Checkout Syncfor MailerLite · by Tofu Labs
Checkout Sync forKitMailerLite

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.

  1. In Paddle, open Developer tools → Authentication.
  2. Press New API key and name it Checkout Sync.
  3. 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.
  4. Give it these permissions and leave the rest off:
    PermissionAccessWhy
    CustomersReadTo find the buyer's email and name
    SubscriptionsReadTo name the product on cancellations, and for the update-card link on failed payments
    TransactionsReadTo import your past customers, only when you ask
    Notification settingsWriteTo add (and later remove) our webhook
    Leave everything else (description, Rotatable) as it is.
  5. 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.

When a key is about to end, Paddle tells us ahead of time and your settings page shows a warning with the date. Make a new key with the same permissions and paste it in the box under Needs your attention: the sync carries on with no gap.

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.

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