Set up a test
- Open the campaign editor for the workflow you want to test
- Go to Revenue Recovery settings → A/B testing
- Turn on the A/B testing switch
- Configure 2 to 5 variants
- Save the campaign
RevenueCat variants use App Store offers. Apple discounts come from an
offer you create in App Store Connect, not a typed percentage. For a
RevenueCat test, choose an App Store offer for each variant from the offer
dropdown. If you need a different discount, the setup panel links you straight
to App Store Connect with the price point to create. It then mints the
redemption codes for you automatically. A test cannot start until every
variant has an offer with codes ready.
Once a test starts, its variants lock. The scripts and discount
percentages can’t be edited until the test is closed. This is intentional.
Changing a variant mid-test would mean some calls used the old version and
some the new. That makes it impossible to compare results fairly. If you want
to adjust anything, close the current test first, then start a new one,
or duplicate the closed test as a starting point.
A 0% variant behaves like a 0% flat offer on a live call, which is a
feedback-only conversation. It can’t extend an offer on resubscribe-link
recoveries, since there’s
no discount to attach to the link.
Read results
While a test is running, and after it’s closed, its results appear on the Revenue Recovery Analytics page. They sit in the Offer performance card, inside the Cancellation recovery view, broken down by variant:- The traffic split.
- How many calls went out.
- How many were saved.
- How many converted.
- The save rate.
- The revenue retained per month.
- The revenue collected from one-time win-back checkouts.
You may run recovery workflows for more than one trigger or provider. One
example is a Stripe cancellation flow alongside a Stripe trial flow, or
Stripe alongside RevenueCat. The Offer performance card then shows a row of
tabs above the table: All, plus one per workflow. The tabs are labeled
like Cancellation · Stripe or RevenueCat. You can then focus on a
single workflow’s results instead of reading them all blended together.
The tabs only appear once there’s more than one workflow’s worth of
results to split. Older results that predate this grouping fall under an
Earlier tab.
These are raw counts, not a statistical significance test. So hyzl doesn’t
yet tell you whether a difference between variants is large enough to be
meaningful rather than chance. At low call volumes especially, treat the
numbers as a directional signal, not a verdict.
Decide a test
Deciding a test, promoting a winner or relaunching with fewer variants, happens in one place: the Offer performance card on Analytics. Closing a test without deciding a winner is available in two places instead. One is Close test on that same Analytics card. The other is Close test in the campaign editor’s A/B panel. Either one asks you to confirm. Recovery calls then immediately go back to using the campaign’s flat win-back discount, and the variants unlock. You can then start a fresh test, or duplicate the closed one as a starting point.Promote a winner
Once you know how a test should end, click Promote winner on the Offer performance card (Analytics page). It is available any time a test is running. The dialog lets you choose variants, and what happens depends on how many you choose:- Choose one variant to promote it. The test ends immediately. That variant’s offer becomes the campaign’s standing win-back offer, along with its script if it has a custom one. The other variants stop being used.
- Choose two or more variants (but not all of them) to keep them and relaunch. The current test closes, and its results stay right where they are on Analytics. A new test starts immediately with only the variants you kept, split evenly across them. For example, keeping 2 out of 5 variants puts each of the survivors at 50% of new calls.
If a promoted variant had a script tweak attached, promoting it does not
copy that tweak into the campaign’s base script automatically. The
dialog calls this out, and you’ll need to copy it over yourself if you
want to keep it.
Relaunching starts a fresh test rather than reallocating traffic within the
current one, because changing a running test’s split mid-stream would
corrupt the comparison. A fresh test keeps every read on both tests honest.

