Developer Changelog
Use our starter kit to build a Next.js app with Paddle Billing. Deploy to Vercel in a couple of clicks.
Make testing and integration easier by simulating webhooks for single events or predefined scenarios.
Link to the customer portal to let customers manage their own subscriptions and payments.
Let customers review their order details, enter their address and payment details, and complete purchase all on one page. Now in early access.
Sandbox emails now come from the paddle.com
domain, rather than withpaddle.com
.
When you create and send invoices, Paddle now generates unique bank transfer account numbers for each customer. This means invoices can be reconciled more efficiently.
Generate links that preauthorize a customer to perform actions inside the Paddle customer portal with customer portal sessions
You can use our Python SDK to streamline integrating with Paddle Billing. We released major version 1, which means breaking changes result in a new version.
Let customers save their payment details at checkout, then present customers with their saved payment details when they purchase in the future.
Let customers manage their own subscriptions, payments, and account information using the customer portal.
The Paddle API no longer returns notifications or events older than 90 days.
Extend your Apple Pay integration by letting customers launch the Apple Pay modal directly from your checkout. Verify your domain for Apple Pay to turn on.
Customers can now enter discount codes with any casing, for example blackfriday
, BLACKFRIDAY
, or blackFriday
. The Paddle API no longer treats codes against the discount entity as case-sensitive.
Pause subscriptions in trial at the end of the trial period. They move out of trial when they're resumed.
Make testing and integration easier by using webhook simulator to simulate webhooks for single events or predefined scenarios, like a new subscription or successful renewal.
Use our starter kit to build a Next.js app with Paddle Billing, including a localized pricing page, integrated inline checkout, and screens for customers to manage their payments. Deploy to Vercel in a couple of clicks.
For customer record keeping, Paddle automatically sends a credit note (sometimes called a credit memo) when you refund or credit a transaction. Use the new /adjustments/{adjustment_id}/credit-note
endpoint to generate them using the API.
Use a new query parameter to determine whether generated URLs for PDFs should download the file as an attachment saved locally, or open it inline in the browser.
You can use our Go SDK to streamline integrating with Paddle Billing. We released major version 1, which means breaking changes result in a new version.
Add recurring items to a subscription without having to add them to your product catalog by passing price or product attributes when updating a subscription.
When pausing subscriptions, past due renewal transactions are now automatically canceled. This means past due transactions for uncompleted billing periods are not automatically collected on resume.
Subscription items now return the related product object, useful for showing product name, image, and other information your frontend. The returned product is a snapshot of the product at the time it was added to the subscription.
Use do_not_bill
as the proration billing mode when changing a subscription billing frequency, like when customers upgrade to an annual plan from a monthly plan.
Paddle now automatically approves refunds every ten minutes for sandbox accounts, making testing easier. For live accounts, Paddle automatically approves refunds in some cases.
Paddle platform users in countries that use Australian or Canadian dollars can now hold their balance in their local currency, reducing FX fees for payouts.
Use the allowDiscountRemoval
parameter or data-allow-discount-removal
HTML data attribute when working with Paddle.js to hide the option to remove an applied discount at checkout.
Use our Go SDK to streamline integrating with Paddle Billing. Core operations are available now — including products, customers, and subscription management — with full feature parity with the API coming soon. Available now on GitHub.
Use Cancellation Flows where you haven't passed a customer to Paddle Retain.
Use our Python SDK to streamline integrating with Paddle Billing. Fully-featured from webhook verification to every API operation. Available now on GitHub.
The list notification settings operation is now paginated, making it easier work with a large number of notification settings.
Gather insights into why a customer wants to cancel and present them with dynamic salvage attempts while remaining fully compliant in regions with one-click cancellation legislation.
Build advanced, cart-style pricing pages or other pages that present overall totals using a new method in Paddle.js. No need to make server-side calls to the Paddle API.
Manually-collected subscriptions now become past_due
when payment terms against invoices for subscription renewals elapse.
Accept payments using Bancontact, the most popular payment method in Belgium. bancontact
is a new allowed value for method_details.type
for payments against a transaction.
Emails for sandbox accounts are only sent to your registered email domain. Where email addresses with other domains are used for testing, they'll be forwarded to the main email address for your account.
Distinguish between declined payments that should not be retried, and declined payments with no further information.
Use the customer_id
returned in address and business notifications to more easily work with addresses and businesses for a customer in the API.
Sandbox emails now come from the withpaddle.com
domain, so it's easier to filter them when testing.
Prorated changes to a subscription are now reflected on a transaction, rather than using separate adjustments. Item quantities, item amounts, and totals against a transaction may be negative, and there's a new credit_to_balance
field in transaction totals.
Export information about products, prices, and discounts as a spreadsheet to better understand your data using two new reports.
Use the new Paddle.Update()
method to update pwCustomer
and eventCallback
after you've initialized Paddle.js. Plus, Paddle.Initialize()
replaces Paddle.Setup()
.
You can use our PHP or Node.js SDKs to streamline integrating with Paddle Billing. We released 1.0.0
, which means breaking changes result in a new version.
Download an OpenAPI spec file for our API or fork our Postman collection to better work with the Paddle API programmatically.
Paddle Retain now supports using the same client-side tokens as Paddle Billing for authentication. There's no need to pass pwAuth
and a Retain API key to Paddle.Initialize()
anymore.
Products and prices now return created and updated dates, making them consistent with other entities in the Paddle API.
subscription.items[].price
now returns all fields against the price entity, rather than a subset of fields. The fields returned are a snapshot of the price at the time it was added to the subscription.
Paddle Checkout now shows preferred local currencies in some regions, instead of US Dollars. Existing subscriptions are not impacted.
More easily work with payment methods against a transaction payment attempt using the new payment_method_id
field. stored_payment_method_id
is now considered deprecated.
Use the new email
query parameter when listing customers to filter by email address.
Term Optimization is now available for Paddle Billing! Intelligently identify customers on a monthly plan who are likely to upgrade to a plan with a longer term length.
Use our PHP or Node.js SDKs to streamline integrating with Paddle Billing. Fully-featured from webhook verification to every API operation. Available now on GitHub.
Pass a new allowedPaymentMethods
parameter when opening a checkout using Paddle.js to choose which payment methods are presented to customers.
See which payment methods are valid for the prices and location passed to a price preview or a transaction preview using the new available_payment_methods
field in the API.
Bill a one-time item to a subscription without having to add it to your product catalog by passing price or product attributes.
Charge for an item without having to add it to your product catalog by passing price or product attributes when working with a transaction.
Upgrade a subscription, add items, bill for one-time changes, and change billing dates for a subscription even when payment fails by including the new on_payment_failure
property when updating a subscription.
Export data from your Paddle system using the API as well as the Paddle dashboard. Create reports using the /reports
endpoint, then download them using /reports/{report_id}/download-url
endpoint.
Get information about how an entity was imported with the new import_meta
object against products, prices, discounts, customers, addresses, businesses, and subscriptions.
Export information about transaction line items and adjustment line items as a spreadsheet to better understand your data and reconcile account activity.
Check you've installed Paddle.js with Retain correctly and see for yourself what Retain looks like using the new Paddle.Retain.demo()
method.
customer.business.name
no longer requires customer.address
, so you can prefill a business name at checkout even if you haven't captured address information yet.
Use the new origin
query parameter when listing transactions to filter by how they were created.
Merhaba! Paddle now supports the Turkish locale for Paddle Checkout and subscription emails. tr
is now an allowed value for the locale
parameter when passing settings to a checkout.
More easily distinguish emails sent from your sandbox account and your live account. Sandbox emails now include a [TEST]
prefix in the subject.
Cancellation Flows are now available for Paddle Billing! Use the new Paddle.Retain.initCancellationFlow()
method in Paddle.js to start a cancellation flow for a subscription.
Set names for prices and show them on checkouts, invoices, and emails from Paddle using the new name
field against price entities.
Include an object of custom_data
with requests when creating or updating discounts to store your own arbitrary key-value data.
Emails from Paddle when customers start a zero value subscription make it clear that they've saved a payment method. No receipt is sent. We also changed the wording when customers cancel these kinds of subscriptions.
Use the Paddle.PricePreview()
method in Paddle.js to build pricing pages without making server-side calls to the Paddle API.
Pass a client-side token to Paddle.Initialize()
to authenticate with Paddle.js. There's no need to pass your seller ID anymore.
Cardholder name is now returned in transaction.payments[].method_details.card
, so you can build billing information pages or integrations that show the name on the card used for a payment attempt.
Filter to see subscriptions with a scheduled change to pause, cancel, or resume using the scheduled_change_action
query parameter.
Pass an approved domain to checkout.url
when creating a transaction to specify an approved domain for the returned checkout link rather than using your default payment link.
Pass a list of subscription IDs when listing subscriptions using the id
query parameter to return subscriptions that match.
Pause or cancel a subscription right away, rather than at the end of the billing period. immediately
is now an accepted allowed value for effective_from
when sending a request to pause or cancel a subscription.
Use the new showAddTaxId
parameter or show-add-tax-id
HTML data attribute when working with Paddle.js to hide the option to add tax and business information at checkout.
Get a list of transactions that aren't related to a subscription by passing null
as a value for the subscription_id
query parameter when listing transactions. Use this to see transactions for single purchases.
List only automatically-collected or manually-collected subscriptions using the new collection_mode
query parameter.
Load Paddle.js as a module and use TypeScript definitions when working with its methods.
Pass items, discount, and customer information to the new Paddle.Checkout.updateCheckout()
method to update an open checkout.
Use the new showAddDiscounts
parameter or show-add-discount
HTML data attribute when working with Paddle.js to hide the option to add a discount at checkout.
Let customers pay for subscriptions using Apple Pay and Google Pay, with no engineering effort required on your part. You may see apple_pay
and google_pay
as values for transaction.payments[].method_details.type
when working with subscription-related transactions.
Listen to the new checkout.warning
event to get details about invalid or missing information passed to a checkout when opening, so you can handle problems in your frontend.
Create prices, discounts, transactions, and subscriptions in Colombian Peso. COP
is a new allowed value for currency_code
for payments.
Include an object of custom_data
with requests when creating or updating customers, addresses, and businesses to store your own arbitrary key-value data.
Subscribe to the new transaction.paid
event to get notified when a transaction is paid but not yet fully processed. transaction.completed
now include details of the related subscription and invoice number.
List credit balances for a customer using the new /customers/{customer_id}/credit-balances
endpoint to see how much credit a customer has to use, and how much credit they've previously used.
Send a request to the /subscriptions/{subscription_id}/activate
endpoint to immediately activate a trialing subscription.
Add or remove recurring items, change quantities, bill for one-time charges, and change the next billing date for subscriptions in trial.
Subscribe to notifications for payouts for Paddle to get notified when payouts are initiated (payout.created
) and when they're paid (payout.paid
.)
Subscribe to notifications for discount events to get notified when discounts are created (discount.created
) and when they're updated (discount.updated
.)
Check the new update_summary
object returned when previewing an update to a subscription or billing for a one-time charge to get an overview of any prorated credits and charges created as a result of the change.
Paddle Classic customers can now opt in to Paddle Billing to try the latest features. Paddle Billing shares some settings with Classic, but has its own data and API so your existing subscriptions and integration aren't impacted.
Present charge totals to a customer before billing a one-time charge to a subscription using the new /subscriptions/{id}/charge/preview
endpoint.
Get localized prices for a country, including taxes and discount calculation using the new /price-preview
endpoint. Paddle returns formatted prices, including currency symbol, so you can pass straight to your frontend.
Use the new subscription_charge
allowed value for the origin
field against a transaction to more easily determine why a transaction was created for a subscription.
Include an object of custom_data
with requests when creating or updating products and prices to store your own arbitrary key-value data.
Use the new /subscriptions/{subscription_id}/update-payment-method-transaction
endpoint to get a transaction that you can pass to Paddle.js to let customers update their payment details.
Filter to see recurring or one-time prices when using the list prices operation with the recurring
query parameter.
See how transaction totals and payout totals look after adjustments using the transaction.details.adjusted_totals
and transaction.details.adjusted_payout_totals
.
Use the adjustments_totals
include parameter to return a total for all the adjustments against a transaction, including a breakdown by adjustment action.
Resend a notification that's delivered
or failed
using the new /notifications/{notification_id}/replay
endpoint.
Find all notifications that relate to a customer, subscription, or transaction entity using the new filter
query parameter. Plus, filter notifications by date period using the from
and to
parameters.
We added a new discountCode
parameter and data-discount-code
HTML data attribute to Paddle.js to let you pass a discount code when opening a checkout.
Get the amount that a customer has to pay more easily using the new transaction.details.totals.grand_total
field against totals for a transaction. It's especially useful for completed transactions.