Action guide

Capture the reason when a customer leaves

POST/v1/events · subscription.cancelled

Emit a `subscription.cancelled` event as soon as a customer asks to cancel, even before the period ends. Store the reason from your cancel flow if you have one.

When to emit

Right after the cancellation request is accepted, your customer is still in the middle of the flow, so you know exactly which reason they picked.

Example payload
await recalled.events.create({
  action: "subscription.cancelled",
  actor: { id: user.id, email: user.email },
  organization: user.organizationId,
  metadata: {
    reason: "value",
    comment: "value",
    atPeriodEnd: "value"
  },
});
Metadata to include

Keep metadata flat and consistent across your service so it plays well with search and CSV exports.

KeyPurpose
reasontoo_expensive, missing_feature, switching_tools, not_using, other
commentFree-form comment left by the customer
atPeriodEndWhether the cancellation takes effect at period end
Suggested retention

Keep forever, cancellation reasons are churn gold.

Related actions