Skip to main content
Your account is always on a plan. The plan sets your default fees, your API limits and the features listed on it. These endpoints let your dashboard show the plans you can choose, change plan, renew, cancel, and read your billing history. How a plan is paid: These are two separate ways to pay for the plan. Card Payment is not a wallet top-up — it charges the card for the subscription only. No USD wallet balance is credited when you pay by card. When a renewal isn’t paid, your plan stays active for a grace period. Pay before it ends (wallet or card) to keep the plan; otherwise the account moves to its fallback plan, usually the free plan.

How to pay (wallet vs card)

Both methods use the same endpoints. Pass payment_method on quote, subscribe, and renew. Defaults to wallet when omitted. Check what is enabled for the account:
payment_methods is the short list (wallet, card). payment_options adds label, description, available, and unavailable_reason — use description in the UI so merchants see that Card Payment pays the plan directly and is not a wallet deposit. Custom-negotiated plan prices are wallet-only (card checkout always charges the catalog price).

Pay with USD wallet balance

  1. Fund the wallet — top up or collect pay-ins so the business USD wallet covers amount_due (see Pay-in / payout integration).
  2. Optional: quote — GET /v1/business/subscription/quote?plan_id={id}&payment_method=wallet to see amount_due, upgrade credit for unused time, and currency (always USD for standard plans).
  3. Subscribe or change plan — POST /v1/business/subscription/subscribe with payment_method: "wallet" and auto_renew: true (default) if you want automatic wallet renewal each period.
  1. Success — response data.action is activated (new plan or upgrade), renewed (same plan extended), or scheduled (downgrade at period end; nothing charged now). data.subscription.billing_method is wallet.
  2. Renew early or fix past due — POST /v1/business/subscription/renew with { "payment_method": "wallet" }. The USD wallet is debited for the current plan price (or awarded price if set on the subscription).
Wallet debits use the plan’s currency (USD). If balance is too low, the API returns 422 with Insufficient USD wallet balance: … — top up or switch to card. Automatic renewal (wallet): while auto_renew is true and billing is wallet, the scheduler debits USD each period. Turn it off with PUT /v1/business/subscription/auto-renew and renew manually before current_period_end.

Pay by Card Payment

Direct plan billing. The card is charged for the subscription (initial checkout and recurring renewals). Your USD wallet is unchanged — use wallet only if you intend to pay from an existing balance.
  1. Optional: quote — GET /v1/business/subscription/quote?plan_id={id}&payment_method=card. Upgrades charge the full catalog price (credit is always 0 for card).
  2. Start checkout — POST /v1/business/subscription/subscribe (or POST …/renew for the current plan) with payment_method: "card".
  1. Response — data.action is checkout. Send the user to data.checkout_url (on api.yativo.com, path /subscriptions/checkout/{token}). That page is the Yativo-hosted Card Payment checkout (Whop Elements); it does not redirect to Whop.
  2. After payment — the user returns to SUBSCRIPTION_RETURN_URL (default {WEB_URL}/settings/billing). Poll GET /v1/business/subscription until billing_method is card and plan.id matches. Activation is usually within seconds once payment is confirmed.
  3. Manage card — when billing_method is card, subscription.manage_card_url (signed, ~30 minutes) opens a page to update the card or download receipts.
Checkout links expire after checkout TTL minutes (default 60, configurable in admin Plans & Subscriptions → Settings). Calling subscribe again with card reuses an still-valid open link for the same plan. Renewals: Card Payment bills the saved card each period. If payment fails, status becomes past_due until grace ends; use renew with card (new checkout) or wallet to settle.

Card billing setup (operators / deploy)

Which Whop biz_… account is charged? Merchant card sales must not be created under the platform company. Subscription Card Payment must not be created under a merchant connected account. See App\Support\WhopPlatformCompany. Required environment (see .env.example and config/whop.php): How it works in code:
  • WhopPlanSync creates a hidden Whop product under WhopPlatformCompany::id() and one renewal variant per paid plan (plans.whop_variant_id).
  • SubscriptionManager::startCardCheckout() calls Whop createCheckoutConfiguration with account_id = WhopPlatformCompany::id() and plan_id = that variant.
  • Card Checkout charges use CheckoutService::chargeAccountId() → the order’s connected seller account.
  • Product id is stored in admin settings as subscriptions.whop_product_id (created on first sync). Run php artisan subscriptions:sync-plans after plan price changes.
Admin toggle (Plans & Subscriptions → Settings): USD wallet (allow_wallet). Card Payment is on for every active paid self-serve plan whenever WHOP_API_KEY is set (WhopPlanSync::configured()); each plan gets a processor variant automatically on save. Sandbox testing: use sandbox processor credentials and WHOP_ENV=sandbox; subscribe with payment_method: "card" and complete Card Payment checkout. Related guides:
  • Fee Schedule: GET /v1/fees shows the fees your current plan gives you. Lines priced by your plan have source: "plan".

Environments

All endpoints take Authorization: Bearer <token>. They act on the business account, whoever on the team calls them. Team members need Plans → view (team.plans.view) for GET endpoints and Plans → upgrade (team.plans.upgrade) for everything else.

Current subscription

A new account with no plan is put on the free plan the first time this endpoint is called.

Plans you can choose

  • change_type says what choosing the plan would do: new, renew, upgrade (takes effect now) or downgrade (takes effect at the end of the paid period).
  • is_custom: true marks a plan built for your account with your negotiated pricing. Only you see it.
  • contact_sales: true plans have price: null and can’t be bought here; ask your account manager.
  • A feature limit of -1 means unlimited.

Quote

Shows what a plan change costs before you commit.
When you upgrade and pay from the wallet, the unused part of your current paid period is credited (credit) and you pay amount_due. Card upgrades charge the full price and have credit: 0. A downgrade returns effective: "period_end" and amount_due: 0.

Subscribe, upgrade or downgrade

The response’s data.action tells you what happened:

Card checkout (summary)

See Pay by Card Payment for the full flow. In short: open checkout_url → card checkout → return to billing → poll until billing_method is card.

Renew now

Pays for the current plan immediately: early renewal while active (the new period starts when the current one ends), or settling a past_due / overdue plan.
Returns action: "renewed" (wallet) or action: "checkout" with a checkout_url (card). Free plans renew by themselves and return an error.

Cancel and resume

The plan stays active until current_period_end, then the account moves to the free plan. Nothing more is charged. subscription.cancel_at_period_end becomes true.
Turns renewal back on and drops any scheduled downgrade. Only possible before the period ends.
For wallet billing, false means the plan isn’t renewed from the wallet automatically; renew it yourself with POST /renew before it ends. For card billing it is the same as cancel / resume.

Billing history

Paginated, newest first:
status is succeeded, failed, pending or refunded. Failed wallet renewals appear with a failure_reason. Invoice payments recorded by Yativo show their invoice_number.
type is one of started, subscribed, upgraded, renewed, assigned, change_scheduled, cancel_scheduled, resumed, past_due, recovered, overdue, downgraded, ended, fallback, invoice_paid, extended, auto_renew_on, auto_renew_off. by is You, Yativo or Automatic.

Emails

The account owner is emailed when a plan activates or renews, a few days before a renewal, when a renewal fails (with the grace period end date), when a plan becomes overdue or is downgraded, and when a cancellation or downgrade is scheduled.

Service fee bills

Platform service fees (account maintenance, annual KYC/KYB, and similar) are billed separately from your plan subscription. Pending and partially paid bills appear only under /business/billing/*, never in transaction history. Same permissions as subscription endpoints: Plans → view (team.plans.view) for GET, Plans → upgrade (team.plans.upgrade) for card payment. Wallet collection runs automatically when configured; use card payment when you need to pay outstanding bills by card. See Fee Schedule for the rates that drive these bills.

Errors

Errors use the usual shape with HTTP 422 and a message you can show the user:

Older endpoints

GET /business/plans/current, GET /business/plans/all, POST /business/plans/subscribe/{plan_id} and PUT /business/plans/upgrade/{plan_id} still work and follow the same rules (wallet by default; pass payment_method: "card" to get a checkout_url). Use the endpoints above for new work.