A free trial lets a merchant use a plan for a set number of days before the first charge, a low-friction way to highlight your app’s features and win the subscription.
Setting a trial
Each plan can define a trial length in days. Set it on the plan when you create it; leave it empty for no trial. When a merchant subscribes to a plan with a trial, Shopify holds the recurring charge until the trial ends, at which point billing begins automatically unless they’ve cancelled.
The trial length is per plan, so you can offer a longer trial on a higher tier, or a trial on one plan and not another.
One trial per store
Each store gets a plan trial once per app. After a store has used it, every later subscribe from that store starts billing immediately, on any plan of your app. Cancelling, uninstalling, and installing again does not bring the trial back. The rule is scoped to the store and the app, so your other stores keep their own trial, and a store that used the trial on one of your apps still gets one on the next.
Shopify does not deduplicate trials on its own, so Meridian applies the rule at subscribe time. It asks Shopify for the plan’s trial length when the store has not used the trial yet, and for zero days when it has.
The trial is spent when the subscription becomes active, not when the merchant reaches Shopify’s confirmation screen. A merchant who declines the charge or closes the tab has spent nothing, and gets the full trial on their next attempt.
Free plans never spend the trial. A plan priced at zero has nothing to charge, so it activates without a Shopify charge and leaves the trial available for a paid plan later.
Trials on subscriptions you bill yourself
Everything above describes plans you publish through Meridian. If your app bills through the Shopify Billing API on its own, Meridian still learns about your subscriptions, and their trials, through the SDK.
At each authentication, afterAuth reads the shop’s active subscriptions from the Shopify Admin API with the access token your app already holds and reports their name, status, trial length and creation date. Shopify counts a trial from the subscription’s creation date, so that is what Meridian uses as the trial end: creation date plus trial days. Shopify’s own subscription webhook carries no trial length, which is why this step exists.
Once reported, an externally billed trial behaves like any other in Meridian: the store reads as Trial on the Stores screen, counts in the Trials report, marks the store’s one trial as used, and fires the trial expiring and trial expired automations.
A trial that starts after the install
afterAuth runs when the shop authenticates, and for a new store that is the install, before the merchant has seen your plans. Approving a charge on Shopify’s confirmation screen is not an authentication, so the subscription sync does not see the trial they just started. Shopify’s own subscription webhook is all Meridian receives then, and it carries no trial length, so the store reads Active and the Trials report stays empty.
How long that lasts depends on your offline tokens. With expiring offline tokens the shop authenticates again on its first embedded request after the 60-minute token lapses, so the trial shows up within about an hour. With non-expiring offline tokens the shop never authenticates again, and the trial never reaches Meridian by this path.
Report it yourself from the route the merchant lands on after approving the charge:
The trial is then in Meridian before the merchant is back in your app, on either kind of token, and the call is idempotent if they reload the page. See Reporting a trial the merchant just started.
Stores that installed before you upgraded the SDK
These stores are not picked up by a merchant opening the app. Shopify’s app libraries only run afterAuth when a shop has no stored session, its access token expires or its scopes change, so with non-expiring offline tokens they stay unknown to Meridian until they reinstall. Apps on expiring offline tokens re-authenticate once the 60-minute token lapses, so they are picked up within about an hour of the merchant next opening the app. For every other app, back those stores up with a one-off syncSubscriptions loop over your offline sessions. Refresh each session before the call instead of sending the access token you have stored: an expiring offline token that has lapsed answers 401 and the shop is skipped. See Syncing subscriptions on demand. The call is idempotent. Last modified on September 21, 2026