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 billed (issued invoices) or ready. 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.
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. You don't need to include anything else.
Transactions must be manually collected and billed or ready to cancel. Use list transactions with collection_mode=manual and status=billed,ready to find eligible transactions.
{ "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. This means the subscription remains active, so a customer may still have access to your app. Paddle reinvoices for the subscription on renewal.
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.
Events
transaction.canceled | Occurs when a transaction is canceled. Its status field changes to canceled. |
Common errors
transaction_invalid_status_change |
| Invalid status change attempted |
transaction_immutable |
| You are trying to update a transaction which is not in the draft or ready state. |