Checkout Syncby Tofu Labs

How to use Checkout Sync with Kit

Checkout Sync sends what happens in your checkout to Kit: sales, refunds, cancellations and failed payments. Setup takes about five minutes. To start emails you need Kit's Creator or Creator Pro plan, because Kit runs Visual Automations on its paid plans only. On Kit's Free plan the app still records purchases, tags and custom fields.

1. Install the app

Install Checkout Sync by Tofu Labs from Kit and press Grant access. Kit then sends you to your Checkout Sync settings, where a short checklist walks you through the rest: connect your checkout, add a Checkout Sync event to an automation, send a test sale, and (optional) import past customers. If Kit leaves you on its own page instead, press App settings on Checkout Sync.

To come back to your settings later, open Apps → Manage in Kit and press App settings on Checkout Sync, or go to tofulabs.app/sync/settings and sign in with Kit.

2. Connect your checkout

Under Your checkouts, press Connect a checkout and pick yours. Each one has its own short guide:

CheckoutWhat you doWhat comes through
Lemon SqueezyPaste a URL and a secret into a new webhookSales, renewals, refunds, cancellations, failed payments
Paddle BillingPaste an API key; we add the webhookSales, renewals, refunds, cancellations, failed payments
PolarPaste a URL and a secret into a new webhookSales, renewals, refunds, cancellations, failed payments
StripePaste a restricted key; we add the webhookRefunds, cancellations, failed payments, and sales too if you switch them on (why it starts off)

You can connect more than one. When the first event arrives, the checkout's label turns green and the event shows under Recent activity.

Checkout Sync settings: this month's sales, refunds, failed payments and recovered payments, connected checkouts and recent activity
Your settings page (shown with sample data): this month's numbers, connected checkouts and what each recent event did.

3. Send a test sale

Next to each connected checkout, press Send a test sale or Test failed payment. It's a test sale (or failed payment) for your own Kit address, with an order number starting test-. Once that checkout has had two or more products sell, a Test with list appears beside the buttons with that checkout's products (your newest is picked to start with): an automation limited to one product only starts for a test of that product. The test uses the price that product last sold for. Before the first sale it uses "Sample product", and when we don't know a price it uses a sample price of $19.00; the message says so. After you press it, the page says Test sent to Kit for your address, and Why didn't it start? under it lists the usual reasons an automation stays quiet. What it does in Kit:

The test failed payment's update-card link opens this section (or your Polar portal, if you've added it). A real one opens the buyer's own update page. You can remove the Checkout Sync test tag in Kit whenever you like.

Orders from a Polar sandbox or Lemon Squeezy test mode work the same way: they only add the Checkout Sync test tag to people already on your list (or, unless you chose "Only update people already on my list", add the buyer first, for a test sale).

Already ran a test? Kit won't start the same automation for you again while you're still inside it. Wait until you've finished it, or remove yourself from that automation in Kit, then test again.

4. What lands in Kit

Under What happens in Kit, pick one. A new install (and Start fresh) begins on the middle one.

Which fits depends on what you told buyers at checkout and on the rules where you and they live; when unsure, the middle choice keeps your options open. Refunds, cancellations and failed payments only ever update people already on your list.

6. Custom fields

With Keep three custom fields up to date on, Checkout Sync adds these fields to your Kit account and fills them in for each buyer:

FieldWhat it holds
checkout_statusactive, past_due (a payment failed), canceled, refunded or one-time (single purchases only)
checkout_last_productThe product they bought most recently
checkout_customer_sinceThe date of their first purchase we know of, like 2026-03-14

Use them in any email, like Hi {{ subscriber.first_name }}, thanks for being a member since {{ subscriber.checkout_customer_since }}, or build a segment in Kit with a filter such as "checkout_status is active" to email only current members.

How checkout_status changes: once someone has a subscription, only subscription events change it (a renewal, a failed payment, a cancellation, or a refund of the subscription). A one-off purchase, or the refund of one, never knocks an active member out of active. one-time is for people who have only ever made single purchases. When someone cancels, the Canceled tag and ends_on come right away, but checkout_status stays active until their paid time actually runs out, then turns canceled. If access ends right away, it turns canceled at once and ends_on is empty.

7. Start an automation from an event

Add a Checkout Sync event to any Visual Automation:

  1. In Kit, open Automations → Visual automations and create one (or open an existing one).
  2. Add an event, or pick the entry point, and choose Checkout Sync by Tofu Labs.
  3. Pick Bought, Refunded, Canceled or Payment failed.
  4. Optional: type part of a product name to only react to that product, and pick one checkout. For Bought you can also choose new sales only or renewals only.
  5. Add your emails after it and turn the automation on.
The Bought event settings in a Kit Visual Automation: product, checkout and which sales
The Bought event, limited to one product.

Ready-made automations (Rescue failed payments, Win back canceled, Welcome new customers) will show up in Kit's template gallery once Kit has reviewed them. Until then, the steps above take about two minutes, and step 9 has an email for each event ready to copy.

Kit checks for new events about every five minutes, so an automation can start up to five minutes after the sale. Only events that happen after you turn the automation on start it.

On the Free plan, Canceled and Payment failed are still recorded and tagged, and your dashboard shows the money at risk; they start automations from the Starter plan. Plans

8. Put the details in your emails

In an email inside that automation, type {{ automation.checkout_sync.EVENT.TAG }}, with the event's name (bought, refunded, canceled or failed) and one of these tags. For example {{ automation.checkout_sync.bought.product }}.

TagEventsWhat it holds
productAll fourWhat they bought, named like their Bought tag
amountBought, Refunded, Payment failedLike "$19.00"
order_numberBoughtThe checkout's order or invoice number; empty on Lemon Squeezy renewals
receipt_urlBoughtThe Lemon Squeezy receipt or the Stripe invoice page. Empty for Paddle (Paddle emails its own receipt), Polar and tests, so always wrap it (below)
renewalBoughtyes or no
full_refundRefundedyes or no
reasonRefunded, CanceledThe reason given, when the checkout sends one: Paddle on refunds; Polar and Stripe (if you ask for cancellation feedback) on cancellations. Otherwise empty
ends_onCanceledWhen their access ends, like "November 9, 2026". Empty when access ended right away, so wrap it (as in the Canceled email below)
manage_urlCanceledWhere they can resume: your Lemon Squeezy customer portal, or your Polar portal link if you've added it. Empty for Paddle and Stripe
update_payment_urlPayment failedWhere they fix their card: Paddle's update page, Stripe's hosted invoice, your Lemon Squeezy portal, or your Polar portal link if you've added it (where to find it)
storeAll fourThe checkout's name, like "Lemon Squeezy"
first_nameAll fourThe first name the buyer typed at checkout

Wrap a tag that can be empty, so its line disappears when there's nothing to show:

{% if automation.checkout_sync.bought.receipt_url != "" %}Your receipt: {{ automation.checkout_sync.bought.receipt_url }}{% endif %}

A payment-failed email with the product, amount and an update-card link filled in
A Payment failed email with the details filled in.

9. Emails ready to copy

Our ready-made automations are still in Kit's review, so they aren't in Kit's template gallery yet. Until they are, each event below takes four steps:

  1. In Kit, make a Visual Automation and pick the Checkout Sync event as its entry point (step 7).
  2. Add an Email step after it and create a new email.
  3. Copy the subject and the email below into it, and swap your name in at the end.
  4. Turn the automation on.

Bought: a thank-you

Subject: Thank you for buying {{ automation.checkout_sync.bought.product }}!

Hi {{ subscriber.first_name | default: "there" }},

Thank you for buying {{ automation.checkout_sync.bought.product }}. It means a lot.
{% if automation.checkout_sync.bought.receipt_url != "" %}
Your receipt: {{ automation.checkout_sync.bought.receipt_url }}
{% endif %}
If anything is unclear or doesn't work, just reply to this email and I'll help.

Your name

Payment failed: update your card

Subject: Your payment for {{ automation.checkout_sync.failed.product }} didn't go through

Hi {{ subscriber.first_name | default: "there" }},

Your latest payment of {{ automation.checkout_sync.failed.amount }} for {{ automation.checkout_sync.failed.product }} didn't go through. That usually means a card expired or the bank declined it.
{% if automation.checkout_sync.failed.update_payment_url != "" %}
Update your card here: {{ automation.checkout_sync.failed.update_payment_url }}
It takes about a minute.
{% endif %}
If something else is going on, just reply and I'll help.

Your name

On Kit, add a Condition step before a second reminder: "has tag Payment failed". The tag comes off when their next payment goes through, so people who already fixed their card don't get it.

Canceled: sorry to see you go

Subject: Sorry to see you go

Hi {{ subscriber.first_name | default: "there" }},

Your {{ automation.checkout_sync.canceled.product }} subscription is canceled. Thank you for being part of it.
{% if automation.checkout_sync.canceled.ends_on != "" %}
You keep access until {{ automation.checkout_sync.canceled.ends_on }}.
{% endif %}
Can I ask why you left? Just reply with a sentence. I read every answer.

Your name

Refunded: a kind goodbye

Subject: Your refund for {{ automation.checkout_sync.refunded.product }}

Hi {{ subscriber.first_name | default: "there" }},

Your refund of {{ automation.checkout_sync.refunded.amount }} for {{ automation.checkout_sync.refunded.product }} is on its way. Banks usually take a few days to show it.

Sorry it wasn't the right fit. If you have a minute, reply and tell me what was missing.

Your name

10. Import past customers

Under Import past customers, pick how far back (30 days, 90 days, a year or everything) and press Import. Each past sale becomes a Kit purchase with its original date, the same tags and custom fields, following your choice for buyers who aren't on your list.

11. If something doesn't arrive

Every event shows under Recent activity in your settings with what happened to it:

A cancellation can show as two rows on different days: Canceled when the buyer cancels (the tag and ends_on go to Kit, and on Starter and Pro the Canceled automation starts) and Subscription ended on the day their paid time runs out (only checkout_status changes, to canceled). When access ends right away, it's one row: Canceled, access ended (the Canceled event goes to Kit with an empty ends_on, and checkout_status turns canceled).

Filter the list by type and status, search by email, product or order number, and press Download CSV for a spreadsheet. If a checkout stops accepting our key, has sent nothing for a week, or events are stuck, a Needs your attention box at the top says what to do.

Nothing showing up at all? Check the webhook in your checkout points at the URL from your settings and has the right events ticked. Still stuck? Write to us.

12. Uninstalling

Uninstall Checkout Sync in Kit under Apps → Manage. We stop at once: for Paddle and Stripe we remove the webhook we added and delete your key; for Lemon Squeezy and Polar, delete the webhook in their dashboard (until you do, we answer it without doing anything). A running import stops. Purchases and tags already in Kit stay, and the rest of your Checkout Sync data is deleted 30 days later.