Verify a signature
MonetizeKit signs each delivery: HMAC-SHA256 over "{timestamp}.{rawBody}" using your endpoint secret, sent as X-MonetizeKit-Signature. Paste your values to compute and verify it — see the Webhooks guide for registering an endpoint and processing retried deliveries idempotently, and the Caching and Edge Evaluation guide for using these same events as cache-invalidation triggers.
customers
customer.created
A new customer was created in the workspace.
{ "id": "evt_sample_00000000", "type": "customer.created", "workspace_id": "ws_example", "created_at": "2026-06-14T00:00:00.000Z", "data": { "customerId": "cust_123", "customerName": "Acme Corp", "customerEmail": "ops@acme.test" }}customer.updated
A customer's attributes or plan changed.
{ "id": "evt_sample_00000000", "type": "customer.updated", "workspace_id": "ws_example", "created_at": "2026-06-14T00:00:00.000Z", "data": { "customerId": "cust_123", "changes": [ "plan" ] }}subscriptions
subscription.created
A customer subscribed to a plan.
{ "id": "evt_sample_00000000", "type": "subscription.created", "workspace_id": "ws_example", "created_at": "2026-06-14T00:00:00.000Z", "data": { "customerId": "cust_123", "subscriptionId": "sub_123", "planId": "plan_pro" }}subscription.updated
A subscription changed status, plan, or term.
{ "id": "evt_sample_00000000", "type": "subscription.updated", "workspace_id": "ws_example", "created_at": "2026-06-14T00:00:00.000Z", "data": { "subscriptionId": "sub_123", "status": "active", "planId": "plan_pro" }}subscription.canceled
A subscription was canceled.
{ "id": "evt_sample_00000000", "type": "subscription.canceled", "workspace_id": "ws_example", "created_at": "2026-06-14T00:00:00.000Z", "data": { "subscriptionId": "sub_123", "canceledAt": "2026-06-14T00:00:00.000Z" }}catalog
plan.created
A new plan was created (not yet published).
{ "id": "evt_sample_00000000", "type": "plan.created", "workspace_id": "ws_example", "created_at": "2026-06-14T00:00:00.000Z", "data": { "planId": "plan_pro", "status": "draft", "version": 1 }}plan.updated
A plan's definition changed (features, pricing, or limits).
{ "id": "evt_sample_00000000", "type": "plan.updated", "workspace_id": "ws_example", "created_at": "2026-06-14T00:00:00.000Z", "data": { "planId": "plan_pro", "version": 2 }}plan.published
A plan version was published.
{ "id": "evt_sample_00000000", "type": "plan.published", "workspace_id": "ws_example", "created_at": "2026-06-14T00:00:00.000Z", "data": { "planId": "plan_pro", "status": "published", "version": 3 }}plan.archived
A plan was archived and can no longer be assigned to new customers.
{ "id": "evt_sample_00000000", "type": "plan.archived", "workspace_id": "ws_example", "created_at": "2026-06-14T00:00:00.000Z", "data": { "planId": "plan_legacy", "status": "archived", "version": 4 }}feature.updated
A feature definition changed.
{ "id": "evt_sample_00000000", "type": "feature.updated", "workspace_id": "ws_example", "created_at": "2026-06-14T00:00:00.000Z", "data": { "featureId": "feat_seats", "key": "seats" }}feature.deleted
A feature definition was deleted.
{ "id": "evt_sample_00000000", "type": "feature.deleted", "workspace_id": "ws_example", "created_at": "2026-06-14T00:00:00.000Z", "data": { "featureId": "feat_legacy", "key": "legacy_feature" }}usage
usage.threshold
A customer crossed a soft or hard usage budget threshold.
{ "id": "evt_sample_00000000", "type": "usage.threshold", "workspace_id": "ws_example", "created_at": "2026-06-14T00:00:00.000Z", "data": { "customerId": "cust_123", "meterId": "meter_api", "thresholdValue": 100000, "currentUsage": 100250 }}credits
credit.granted
Credits were granted to a customer wallet.
{ "id": "evt_sample_00000000", "type": "credit.granted", "workspace_id": "ws_example", "created_at": "2026-06-14T00:00:00.000Z", "data": { "customerId": "cust_123", "amount": 500, "reason": "manual_grant" }}credit.depleted
A customer's credit balance reached zero.
{ "id": "evt_sample_00000000", "type": "credit.depleted", "workspace_id": "ws_example", "created_at": "2026-06-14T00:00:00.000Z", "data": { "customerId": "cust_123", "balance": 0 }}entitlements
entitlement.changed
A customer's effective entitlement for a feature changed (plan, add-on, or override).
{ "id": "evt_sample_00000000", "type": "entitlement.changed", "workspace_id": "ws_example", "created_at": "2026-06-14T00:00:00.000Z", "data": { "customerId": "cust_123", "featureKey": "seats", "allowed": true, "effectiveValue": 25 }}Activation funnel
Beyond the webhook events above, the embed SDK posts activation-funnel telemetry to the ingestion beacon POST /api/v1/events/funnel as visitors move through your pricing widget. Send widget_view when the pricing table mounts and checkout_started when the upgrade call-to-action is clicked; the activated stage is derived server-side from the MRR movement ledger and is never posted by the widget. The request body carries event (widget_view or checkout_started), sessionId (a stable anonymous id per widget mount), and an optional planId; a successful call returns 201 with the recorded event id. Authenticate this beacon with a browser-embedded publishable key — the one write that accepts one — which is exempt from the per-key scope check because it records only an anonymous, workspace-scoped funnel-telemetry row (plus the standard first-API-call activation telemetry the API layer records for any authenticated request) and touches no tenant business data or configuration. See Authentication for the publishable-key exception.