UseThatApp Logo

    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.

    prices response (excerpt)
    {
      "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.

    entitlement (trialing)
    {
      "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: true until period_end, then the entitlement drops. It is computed live on every call — never cache it past period_end, and never past cache_until on the legacy endpoint.
    • Conversion is silent for you. When the trial converts, status becomes "active", is_trial becomes false and period_end moves to the next renewal. Nothing to handle; there are no payment webhooks to build.
    • Legacy get_version integrations 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.

    AI agents: this site is fully pre-rendered — fetch /llms.txt for an indexed summary of every page, or /llms-full.txt for the whole documentation as one Markdown file.