Recipe 1: webhook.site (zero-code receiver)
The fastest possible test. Use webhook.site to capture raw POSTs and inspect them without writing any code.Open webhook.site
Open webhook.site — you’ll get a unique URL like
https://webhook.site/8a3f-7c2e-...Subscribe in FPT
Settings → Webhook Endpoints → Add Endpoint. Paste your webhook.site URL. Check
contact.updated. Save.Trigger an event
Edit any test contact and save. Within ~10 seconds, the request appears on webhook.site with full headers (including
X-FPT-Signature) and body.webhook.site is great for inspection but don’t leave production subscriptions pointed at it — payloads contain customer data, and webhook.site is a public service.
Recipe 2: ngrok + your local server
For active development on your real handler, expose your localhost to the internet via ngrok:Install ngrok and start a tunnel to your local server
https://abc123.ngrok-free.app.Subscribe in FPT to the ngrok URL
Settings → Webhook Endpoints → URL:
https://abc123.ngrok-free.app/webhooks/fptRecipe 3: Capture-and-replay
Once you have a few real events captured (from webhook.site or your own logs), you can replay them locally without touching FPT at all. This is the fastest dev loop for handler logic — no waiting on events to fire.Recipe 4: Generate test payloads in code
For unit tests of your handler logic, build synthetic events directly:Coming soon — “Send test event” button
A “Send test event” action is on the roadmap. From your endpoint’s row in Settings → Webhook Endpoints, click the button to fire a synthetic event of any type to your URL. You’ll see the request, response status, and body inline — no need to modify real data.
Common gotchas
Signature mismatch because your framework re-encoded the body
Signature mismatch because your framework re-encoded the body
Express, Flask, ASP.NET — most web frameworks parse JSON into an object before your handler runs. If you sign
JSON.stringify(req.body) instead of the raw bytes, you’ll fail verification. See Signature verification for the right pattern.ngrok URL keeps changing
ngrok URL keeps changing
Free-tier ngrok rotates the subdomain on every restart. Either update the FPT subscription each time, or use a paid plan with a reserved domain.
webhook.site stops capturing
webhook.site stops capturing
Free webhook.site sessions expire after a few days of inactivity. Your unique URL is durable but the captured request log may rotate.
Timestamps in test fixtures get stale
Timestamps in test fixtures get stale
If you store a captured signature in a fixture file and try to replay it weeks later, your verifier’s timestamp tolerance check will reject it. For dev/test environments, consider disabling the tolerance check or regenerating fixtures dynamically.