Free trials
A subscription price can start with a free trial of 7, 14 or 30 days. The buyer enters a card first, nothing is charged until the trial ends, and they can cancel from their UseThatApp dashboard at any time before then with no charge. Your app sees a trialing user as entitled from the first second, with is_trial set so you can show a banner — there is nothing extra to gate.
What you configure
On the manage hub's Versions & pricing panel each price row has a trial select: No trial, 7, 14 or 30 days. It is per price, so a monthly price can carry a trial while the annual price of the same version does not. The same value is trial_period_days in the MCP replace_versions payload: send null to remove a trial; a price row that leaves the key out keeps the trial the price already has.
- One trial per buyer per app. Trying the monthly price and then the annual one is one trial. A buyer who already used theirs is simply charged on the day; the hosted checkout tells them so. Cancelling and buying again does not reset it.
- Card up front. The trial starts only after a card is saved, so a trial converts with no second step from the buyer.
- No charge, no fee. The trial's first invoice is $0. Your payout and the platform fee begin with the first paid invoice when the trial converts; affiliate commissions do too.
- The buyer is told the deal before they start: "Free for 14 days, then $9.00/month. Cancel anytime before November 11 and you won't be charged." Their receipt repeats it, and three days before the first charge they get a reminder with the date and amount. Keep your own pricing page consistent with that — the seller terms require it.
What the Pricing API shows
Each price in the Pricing API carries trial_period_days: 7, 14, 30 or null. That is the offered trial, not a per-visitor answer — the API is anonymous and cached, so it cannot know who is asking. Render "14-day free trial" beside the price and let the buy link settle eligibility; a returning buyer sees "charged today" on the hosted checkout, never a dead end.
{
"public_id": "prc_9f2kq8w7",
"product_id": "prod_9XkKe2QGxN4Ttz1Rw7Ya",
"amount": "10.00",
"frequency": "month",
"trial_period_days": 14,
"buy_url": "https://www.usethatapp.com/buy/prc_9f2kq8w7/"
}What your app sees
The entitlement of a trialing user is entitled: true, status: "trialing" and is_trial: true, with period_end set to the date the trial converts — the first charge. The License Key API carries the same is_trial flag. Use it for an in-app "trial ends on …" banner; do not string-match status.
{
"entitled": true,
"version": "Pro",
"product_public_id": "prod_9XkKe2QGxN4Ttz1Rw7Ya",
"status": "trialing",
"is_free": false,
"is_trial": true,
"period_end": "2026-11-11"
}- Access ends the moment a canceled trial lapses. A buyer who cancels keeps
entitled: trueuntilperiod_end, then the entitlement drops. It is computed live on every call — never cache it pastperiod_end, and never pastcache_untilon the legacy endpoint. - Conversion is silent for you. When the trial converts,
statusbecomes"active",is_trialbecomesfalseandperiod_endmoves to the next renewal. Nothing to handle; there are no payment webhooks to build. - Legacy
get_versionintegrations get the paid version's name for the whole trial, exactly as a paying user would. They cannot tell a trial from a paid plan, which is fine for gating; move to the entitlement endpoint if you want the banner. - Switching plans mid-trial keeps the trial and its end date; the new price bills at conversion. A trial can never be restarted or extended by changing plans.
Testing it
The seller walkthrough of your own buy link previews the trial copy a buyer will see and creates nothing. To see a real trial convert without waiting, use a second account on a Stripe test clock — or simply watch is_trial and period_end on a real trial; the conversion changes nothing your app has to react to.
