Growth5 min read

Which TikTok made the sale? Track sales from every post

Your analytics says a sale came from “TikTok”, not which video. Give every post its own tracked link and see the visits, sales and revenue each one brings.

You posted five videos this week and sales went up. Which one did it? Ask most analytics tools and you get “TikTok”, or worse, “Direct”. That’s enough to know the platform works. It isn’t enough to know what to make next.

This guide shows how to get the answer post by post: a tracked link for every post, and a way to tie each sale to the visit that made it. The first half works with any analytics tool.

Why “TikTok” isn’t an answer

Analytics tools sort visits by where they came from: the source (TikTok, Instagram, Google) and the channel (social, search, email). Every video you post shares one source, so they all land in the same row.

It gets worse inside apps. Tap a link in TikTok or Instagram and it usually opens in the app’s own browser, and that visit often arrives without saying where it came from. Your analytics files it under Direct, and even the platform is lost.

The fix is old and simple: write the answer into the link.

Give every post its own link

Add three tags to the end of the address you share. They’re called UTM parameters, and almost every analytics tool reads them:

Text
https://yourshop.com/?utm_source=tiktok&utm_medium=social&utm_campaign=desk-setup-tour
  • utm_source is the platform: tiktok, instagram, youtube.
  • utm_medium is the kind of traffic: social for posts, email for a newsletter, paid for ads.
  • utm_campaign names the post, in words you’ll still recognize in a month: desk-setup-tour, october-restock.

A few habits keep the results readable:

  1. Make a new link for every post. A campaign name used twice merges two posts into one row.
  2. Write tags in lowercase, with hyphens instead of spaces.
  3. Spell each platform the same way every time: tiktok, never TikTok one week and tt the next.
  • YouTube: in the description, and in a pinned comment.
  • Instagram: a link sticker on a story. Posts and reels can’t hold a link, so use the one in your bio.
  • TikTok: the clickable link usually lives in your bio. When you post, put that post’s link in your bio and say “link in bio” in the video.
  • Newsletters, Reddit, X and Discord: paste the post’s own link right in it.

Tie each sale to its visit

A tagged link tells you where a visit came from. To know which post sold, the sale has to be joined to that visit, and that’s where most setups stop: your analytics sees the visit, your payment platform sees the sale, and nothing connects the two.

Some tools count a sale when the thank-you page loads instead. That works until the page is skipped, blocked or reloaded, and it never hears about refunds.

odo makes the connection at the source. Add its script to every page’s <head>:

HTML
<script defer src="https://odo.gg/js/odo.js" data-site="SITE_ID"></script>

The script keeps one id per visitor on your own domain and hands it to your checkout. When the payment comes back from the platform it carries that id, so odo knows which visits brought the buyer. How the id gets there depends on how you sell:

  • Checkout links on your pages are tagged for you: Stripe Payment Links, Lemon Squeezy, Polar, Gumroad and Dodo Payments links, Shopify cart links, and Paddle’s checkout buttons.
  • A checkout your server creates, like a Stripe Checkout Session, takes the id as odo_visitor_id in its metadata.
  • Anything else can report the sale from the page with odo('Purchase', { revenue: 49, currency: 'USD' }). If the platform traces the same sale too, it’s still counted once.

For a Stripe checkout of your own, that’s two lines:

JavaScript
// In the browser, when the buyer clicks Buy:
fetch('/checkout', { method: 'POST', body: JSON.stringify({ odo: window.odo?.visitorId }) });

// On your server:
stripe.checkout.sessions.create({ /* … */ metadata: { odo_visitor_id: body.odo } });

odo traces sales to visits for Stripe, Lemon Squeezy, Polar, Paddle, Gumroad, Dodo Payments, Shopify and WooCommerce. Shopify takes one line in your theme and WooCommerce one snippet, both shown when you connect them. Lemon Squeezy and Gumroad send the visitor back through their instant updates, so turn those on.

The path behind one sale: the post, the page, the checkout, the payment.

Read the results

In odo, the Sources card on the Traffic dashboard has a Campaign tab: every utm_campaign, with its visitors and the revenue its visits brought. Tap one to narrow the whole dashboard to visits from that post: the pages they read, where they’re from, and the customers who paid.

Two things are worth knowing as you read it.

Which visit gets the credit. Buyers often visit more than once. By default odo credits their most recent visit that didn’t come in Direct (last touch); switch the Revenue card to First touch to credit the visit that first brought them. Say someone found you through a video, came back a week later from a Google search, and bought: last touch credits Google, first touch credits the video. Posts that start the relationship show up under first touch.

What a visitor is worth. Compare posts by revenue per visitor, not by views. The post with the most views is often not the one that sells.

Revenue per visitor, channel by channel. The same comparison, post by post, shows which posts bring buyers.

Writing UTM tags by hand works, but it’s easy to slip. odo can make each post’s link for you: pick the platform, name the post, and copy the link. Every link then shows its visits, sales and revenue side by side, so the post that sells stands out.

Make more of what sells

Once each post has its own line, the weekly question changes from “did TikTok work?” to “which video should I make another of?”. A few patterns to look for:

  • Modest views, steady sales: that audience was ready to buy. Make the follow-up.
  • Big views, no sales: it entertained the wrong people, or sent them to the wrong page. Check where its visitors landed.
  • Sales days after the post: give each post a week before you judge it. odo shows how long your buyers usually take from first visit to payment.

Want every sale from every platform in one place first? Read Stripe, PayPal, Shopify and Patreon in one live number. And if you’d like odo to do all of the above for you, the plans are on the pricing page.

Keep reading