Skip to main content
Webhooks let you receive events from Productlane as they happen - new threads, status changes, comments, contacts, changelogs, and more - without polling list endpoints. Every delivery is signed with HMAC-SHA256 so you can verify it came from us.

How it works

  1. You register a webhook with a url, a label, and a list of event patterns.
  2. We give you back a secret. Keep it - you’ll need it to verify deliveries.
  3. When an event happens, we POST a JSON payload to your URL.
  4. If your endpoint responds with 2xx, the delivery succeeds. Otherwise we retry on a schedule (1m, 5m, 30m) before marking the delivery dead.
Manage webhooks at Settings → Integrations → API → Webhooks or via the API.

Subscribe to events

The picker exposes 12 resource-level patterns. Subscribe to the resource, then switch on the type field at delivery time. We deliberately don’t let you subscribe to individual event types. Too many integrations break when they subscribe to thread.created and silently miss thread.assigned. Subscribe to the resource, switch on type in your handler.

Delivery payload

Every delivery is a POST with this body:
And these headers:
  • Productlane-Event-Id is stable across retries. If you process the same event_id twice, drop the second. (Most deliveries fire once, but retries can produce duplicates after network hiccups.)
  • Productlane-Delivery-Id is unique per HTTP attempt and useful for matching against the delivery log in the dashboard.

Verify the signature

The signature is HMAC-SHA256 over ${timestamp}.${rawBody}, using your webhook’s secret as the key. Always read the request body raw before parsing it as JSON. Re-serializing reorders keys and breaks the signature.

Node.js

Python

Retries and delivery state

Retry schedule (3 attempts total, including the first):
The request timeout is 10 seconds. Anything slower counts as a failure. After the final failure, the delivery moves to dead. We keep the delivery log for 30 days at Settings → Integrations → API → Webhooks → [webhook] → Deliveries - you can inspect the response body, status, headers, and replay it manually from there.

Receiver checklist

Things receivers commonly get wrong, in order of how often they bite us in support:
  • Respond fast. Acknowledge with 2xx within 10 seconds. Do the actual work in a background job.
  • Read the body raw. Frameworks that auto-parse JSON usually destroy whitespace and break the signature. Express: express.raw({ type: "application/json" }) before your JSON middleware.
  • Verify the signature. Always. Don’t trust IP allowlists alone.
  • Deduplicate by Productlane-Event-Id. Retries can re-deliver successful events if your endpoint replied slowly the first time.
  • Reject stale deliveries. If the signature timestamp is older than 5 minutes, return 400 - it’s an attempted replay.
  • Return 410 for permanently-gone endpoints. We don’t auto-disable webhooks based on status codes (yet), but the dashboard surfaces 410s prominently.

Local development

Use a tunnel (ngrok, Cloudflare tunnel) to expose your local server, register the tunnel URL as a webhook, then perform the corresponding action in Productlane (create a thread, add a comment, etc.) to fire real events at your endpoint.