---
title: "Cancel a scheduled plan change"
method: POST
path: "/organizations/{organizationId}/plan-change/cancel"
tags: ["Organizations"]
---

# Cancel a scheduled plan change

`POST /organizations/{organizationId}/plan-change/cancel`

## Request

- Base URL: `https://api.xfa.tech`
- URL: `https://api.xfa.tech/organizations/{organizationId}/plan-change/cancel`
- Auth: HTTP bearer

Withdraws a plan change scheduled for the next renewal date before it is applied, so the organization stays on its current plan. A change waiting for a checkout is not canceled here; the payment webhook clears it when the payment fails or is canceled.

## Path parameters

- `organizationId` string, required

## Response `200`

The canceled change, with status canceled

- PlanChangeResponse
  - `status` 'applied' | 'scheduled' | 'checkout_required' | 'blocked' | 'canceled'
  - `message` string
  - `error_code` string: Typed reason when billing refuses the checkout a confirm needs, passed through with billing's 4xx status: billing_email_invalid, checkout_return_url_invalid, checkout_return_url_not_allowed, checkout_request_invalid, payment_method_exists or payment_method_not_found. Absent on other responses.
  - `request_id` string
  - `change_id` string
  - `requested_at` string
  - `requested_by_email` string
  - `requested_by_user_id` string
  - `current_plan_name` string
  - `target_plan_name` string
  - `current_billing_cycle` 'monthly' | 'yearly'
  - `target_billing_cycle` 'monthly' | 'yearly'
  - `current_seats` integer
  - `target_seats` integer
  - `effective_date` string
  - `payment_method_required` boolean
  - `pending_checkout` boolean: True when the target plan is waiting for checkout/payment mandate completion and has not been applied.
  - `checkout_url` string
  - `hubspot_notification_required` boolean
  - `internal_notification_required` boolean
  - `has_partner_terms` boolean
  - `has_discount_terms` boolean
  - `pricing` PlanChangePricing
    - `currency` 'EUR' | 'USD' | 'GBP': Supported currencies
    - `unit_price` number, float
    - `recurring_amount` number, float
    - `billing_cycle` 'monthly' | 'yearly'
  - `upgrade_charge` PlanUpgradeCharge: What a paying organization owes for the rest of its current billing cycle when it upgrades mid-cycle: the unit price difference for the seats it pays for, pro-rated from the day the upgrade was applied to the next renewal, net of its discounts and before VAT. Invoiced by the next daily invoicing run. On a change that still waits for a checkout it is the amount as of the preview; the charge is computed again on the day the change applies.
    - `change_id` string
    - `from_plan` string
    - `to_plan` string
    - `applied_at` string: When the upgrade took effect, 20060102T150405 UTC
    - `cycle_start` string: The first day of the billing cycle the upgrade fell in, 20060102
    - `cycle_end` string: The last day of that cycle, 20060102
    - `seats` integer: The seats the difference is charged for (free users left out)
    - `unit_price_difference` number, float
    - `billing_cycle` 'monthly' | 'yearly'
    - `pro_rata` number, float: The fraction of the cycle that remained when the upgrade was applied
    - `amount` number, float: The net amount, discounts applied, before VAT
    - `discounts` object
      - `DiscountPercentage` number, float
      - `DiscountCodePercentage` number, float
      - `DiscountCodeID` string
    - `billed` boolean
    - `invoice_date` string: The key of the invoice once billed; empty when nothing was owed
  - `blockers` string[]

## Other responses

- `404`: No pending plan change
- `409`: The pending plan change is waiting for checkout

---

[API](https://skmtc.dev/xfa/apis/xfa-api.md) · [All operations](https://skmtc.dev/xfa/apis/xfa-api/llms.txt) · [OpenAPI document](https://skmtc.dev/xfa/apis/xfa-api/revisions/1a1be0e8972b?raw)
