How do I upgrade or downgrade a user’s plan?
Call/api/v1/subscription/change. The change request creates a new
subscription based on the original one, and any remaining amount from the
original subscription is applied to the new one — you do not need to cancel
and re-create manually.
- Track the result with
/api/v1/subscription/change/inquiry. - Waffo also pushes a
SUBSCRIPTION_CHANGE_NOTIFICATIONwhen the change completes.
What is the difference between change, update, and manage?
Amount updates are validated against your contract limits.
Can I charge different amounts in different periods?
Yes. Two mechanisms combine to cover tiered pricing and first-period offers:- Trial periods — set
trialPeriodAmountandnumberOfTrialPeriodwhen creating the subscription. Custom trial granularity is supported viatrialPeriodTypeandtrialPeriodInterval. - Scheduled amounts — configure per-period amounts for specific formal
periods (for example, a discounted first period), either at creation or
later through
/api/v1/subscription/update.
amount applies.
A deduction failed. What happens next?
Failed deductions are retried automatically according to the subscription’s retry strategy — you do not need to trigger retries yourself.- Every payment attempt, including failure reason, timestamp and retry details, is pushed through the subscription payment order notification.
- If you only care about the final outcome of each billing period, listen to
SUBSCRIPTION_PERIOD_CHANGED_NOTIFICATIONinstead — it fires once per period with the final result and skips intermediate retry events.
Which subscription notifications should I listen to?
For any notification, respond with
success after processing. If Waffo
receives failed or unknown, Waffo retries the notification on a back-off
schedule spread over the following day; see
Webhook retry for the schedule.
How does a user cancel a subscription?
Two paths:- Merchant-initiated — call
/api/v1/subscription/cancel. - User-initiated — redirect the user to the hosted management page
obtained from
/api/v1/subscription/manage, where they can view details and cancel. - Wallet-side — if the user revokes the payment authorization inside their wallet app, the wallet notifies Waffo. If the revoked method was the only one on the subscription, the subscription is cancelled automatically; if a backup method is available, that method becomes the default instead. This is reported to you through the subscription status notification, so treat the webhook — not your own records — as the source of truth for whether a subscription is still active.
Does Waffo support daily billing or cross-currency subscriptions?
Yes on both:DAILYis a supportedperiodType, alongside the other billing cycles.- Cross-currency subscriptions are supported via the
userCurrencyfield — the user pays in their local currency.
What should I pass in subscriptionManagementUrl?
subscriptionManagementUrl is documented as required on subscription create
and you should always send it. Be aware that the server does not currently
reject a request that omits it — an omission will not surface as a validation
error, it will surface later as a missing link in the customer emails that are
routed to your page. Point it at a page the user can open in a desktop
browser. An app
deeplink is a poor choice here: users who open it on a PC may not be able to
reach the page at all. You have three options:
- Build your own authenticated subscription management page and pass its URL.
- Wrap the hosted page Waffo returns from
/api/v1/subscription/managein a page of your own and pass that. - Use Waffo’s hosted management page directly.
I received a subscription notification, but an immediate query says the subscription is not ACTIVE
Subscription state is eventually consistent. When a notification arrives,
the internal state update can still be settling, so a query fired immediately
afterwards may return a status that is not yet ACTIVE. That is a read timing
effect, not a failed subscription.
Handle it like this:
- Do not treat the first inquiry result as final. Re-query after a short pause.
- Prefer the subscription status notification as your trigger for state changes, and use the inquiry to confirm rather than to decide.
Can the trial-period amount be the same as the regular amount?
No. At creationtrialPeriodAmount must be strictly lower than amount;
an equal value is rejected with a parameter error whose message reads
trial period amount should be less than subscription amount. Zero is a valid
trial amount (a free trial), so the accepted range is 0 ≤ trialPeriodAmount < amount.
If the trial is meant to shift the billing calendar without changing the price,
do not configure a trial at all — use startTime to defer the first charge,
or scheduledAmounts to price specific early periods.