Subscription management
To manage subscriptions:- Go to the Support Tool page.
- Search for a user or click on the User UUID under Latest payments.
- You will see sections with the following user details:
- User information: Shows user IDs, email address, user agent (browser), IP address, and creation date.
- Payments: Shows transactions and refund options.
- Subscriptions: Performs subscription management actions and shows subscription status.
- One-off: Shows lifetime subscription access.
- Webhook events: Shows events related to the user. Learn about Subscription engine webhook events.
Modify subscriptions
From the Subscription section, you can perform the following actions:Unsubscribe
Auto-renew becomes disabled, no additional charges occur. Premium access remains active until the end of the current paid period, then becomes deactivated.
Pause and Resume
Users can temporarily pause their subscriptions to delay future charges. The subscription resumes automatically after the set period or can be manually resumed via API. Premium access is not available during the pause.
Discount
After a subscription is purchased, you can apply discounts to future payments. Discounts are calculated as a percentage of the payment amount. You can also specify how many billing cycles the discount applies to. For example, set a 30% discount on all future payments, or a 50% discount on just the next two payments.
Defer Subscription
Defer subscription postpones the next charge date. This is useful when a user could not use the app and you want to compensate them for that time.The next payment date is pushed forward, giving the user free access for a set period. This helps maintain customer loyalty without issuing refunds or manually extending subscriptions.
Subscription status
To check a user’s subscription status, open the User Information page in the Support Tool. The Subscription section shows two key fields that tell you the current state and what happens next:
Status
The status field shows the current subscription state:- INTRO: The subscription is in its trial period.
- RECURRING: The trial is over and the subscription is active. Charges occur 2 hours before each billing cycle to ensure uninterrupted access.
- AUTORENEW_OFF: Auto-renewal is disabled. The subscription will end after the current period.
- PAUSED: The subscription is paused until a set date. Premium access is unavailable during this time.
- GRACE: Payment failed, but the user still has temporary access.
- RETRY: Payment failed and the system is retrying the charge.
- EXPIRED: The subscription has ended.

is_active webhook property is true when premium access is active, and false when it’s disabled.

Next check
The next_check field shows when the next subscription action will occur. What happens depends on the current status:| Status | What happens at next_check |
|---|---|
| INTRO | User is charged and the subscription converts to recurring |
| RECURRING | User is charged for the current billing cycle and the premium access is active |
| AUTORENEW_OFF | Subscription expires and premium access is revoked |
| PAUSED | Subscription resumes automatically |
| GRACE | System attempts to charge the user again |
| RETRY | System attempts to charge the user again |
| EXPIRED | No action (subscription fully stopped) |
A subscription can have multiple statuses simultaneously. When this happens, all corresponding actions occur at
next_check. For example, a subscription with both RECURRING and AUTORENEW_OFF statuses won’t charge again (auto-renewal is disabled), but the current premium access remains active until it expires.Track status changes
Track all subscription status changes to maintain your own analytics and stay up-to-date on user activity. Each status change creates an event that you can view in two places:- In the Webhook Events section on the user’s information page in the Support Tool.
- At your backend via webhook (if configured).

Subscription migration
You can switch an active subscription to a different Price Point (subscription plan) usingPOST /subscription/migration API endpoint or directly from your Support Tool.
To process migration in the Support Tool:
- Go to the Subscriptions section of the User Information page.
- Set up migration fields next to the Migrate button:
- Price Point to migrate to.
-
Migration strategy:
- price_prorate: Unused time is credited toward the new plan’s first payment.
- delayed_start: Unused time is converted to a free trial on the new plan.
- Dry Run: Enable to preview charges without executing the migration.
- Reason: Short reason code.
- Comment: Human-readable comment or reference (e.g., support ticket link).
- Click Migrate.

How migration strategy works
By default, if you select a migration strategy that can’t be applied to the specific scenario, the API returns a 400 error. You can setstrict_mode to false in the API request to automatically switch to the appropriate migration strategy when the selected one fails. The strict_mode parameter defaults to true.
Here are scenarios where the selected strategy would fail:
When price_prorate fails
When price_prorate fails
User has a
$100/month subscription. After 1 day, they want to downgrade to a $5/day plan.With price_prorate, the system would calculate the credit toward the first payment:- Unused value:
(29 days / 30 days) × $100 = $96.67 - New plan charge:
$5
$5 - $96.67 = -$91.67Since negative charges are impossible:- With
strict_mode: true(default): The migration fails with a 400 error - With
strict_mode: false: The strategy automatically switches todelayed_start—the new$5/dayplan starts immediately with a 29-day free trial, preserving the value of the unused time
When delayed_start fails
When delayed_start fails
User has a
$100/month subscription. After 1 day, they want to upgrade to a Lifetime plan for $120.With delayed_start, the unused time would be converted to a free trial, but this doesn’t make sense for a lifetime purchase (which is already permanent). The user would effectively lose their 29 days of already-paid access.This doesn’t make sense for the user, so:- With
strict_mode: true(default): The migration fails with a 400 error - With
strict_mode: false: The strategy automatically switches toprice_prorate:- Credit for unused time:
(29 days / 30 days) × $100 = $96.67 - Immediate charge:
$120 - $96.67 = $23.33 - The user gets lifetime access right away and only pays for the difference
- Credit for unused time:
One-off
To check if a user has been granted lifetime access, go to the One-off section. Lifetime access is permanent and can only be revoked if a full refund is issued.Payments
The Subscription engine handles payments end-to-end and includes built-in deduplication to prevent duplicate charges when users attempt to purchase a product they already own.One-click payment
Once a customer completes a purchase, their payment credentials are securely stored. This allows one-click payments for future purchases without re-entering details. This feature works for both one-off and subscription upsells, streamlining the checkout experience.Refunds
To process a refund, click any transaction under the Payments section. Subscription engine supports the following refund types:- Full Refund: Entire amount refunded; subscription immediately becomes
EXPIRED, one-off payment is revoked. - Partial Refund: Partial amount refunded; auto-renewal is disabled automatically.
- Soft Refund: Funds are refunded, but auto-renewal remains enabled. No effect on subscription or one-off purchase.
- Reason: Short reason for the refund.
- Comment: Custom support engineer comment (Jira task ID, ZenDesk ticket ID, etc.).
Free trials
To launch a free trial, you need to save the user’s payment information without charging their card. This is done through the Primary Workflow with the proper metadata configuration.- Create a client session with the special
metadataflagff_auto_cancel = true. - The Primary Workflow processes this flag:
- The card is authorized like a normal payment.
- Instead of completing the transaction, Primer cancels it.
- Result:
- No charge is made and no funds are withdrawn.
- The card data is saved for the first subscription renewal.
Payment method update
When a user has failed payment attempts and all retry stages are unsuccessful, you can direct them to an Update Payment Method page. This page can also be used anytime card information needs updating. How it works:- The user goes to a page that looks like a standard payment form
- It uses a special
update_payment_methodfunction designed only for card updates, not purchases - When entering a new card, authorization without charging is performed:
- The transaction is cancelled immediately after authorization
- The card data is saved for future charges
Disputes
When a dispute is initiated for any payment, the system automatically responds to minimize financial and reputational risks:- Auto-renewal is disabled immediately upon receiving a dispute
- Assumptions:
- The dispute will be automatically resolved in favor of the user
- Funds from the last transaction will be automatically refunded by the PSP
- No new subscription charges will be made, preventing future disputes
Retries
The retry logic is configurable per merchant.
Long (Smart) Retry schedule
For subscriptions with 7-day intervals or less:- Day 0 (billing problem detected): Activate grace period
- Day 2: Partial charge (70%)
- Day 7: Partial charge (50%)
- Day 0 (billing problem detected): Activate grace period
- Day 2: Full charge
- Day 7: Full charge, deactivate grace period
- Day 12: Partial charge (70%)
- Day 20: Partial charge (50%)
- Day 0 (billing problem detected): Activate grace period
- Day 2: Full charge
- Day 7: Full charge, deactivate grace period
- Day 12: Full charge
- Day 22: Partial charge (70%)
- Day 33: Partial charge (50%)
Short Retry schedule
For subscriptions with 7-day intervals or less:- Day 0 (billing problem detected): Activate grace period
- Day 2: Partial charge (70%)
- Day 0 (billing problem detected): Activate grace period
- Day 7: Partial charge (70%), deactivate grace period
- Day 20: Partial charge (50%)
- Day 0 (billing problem detected): Activate grace period
- Day 7: Full charge, deactivate grace period
- Day 15: Partial charge (70%)
- Day 33: Partial charge (50%)
