Retention Offers
Retention offers are the incentives Windback shows to customers during the Cancel Flow. Each cancellation reason can have its own offer, so the customer sees something relevant to why they want to leave.How Offer Matching Works
When a customer submits a cancellation reason through the Cancel Flow, Windback looks up the retention offer configured for that reason. If an active offer exists, it is returned in the API response for your app to display. If no offer is configured (or the offer is inactive), the response returnsoffer: null and the cancellation proceeds without an intervention.
Offer Types
Windback supports five offer types:| Offer Type | Description | Use Case |
|---|---|---|
discount | A percentage discount applied to upcoming invoices | Customer says the product is too expensive |
extension | Free extra days added to the current billing period | Customer wants a temporary pause or more time |
downgrade | Move the customer to a lower-tier plan automatically | Customer is not using enough to justify current plan |
feature_unlock | Temporarily unlock a premium feature for the customer | Customer is missing a specific feature |
custom | Free-form offer with custom title and description | Any situation that doesn’t fit the standard types |
Offer Fields
| Field | Type | Required | Description |
|---|---|---|---|
offer_type | string | Yes | One of: discount, extension, downgrade, feature_unlock, custom |
title | string | Yes | Short headline shown to the customer (e.g., “Stay for 20% Less”) |
description | string | Yes | Longer explanation of the offer |
cta_button_text | string | Yes | Text for the accept button (e.g., “Apply Discount”) |
discount_percent | integer | No | Percentage discount (only for discount type, 1-100) |
extension_days | integer | No | Number of free days (only for extension type) |
is_active | boolean | Yes | Whether this offer is currently shown to customers |
Dashboard Configuration
You can configure retention offers in the dashboard without writing any code:- Go to Settings > Retention Offers in your project.
- Each cancellation reason is listed with its current offer (or “No offer configured”).
- Click a reason to create or edit its offer.
- Toggle
is_activeto enable or disable an offer without deleting it.
API Endpoints
List All Retention Offers
Create or Update an Offer
The
:reason path parameter must be one of the eight standard cancel reasons (e.g., too_expensive, missing_features). See the Cancel Flow docs for the full list.Delete an Offer
204 No Content on success. After deletion, customers who cancel with this reason will not see an offer.
Example Configuration
Here is a recommended offer for each cancellation reason:too_expensive
too_expensive
missing_features
missing_features
switched_to_competitor
switched_to_competitor
not_using_enough
not_using_enough
technical_issues
technical_issues
bad_support
bad_support
temporary_pause
temporary_pause
other
other
Best Practices
| Cancel Reason | Recommended Offer | Why It Works |
|---|---|---|
too_expensive | 20% discount | Directly addresses the cost objection without deep discounting |
missing_features | Feature unlock (14 days) | Lets the customer try before re-committing |
switched_to_competitor | 25% discount | Buys time to understand the competitive gap |
not_using_enough | Downgrade to a lighter plan | Reduces cost while keeping the customer in your ecosystem |
technical_issues | 30-day extension | Shows good faith while your team fixes the problem |
bad_support | 14-day extension + priority support | Addresses the root cause with a concrete improvement |
temporary_pause | 30-day extension | Exactly what the customer asked for |
other | Custom “book a call” | Opens a conversation to discover the real reason |
Analytics
Retention offer analytics — including acceptance rates, revenue saved per reason, and A/B test results — are coming soon. Today you can view offer outcomes in the Cancel Flow event log in the dashboard.