powered by

Create plans and manage subscriptions

Updated Sep 30, 2026
Define subscription plans with trials and intervals, subscribe users, and cancel, resume or reassign subscriptions.

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.

Plans

In the Anythink dashboard

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.

With the CLI

There's no dedicated anythink pay plans subcommand. Manage plans with fetch against the AnythinkPay API:

bash
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 plans is a different, unrelated command — it lists Anythink's own hosting plans (storage, users, custom domain) for anythink projects create --plan, not AnythinkPay subscription plans. Don't confuse the two.

With an AI assistant (MCP)

text
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.

Templates (deprecated route)

/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.

Subscriptions

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.

In the Anythink dashboard

AnythinkPay › Subscriptions lists every subscription with its subscriber, plan, status and current period. Open one to:

  • See its Status and Events timeline (created, renewed, cancelled, refunded, plan changes).
  • Cancel — stops auto-renewal; the subscriber keeps access until the current period ends.
  • Resume — re-enables auto-renewal on a subscription that's cancelled but not yet expired.
  • Manage which users can see the subscription, under its Users list.

With the CLI

bash
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

With an AI assistant (MCP)

text
Cancel subscription 4c2f... for this project.

Subscription statuses

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.

Sharing a subscription

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:

http
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.

Admin recovery tools

Project administrators have three recovery endpoints for fixing a subscription record without touching Postgres by hand — useful after a support case:

http
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.

Permissions

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

Next steps

Create plans and manage subscriptions | Anythink Docs