A plan is the product you sell — name, price, interval and trial length. A subscription is one subscriber's instance of a plan. This page covers both in the dashboard, CLI and API.
If you're setting this up for the first time, Sell a subscription in 15 minutes walks through the same steps end to end.
AnythinkPay › Plans lists every plan, active or not. New plan and each plan's Edit page share the same form:
| Field | Notes |
|---|---|
| Plan name | Internal name, shown in the dashboard and CLI. |
| Subscription name | Customer-facing name — the name your app and Stripe show the subscriber. |
| Type | recurring for a subscription, or a one-off type for a single payment plan. |
| Amount, Billing period, Bill every | Price and interval — for example £9.99 every 1 month. |
| Trial period (days) | Days of access before the first charge. Leave at 0 for no trial. |
| Product name / Product description | Optional — what shows on the Stripe product if different from the plan's own name/description. |
| Reference | Optional free-text tag, useful for your own bookkeeping. |
| Apple product ID / Apple subscription group ID | Link this plan to an App Store Connect subscription product — see Verify Apple in-app purchases. |
| Tier rank | An integer used to compare plans (for example for upgrade/downgrade rules in offers) — higher is a better plan. |
| Active | Inactive plans stay visible for reporting but can't be subscribed to. |
Once Stripe Connect onboarding is complete, saving a plan whose price, currency, interval or product name/description changed re-syncs it to Stripe automatically — the plan page shows Synced to Stripe with the resulting Stripe product and price ids, or Not yet synced to Stripe if onboarding isn't done yet.
There's no dedicated anythink pay plans subcommand. Manage plans with fetch against the AnythinkPay API:
anythink fetch /integrations/anythinkpay/subscription-plans
anythink fetch /integrations/anythinkpay/subscription-plans/8
anythink fetch /integrations/anythinkpay/subscription-plans --method POST --body '{ ... }'
anythink fetch /integrations/anythinkpay/subscription-plans/8 --method PUT --body '{ ... }'
anythink fetch /integrations/anythinkpay/subscription-plans/8 --method DELETE
Note:
anythink plansis a different, unrelated command — it lists Anythink's own hosting plans (storage, users, custom domain) foranythink projects create --plan, not AnythinkPay subscription plans. Don't confuse the two.
List the active AnythinkPay subscription plans on this project.
Locally, this goes through the cli tool's fetch handler — see the note on the hosted tool in Sell a subscription in 15 minutes.
/org/{orgId}/integrations/anythinkpay/subscription-templates is kept as an alias of the plans endpoints for existing integrations — it's the same controller under the old name, marked deprecated in the OpenAPI spec. Use /subscription-plans for anything new.
A subscription is created against a plan's price and interval, and is linked to one or more Anythink users so row-level access can be granted or revoked without touching the billing provider.
AnythinkPay › Subscriptions lists every subscription with its subscriber, plan, status and current period. Open one to:
anythink fetch /integrations/anythinkpay/subscriptions
anythink fetch /integrations/anythinkpay/subscriptions/{id}
anythink fetch /integrations/anythinkpay/subscriptions/{id}/cancel --method POST
anythink fetch /integrations/anythinkpay/subscriptions/{id}/resume --method POST
anythink fetch /integrations/anythinkpay/subscriptions/{id}/events
Cancel subscription 4c2f... for this project.
| Status | Meaning | Grants access? |
|---|---|---|
trialing |
In its trial period | Yes |
active |
Paying, current period in progress | Yes |
grace_period |
Apple billing retry window, still entitled | Yes |
in_billing_retry / past_due |
Payment failed, provider retrying | Yes, until the current period ends |
cancelled |
Auto-renew off | Yes, until the current period ends, then falls out |
revoked |
Refunded or forcibly ended | No |
expired |
Period ended with no active subscription | No |
unpaid |
Stripe gave up retrying | No |
superseded |
Replaced by a newer subscription for the same product (Apple plan switches) | No — read the new subscription instead |
This table is the same rule How payments and subscriptions work and /me/entitlement use — see Offer codes, free trials and entitlements for the entitlement endpoint itself.
A subscription's Users list controls who can read it (and, for a non-readonly grant, who can cancel or resume it) — this is Anythink-side access control, not a billing-level seat count. Add or remove users with:
PUT /org/{orgId}/integrations/anythinkpay/subscriptions/{id}/users
{ "user_id": 61, "readonly": true }
DELETE /org/{orgId}/integrations/anythinkpay/subscriptions/{id}/users/{userId}
Adding a user needs anythink_subscription_plans:* at the project-administrator level; a subscriber can read their own subscriptions and the ones they've been granted access to without administrator rights.
Limit: This isn't team or per-seat billing — one Stripe/Apple purchase still has one payer. It's for sharing read access to an existing subscription (a household plan, a linked account), not for billing several users under one subscription.
Project administrators have three recovery endpoints for fixing a subscription record without touching Postgres by hand — useful after a support case:
POST /org/{orgId}/integrations/anythinkpay/subscriptions/{id}/admin/status
{ "status": "expired", "clear_period": true }
POST /org/{orgId}/integrations/anythinkpay/subscriptions/{id}/admin/relink
{ "user_id": 61 }
POST /org/{orgId}/integrations/anythinkpay/subscriptions/{id}/admin/resync
DELETE /org/{orgId}/integrations/anythinkpay/subscriptions/{id}/admin
admin/status forces a status (for example to manually expire a stuck subscription).admin/relink reassigns a subscription to a different user — fixes a wrong-user binding.admin/resync re-pulls live status from the provider. This only works for Stripe subscriptions today — Apple subscriptions return a 400 explaining that Apple resync needs the App Store Server API and isn't available yet.admin/{id} (DELETE) hard-deletes the subscription record and its user links. It doesn't cancel anything at Stripe or Apple — use this to clear a stuck or duplicate Anythink record, not to end a live subscription.| To | Permission |
|---|---|
| List and read plans | anythink_subscription_plans:read |
| Create, edit or delete plans | Project administrator |
| List and read subscriptions you're linked to | anythink_subscription_plans:read |
| Create a subscription | anythink_subscription_plans:read, standard user access |
| Cancel or resume a subscription you're linked to | Standard user access, non-readonly link |
| Manage a subscription's user list | Project administrator |
| Admin recovery endpoints | Project administrator |