Connect Paddle
Checkout Sync works with Paddle Billing (the current Paddle). Paddle's webhooks don't include the buyer's email, so we need a key that can look it up. With that key we also add the webhook for you.
- In Paddle, open Developer tools → Authentication.
- Press New API key and name it Checkout Sync.
- Expires at: Paddle fills in 90 days. Open the calendar and pick a date further out (up to a year), so the sync doesn't stop in three months. We'll also warn you in your settings before it ends, as soon as Paddle tells us.
- Give it these permissions and leave the rest off:
Leave everything else (description, Rotatable) as it is.Permission Access Why Customers Read To find the buyer's email and name Subscriptions Read To name the product on cancellations, and for the update-card link on failed payments Transactions Read To import your past customers, only when you ask Notification settings Write To add (and later remove) our webhook - Save, copy the key (it starts with
pdl_live_apikey_) and paste it into your settings under Paddle.
You'll see a new notification destination called Checkout Sync (sends sales to MailerLite) in Paddle under Events → Notifications. Press Disconnect in your settings and we delete it again.
Test it
Paddle's webhook simulator (Developer tools → Simulations) works with Checkout Sync. Simulated events use made-up customers, so they show as Skipped in your activity list, which still proves the connection works. If you edit a simulation to use one of your real customers, it goes all the way to MailerLite, but simulator events never count toward your plan or the month's numbers. A real or sandbox purchase goes all the way to MailerLite. A sandbox key starts with pdl_sdbx_apikey_, and sandbox sales don't count toward your plan.
The update-card link
When a Paddle renewal fails, we ask Paddle for that subscription's update-card link and put it in {$checkout_update_payment_url}. It looks like https://customer-portal.paddle.com/cpl_…?action=update_subscription_payment_method&subscription_id=sub_… and opens your Paddle customer portal on that subscription's card page.
Paddle adds a temporary sign-in token to these links and says not to store them, because the token expires (Paddle's sign-in tokens for the portal last 24 hours). So we keep the link without the token. It doesn't expire, which suits a reminder sent days later: the buyer enters their email, Paddle emails them a sign-in link, and they land on the card page. Test failed payment in your settings uses a real link from one of your subscriptions when we have one; until then it links to this section, so you can see where the link goes in your email.
Subscriptions made by Paddle's webhook simulator don't exist in Paddle, so they have no update-card link: a simulated failed payment shows Sent to MailerLite, no update-card link (on Free: No update-card link under the row's note). That's expected. Real and sandbox subscriptions do have one.
Good to know
- Free trials. When a trial starts (Paddle's $0 checkout), the buyer joins Customers and Bought: product right away, with
{$checkout_status}trialing and{$checkout_last_event}Started trial, so your welcome email goes out on day one. The first payment after the trial only updates the fields (status active), so nobody gets the welcome twice, and it counts as a sale on your plan. If we never saw the trial start (it began before you connected), the first payment is treated as the sale. - Names. Groups and
{$checkout_product}use the product's name, like Budget Club, on every event of a subscription. The price's name (Monthly, Yearly) goes in{$checkout_plan}(empty when the price has no name: we never use its internal description, which Paddle doesn't show to customers), so monthly and yearly members share one Bought: group. - Failed payments come with the buyer's own update-card link in
{$checkout_update_payment_url}(how it works). If Paddle gives us no link for a subscription, the row says Sent to MailerLite, no update-card link; add a fallback to the email. - Paddle doesn't send a receipt link, so
{$checkout_receipt_url}and{$checkout_manage_url}stay empty for Paddle. The order number is in{$checkout_order_number}. - A cancellation you schedule for the end of the period arrives straight away, with the last day of access in
{$checkout_ends_on}.{$checkout_status}stays active until access really ends. If the buyer takes the cancellation back, they leave Canceled, the end date is emptied and the last event reads Resumed. - Free orders ($0, like a 100% coupon or a free product) sync like sales with the amount $0.00, and never count toward your plan.
- Each Paddle event needs one lookup at Paddle to find the buyer. When Paddle asks us to slow down, the row shows Waiting with "Checking the buyer with Paddle; usually a few minutes" and goes through by itself.
- Paddle asks buyers for marketing consent at checkout. With the default setting, buyers who didn't tick it join your Not opted in group.
- Import past customers in your settings uses this same key. It reads your completed transactions and fills in each buyer's fields; it joins no groups unless you tick the box. MailerLite's anti-spam policy only lets you email buyers from the last 2 years without other permission, so if you tick the box, keep the range to a year or less ("Everything" is refused with it).