Registration webhook
For engineers receiving lead data from Zellify funnels. You'll have a verified webhook endpoint receiving live funnel registrations. You need an HTTPS endpoint and the ability to verify HMAC-SHA256 signatures.
Overview#
The Registration webhook fires when a funnel visitor submits their email at the Registration step and clicks the button to advance. It delivers the email, the quiz answers collected before that step, and session context including app_user_id.
Registration happens before payment. Use this webhook for lead capture, early account creation, abandoned-cart follow-up, and pre-qualification — not for granting access.
Configuration#
- Open Dashboard → Settings → Developers
- Click Configure under Registration Webhook
- Enter your endpoint URL
- Save and store the webhook secret somewhere safe — you'll need it to verify signatures
Request#
- Method:
POST - Content-Type:
application/json - Signature header:
X-Webhook-Signature— HMAC-SHA256 of the raw request body, hex-encoded, keyed with your webhook secret
Payload#
1{2 "email": "[email protected]",3 "answers": {4 "age": { "value": 35, "pageSlug": "page-1", "questionText": "How old are you?" },5 "gender": { "value": "2", "label": "Female", "pageSlug": "page-2", "questionText": "Your gender?" }6 },7 "context": {8 "appUserId": "ac17064d-4edf-5acc-8487-d8dd4e5b1ac5",9 "funnelId": "46",10 "campaignId": "12",11 "experimentId": null,12 "experimentTag": null,13 "organizationId": "529719da-d8e7-4c36-ae52-1cf9f6630c39",14 "pageLocation": "/f/46/page-2",15 "ip": "95.104.11.250",16 "userAgent": "Mozilla/5.0 ...",17 "sessionToken": null18 }19}
See the Payload reference for every field, every type, every resolution rule — and how to export the Variables Schema from your funnel to give your backend a typed picture of every question.
The keys inside answers (age, gender above) are the Component IDs you set on each question component in the funnel builder. Sidebar Custom Variables drive funnel personalization but don't affect this payload. To rename a key, change the Component ID on the question.
For choice questions, value is an auto-generated option ID. Each entry also includes an optional label with the option's display text. For multiselect, that's a comma-joined string of the selected labels. If you need an array of labels or a per-option mapping, export the Variables Schema.
Signature verification#
Verify before parsing the body. The signature is HMAC-SHA256(secret, rawRequestBody) as a lowercase hex string.
timingSafeEqual / compare_digest / hmac.Equal) — never === on the raw strings.Errors and retries#
| Response | Behaviour |
|---|---|
| 2xx | Zellify treats the webhook as delivered. |
| non-2xx | Zellify retries with exponential backoff. |
| Timeout (>15s default) | Zellify retries. |
Delivery logs#
Every delivery attempt is recorded and viewable in Dashboard → Settings → Developers under Delivery Logs.
Each row shows the time, event name, response status code, success/failed status, and request duration. Filter by All / Successful / Failed and search by recipient email.
Click a row to expand and see:
- The webhook URL the request was sent to
- The error message (for failed deliveries)
- The full request payload (JSON)
- The response body returned by your endpoint (truncated to 1024 characters)
Resend#
Each row has a Resend button that re-sends the original payload to your currently configured webhook URL with a fresh HMAC signature. The resend is recorded as a new log entry with event_name: "resend" so you can see whether the retry succeeded.
Use this for:
- Replaying deliveries after fixing a bug in your endpoint
- Re-triggering a registration that hit a transient outage
- Confirming a fix works against real production payloads
The signature is recomputed from your current webhook secret, so resends made after a secret rotation will sign with the new key.
Rate limits#
Not rate-limited for normal funnel traffic. High-volume replays from the dashboard may queue.