Setup
Meta Ads and Lemon Squeezy: see which campaigns produced orders
To see which Meta campaigns led to Lemon Squeezy orders, add UTM parameters to your ad URLs, connect Lemon Squeezy with an API key, and let the checkout link carry the visitor's session. Each order is then matched back to the campaign and click that started it.
It's a common question. One r/SaaS poster asked: "Is there a way to see/track where my customers are coming from?" and added, "I want to know if they came from Facebook, or from my newsletter." (r/SaaS, July 2025)
What you need
Access to the ad in Meta Ads Manager.
A Lemon Squeezy account with dashboard access (Thexly Lemon Squeezy guide).
The Thexly tracking script on your site (docs).
What we checked, and how
On 16 October 2026 we compared Thexly's Lemon Squeezy and Stripe guides and Lemon Squeezy's custom data docs. The biggest difference is the key. With Stripe you can create a restricted key with two permissions. Lemon Squeezy "doesn't offer a read-only or permission-scoped key today", so "every key it issues has full account access" (Thexly Lemon Squeezy guide, Thexly Stripe guide). We say this plainly below so you can decide.
Step 1: tag the ad clicks in Meta
From Meta's help page (Meta help):
1. Create or edit an ad in Ads Manager and go to Tracking for that ad.
2. Enter your parameters in the URL parameters field, or click Build a URL parameter.
3. Click Apply.
An illustrative example: utm_source=facebook&utm_medium=paid&utm_campaign=spring-launch. Stick to a readable campaign name, because Thexly shows utm_campaign exactly as it arrives. Keep utm_source fixed and lowercase, like facebook. Thexly's source reports group by the exact text, so Facebook, fb and ig would each get their own row.
Meta notes the parameter only applies to the first page someone lands on. If they leave and come back organically later, it's lost. Thexly reads the UTM tags and Meta's fbclid from that first page URL and labels fbclid clicks as Meta.
Check one script setting: with data-exclude-search turned on, Thexly drops all UTM tags and click IDs such as fbclid, so Thexly can't tie those visits to your campaigns. Keep it off on ad landing pages.
Step 2: connect Lemon Squeezy
From the Thexly Lemon Squeezy guide:
1. In Lemon Squeezy, go to Settings → API and create a new API key.
2. Give it a clear name. Lemon Squeezy doesn't let you rename it later.
3. Copy it straight away. It's shown only once.
4. Paste it into Thexly under Settings → Payments → Lemon Squeezy.
About that key. It has full account access, because Lemon Squeezy has no scoped option today. Thexly only makes read requests with it, plus registering its own webhook (and removing it if you disconnect). The guide is honest that this is "a promise about what Thexly's code does, not a restriction Lemon Squeezy enforces on the key itself." Thexly never creates, modifies or refunds an order.
What arrives, and from when. Orders reach Thexly through that webhook, starting from the moment you connect. Thexly doesn't import orders from before then, so the first matched order will be the next one after setup.
Step 3: pass the session at checkout
Lemon Squeezy checkout links on your page: for a normal link to a /checkout/buy/ URL, the script appends the visitor's session before they click. Nothing to do.
Buttons or checkouts opened with JavaScript: the session isn't added for you. Call window.thexly.getSessionId() and add it to the checkout URL yourself as checkout[custom][thexly_session_id].
Checkout URLs you generate on your server: pass the session the same way, as checkout[custom][thexly_session_id] (Thexly Lemon Squeezy guide).
This uses Lemon Squeezy's own custom data feature. Its docs show the same pattern, for example ?checkout[custom][user_id]=123, and say the data comes back in webhooks for orders, subscriptions and license keys inside a custom_data object in the meta field (Lemon Squeezy docs).
Subscriptions and renewals
The first charge on a subscription is counted from the order. Each renewal after that arrives through Lemon Squeezy's subscription payment webhooks and is matched using the session saved in the checkout's custom data.
Check it works
1. Open your page with the UTM parameters added by hand.
2. Check your Thexly dashboard for the visit (docs).
3. Hover over or inspect the checkout link and confirm the session was added. If it's a button, check your own code adds it.
4. Make a test order, or wait for the first real one, and confirm it shows the campaign.
What Thexly does and doesn't do
Thexly matches each order to the visit that led to it and credits one channel: the first one that brought the visitor in, or the one that closed the sale, your choice per website (docs).
It doesn't send conversions back to Meta and doesn't change your ad settings. It doesn't pull spend from Meta, so you bring spend from Ads Manager when you compare.
Running this for clients? See Thexly for agencies. More on Meta numbers: Meta ads reporting. There's a 14-day trial, no card needed.
FAQ