> For the complete AppRefer docs index, see https://apprefer.com/llms.txt (every page as markdown) or https://apprefer.com/llms-full.txt (all docs in one file).

# Qualified trials

Send a trial start to ad networks only after the user has kept it for a while, so the networks learn from trials that are likely to pay.

## Why

Ad networks optimise toward the events you send them. Many people start a trial and cancel within minutes. If every trial start is sent, the network learns to find more of those people. Holding the event back until the trial has survived a short window gives the network a cleaner signal of purchase intent.

## How it works

| Step | What happens |
| --- | --- |
| 1\. Trial starts | A store notification (AppRefer Billing) or a RevenueCat webhook reports a new trial for an install attributed to an ad network. Instead of sending it, AppRefer holds it. |
| 2\. Hold | The trial waits for the delay you set (2 hours by default, 1 to 24 hours). |
| 3a. Still active | When the delay ends, AppRefer sends it as `qualified_trial` to the network that drove the install. |
| 3b. Cancelled | If the user cancels during the hold, the trial is disqualified and never sent. |
| 3c. Paid early | If a renewal or plan change arrives during the hold, the hold ends. The paid event is sent on its own, so no separate trial event is needed. |

Trials from organic installs and test-key (sandbox) purchases are never held. The hold applies to installs attributed to Meta, Google, TikTok and ChatGPT Ads.

## How cancellations are matched

A cancellation has to find the right held trial even when the user changed identity in between, and even when the store reports events out of order. AppRefer handles both:

-   **Across user IDs.** Apps often start a trial under an anonymous ID and log the user in before they cancel. A cancellation is matched to held trials by the install's attribution and by every ID the purchase knows about: the current app user ID, the original app user ID and all aliases.
-   **Cancellation before the trial.** A cancellation can arrive a second before the trial start it belongs to, when nothing is held yet. Every cancellation therefore also stamps the install's attribution with the time it happened (`lastCancellationAt`). When a held trial is due, AppRefer disqualifies it if that install has a cancellation from 10 minutes before the trial start onwards.

## What is sent

| Network | Event |
| --- | --- |
| Meta | StartTrial |
| TikTok | StartTrial |
| Google Ads | The conversion action you mapped to `qualified_trial` (nothing is sent without one) |
| ChatGPT Ads | trial\_started |

You can change the Meta and TikTok event in **Settings → Event mapping**. The original trial time is kept, and the qualified trial also appears as a `qualified_trial` event in your analytics. If the install is still waiting for the user's tracking answer, the event waits too (see [Tracking consent](https://apprefer.com/docs/attribution.md#tracking-consent)); if tracking was denied, it is recorded but not sent.

## Setup

1.  Open **Settings → App settings** for your app (admin role needed).
2.  Turn on **Qualified Trial**.
3.  Set the **delay** in hours, from 1 to 24. Most apps use 2 to 4 hours.

The same card shows how many trials qualified, were disqualified or are still pending, and the qualification rate.

> **Choosing the delay**
>
> A longer delay filters out more quick cancellations but gives the ad network its signal later. Look at when most cancellations happen in your app and pick a delay just after that.

---

Source: https://apprefer.com/docs/qualified-trials · Last updated: 2026-10-19
