Skip to main content
POST
/
subscription
/
migration
Migrate a subscription to a new plan
curl --request POST \
  --url https://billing.funnelfox.com/{org_id}/v1/subscription/migration \
  --header 'Content-Type: application/json' \
  --data '{
  "reason": "",
  "comment": "",
  "external_id": "<string>",
  "subs_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
  "pp_ident": "<string>",
  "strategy": "price_prorate",
  "dry_run": false
}'
{
  "payment_result": {
    "action_required_token": "<string>",
    "checkout_status": "processing",
    "failed_message_for_user": "<string>",
    "order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
  },
  "charged_amount": 123,
  "subs_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
  "oneoff_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
Supports two migration strategies:
  • delayed_start - Unused time is converted to a free trial on the new plan
  • price_prorate - Unused time is credited toward the new plan’s first payment
If the requested strategy isn’t available, the system automatically uses the alternative. Use dry_run: true to preview charges without executing the migration. Supports migrations from subscription to subscription or subscription to lifetime purchases.

Path Parameters

org_id
string
required

Organization ID

Body

application/json
external_id
string
required

Your unique identifier for the user

Maximum length: 256
subs_id
string<uuid>
required
pp_ident
string
required

Unique identifier of the price point

Maximum length: 256
reason
string
default:""

Short reason code (e.g., "duplicate_payment", "unauthorized_charge")

Maximum length: 256
comment
string
default:""

Human-readable comment or reference (e.g., support ticket link)

Maximum length: 2048
strategy
enum<string>
Available options:
price_prorate,
delayed_start
dry_run
boolean
default:false

Response

200 - application/json
payment_result
object
charged_amount
subs_id
string<uuid> | null
oneoff_id
string<uuid> | null
I