Cancellation flow sessions reports contain information about each time a customer went through one of your Cancellation Flows, including the reason they gave for canceling, their feedback, what they decided on the salvage attempts and offers they saw, and how the session ended.
Use them to understand why customers cancel and how well your flows salvage subscriptions.
Cancellation flow sessions reports are available if the report is enabled on your account. They include sessions from the flows you manage under Paddle > Retain > Cancellation Flows only.
When to use
- Understand why customers cancel
See the cancellation reasons, satisfaction insights, and free-text feedback customers give, with the subscription and products each session relates to. - Measure how well your flows salvage subscriptions
Compare how many sessions were salvaged, failed to salvage, or were abandoned, which salvage attempts customers accepted, and how many accepted a salvage offer. - Automate reporting workflows
Generate reports via API to feed cancellation data into your own dashboards and business intelligence tools.
Report filters
When generating cancellation flow sessions reports, you can filter by:
| Field | Description | Use case |
|---|---|---|
cancellation_flow_session_created_at | Filter by the date range when sessions were created. Pass an RFC 3339 datetime string with a gte or lt operator, and combine two filters to scope to a specific range. If you don't pass a gte filter, the report includes sessions created in the month before it was generated. | Reporting on sessions for a specific period. |
cancellation_flow_id | Filter by cancellation flow. Pass one or more cancellation flow IDs, prefixed with cfl_. To find a flow's ID, generate a report without this filter and read it from the cancellation_flow_id column. | Reporting on specific cancellation flows. |
cancellation_flow_session_resolution | Filter by how sessions ended. Pass one or more of salvaged, failed_to_salvage, and abandoned. | Building a list of customers who canceled through a flow, or reviewing the sessions where a salvage attempt or offer worked. |
Which sessions are included
A session starts when a customer begins a cancellation flow. It appears in the report in the next daily update after it ends, with one of these resolutions:
salvaged: the customer accepted a salvage attempt or a salvage offer and kept their subscription.failed_to_salvage: the customer canceled their subscription. This includes cases where they accepted a salvage attempt, such as contacting support, and still went on to cancel. The cancellation can be scheduled for the end of the billing period, so the subscription may still beactiveortrialing. A customer who leaves the flow and then cancels another way shows asabandoned, notfailed_to_salvage.abandoned: the customer closed the flow, or stopped using it until the session timed out, before it ended in a salvage or a cancellation. Once a one-click cancellation is scheduled, the session can't end asabandoned.
Sessions that are still in progress aren't included. A session that timed out has no cancellation_flow_session_completed_at, and the customer can still come back to it. If they finish it, later reports show its new resolution.
How session details are recorded
A cancellation flow can try to keep a customer in two ways:
- Salvage attempt: an option to stay without a discount, such as pausing the subscription, switching plans, or contacting your support team. The flow picks one based on the customer's survey answers.
- Salvage offer: a temporary discount to stay. If you turn salvage offers on, the flow can present one when the customer doesn't accept the attempt.
cancellation_flow_session_salvage_offer_discount_percentage and cancellation_flow_session_salvage_offer_discount_max_recurring_intervals are set when the session starts, so they can have values even when cancellation_flow_session_is_salvage_offer_shown is false.
In regions that require one-click cancellation, customers can cancel at any point in the flow. Paddle can schedule the cancellation and keep the flow open, so the customer can still accept a salvage attempt or offer afterward. Those sessions have cancellation_flow_session_is_one_click_cancellation set to true.
When the flow can't stay open, such as when a subscription renews within 24 hours, a one-click cancellation ends the session straight away. A session with a scheduled one-click cancellation doesn't time out, so if the customer leaves without finishing the flow, it can stay in progress and isn't in the report.
product_id_list, price_id_list, subscription_billing_interval, subscription_billing_frequency, and customer_country_code describe the subscription as it was when the session started. If a customer switches plans as part of the flow, the report still shows the original plan they tried to cancel. product_name_list is the exception: it shows each product's current name.
Cancellation flow sessions reports are updated daily. customer_email holds each customer's current email address, so it may differ from the one they had when they went through the flow.
Report columns
Each row in the report is one cancellation flow session. Columns cover the session, the flow, what the customer said and decided, and the subscription they tried to cancel:
- Session: when the session started and ended, and how it was resolved, like
cancellation_flow_session_created_atandcancellation_flow_session_resolution. - Flow: which flow the customer went through and where, like
cancellation_flow_nameandcancellation_flow_session_channel. - Survey answers: what the customer told you, like
cancellation_flow_session_cancel_reasonandcancellation_flow_session_additional_feedback. - Salvage attempts and offers: what the flow presented and what the customer decided, like
cancellation_flow_session_salvage_attemptandcancellation_flow_session_salvage_offer_decision. - Customer: who the customer is, like
customer_idandcustomer_country_code. - Subscription: the subscription as it was when the session started, like
subscription_idandproduct_id_list.
Column headings on cancellation flow sessions reports mirror fields in the Paddle API. Data is provided in the following columns:
cflses_01jz8m2q4k7vx3t9bnc6rhd5ywcflses_.^cflses_[a-z\d]{26}$2026-11-03T14:21:12.340Zcancellation_flow_session_created_at filter matches on this column.2026-11-03T14:23:40.112Z2026-11-03T14:23:40.112Znull if the session timed out.cancellation_flow_session_resolution filter takes the same values.salvagedThe customer accepted a salvage attempt or a salvage offer and kept their subscription.failed_to_salvageThe customer canceled their subscription. This includes customers who accepted a salvage attempt, such as contacting support, and still went on to cancel. The cancellation can be scheduled for the end of the billing period, so the subscription may still beactiveortrialing.abandonedThe customer closed the flow, or stopped using it until the session timed out, before it ended in a salvage or a cancellation.
cfl_01jx4d7h2p9rk5wm3sbt8yq6nccfl_. The cancellation_flow_id filter matches on this column.^cfl_[a-z\d]{26}$portalThe customer went through the flow in the customer portal.in_appThe customer went through the flow outside the customer portal, such as in your app or website.
true if they accepted and the session ended salvaged. false if the flow had no one-click link, or if one-click cancellation closed the flow straight away.Too expensivenull if the customer didn't choose a reason.Easy to usenull if the customer didn't choose one.null if the customer didn't enter any feedback.cancellation_flow_session_salvage_offer_decision. null if the session ended before the customer answered the survey.pause_planThe customer was offered to pause their subscription.switch_planThe customer was offered to switch to a different plan.contact_supportThe customer was offered to contact your support team.calendar_inviteThe customer was offered a link to book a meeting with your team.noneThe flow didn't present a salvage attempt, either because the customer's survey answers don't map to one or because the mapped attempt isn't available for this customer.
+ Show all values− Hide values
null
null if the flow didn't present a salvage attempt, or if the customer left the flow without deciding.acceptedrejectednull
false.null if the customer didn't make a decision on a salvage offer.acceptedrejectednull
20 for 20% off. null if the customer wasn't eligible for a salvage offer, if no discount in the flow matched the subscription's billing cycle, or for sessions created before this column was added.null whenever cancellation_flow_session_salvage_offer_discount_percentage is null. The two are always set or null together.ctm_01grnn4zta5a1mf02jjze7y2ysctm_.^ctm_[a-z\d]{26}$USnull if Paddle couldn't look up the address at the time, or for sessions created before this column was added.sub_01h04vsc0qhwtsbsxh3422wjs4sub_.^sub_[a-z\d]{26}$subscription_billing_frequency, which says how many of these units each cycle spans. null for subscriptions that only have one-time prices or that have recurring prices on different billing cycles, or for sessions created before this column was added.dayBilling cycles are measured in days.weekBilling cycles are measured in weeks.monthBilling cycles are measured in months.yearBilling cycles are measured in years.
subscription_billing_interval units each billing cycle of the subscription spans, recorded when the session started. With an interval of month, 1 is monthly and 3 is quarterly. null if subscription_billing_interval is null. The two are always null together.pro_, recorded when the session started. [] for sessions created before this column was added.product_id_list, listed in the same order. These are the products' current names, so a renamed product shows its new name, including for earlier sessions. Holds an empty string for a product with no name.pri_, recorded when the session started. [] for sessions created before this column was added.price_id_list, listed in the same order and recorded when the session started. Holds an empty string for a price with no name.