Webhooks
Start here
A webhook is an automatic POST request from Superfolio to an endpoint you choose. In plain English: when something happens in your portfolio, Superfolio can send a structured message to another tool.
Use webhooks when you want portfolio activity to create CRM notes, Slack alerts, spreadsheet rows, lead records, automation runs, or custom backend actions without checking the dashboard manually.
Method
Every delivery is an HTTP POST request.
Format
The body is JSON and uses Content-Type: application/json.
Security
Saved webhooks are signed with X-Superfolio-Signature.
Important behavior
tracking_link: null.Setup
Create a webhook endpoint
- 1Create an endpoint in the receiving tool. This can be your server, Zapier, Make, n8n, Pipedream, a CRM webhook URL, or any public HTTPS URL that accepts POST requests.
- 2Open Superfolio, go to Dashboard, then Integrations, then Webhooks.
- 3Click Add webhook.
- 4Paste the endpoint URL. Use the full URL, including https://.
- 5Keep Enabled on if you want deliveries to start right away.
- 6Choose the raw event names this endpoint should receive, such as activity.page_view or form.submitted.
- 7Save the webhook.
- 8Open Edit on the saved webhook, reveal the signing secret, and copy it into the receiving system if you want signature verification.
- 9Store incoming event_id values in your receiver if you want duplicate protection.
Choosing events without needing to understand scopes
Events
Event catalog
Pick the smallest set of events your endpoint needs. For example, send only form.submitted to a CRM, but send activity.page_view, activity.project_view, and lead.hot_detected to a lead scoring system.
| Event name | What it means | Backend scope |
|---|---|---|
| activity.page_view | A visitor opened the public portfolio. | activity.read |
| activity.section_view | A visitor reached a portfolio section. | activity.read |
| activity.project_view | A visitor viewed a project card or detail area. | activity.read |
| activity.project_click | A visitor clicked inside a project. | activity.read |
| activity.external_link_click | A visitor opened a project or portfolio link. | activity.read |
| activity.time_on_page | A visitor spent time on the portfolio. | activity.read |
| activity.session_end | A visitor session ended or timed out. | activity.read |
| lead.hot_detected | A tracked share link crossed the hot-lead threshold. | leads.read |
| form.submitted | Someone submitted a public portfolio form. | forms.read |
| testimonial.submitted | Someone submitted a review. | testimonials.read |
| tracking_link.created | A tracked share link was created. | tracking_links.read |
| tracking_link.updated | A tracked share link changed or was removed. | tracking_links.read |
| portfolio.project_changed | A public project was created, edited, hidden, shown, or removed. | portfolio.read |
| portfolio.profile_changed | Public profile fields changed. | profile.read |
| portfolio.availability_changed | Public availability status changed. | availability.read |
| integration.test | A test payload was sent from Superfolio. | integration.test |
Payloads
How payloads are shaped
Every webhook delivery uses the same outer envelope. The data field changes based on the event. The event_data field at the top level is included for compatibility and currently mirrors data.
event_id
Unique ID for this webhook delivery. Store it if your receiver needs duplicate protection.
event_type
The raw event name, such as activity.page_view.
scope
Backend grouping for the event. Users do not choose this in the dashboard.
timestamp
ISO timestamp for when the event happened or was created.
user_id
The Superfolio owner ID for the portfolio.
session_id
Visitor session ID for activity events. Non-activity events can be null.
data
The event-specific object you will usually read.
event_data
Compatibility copy of data. Prefer data for new receivers.
Full activity.page_view payload without a tracking link
{
"event_id": "6f2c2f85-3b7e-4f19-a0f3-8d5ec8c0ab11",
"event_type": "activity.page_view",
"scope": "activity.read",
"timestamp": "2026-06-01T17:45:12.345Z",
"user_id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"data": {
"activity": {
"id": "evt_01JZPAGEVIEWGENERIC",
"type": "page_view",
"created_at": "2026-06-01T17:45:12.345Z",
"tracking_link_id": null,
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10"
},
"tracking_link": null,
"session": {
"id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN"
},
"event_data": {
"referrer": "https://www.google.com/",
"viewport": "1440x900",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"session_started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN",
"repeat_viewer": false,
"repeat_signal": "first_seen",
"city": "Mumbai",
"region": "Maharashtra",
"country": "IN",
"latitude": "19.076",
"longitude": "72.8777",
"timezone": "Asia/Kolkata",
"postal_code": "400001",
"geo_source": "edge_headers"
}
},
"event_data": {
"activity": {
"id": "evt_01JZPAGEVIEWGENERIC",
"type": "page_view",
"created_at": "2026-06-01T17:45:12.345Z",
"tracking_link_id": null,
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10"
},
"tracking_link": null,
"session": {
"id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN"
},
"event_data": {
"referrer": "https://www.google.com/",
"viewport": "1440x900",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"session_started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN",
"repeat_viewer": false,
"repeat_signal": "first_seen",
"city": "Mumbai",
"region": "Maharashtra",
"country": "IN",
"latitude": "19.076",
"longitude": "72.8777",
"timezone": "Asia/Kolkata",
"postal_code": "400001",
"geo_source": "edge_headers"
}
}
}Full activity.page_view payload with a tracking link
{
"event_id": "6f2c2f85-3b7e-4f19-a0f3-8d5ec8c0ab11",
"event_type": "activity.page_view",
"scope": "activity.read",
"timestamp": "2026-06-01T17:45:12.345Z",
"user_id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"data": {
"activity": {
"id": "evt_01JZPAGEVIEWTRACKED",
"type": "page_view",
"created_at": "2026-06-01T17:45:12.345Z",
"tracking_link_id": "tl_8ad2b0c1-1e84-4c92-a6a5-f2a53bde8612",
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10"
},
"tracking_link": {
"id": "tl_8ad2b0c1-1e84-4c92-a6a5-f2a53bde8612",
"code": "acme-cmo",
"label": "ACME CMO intro",
"scope": "project",
"category_id": null,
"project_id": "project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8",
"selection_ids": {
"project_ids": [
"project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8"
]
},
"is_active": true,
"recipient_name": "Maya Rao",
"recipient_email": "maya@example.com",
"created_at": "2026-05-31T12:18:44.000Z",
"updated_at": "2026-05-31T12:18:44.000Z"
},
"session": {
"id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN"
},
"event_data": {
"referrer": "https://www.google.com/",
"viewport": "1440x900",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"session_started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN",
"repeat_viewer": false,
"repeat_signal": "first_seen",
"city": "Mumbai",
"region": "Maharashtra",
"country": "IN",
"latitude": "19.076",
"longitude": "72.8777",
"timezone": "Asia/Kolkata",
"postal_code": "400001",
"geo_source": "edge_headers"
}
},
"event_data": {
"activity": {
"id": "evt_01JZPAGEVIEWTRACKED",
"type": "page_view",
"created_at": "2026-06-01T17:45:12.345Z",
"tracking_link_id": "tl_8ad2b0c1-1e84-4c92-a6a5-f2a53bde8612",
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10"
},
"tracking_link": {
"id": "tl_8ad2b0c1-1e84-4c92-a6a5-f2a53bde8612",
"code": "acme-cmo",
"label": "ACME CMO intro",
"scope": "project",
"category_id": null,
"project_id": "project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8",
"selection_ids": {
"project_ids": [
"project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8"
]
},
"is_active": true,
"recipient_name": "Maya Rao",
"recipient_email": "maya@example.com",
"created_at": "2026-05-31T12:18:44.000Z",
"updated_at": "2026-05-31T12:18:44.000Z"
},
"session": {
"id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN"
},
"event_data": {
"referrer": "https://www.google.com/",
"viewport": "1440x900",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"session_started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN",
"repeat_viewer": false,
"repeat_signal": "first_seen",
"city": "Mumbai",
"region": "Maharashtra",
"country": "IN",
"latitude": "19.076",
"longitude": "72.8777",
"timezone": "Asia/Kolkata",
"postal_code": "400001",
"geo_source": "edge_headers"
}
}
}Full activity.section_view payload
{
"event_id": "6f2c2f85-3b7e-4f19-a0f3-8d5ec8c0ab11",
"event_type": "activity.section_view",
"scope": "activity.read",
"timestamp": "2026-06-01T17:45:12.345Z",
"user_id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"data": {
"activity": {
"id": "evt_01JZSECTIONVIEW",
"type": "section_view",
"created_at": "2026-06-01T17:45:12.345Z",
"tracking_link_id": null,
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10"
},
"tracking_link": null,
"session": {
"id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN"
},
"event_data": {
"category_slug": "growth-systems",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"session_started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN",
"repeat_viewer": true,
"repeat_signal": "same_browser",
"first_seen_at": "2026-05-25T09:21:10.000Z",
"city": "Mumbai",
"region": "Maharashtra",
"country": "IN",
"latitude": "19.076",
"longitude": "72.8777",
"timezone": "Asia/Kolkata",
"postal_code": "400001",
"geo_source": "edge_headers"
}
},
"event_data": {
"activity": {
"id": "evt_01JZSECTIONVIEW",
"type": "section_view",
"created_at": "2026-06-01T17:45:12.345Z",
"tracking_link_id": null,
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10"
},
"tracking_link": null,
"session": {
"id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN"
},
"event_data": {
"category_slug": "growth-systems",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"session_started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN",
"repeat_viewer": true,
"repeat_signal": "same_browser",
"first_seen_at": "2026-05-25T09:21:10.000Z",
"city": "Mumbai",
"region": "Maharashtra",
"country": "IN",
"latitude": "19.076",
"longitude": "72.8777",
"timezone": "Asia/Kolkata",
"postal_code": "400001",
"geo_source": "edge_headers"
}
}
}Security
Verify webhook signatures
Saved Superfolio webhooks include an X-Superfolio-Signature header. The value is an HMAC-SHA256 hex digest of the exact raw request body, signed with that webhook endpoint's signing secret.
- 1Save the webhook endpoint in Superfolio.
- 2Edit the webhook.
- 3Click Reveal secret.
- 4Copy the secret into the receiving system as an environment variable.
- 5When a request arrives, read the raw body before parsing JSON.
- 6Compute HMAC-SHA256 over that raw body with the signing secret.
- 7Compare your computed hex digest to X-Superfolio-Signature using a timing-safe comparison.
- 8Reject the request with 401 if the signature does not match.
Do not sign the parsed JSON
Node and Express
import crypto from "node:crypto";
import express from "express";
const app = express();
app.post("/superfolio-webhook", express.raw({ type: "application/json" }), (request, response) => {
const rawBody = request.body.toString("utf8");
const received = request.header("X-Superfolio-Signature") ?? "";
const expected = crypto
.createHmac("sha256", process.env.SUPERFOLIO_WEBHOOK_SECRET ?? "")
.update(rawBody)
.digest("hex");
const isValid =
received.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(received, "hex"), Buffer.from(expected, "hex"));
if (!isValid) {
response.status(401).send("Invalid signature");
return;
}
const payload = JSON.parse(rawBody);
console.log(payload.event_type, payload.event_id);
response.status(200).send("ok");
});Next.js route handler
import crypto from "node:crypto";
import { NextResponse } from "next/server";
export const runtime = "nodejs";
export async function POST(request: Request) {
const rawBody = await request.text();
const received = request.headers.get("X-Superfolio-Signature") ?? "";
const expected = crypto
.createHmac("sha256", process.env.SUPERFOLIO_WEBHOOK_SECRET ?? "")
.update(rawBody)
.digest("hex");
if (received.length !== expected.length || !crypto.timingSafeEqual(Buffer.from(received, "hex"), Buffer.from(expected, "hex"))) {
return NextResponse.json({ error: "Invalid signature" }, { status: 401 });
}
const payload = JSON.parse(rawBody);
return NextResponse.json({ received: payload.event_id });
}Python and FastAPI
import hashlib
import hmac
import json
import os
from fastapi import FastAPI, Request, HTTPException
app = FastAPI()
@app.post("/superfolio-webhook")
async def superfolio_webhook(request: Request):
raw_body = await request.body()
received = request.headers.get("X-Superfolio-Signature", "")
expected = hmac.new(
os.environ["SUPERFOLIO_WEBHOOK_SECRET"].encode("utf-8"),
raw_body,
hashlib.sha256,
).hexdigest()
if not hmac.compare_digest(received, expected):
raise HTTPException(status_code=401, detail="Invalid signature")
payload = json.loads(raw_body)
return {"received": payload["event_id"]}PHP
<?php
$rawBody = file_get_contents("php://input");
$received = $_SERVER["HTTP_X_SUPERFOLIO_SIGNATURE"] ?? "";
$expected = hash_hmac("sha256", $rawBody, $_ENV["SUPERFOLIO_WEBHOOK_SECRET"]);
if (!hash_equals($expected, $received)) {
http_response_code(401);
echo "Invalid signature";
exit;
}
$payload = json_decode($rawBody, true);
http_response_code(200);
echo "ok";
?>Examples
Event-by-event payload examples
These examples show the full delivery wrapper for every event. Real IDs, timestamps, locations, form fields, project content, and recipient values will come from the user's portfolio and visitor activity.
activity.page_viewA visitor opened the public portfolio.
{
"event_id": "6f2c2f85-3b7e-4f19-a0f3-8d5ec8c0ab11",
"event_type": "activity.page_view",
"scope": "activity.read",
"timestamp": "2026-06-01T17:45:12.345Z",
"user_id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"session_id": null,
"data": {
"activity": {
"id": "evt_01JZPAGEVIEWGENERIC",
"type": "page_view",
"created_at": "2026-06-01T17:45:12.345Z",
"tracking_link_id": null,
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10"
},
"tracking_link": null,
"session": {
"id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN"
},
"event_data": {
"referrer": "https://www.google.com/",
"viewport": "1440x900",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"session_started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN",
"repeat_viewer": false,
"repeat_signal": "first_seen",
"city": "Mumbai",
"region": "Maharashtra",
"country": "IN",
"latitude": "19.076",
"longitude": "72.8777",
"timezone": "Asia/Kolkata",
"postal_code": "400001",
"geo_source": "edge_headers"
}
},
"event_data": {
"activity": {
"id": "evt_01JZPAGEVIEWGENERIC",
"type": "page_view",
"created_at": "2026-06-01T17:45:12.345Z",
"tracking_link_id": null,
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10"
},
"tracking_link": null,
"session": {
"id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN"
},
"event_data": {
"referrer": "https://www.google.com/",
"viewport": "1440x900",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"session_started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN",
"repeat_viewer": false,
"repeat_signal": "first_seen",
"city": "Mumbai",
"region": "Maharashtra",
"country": "IN",
"latitude": "19.076",
"longitude": "72.8777",
"timezone": "Asia/Kolkata",
"postal_code": "400001",
"geo_source": "edge_headers"
}
}
}activity.section_viewA visitor stayed on a portfolio section long enough to count as viewed.
{
"event_id": "6f2c2f85-3b7e-4f19-a0f3-8d5ec8c0ab11",
"event_type": "activity.section_view",
"scope": "activity.read",
"timestamp": "2026-06-01T17:45:12.345Z",
"user_id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"session_id": null,
"data": {
"activity": {
"id": "evt_01JZSECTIONVIEW",
"type": "section_view",
"created_at": "2026-06-01T17:45:12.345Z",
"tracking_link_id": null,
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10"
},
"tracking_link": null,
"session": {
"id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN"
},
"event_data": {
"category_slug": "growth-systems",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"session_started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN",
"repeat_viewer": true,
"repeat_signal": "same_browser",
"first_seen_at": "2026-05-25T09:21:10.000Z",
"city": "Mumbai",
"region": "Maharashtra",
"country": "IN",
"latitude": "19.076",
"longitude": "72.8777",
"timezone": "Asia/Kolkata",
"postal_code": "400001",
"geo_source": "edge_headers"
}
},
"event_data": {
"activity": {
"id": "evt_01JZSECTIONVIEW",
"type": "section_view",
"created_at": "2026-06-01T17:45:12.345Z",
"tracking_link_id": null,
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10"
},
"tracking_link": null,
"session": {
"id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN"
},
"event_data": {
"category_slug": "growth-systems",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"session_started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN",
"repeat_viewer": true,
"repeat_signal": "same_browser",
"first_seen_at": "2026-05-25T09:21:10.000Z",
"city": "Mumbai",
"region": "Maharashtra",
"country": "IN",
"latitude": "19.076",
"longitude": "72.8777",
"timezone": "Asia/Kolkata",
"postal_code": "400001",
"geo_source": "edge_headers"
}
}
}activity.project_viewA project card or project area became visible to the visitor.
{
"event_id": "6f2c2f85-3b7e-4f19-a0f3-8d5ec8c0ab11",
"event_type": "activity.project_view",
"scope": "activity.read",
"timestamp": "2026-06-01T17:45:12.345Z",
"user_id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"session_id": null,
"data": {
"activity": {
"id": "evt_01JZPROJECTVIEW",
"type": "project_view",
"created_at": "2026-06-01T17:45:12.345Z",
"tracking_link_id": null,
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10"
},
"tracking_link": null,
"session": {
"id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN"
},
"event_data": {
"project_id": "project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8",
"project_title": "Revenue dashboard rebuild",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"session_started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN",
"repeat_viewer": false,
"repeat_signal": "first_seen",
"geo_source": "ipapi",
"city": "Mumbai",
"region": "Maharashtra",
"country": "IN"
}
},
"event_data": {
"activity": {
"id": "evt_01JZPROJECTVIEW",
"type": "project_view",
"created_at": "2026-06-01T17:45:12.345Z",
"tracking_link_id": null,
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10"
},
"tracking_link": null,
"session": {
"id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN"
},
"event_data": {
"project_id": "project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8",
"project_title": "Revenue dashboard rebuild",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"session_started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN",
"repeat_viewer": false,
"repeat_signal": "first_seen",
"geo_source": "ipapi",
"city": "Mumbai",
"region": "Maharashtra",
"country": "IN"
}
}
}activity.project_clickA visitor clicked View details on a project.
{
"event_id": "6f2c2f85-3b7e-4f19-a0f3-8d5ec8c0ab11",
"event_type": "activity.project_click",
"scope": "activity.read",
"timestamp": "2026-06-01T17:45:12.345Z",
"user_id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"session_id": null,
"data": {
"activity": {
"id": "evt_01JZPROJECTCLICK",
"type": "project_click",
"created_at": "2026-06-01T17:45:12.345Z",
"tracking_link_id": null,
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10"
},
"tracking_link": null,
"session": {
"id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN"
},
"event_data": {
"project_id": "project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8",
"project_title": "Revenue dashboard rebuild",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"session_started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN",
"repeat_viewer": true,
"repeat_signal": "same_browser",
"first_seen_at": "2026-05-25T09:21:10.000Z"
}
},
"event_data": {
"activity": {
"id": "evt_01JZPROJECTCLICK",
"type": "project_click",
"created_at": "2026-06-01T17:45:12.345Z",
"tracking_link_id": null,
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10"
},
"tracking_link": null,
"session": {
"id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN"
},
"event_data": {
"project_id": "project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8",
"project_title": "Revenue dashboard rebuild",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"session_started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN",
"repeat_viewer": true,
"repeat_signal": "same_browser",
"first_seen_at": "2026-05-25T09:21:10.000Z"
}
}
}activity.external_link_clickA visitor clicked an external project or portfolio link.
{
"event_id": "6f2c2f85-3b7e-4f19-a0f3-8d5ec8c0ab11",
"event_type": "activity.external_link_click",
"scope": "activity.read",
"timestamp": "2026-06-01T17:45:12.345Z",
"user_id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"session_id": null,
"data": {
"activity": {
"id": "evt_01JZEXTERNALLINK",
"type": "external_link_click",
"created_at": "2026-06-01T17:45:12.345Z",
"tracking_link_id": null,
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10"
},
"tracking_link": null,
"session": {
"id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN"
},
"event_data": {
"project_id": "project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8",
"external_url": "https://example.com/case-study",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"session_started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN",
"repeat_viewer": false,
"repeat_signal": "first_seen"
}
},
"event_data": {
"activity": {
"id": "evt_01JZEXTERNALLINK",
"type": "external_link_click",
"created_at": "2026-06-01T17:45:12.345Z",
"tracking_link_id": null,
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10"
},
"tracking_link": null,
"session": {
"id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN"
},
"event_data": {
"project_id": "project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8",
"external_url": "https://example.com/case-study",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"session_started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN",
"repeat_viewer": false,
"repeat_signal": "first_seen"
}
}
}activity.time_on_pageA visitor spent time on the portfolio before the session ended.
{
"event_id": "6f2c2f85-3b7e-4f19-a0f3-8d5ec8c0ab11",
"event_type": "activity.time_on_page",
"scope": "activity.read",
"timestamp": "2026-06-01T17:45:12.345Z",
"user_id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"session_id": null,
"data": {
"activity": {
"id": "evt_01JZTIMEONPAGE",
"type": "time_on_page",
"created_at": "2026-06-01T17:45:12.345Z",
"tracking_link_id": null,
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10"
},
"tracking_link": null,
"session": {
"id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN"
},
"event_data": {
"duration_seconds": 184,
"session_end_reason": "tab_closed",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"session_started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN",
"repeat_viewer": true,
"repeat_signal": "same_browser"
}
},
"event_data": {
"activity": {
"id": "evt_01JZTIMEONPAGE",
"type": "time_on_page",
"created_at": "2026-06-01T17:45:12.345Z",
"tracking_link_id": null,
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10"
},
"tracking_link": null,
"session": {
"id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN"
},
"event_data": {
"duration_seconds": 184,
"session_end_reason": "tab_closed",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"session_started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN",
"repeat_viewer": true,
"repeat_signal": "same_browser"
}
}
}activity.session_endA visitor session ended because the tab closed or became idle.
{
"event_id": "6f2c2f85-3b7e-4f19-a0f3-8d5ec8c0ab11",
"event_type": "activity.session_end",
"scope": "activity.read",
"timestamp": "2026-06-01T17:45:12.345Z",
"user_id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"session_id": null,
"data": {
"activity": {
"id": "evt_01JZSESSIONEND",
"type": "session_end",
"created_at": "2026-06-01T17:45:12.345Z",
"tracking_link_id": null,
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10"
},
"tracking_link": null,
"session": {
"id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN"
},
"event_data": {
"duration_seconds": 184,
"reason": "tab_closed",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"session_started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN",
"repeat_viewer": true,
"repeat_signal": "same_browser"
}
},
"event_data": {
"activity": {
"id": "evt_01JZSESSIONEND",
"type": "session_end",
"created_at": "2026-06-01T17:45:12.345Z",
"tracking_link_id": null,
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10"
},
"tracking_link": null,
"session": {
"id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN"
},
"event_data": {
"duration_seconds": 184,
"reason": "tab_closed",
"visitor_id": "visitor_1d4d0c4e-8c32-474d-9128-61f81b763a5a",
"session_started_at": "2026-06-01T17:44:58.000Z",
"client_timezone": "Asia/Kolkata",
"client_locale": "en-IN",
"repeat_viewer": true,
"repeat_signal": "same_browser"
}
}
}lead.hot_detectedA tracked share link crossed the hot-lead threshold for the first time.
{
"event_id": "6f2c2f85-3b7e-4f19-a0f3-8d5ec8c0ab11",
"event_type": "lead.hot_detected",
"scope": "leads.read",
"timestamp": "2026-06-01T17:45:12.345Z",
"user_id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"session_id": "sess_8f2a1fb0-73b8-4df0-9b87-3a5a6f2d3c10",
"data": {
"tracking_link": {
"id": "tl_8ad2b0c1-1e84-4c92-a6a5-f2a53bde8612",
"code": "acme-cmo",
"label": "ACME CMO intro",
"scope": "project",
"category_id": null,
"project_id": "project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8",
"selection_ids": {
"project_ids": [
"project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8"
]
},
"recipient_name": "Maya Rao",
"recipient_email": "maya@example.com",
"is_active": true,
"created_at": "2026-05-31T12:18:44.000Z",
"updated_at": "2026-05-31T12:18:44.000Z"
},
"tracking_url": "https://superfolio.app/sanket?ref=acme-cmo",
"dashboard_url": "https://superfolio.app/dashboard/tracking/tl_8ad2b0c1-1e84-4c92-a6a5-f2a53bde8612",
"heat": {
"previous": "Warm",
"current": "Hot"
},
"activity": {
"event_count": 9,
"recent_event_count": 5,
"session_count": 2,
"summary": [
"3 page views",
"2 project views",
"2 external clicks"
],
"last_activity_at": "2026-06-01T17:45:12.345Z"
}
},
"event_data": {
"tracking_link": {
"id": "tl_8ad2b0c1-1e84-4c92-a6a5-f2a53bde8612",
"code": "acme-cmo",
"label": "ACME CMO intro",
"scope": "project",
"category_id": null,
"project_id": "project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8",
"selection_ids": {
"project_ids": [
"project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8"
]
},
"recipient_name": "Maya Rao",
"recipient_email": "maya@example.com",
"is_active": true,
"created_at": "2026-05-31T12:18:44.000Z",
"updated_at": "2026-05-31T12:18:44.000Z"
},
"tracking_url": "https://superfolio.app/sanket?ref=acme-cmo",
"dashboard_url": "https://superfolio.app/dashboard/tracking/tl_8ad2b0c1-1e84-4c92-a6a5-f2a53bde8612",
"heat": {
"previous": "Warm",
"current": "Hot"
},
"activity": {
"event_count": 9,
"recent_event_count": 5,
"session_count": 2,
"summary": [
"3 page views",
"2 project views",
"2 external clicks"
],
"last_activity_at": "2026-06-01T17:45:12.345Z"
}
}
}form.submittedSomeone submitted a public portfolio form.
{
"event_id": "6f2c2f85-3b7e-4f19-a0f3-8d5ec8c0ab11",
"event_type": "form.submitted",
"scope": "forms.read",
"timestamp": "2026-06-01T17:45:12.345Z",
"user_id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"session_id": null,
"data": {
"form": {
"id": "form_f8f88d4a-30bd-4d0a-b2bd-6df9a8065774",
"title": "Project inquiry"
},
"submission": {
"id": "submission_1bb5c4eb-f274-47dd-97c3-9b4d8ddf5af1",
"created_at": "2026-06-01T17:45:12.345Z",
"responses": {
"name": "Maya Rao",
"email": "maya@example.com",
"budget": "$10k to $25k",
"message": "We want to talk about a revenue dashboard."
},
"response_rows": [
{
"field_id": "field_name",
"label": "Name",
"value": "Maya Rao",
"field_type": "name"
},
{
"field_id": "field_email",
"label": "Email",
"value": "maya@example.com",
"field_type": "email"
},
{
"field_id": "field_budget",
"label": "Budget",
"value": "$10k to $25k",
"field_type": "single_select"
},
{
"field_id": "field_message",
"label": "Message",
"value": "We want to talk about a revenue dashboard.",
"field_type": "long_text"
}
]
},
"fields": [
{
"id": "field_name",
"label": "Name",
"field_type": "name",
"is_required": true,
"options": [],
"display_order": 1
},
{
"id": "field_email",
"label": "Email",
"field_type": "email",
"is_required": true,
"options": [],
"display_order": 2
},
{
"id": "field_budget",
"label": "Budget",
"field_type": "single_select",
"is_required": false,
"options": [
"Under $10k",
"$10k to $25k",
"$25k+"
],
"display_order": 3
}
]
},
"event_data": {
"form": {
"id": "form_f8f88d4a-30bd-4d0a-b2bd-6df9a8065774",
"title": "Project inquiry"
},
"submission": {
"id": "submission_1bb5c4eb-f274-47dd-97c3-9b4d8ddf5af1",
"created_at": "2026-06-01T17:45:12.345Z",
"responses": {
"name": "Maya Rao",
"email": "maya@example.com",
"budget": "$10k to $25k",
"message": "We want to talk about a revenue dashboard."
},
"response_rows": [
{
"field_id": "field_name",
"label": "Name",
"value": "Maya Rao",
"field_type": "name"
},
{
"field_id": "field_email",
"label": "Email",
"value": "maya@example.com",
"field_type": "email"
},
{
"field_id": "field_budget",
"label": "Budget",
"value": "$10k to $25k",
"field_type": "single_select"
},
{
"field_id": "field_message",
"label": "Message",
"value": "We want to talk about a revenue dashboard.",
"field_type": "long_text"
}
]
},
"fields": [
{
"id": "field_name",
"label": "Name",
"field_type": "name",
"is_required": true,
"options": [],
"display_order": 1
},
{
"id": "field_email",
"label": "Email",
"field_type": "email",
"is_required": true,
"options": [],
"display_order": 2
},
{
"id": "field_budget",
"label": "Budget",
"field_type": "single_select",
"is_required": false,
"options": [
"Under $10k",
"$10k to $25k",
"$25k+"
],
"display_order": 3
}
]
}
}testimonial.submittedSomeone submitted a review, or the owner added one manually.
{
"event_id": "6f2c2f85-3b7e-4f19-a0f3-8d5ec8c0ab11",
"event_type": "testimonial.submitted",
"scope": "testimonials.read",
"timestamp": "2026-06-01T17:45:12.345Z",
"user_id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"session_id": null,
"data": {
"source": "invited",
"testimonial": {
"id": "testimonial_7bc9b6c4-b2c4-4d5d-807d-55ac33d95551",
"created_at": "2026-05-28T10:03:22.000Z",
"updated_at": "2026-06-01T17:45:12.345Z",
"author_name": "Maya Rao",
"author_email": "maya@example.com",
"author_title": "CMO",
"author_company": "ACME",
"author_avatar_url": null,
"content": "The work was sharp, fast, and easy to ship.",
"original_content": "The work was sharp, fast, and easy to ship.",
"rating": 5,
"media_type": "text",
"mux_playback_id": null,
"mux_playback_policy": null,
"mux_duration_seconds": null,
"type": "invited",
"status": "complete",
"invite_sent_at": "2026-05-28T10:03:22.000Z",
"submitted_at": "2026-06-01T17:45:12.345Z",
"is_visible": true,
"display_order": 1
}
},
"event_data": {
"source": "invited",
"testimonial": {
"id": "testimonial_7bc9b6c4-b2c4-4d5d-807d-55ac33d95551",
"created_at": "2026-05-28T10:03:22.000Z",
"updated_at": "2026-06-01T17:45:12.345Z",
"author_name": "Maya Rao",
"author_email": "maya@example.com",
"author_title": "CMO",
"author_company": "ACME",
"author_avatar_url": null,
"content": "The work was sharp, fast, and easy to ship.",
"original_content": "The work was sharp, fast, and easy to ship.",
"rating": 5,
"media_type": "text",
"mux_playback_id": null,
"mux_playback_policy": null,
"mux_duration_seconds": null,
"type": "invited",
"status": "complete",
"invite_sent_at": "2026-05-28T10:03:22.000Z",
"submitted_at": "2026-06-01T17:45:12.345Z",
"is_visible": true,
"display_order": 1
}
}
}tracking_link.createdA tracked share link was created.
{
"event_id": "6f2c2f85-3b7e-4f19-a0f3-8d5ec8c0ab11",
"event_type": "tracking_link.created",
"scope": "tracking_links.read",
"timestamp": "2026-06-01T17:45:12.345Z",
"user_id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"session_id": null,
"data": {
"action": "created",
"tracking_link": {
"id": "tl_8ad2b0c1-1e84-4c92-a6a5-f2a53bde8612",
"created_at": "2026-06-01T17:45:12.345Z",
"updated_at": "2026-06-01T17:45:12.345Z",
"code": "acme-cmo",
"url": "https://superfolio.app/sanket?ref=acme-cmo",
"label": "ACME CMO intro",
"scope": "project",
"category_id": null,
"project_id": "project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8",
"selection_ids": {
"project_ids": [
"project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8"
]
},
"is_active": true,
"recipient_name": "Maya Rao",
"recipient_email": "maya@example.com"
}
},
"event_data": {
"action": "created",
"tracking_link": {
"id": "tl_8ad2b0c1-1e84-4c92-a6a5-f2a53bde8612",
"created_at": "2026-06-01T17:45:12.345Z",
"updated_at": "2026-06-01T17:45:12.345Z",
"code": "acme-cmo",
"url": "https://superfolio.app/sanket?ref=acme-cmo",
"label": "ACME CMO intro",
"scope": "project",
"category_id": null,
"project_id": "project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8",
"selection_ids": {
"project_ids": [
"project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8"
]
},
"is_active": true,
"recipient_name": "Maya Rao",
"recipient_email": "maya@example.com"
}
}
}tracking_link.updatedA tracked share link changed or was deleted.
{
"event_id": "6f2c2f85-3b7e-4f19-a0f3-8d5ec8c0ab11",
"event_type": "tracking_link.updated",
"scope": "tracking_links.read",
"timestamp": "2026-06-01T17:45:12.345Z",
"user_id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"session_id": null,
"data": {
"action": "deleted",
"tracking_link": {
"id": "tl_8ad2b0c1-1e84-4c92-a6a5-f2a53bde8612",
"created_at": "2026-05-31T12:18:44.000Z",
"updated_at": "2026-06-01T17:10:00.000Z",
"code": "acme-cmo",
"url": "https://superfolio.app/sanket?ref=acme-cmo",
"label": "ACME CMO intro",
"scope": "project",
"category_id": null,
"project_id": "project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8",
"selection_ids": {
"project_ids": [
"project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8"
]
},
"is_active": true,
"recipient_name": "Maya Rao",
"recipient_email": "maya@example.com"
},
"deleted_at": "2026-06-01T17:45:12.345Z"
},
"event_data": {
"action": "deleted",
"tracking_link": {
"id": "tl_8ad2b0c1-1e84-4c92-a6a5-f2a53bde8612",
"created_at": "2026-05-31T12:18:44.000Z",
"updated_at": "2026-06-01T17:10:00.000Z",
"code": "acme-cmo",
"url": "https://superfolio.app/sanket?ref=acme-cmo",
"label": "ACME CMO intro",
"scope": "project",
"category_id": null,
"project_id": "project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8",
"selection_ids": {
"project_ids": [
"project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8"
]
},
"is_active": true,
"recipient_name": "Maya Rao",
"recipient_email": "maya@example.com"
},
"deleted_at": "2026-06-01T17:45:12.345Z"
}
}portfolio.project_changedA public project was created, edited, shown, hidden, deleted, or reordered.
{
"event_id": "6f2c2f85-3b7e-4f19-a0f3-8d5ec8c0ab11",
"event_type": "portfolio.project_changed",
"scope": "portfolio.read",
"timestamp": "2026-06-01T17:45:12.345Z",
"user_id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"session_id": null,
"data": {
"action": "updated",
"project": {
"id": "project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8",
"created_at": "2026-05-20T08:30:00.000Z",
"updated_at": "2026-06-01T17:45:12.345Z",
"category_id": "category_growth",
"title": "Revenue dashboard rebuild",
"description": "A reporting system for leadership reviews.",
"thumbnail_url": "https://cdn.superfolio.app/projects/revenue-dashboard.png",
"external_url": "https://example.com/case-study",
"content_html": "<p>Rebuilt the reporting workflow from source data to board-ready views.</p>",
"tags": [
"Analytics",
"RevOps",
"Dashboards"
],
"display_order": 2,
"is_visible": true,
"timeline": {
"start_year": 2026,
"start_month": 1,
"start_day": null,
"end_year": 2026,
"end_month": 3,
"end_day": null
}
}
},
"event_data": {
"action": "updated",
"project": {
"id": "project_2d9a0d5b-2b6f-4a11-b4fd-8fd78e4e31a8",
"created_at": "2026-05-20T08:30:00.000Z",
"updated_at": "2026-06-01T17:45:12.345Z",
"category_id": "category_growth",
"title": "Revenue dashboard rebuild",
"description": "A reporting system for leadership reviews.",
"thumbnail_url": "https://cdn.superfolio.app/projects/revenue-dashboard.png",
"external_url": "https://example.com/case-study",
"content_html": "<p>Rebuilt the reporting workflow from source data to board-ready views.</p>",
"tags": [
"Analytics",
"RevOps",
"Dashboards"
],
"display_order": 2,
"is_visible": true,
"timeline": {
"start_year": 2026,
"start_month": 1,
"start_day": null,
"end_year": 2026,
"end_month": 3,
"end_day": null
}
}
}
}portfolio.profile_changedPublic profile fields changed.
{
"event_id": "6f2c2f85-3b7e-4f19-a0f3-8d5ec8c0ab11",
"event_type": "portfolio.profile_changed",
"scope": "profile.read",
"timestamp": "2026-06-01T17:45:12.345Z",
"user_id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"session_id": null,
"data": {
"profile": {
"id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"slug": "sanket",
"full_name": "Sanket Datta",
"headline": "Systems consultant for founder-led teams",
"bio": "I help teams turn messy workflows into useful operating systems.",
"location": "Mumbai",
"headshot_url": "https://cdn.superfolio.app/headshots/sanket.png",
"social_links": [
{
"platform": "linkedin",
"url": "https://www.linkedin.com/in/example",
"is_visible": true
},
{
"platform": "email",
"url": "mailto:hello@example.com",
"is_visible": true
}
],
"profile_category_id": "consulting",
"profile_subcategory_ids": [
"operations",
"growth"
],
"profile_subcategory_custom_labels": {},
"portfolio_settings": {
"show_projects": true,
"show_testimonials": true,
"show_faq": true,
"show_social_links": true
},
"meta_title": "Sanket Datta",
"meta_description": "Systems consultant for founder-led teams."
},
"changed_at": "2026-06-01T17:45:12.345Z"
},
"event_data": {
"profile": {
"id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"slug": "sanket",
"full_name": "Sanket Datta",
"headline": "Systems consultant for founder-led teams",
"bio": "I help teams turn messy workflows into useful operating systems.",
"location": "Mumbai",
"headshot_url": "https://cdn.superfolio.app/headshots/sanket.png",
"social_links": [
{
"platform": "linkedin",
"url": "https://www.linkedin.com/in/example",
"is_visible": true
},
{
"platform": "email",
"url": "mailto:hello@example.com",
"is_visible": true
}
],
"profile_category_id": "consulting",
"profile_subcategory_ids": [
"operations",
"growth"
],
"profile_subcategory_custom_labels": {},
"portfolio_settings": {
"show_projects": true,
"show_testimonials": true,
"show_faq": true,
"show_social_links": true
},
"meta_title": "Sanket Datta",
"meta_description": "Systems consultant for founder-led teams."
},
"changed_at": "2026-06-01T17:45:12.345Z"
}
}portfolio.availability_changedThe public availability status changed.
{
"event_id": "6f2c2f85-3b7e-4f19-a0f3-8d5ec8c0ab11",
"event_type": "portfolio.availability_changed",
"scope": "availability.read",
"timestamp": "2026-06-01T17:45:12.345Z",
"user_id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"session_id": null,
"data": {
"profile": {
"id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"slug": "sanket"
},
"availability": {
"status": "available_from",
"available_from": "2026-07-01",
"client_count": null,
"custom_text": null
}
},
"event_data": {
"profile": {
"id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"slug": "sanket"
},
"availability": {
"status": "available_from",
"available_from": "2026-07-01",
"client_count": null,
"custom_text": null
}
}
}integration.testA test payload was sent from Superfolio.
{
"event_id": "6f2c2f85-3b7e-4f19-a0f3-8d5ec8c0ab11",
"event_type": "integration.test",
"scope": "integration.test",
"timestamp": "2026-06-01T17:45:12.345Z",
"user_id": "user_7f4f6e0d-5f12-4b7c-9c11-4e6f1f3b8a91",
"session_id": null,
"data": {
"test": true,
"message": "Superfolio webhook test"
},
"event_data": {
"test": true,
"message": "Superfolio webhook test"
}
}Troubleshooting
Common issues
My endpoint is not receiving anything
Check that the webhook is enabled, the URL is public, the event is selected, and the event actually happened after saving the webhook.
The webhook shows Last sync failed
Superfolio treats any non-2xx response as a failed delivery. Return 200, 201, 202, or 204 after your receiver accepts the payload.
Signature verification fails
Read the raw body before parsing JSON, use the right endpoint secret, and compare against X-Superfolio-Signature exactly.
tracking_link is null
That is expected for normal portfolio visits. Tracking link details appear only when the visitor used a tracked share link.
I got duplicate-looking activity
Use event_id for delivery-level idempotency. For activity analytics, data.activity.id is the stored portfolio activity event.
My local endpoint does not work
A localhost URL is only available on your machine. Use a tunnel such as ngrok, Cloudflare Tunnel, or a deployed preview URL while testing.
Retries
Privacy
What gets sent outside Superfolio
Only choose events you are comfortable sending to the receiving endpoint. Form submissions and reviews can contain personal information because the visitor typed that information into the public portfolio.
Sent
Selected event data, visitor session metadata, tracking link metadata when present, form answers, review content, and public portfolio content relevant to the event.
Not sent
Raw visitor IP addresses, IP hashes, encrypted webhook secrets, SMTP passwords, custom dashboard auth state, and private internal logs.
Location fields
City, region, country, timezone, latitude, longitude, postal code, and geo_source can appear when the request environment provides them.
Tracking links
Recipient name and email can appear when the event belongs to a tracking link configured with those recipient fields.
FAQ
Questions people usually ask
Will activity.page_view fire without a tracking link?
tracking_link: null.Should I use data or event_data?
data for new integrations. Top-level event_data is kept as a compatibility copy.