Skip to main content
Crovver can push subscription lifecycle events to HTTP endpoints you register. When a subscription is created, activated, renewed, or canceled — whether triggered manually from your dashboard or by a payment provider — Crovver signs a JSON payload and POSTs it to every active endpoint you’ve configured.

Setting Up an Endpoint

  1. Go to Developers → Webhooks in your Crovver dashboard
  2. Click + Add Endpoint
  3. Enter your HTTPS URL — e.g. https://api.your-app.com/webhooks/crovver
  4. Copy the signing secret shown — it is displayed only once and cannot be retrieved again
Your endpoint must respond with a 2xx status within 5 seconds. Any other response or a timeout is recorded as a failed delivery.

Event Envelope

Every event shares the same top-level structure:
data.external_tenant_id is the ID you provided when creating the tenant — use this to identify the user or workspace in your own system. data.tenant_name is the human-readable name for quick identification.

Events Reference

When a free trial ends and the first charge succeeds, both subscription.updated (status: trialing → active) and subscription.renewed (payment received) fire in sequence. These represent distinct state changes — handle them independently and use the top-level id to deduplicate if needed.

Verifying Signatures

Every request includes an X-Crovver-Signature header. Always verify it before processing the event.
The signature is HMAC-SHA256 of the raw request body using your endpoint’s signing secret.
Always verify the signature against the raw request body bytes — not a re-serialized version. JSON parsers may reorder keys, which will break the HMAC comparison.

Delivery & Retries

Crovver delivers each event once. If your endpoint is down or returns a non-2xx status, the delivery is recorded as failed. In Developers → Webhooks, click View Deliveries on any endpoint to see:
  • The full JSON payload that was sent
  • The HTTP status and response body your server returned
  • Attempt count and timestamp
Click Retry on any failed delivery to re-fire it with the same id — so your server can safely deduplicate.
Use the top-level id field as an idempotency key. Store processed event IDs and skip duplicates to handle retries safely.

Testing Locally

Use the Send Test button in your dashboard to fire a webhook.test event to any registered endpoint. The delivery and its payload will appear in the View Deliveries log immediately. To receive events on your local machine, expose it with a tunneling tool like ngrok:
Register the generated HTTPS URL as your endpoint — e.g. https://abc123.ngrok-free.app/webhooks/crovver — then use Send Test to verify your handler end-to-end before deploying.

Security Notes