Sources checked 6 November 2026 ยท Official Stripe documentation reviewed
When should recurring affiliate commissions stop after a Stripe subscription cancellation?
Short answer: Do not stop recurring affiliate commissions merely because a customer schedules a cancellation. Stripe sends customer.subscription.updated when a subscription is changed, including when cancel_at_period_end is set to true. It sends customer.subscription.deleted when the subscription actually ends. Your affiliate agreement must define which paid invoices qualify, what happens to commissions already earned, and how refunds or chargebacks are handled. Stripe supplies billing events; it does not decide affiliate commission eligibility.
This distinction prevents two common errors: removing a partner’s future commission before the customer’s paid period has ended, and continuing to accrue recurring commission after the subscription has terminated.
Understand the three Stripe cancellation paths
Stripe supports immediate cancellation, cancellation at the end of the current billing period, and cancellation on a custom date. The timing affects when the subscription ends and when your commission ledger should stop considering future billing activity.
| Cancellation path | What happens in Stripe | Affiliate-system response |
|---|---|---|
| Immediate | The subscription ends immediately. Stripe documents customer.subscription.deleted for the cancellation. |
Stop future recurring accrual once the ended state is confirmed. Review existing commissions separately under the published refund and clawback terms. |
| At period end | Setting cancel_at_period_end to true updates the subscription, but the customer keeps the paid subscription through the period. The subscription ends when that period finishes. |
Record the scheduled end date. Do not treat the scheduling event as an immediate commission reversal. Stop future accrual when the subscription actually ends. |
| Custom date | Setting cancel_at schedules a future timestamp. A date that shortens the current period can change proration and invoice behavior. |
Use the effective cancellation timestamp and the invoice’s eligible amount and period. Do not assume every custom date equals the original renewal date. |
Stripe also allows a pending end-of-period cancellation to be reversed by setting cancel_at_period_end back to false, provided the subscription has not yet reached its end. A commission system that permanently closes a partner relationship as soon as it sees the first cancellation request can therefore make an incorrect decision.
See Stripe’s official subscription cancellation guide for the supported cancellation paths and API behavior.
Use the correct webhook events
A cancellation request and an ended subscription are different lifecycle states. Subscribe to the event types your integration needs and evaluate the current subscription state before changing commission eligibility.
| Event | What it tells your system | Recommended commission action |
|---|---|---|
invoice.paid |
An invoice payment attempt succeeded or the invoice was marked paid out of band. | Evaluate the invoice against the commission policy. Check the amount, invoice status, subscription mapping and whether an out-of-band payment is eligible under your rules. |
customer.subscription.updated |
The subscription changed. This includes a scheduled cancellation, a cleared cancellation flag or other subscription updates. | Refresh the stored subscription state and effective end date. Do not issue a clawback simply because this event arrived. |
customer.subscription.deleted |
The subscription has ended, whether through immediate cancellation or after a scheduled period-end cancellation. | Mark the subscription ended and stop future recurring commission accrual. Reconcile any invoice or usage activity that remains eligible under the agreement. |
| Refund or dispute events | A payment may have been refunded, reversed or disputed independently of the subscription’s cancellation state. | Apply the documented refund, reserve and clawback rules to the affected transaction. Do not treat cancellation itself as proof that a refund occurred. |
Stripe’s cancellation event documentation explicitly distinguishes the subscription update from the event sent when the subscription is canceled. Its event catalog describes invoice and subscription event types. An invoice.paid event can also represent an invoice marked paid out of band, so a program that pays commissions only on collected funds should inspect the payment details rather than treating every paid status as identical.
Write the commission cutoff rule before implementing it
Stripe does not define whether an affiliate earns one commission, a fixed number of recurring commissions or a lifetime share. Put the commercial rule in the partner agreement first, then map it to billing events. The following models require different handling.
First-payment commission
If the partner earns a reward only on the first eligible payment, a later cancellation normally stops future subscription activity but does not automatically erase the commission already earned. Your terms may allow a reversal for a qualifying refund, fraud or chargeback. Keep that decision separate from the cancellation event.
Recurring commission
If the partner earns a share of eligible renewals, calculate each commission from the invoice or payment event that satisfies the agreement. A scheduled cancellation does not create a new commission and does not itself reverse a previously paid invoice. Once the subscription ends, do not accrue a commission for a renewal that never becomes eligible.
Usage-based or prorated billing
Usage reported before cancellation may still appear on a final invoice, and Stripe documents that pending prorations and usage can have different treatment depending on how cancellation is configured. Define whether the partner earns on metered usage, prorated credits, final invoices and one-off adjustments. Calculate the commission from the eligible invoice lines or net amount specified in your terms, not from a subscription status alone.
For a deeper policy framework, see the SaaS affiliate commission approval workflow, affiliate commission clawbacks and recurring affiliate commission tracking guides.
Worked example: a cancellation scheduled before renewal
Assume a customer pays for a monthly SaaS subscription on 1 November. The customer schedules cancellation on 10 November, with the paid period ending on 1 December. The program pays a recurring commission only on eligible paid invoices.
- On 1 November, the eligible invoice is paid. The affiliate system records the invoice ID, subscription ID, partner ID, eligible revenue and commission status.
- On 10 November, Stripe sends
customer.subscription.updatedwith the scheduled cancellation state. The affiliate system records the intended end date but does not reverse the 1 November commission. - If the customer reverses the scheduled cancellation before the period ends, the next subscription update changes the stored state. The partner relationship remains eligible under the program’s normal rules.
- If the cancellation remains in place, Stripe sends
customer.subscription.deletedwhen the subscription ends. The system stops future recurring accrual for that subscription. - The 1 November commission remains subject to the normal approval or refund-hold period. It is not automatically clawed back just because the customer chose not to renew.
This is an illustrative timeline, not a promise about a specific customer’s billing dates. Your system should use the actual event payload, invoice period and current subscription state.
Implementation pattern for a reliable affiliate ledger
Keep attribution, billing eligibility and commission accounting as separate records. A practical ledger should retain at least:
- Affiliate or partner ID and the original attribution record.
- Stripe customer ID, subscription ID, subscription-item ID and invoice ID.
- Event ID, event type, event creation time and the webhook API version.
- Subscription status,
cancel_at_period_end,cancel_atand the confirmed effective end timestamp. - Invoice amount, currency, payment state, eligible period and any refund, credit or dispute adjustment.
- Commission amount, rule version, approval state, payout reference and adjustment history.
Process the following sequence:
- Verify the webhook. Validate the
Stripe-Signatureagainst the unmodified raw request body and the endpoint’s signing secret before changing financial records. - Deduplicate deliveries. Store processed event IDs and make each ledger mutation idempotent. Stripe notes that the same event can arrive more than once and that distinct events are not guaranteed to arrive in creation order.
- Read the current object when necessary. A webhook is a notification, not a substitute for your current billing record. Retrieve the latest subscription or invoice when event order or a stale snapshot could change the decision.
- Calculate commission from eligible billing activity. Use the invoice and payment facts required by the partner agreement. Do not create or reverse a commission solely because a subscription update arrived.
- Apply cancellation state separately. Record the scheduled end when cancellation is requested, then stop future recurring accrual when the subscription has actually ended.
- Reconcile adjustments. Match refunds, credits, disputes and payout records to the original commission. Preserve an audit trail rather than overwriting the original calculation.
Stripe recommends signature verification, tracking event IDs, handling events asynchronously and avoiding assumptions about delivery order in its webhook integration guide.
For adjacent Stripe billing states, see the failed-payment commission hold guide, the invoice finalized versus paid guide, and the subscription plan-change attribution guide.
Important API-version detail: billing periods moved to subscription items
Do not copy old Stripe examples without checking the API version configured for your account and webhook destination. For API version 2025-03-31.basil, Stripe removed current_period_start and current_period_end from the top-level Subscription object and moved those billing-period fields to each Subscription Item. Read the relevant item’s current_period_end rather than assuming subscription.current_period_end is available.
This matters when a subscription has multiple items or when a custom cancellation date changes an item’s billing period. Store the API version with each event and use the corresponding object schema. Stripe documents the change in its Basil API changelog.
Cancellation test cases before launch
- Immediate cancellation before the next renewal.
- Cancellation scheduled for period end, followed by the customer reversing it.
- Cancellation scheduled for period end and allowed to complete.
- A custom
cancel_atdate that shortens a billing period. - A final invoice containing usage or prorated line items.
- An invoice that is paid out of band rather than through a successful payment attempt.
- A refund or dispute before commission approval and another after payout.
- Duplicate webhook delivery and events received out of order.
- A subscription with multiple items and item-level billing periods.
Use a Stripe sandbox and Stripe test clocks to exercise the lifecycle without waiting for real billing cycles. Review the resulting event deliveries and reconcile the test invoices against the affiliate ledger before enabling the production workflow.
Frequently asked questions
Does customer.subscription.updated mean the affiliate commission should stop?
No. The event covers many subscription changes, including a scheduled cancellation. Check the subscription’s current state and the program’s commission rule. A scheduled end is not the same as an ended subscription.
Does customer.subscription.deleted reverse commissions already earned?
No automatic affiliate reversal follows from that event. It signals that the subscription ended. Apply any reversal only when the partner agreement and the related refund, credit or dispute facts justify it.
Should recurring commission be calculated from subscription events?
Usually, the payment or invoice record is the better basis when the agreement rewards successful paid revenue. Subscription events describe lifecycle state; they do not prove that an invoice was paid or that a particular amount is commissionable.
Can a customer undo a scheduled Stripe cancellation?
Yes. Stripe documents that a pending end-of-period cancellation can be stopped by setting cancel_at_period_end to false before the subscription reaches its end. A subscription that has already been canceled cannot be reactivated.
Sources and editorial method
- Stripe: Cancel subscriptions and identify cancellation events
- Stripe: Update a subscription
- Stripe: Event types, including subscription and invoice events
- Stripe: Webhook security, delivery and event handling
- Stripe: Subscription item-level billing-period change
- Stripe: Test Billing integrations with sandbox simulations and test clocks
This is documentation-based technical guidance, not a tested Stripe integration or legal, accounting or tax advice. No vendor paid for placement. No hands-on implementation is claimed. Define commission, refund and payout terms with appropriate commercial and legal review before changing live partner balances.