If you've created an invoice in error, you can cancel it to say that it's no longer needed.
How it works
Invoices work using manually-collected transactions. These are transactions where the collection_mode is set to manual, which means that Paddle sends an invoice that customers must pay themselves by bank transfer or using Paddle Checkout.
You can change the status of a manually-collected transaction to canceled to mark it as canceled. When you cancel an invoice:
- It's no longer due, so customers don't need to pay it
- Links to pay the invoice using Paddle Checkout no longer work
- It doesn't count as revenue for your reports
- You can't uncancel it, or make any other changes to it
You can cancel manually-collected transactions that are draft, ready, billed (issued invoices), or past_due (overdue invoices). If a transaction is completed, meaning a customer has paid an invoice, you can create an adjustment to refund all or part of it instead.
Invoices that Paddle creates for a subscription, like renewal invoices or invoices for subscription changes and one-time charges, can only be canceled using the Paddle dashboard. Their origin starts with subscription_. If you try to cancel them using the API, Paddle returns a forbidden error.
Credit an invoice
You might be able to correct some errors on an issued invoice by creating a credit rather than canceling it.
For example, if you create and issue an invoice then want to remove an item, you can create an adjustment for the item you want to remove. Paddle automatically applies the credit to the issued invoice, so the amount the customer owes is reduced.
When you credit the full value of a transaction, it's marked as completed. It's no longer due.
Cancel an invoice
Send a PATCH request to the /transactions/{transaction_id} endpoint to update a manually-collected transaction, setting status to canceled in your request.
- Go to Paddle > Transactions.
- Use the search box and the Filter by drop-down to find a transaction you want to cancel.
- Click into the transaction, then click the menu and choose Cancel transaction
- Click Cancel transaction to confirm.
Set status to canceled in your request body. Don't include any other fields, or your request fails.
Transactions must be manually collected and draft, ready, billed, or past_due to cancel. You can't cancel invoices that Paddle created for a subscription using the API. Use list transactions with collection_mode=manual, origin=api,web, and status=draft,ready,billed,past_due to find transactions you can cancel using the API.
{ "status": "canceled"}{ "data": { "id": "txn_01j5dx3yajy2hc1p1xz808m92j", "status": "canceled", "customer_id": "ctm_01hv6y1jedq4p1n0yqn5ba3ky4", "address_id": "add_01hv8gq3318ktkfengj2r75gfx", "business_id": null, "custom_data": null, "origin": "api", "collection_mode": "manual", "subscription_id": null, "invoice_id": null, "invoice_number": null, "billing_details": { "enable_checkout": false, "payment_terms": { "interval": "day", "frequency": 14 }, "purchase_order_number": "PO-123", "additional_information": null }, "billing_period": { "starts_at": "2024-04-12T00:00:00Z", "ends_at": "2025-04-11T23:59:00Z" }, "currency_code": "USD", "discount_id": null, "created_at": "2024-08-16T15:32:53.640052Z", "updated_at": "2024-08-16T15:33:11.477353084Z", "billed_at": null, "items": [ { "price": { "id": "pri_01gsz91wy9k1yn7kx82aafwvea", "description": "Annual", "type": "standard", "name": "Annual (per seat)", "product_id": "pro_01gsz4vmqbjk3x4vvtafffd540", "billing_cycle": { "interval": "year", "frequency": 1 }, "trial_period": null, "tax_mode": "account_setting", "unit_price": { "amount": "50000", "currency_code": "USD" }, "unit_price_overrides": [], "custom_data": null, "quantity": { "minimum": 1, "maximum": 100 }, "status": "active", "created_at": "2023-02-23T13:57:54.249913Z", "updated_at": "2024-04-05T14:32:00.471447Z" }, "quantity": 20 }, { "price": { "id": "pri_01gsz96z29d88jrmsf2ztbfgjg", "description": "Annual (recurring addon)", "type": "standard", "name": "Annual (recurring addon)", "product_id": "pro_01gsz92krfzy3hcx5h5rtgnfwz", "billing_cycle": { "interval": "year", "frequency": 1 }, "trial_period": null, "tax_mode": "account_setting", "unit_price": { "amount": "300000", "currency_code": "USD" }, "unit_price_overrides": [], "custom_data": null, "quantity": { "minimum": 1, "maximum": 1 }, "status": "active", "created_at": "2023-02-23T14:00:40.265185Z", "updated_at": "2024-03-25T14:31:18.587603Z" }, "quantity": 1 }, { "price": { "id": "pri_01gsz98e27ak2tyhexptwc58yk", "description": "One-time addon", "type": "standard", "name": "One-time addon", "product_id": "pro_01gsz97mq9pa4fkyy0wqenepkz", "billing_cycle": null, "trial_period": null, "tax_mode": "account_setting", "unit_price": { "amount": "19900", "currency_code": "USD" }, "unit_price_overrides": [], "custom_data": null, "quantity": { "minimum": 1, "maximum": 1 }, "status": "active", "created_at": "2023-02-23T14:01:28.391712Z", "updated_at": "2024-04-09T07:23:10.921392Z" }, "quantity": 1 } ], "details": { "tax_rates_used": [ { "tax_rate": "0.08875", "totals": { "subtotal": "1319900", "discount": "0", "tax": "117141", "total": "1437041" } } ], "totals": { "subtotal": "1319900", "tax": "117141", "discount": "0", "total": "1437041", "grand_total": "1437041", "fee": null, "credit": "0", "credit_to_balance": "0", "balance": "1437041", "earnings": null, "currency_code": "USD" }, "adjusted_totals": { "subtotal": "1319900", "tax": "117141", "total": "1437041", "grand_total": "1437041", "fee": "0", "earnings": "0", "currency_code": "USD" }, "payout_totals": null, "adjusted_payout_totals": null, "line_items": [ { "id": "txnitm_01j5dx3yqvsgxtvrj6f0h6jw3t", "price_id": "pri_01gsz91wy9k1yn7kx82aafwvea", "quantity": 20, "totals": { "subtotal": "1000000", "tax": "88750", "discount": "0", "total": "1088750" }, "product": { "id": "pro_01gsz4vmqbjk3x4vvtafffd540", "name": "AeroEdit Enterprise", "description": "The ultimate solution for organizations, featuring all Pro capabilities plus multi-user support, advanced data storage capabilities, plus personalized onboarding, dedicated account management, and the ability to pay via invoice.", "type": "standard", "tax_category": "standard", "image_url": "https://paddle.s3.amazonaws.com/user/165798/Ws808ziTS76a6YbnMkiK_enterprise.png", "custom_data": { "features": { "aircraft_performance": true, "compliance_monitoring": true, "flight_log_management": true, "payment_by_invoice": true, "route_planning": true, "sso": true }, "suggested_addons": [], "upgrade_description": "Ready to reach new heights? Upgrade to enterprise to unlock single sign-on, payment by invoice, and dedicated account management." }, "status": "active", "created_at": "2023-02-23T12:44:34.923Z", "updated_at": "2024-04-05T15:58:28.309Z" }, "tax_rate": "0.08875", "unit_totals": { "subtotal": "50000", "tax": "4437", "discount": "0", "total": "54437" } }, { "id": "txnitm_01j5dx3yqvsgxtvrj6f2zckeq1", "price_id": "pri_01gsz96z29d88jrmsf2ztbfgjg", "quantity": 1, "totals": { "subtotal": "300000", "tax": "26625", "discount": "0", "total": "326625" }, "product": { "id": "pro_01gsz92krfzy3hcx5h5rtgnfwz", "name": "Reporting module", "description": "Get access to comprehensive reports and customizable analytics dashboards.", "type": "standard", "tax_category": "standard", "image_url": "https://paddle.s3.amazonaws.com/user/165798/qgyipKJwRtq98YNboipo_vip-support.png", "custom_data": null, "status": "active", "created_at": "2023-02-23T13:58:17.615Z", "updated_at": "2024-04-05T15:44:02.893Z" }, "tax_rate": "0.08875", "unit_totals": { "subtotal": "300000", "tax": "26625", "discount": "0", "total": "326625" } }, { "id": "txnitm_01j5dx3yqvsgxtvrj6fa55yjdt", "price_id": "pri_01gsz98e27ak2tyhexptwc58yk", "quantity": 1, "totals": { "subtotal": "19900", "tax": "1766", "discount": "0", "total": "21666" }, "product": { "id": "pro_01gsz97mq9pa4fkyy0wqenepkz", "name": "Custom domains", "description": "Make AeroEdit truly your own with custom domains. Custom domains reinforce your brand identity and make it easy for your team to access your account.", "type": "standard", "tax_category": "standard", "image_url": "https://paddle.s3.amazonaws.com/user/165798/XIG7UXoJQHmlIAiKcnkA_custom-domains.png", "custom_data": null, "status": "active", "created_at": "2023-02-23T14:01:02.441Z", "updated_at": "2024-04-05T15:43:28.971Z" }, "tax_rate": "0.08875", "unit_totals": { "subtotal": "19900", "tax": "1766", "discount": "0", "total": "21666" } } ] }, "payments": [], "checkout": { "url": null } }, "meta": { "request_id": "5b956e6a-a1a4-4796-baf0-ba4cd13f38f6" }}Cancel related subscription
Paddle automatically creates a subscription when you mark a manually-collected transaction as billed.
When you cancel an invoice, its related subscription isn't automatically canceled. The subscription keeps its current status. If it's active or past_due, a customer may still have access to your app, and Paddle sends a new invoice when the subscription renews.
Cancel using the Paddle dashboard or API
Use the Paddle dashboard or API to cancel the related subscription after you have canceled the transaction.
Build a workflow using webhooks
You can build a workflow to programmatically cancel subscriptions using webhooks:
- Subscribe to transaction canceled events
Create or update a notification destination, then subscribe totransaction.canceledevents. - Check that the transaction is manually collected and for a subscription
In thedatapayload for received events, check thatcollection_modeismanualand thatsubscription_idisn'tnull. This means the transaction is an issued invoice related to a subscription. - Extract subscription ID, then cancel
Extractsubscription_idfrom the data payload, then use the cancel a subscription operation to cancel.
Cancel open invoices for a canceled subscription
When you cancel a manually-collected subscription, Paddle doesn't cancel its invoices. Invoices that are billed or past_due stay open and due. If a customer pays one of these invoices, Paddle doesn't reactivate the subscription.
To cancel open invoices after you cancel a subscription:
- Invoices you created, where
originisapiorweb, can be canceled using the Paddle dashboard or API. - Invoices Paddle created for the subscription, like renewal invoices, can only be canceled using the Paddle dashboard.
Events
transaction.canceled | Occurs when a transaction is canceled. Its status field changes to canceled. |
Common errors
transaction_invalid_status_change |
| The status change you requested isn't valid from the transaction's current status. |
transaction_cannot_be_modified_and_canceled |
| You're canceling a transaction while also sending other fields to update, which isn't allowed. |
transaction_immutable_while_processing_payment |
| A payment attempt is in progress for this transaction, so it can't be updated right now. |
forbidden |
| The authentication method you used doesn't have permission to perform that request. |