How it works
When a customer wants to change their subscription, you need to transition them from their current price point to the new one. To migrate a subscription, you need:subs_idof their current subscription.pp_identof the new price point.
Migration strategies
Migration can result in either immediate proration with a billing schedule change, or scheduling the new plan to start at the end of the current billing period. Choose a migration strategy for your use case:- delayed_start: Schedules the new subscription to start when the customer’s already-paid time ends. The customer keeps access to the old plan until that moment, then seamlessly switches to the new plan.
- price_prorate: Migrates to the new plan immediately. Unused time is credited toward the new plan’s first payment. Preview charges without executing the migration using the Dry Run setting.
strict_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.
The API response includes the migration_strategy field, which shows the strategy that was actually applied to the migration.
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 current$100/monthsubscription continues until it expires, and the new$5/daysubscription is created asUPCOMINGto start at the old subscription’s expiration.
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 lifetime plan would start only after the current monthly period ends, so the user wouldn’t get immediate access to their upgrade (even though they’re purchasing permanent access now).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 the difference
Migration examples
Use the following real-world migration examples to understand how subscription migration works.delayed_start
delayed_start

$10 / day plan to a $5 / day plan using delayed_start.What delayed_start does: it schedules the new subscription to start when the customer’s already-paid time ends. The customer keeps access to the old plan until that moment, then seamlessly switches to the new plan.Timeline2025-12-18 11:00 — Initial purchase
Customer purchases the initial subscription (
$10 / day).FunnelFox Billing fires a subscription - convertion webhook.2025-12-18 14:00 — Migration
You run migration with
delayed_start. FunnelFox Billing does two things:- Disables auto-renewal on the old subscription (it keeps
RECURRINGstatus, but also getsAUTORENEW_OFF). - Creates a new subscription in
UPCOMINGstate withstarted_atset to the end of the current paid period (here: 2025-12-19 11:00).
subscription - unsubscription for the old subscription and subscription - planning_postponed_subscription for the new subscription.2025-12-19 11:00 — New plan starts
The switch-over happens automatically:
- Old subscription transitions to
EXPIRED(asubscription - expirationwebhook is fired). - New subscription transitions from
UPCOMING→RECURRING(asubscription - convertionwebhook is fired). - The customer is charged
$5approximately 2 hours before the new paid period starts (anorderwebhook is fired).
- Step 1 — Initial purchase
- Step 2 — Migration
- Step 3 — New plan starts
subscription - convertionprice_prorate
price_prorate

$10 / day plan to a $15 / 3 days plan using price_prorate.What price_prorate does: it credits the unused time from the old subscription toward the first payment of the new plan. The customer is charged immediately for the new plan minus the prorated credit, and the new subscription starts right away.Timeline2025-12-18 11:00 — Initial purchase
Customer purchases the initial subscription (
$10 / day).FunnelFox Billing fires a subscription - convertion webhook and an order webhook charging the customer $10.The subscription enters RECURRING status.2025-12-18 17:00 — Migration with proration
You run migration with
price_prorate. FunnelFox Billing:- Calculates the unused time from the old subscription and credits it toward the new plan’s first payment.
- Charges the customer
$7.5(the prorated amount after applying the credit). - Immediately transitions the old subscription to
EXPIRED. - Immediately starts the new subscription in
RECURRINGstatus withstarted_atset to 2025-12-18 17:00.
- Old subscription:
subscription - unsubscriptionandsubscription - expiration - New subscription:
subscription - convertionandorder(charging$7.5)
- Step 1 — Initial purchase
- Step 2 — Migration with proration
subscription - convertionMigrate using FunnelFox Billing dashboard
You can migrate subscriptions directly from the Support Tool of your FunnelFox Billing dashboard:- Go to the Subscriptions section of the User Information page.
- Set up fields next to the Migrate button:
- Price Point: Subscription plan identifier to migrate to.
- Migration strategy: delayed_start or price_prorate. Learn about migration strategies.
- Dry Run: Enable if you want to preview proration without executing the migration.
- Reason: Optional migration reason code.
- Comment: Optional human-readable comment or reference (e.g., support ticket link).
- Click Migrate.

Migrate using FunnelFox Billing API
Subscription migration API in FunnelFox Billing requires the following parameters:subs_id: Current subscription identifier.pp_ident: The new price point identifier.
subs_id or oneoff_id.
Example request
Example request
Example response
Example response
