Change Plan

This endpoint allows you to replace a subscriber’s current package with a new one (upgrade or downgrade). Plan transitions follow Zotlo’s billing logic, including prorated upgrades, cycle preservation options, and deferred downgrades.

The service operates using the POST method.

How Plan Changes Work

Upgrade

When switching to a more expensive plan, Zotlo processes the change based on the saveCycle parameter.

If saveCycle = true (Keep Billing Cycle)

  • The current billing cycle does not change, expireDate remains the same.

  • The unused portion of the current plan is credited.

  • The user pays only the price difference.

  • The new plan becomes active immediately after a successful charge.

  • If the charge fails → upgrade does not happen; current plan continues.

If saveCycle = false (Start New Cycle)

  • The current billing cycle is terminated immediately.

  • The unused amount is credited to the new plan.

  • A full charge for the new plan is attempted instantly.

  • A new billing cycle starts immediately with a new expire date.

  • If the charge fails → upgrade does not occur; the current plan continues unchanged.

circle-info

Note: Choosing saveCycle = false is ideal when you want users to “reset” into a new full cycle.

Downgrade

When switching to a cheaper plan:

  • The change never happens immediately.

  • The new plan activates at the next renewal.

  • The current billing cycle continues uninterrupted.

  • expireDate does not change.

  • No proration or credit calculation applies.

circle-info

Note: saveCycle is ignored for downgrades because downgrades always activate at the next renewal.

You can learn more about plan changes 👉 here

circle-info

Currency Matching Rule

The new plan must use the same currency defined for the subscriber’s country. Example: A subscriber using USD in the USA can only switch to another USD plan.

Discount Behavior on Plan Change

  • The unused value of remaining days is always calculated based on the actual amount paid by the customer. If the current subscription includes a discount, the discounted price is used.

  • keepDiscount parameter can be used to preserve the existing discount during an upgrade or downgrade.

    • true → current discount continues if the target plan supports it.

  • To apply a different discount, send discountCode . If a new discount is provided, the existing discount is overridden (only one discount can be active).

  • Discount cycles (redemption count) increase only on renewal, not during plan changes.

Method

POST

URL

Request Parameters

Field
Type
Description

subscriberId

Required

The email or phone number the user provided when starting the subscription.

packageId

Required

The ID of the current active package. A successful response is returned only if the user has a subscription for this package.

newPackageId

Required

Package ID to switch to

changeType

Required

upgrade or downgrade

saveCycle

Required

true → Upgrade with cycle continuity

false → Upgrade with a new billing cycle

(This parameter has no effect for downgrades)

keepDiscount

Optional

Indicates whether the current discount should be preserved during the plan change.

  • true → The existing discount is kept if the target plan supports it.

  • false → The existing discount is not preserved.

discountCode

Optional

The code of the discount to apply during the plan change (e.g., NEWYEAR26). If provided, the existing discount (if any) will be overridden.

subscriberIpAddress

Required

Subscriber’s IP address

redirectUrl

Optional

Required for 3DS flows, user is redirected here after authentication

platform

Optional

Example: web, ios, android

Sample Request

circle-info

You can find your AccessKey and AccessSecret in the Zotlo Panel under Developer Tools → API Keys

Sending ApplicationId is optional.

Successful Response

Key Response Fields

Field
Description

profile

Updated subscription profile after the change

package

Details of the new package and discount

response.isSuccess

Indicates whether any required payment was successful

card

Card information used for upgrade

expireDate

Updated expire date (only changes for successful upgrades)

Failed Response

All failed responses follow the same standard error format. (See: Error Handling)

Last updated