Action guide
Capture the reason when a customer leaves
POST
/v1/events · subscription.cancelledEmit 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.
| Key | Purpose |
|---|---|
reason | too_expensive, missing_feature, switching_tools, not_using, other |
comment | Free-form comment left by the customer |
atPeriodEnd | Whether the cancellation takes effect at period end |
Suggested retention
Keep forever, cancellation reasons are churn gold.