We are building a public app on Shopify App Pricing with hybrid plans: a recurring base charge plus a per-unit usage meter (tiered, graduated, with a $0 first tier as the included allowance) and a 7-day free trial. Usage is reported through the App Events endpoint (`POST /app/unstable/events`). We have verified the full flow end to end on development stores, including successful billed events.
Partner support confirmed several behaviors for us but identified the items below as undocumented and advised us to submit them together for an authoritative answer. We plan to build production billing on these behaviors, so we need answers we can rely on, ideally with the documentation updated to match.
Our test observations are included with each question so you can confirm or correct them.
0. Is unstable App Events acceptable for App Store review? (Our blocking question — we need this one in writing first.)
Is using the App Events API at the unstable version acceptable for a production app submitted for App Store review, given Shopify’s general versioning policy? The policy states unstable versions should not be used in production, yet App Events is only published at unstable and is documented as the production mechanism for usage-based billing under App Pricing. Partner support acknowledged this as a genuine conflict in Shopify’s published guidance and directed us here for a written answer. We are targeting App Store submission in roughly two weeks, so this question gates our launch.
1. First billing cycle after a free trial.
When a trial ends, does the first billing cycle start exactly at the trial end, or does it span the trial period? We ask because this determines whether an event timestamped during the trial can ever fall inside a cycle. Observed so far: a trialing subscription has `currentBillingCycle: null`, and a subscription with no trial gets an immediate 30-day cycle.
2. Is a PERIOD_CLOSED refusal terminal?
Events we submitted during a trial returned 202 at transport with billing result `PERIOD_CLOSED` (“Billing cycle is missing or incomplete”). Is that refusal permanent for that event? Does a transport-accepted but billing-refused event consume its idempotency key, or could the same key be resubmitted after a cycle opens?
3. Cycle assignment for late-arriving events.
Our delivery pipeline retries, so an event can arrive minutes or hours after the sale it represents. Is an event assigned to a cycle by its `timestamp` or by receipt time, and what tolerance applies near a cycle boundary? The only constraint we found documented is that timestamps cannot be more than 5 minutes in the future.
4. Billing result codes.
Is there a full enumeration of billing-event result codes (`PERIOD_CLOSED` and its peers) with their meanings? We need it to classify failures for alerting.
5. Negative event values against a $0 first tier.
The 2026-07-09 changelog says events accept negative values, and support confirmed negative values reduce billable quantity. With a graduated meter whose first tier is $0 (an included allowance): does a negative event restore allowance units or only reduce the quantity that has passed into the paid tier? Can a cycle’s total go negative, and if so what happens at invoicing?
6. Trial extension on App Pricing subscriptions.
`appSubscriptionTrialExtend` is documented only under manual pricing, but it worked against an App Pricing subscription in our testing (the extension was cumulative and `currentPeriodEnd` moved with it). Is the mutation supported for App Pricing subscriptions? Separately: can a trial be extended after it has lapsed? That is the case our sales team will actually hit.
7. Uninstall and reinstall during an active trial.
The docs cover the 180-day tracking of consumed trial days. Beyond that, what happens to the subscription contract and to metering when a merchant uninstalls and reinstalls while their trial is active?
8. Limits on the events endpoint.
Are there published rate limits, payload limits, or batching recommendations for `POST /app/unstable/events`?
9. Programmatic access to billing outcomes.
Support confirmed the endpoint always returns 202 at transport and that billing validation failures surface only in the Dev Dashboard, with no webhook and no API. Is a programmatic read of billing-event outcomes planned? Without one, our only production detection of billing failures is reconciling our own ledger against `activeSubscription.usage.quantity`.
10. Stability of App Events while it is `unstable`.
App Events is the only usage-billing mechanism for App Pricing apps, and it is published only at the `unstable` version, which Shopify’s versioning policy says not to use in production. Given production apps have no alternative: does Shopify commit to announcing breaking changes to App Events in the developer changelog with a migration window? Has App Events had any backwards-incompatible change since its introduction?