Getting Started

Set Up Conversion Tracking in 10 Minutes (No Developer Required)

You're spending money on Facebook ads, but you have no idea which ones are actually driving sales. You can see clicks, you can see your revenue go up, but you can't connect the dots. That's running ads blind.

Without accurate conversion tracking, you're guessing. You don't know which campaigns to scale, which creatives to kill, or whether your ads are even profitable. You're making decisions based on gut feeling and hoping for the best.

The solution is conversion tracking. But if you've ever tried to set it up, you've probably encountered a maze of Meta's documentation—Events Manager, Conversions API, developer implementation guides, testing tools. It looks like a 3-hour project that requires a developer.

It doesn't. Here's how to set up accurate conversion tracking in 10 minutes with just 2 code snippets. No developer required.

Why Most Conversion Tracking Guides Are Overcomplicated

Meta's official setup process involves multiple steps across several tools:

This is Meta's recommended approach, and it's comprehensive. But it's also massive overkill for most small businesses. You end up spending 45 minutes following tutorials for a system that's far more complex than you need.

The result: most advertisers never set it up properly. They either skip conversion tracking entirely, or they install the pixel but never verify it's working. They're flying blind because the "right way" seemed too complicated.

The Two Things You Actually Need to Track

Here's what conversion tracking comes down to:

  1. Pageviews — Who clicked your ad and visited your site
  2. Purchases — Who actually bought something

That's it. Everything else is optional complexity that can come later if you need it.

When someone clicks your ad, they land on your site with tracking parameters in the URL (UTMs like utm_source=facebook and utm_content=ad_id_123). If you can capture those UTMs when they arrive and connect them to the purchase when they buy, you have conversion tracking.

No Events Manager setup. No Conversions API. No developer. Just two snippets of code.

First-Party vs Third-Party Tracking

Before we get to the setup, you need to understand why Meta's pixel has limitations.

Meta's pixel is third-party tracking—it's JavaScript from Facebook's domain running on your site. That makes it vulnerable to:

The result: Meta's pixel only captures a fraction of your actual conversions. You might be getting a 2x ROAS according to Meta, when your actual ROAS is 3.5x. You're making decisions based on incomplete data.

First-party tracking—your own pixel on your domain—isn't affected by these restrictions. It's your JavaScript on your site, capturing data you own. No third-party cookies, no tracking blockers, no iOS restrictions.

That's why KillScale uses a first-party pixel. You get complete data, not just the subset that makes it through Meta's restrictions.

The Two-Snippet Setup

KillScale's pixel uses a two-snippet architecture that captures everything you need:

Snippet 1: Main Pixel

This goes in the <head> tag of your site. It tracks pageviews, captures UTM parameters from ad clicks, and stores them in a cookie so they're available when the person makes a purchase later.

Snippet 2: Purchase Script

This goes on Shopify's Order Status Page (the thank-you page after checkout). It fires when someone completes a purchase, sending the order ID and the UTM parameters that were stored in the cookie from Snippet 1.

When both snippets are installed, here's what happens:

  1. Customer clicks your Facebook ad → lands on your site with UTMs in the URL
  2. Snippet 1 captures the UTMs and saves them in a cookie
  3. Customer browses, adds to cart, goes to checkout
  4. Customer completes purchase → Shopify shows the Order Status Page
  5. Snippet 2 fires, sending the order ID and the saved UTMs to KillScale
  6. Shopify webhook confirms the order details (revenue, order ID, etc.)
  7. KillScale matches the order to the ad click via UTMs
  8. You see attributed revenue per ad in your dashboard

The purchase is attributed to the correct ad because the UTMs from the click are stored in the cookie and sent with the purchase event. Even if the customer browses for 20 minutes before buying, the attribution works.

Step-by-Step: Installing on Shopify

Here's the actual implementation. This takes about 10 minutes if you've never touched your theme code before.

1 Get Your Pixel ID

Log into KillScale and go to Settings → Pixel. You'll see your pixel ID—it looks like KS-A7X9K2M. Copy it.

2 Install Snippet 1 (Main Pixel)

In Shopify, go to Online Store → Themes → Edit Code. Open theme.liquid and find the closing </head> tag (usually around line 50-100). Paste this right before it:

<script> (function() { var pixelId = 'YOUR_PIXEL_ID_HERE'; // Capture UTMs from URL var params = new URLSearchParams(window.location.search); if (params.has('utm_content')) { document.cookie = 'ks_utm=' + params.get('utm_content') + ';path=/;max-age=2592000'; } // Send pageview fetch('https://app.killscale.com/api/pixel/pageview', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ pixel_id: pixelId, url: window.location.href, referrer: document.referrer }) }); })(); </script>

Replace YOUR_PIXEL_ID_HERE with the pixel ID you copied from KillScale. Save the file.

3 Install Snippet 2 (Purchase Script)

In Shopify, go to Settings → Checkout → Order Status Page (scroll down to "Additional Scripts"). Paste this:

<script> (function() { var pixelId = 'YOUR_PIXEL_ID_HERE'; var orderId = '{{ order.name }}'; var revenue = {{ total_price | money_without_currency }}; // Get UTM from cookie var utm = document.cookie.match(/ks_utm=([^;]+)/); var utmContent = utm ? utm[1] : null; // Send purchase event fetch('https://app.killscale.com/api/pixel/purchase', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ pixel_id: pixelId, order_id: orderId, revenue: revenue, utm_content: utmContent }) }); })(); </script>

Again, replace YOUR_PIXEL_ID_HERE with your pixel ID. Save.

4 Connect Shopify to KillScale

In KillScale, go to Settings → Integrations → Shopify. Click "Connect Shopify" and authorize the app. This lets KillScale receive order data via webhooks to confirm revenue.

That's it. Your conversion tracking is live.

How It Works Behind the Scenes

Let's walk through what happens when someone clicks your ad and makes a purchase:

The Click

When someone clicks your Facebook ad, they land on your site with a URL like:

https://yourstore.com/products/widget?utm_source=facebook&utm_medium=cpc&utm_campaign=summer_sale&utm_content=23851234567890123

That utm_content parameter is the Facebook ad ID. It uniquely identifies which ad they clicked.

The Pageview

Snippet 1 (Main Pixel) fires immediately when the page loads. It:

  1. Reads the utm_content from the URL
  2. Stores it in a cookie called ks_utm (expires in 30 days)
  3. Sends a pageview event to KillScale with the URL and referrer

The cookie is critical—it preserves the ad ID even as the customer navigates around your site. They might click to a product page, then to a collection, then to the cart, then to checkout. The UTM stays in the cookie the whole time.

The Purchase

When the customer completes checkout, Shopify shows the Order Status Page. Snippet 2 (Purchase Script) fires. It:

  1. Reads the order ID from Shopify's Liquid template ({{ order.name }})
  2. Reads the revenue from the Liquid template ({{ total_price }})
  3. Retrieves the ad ID from the ks_utm cookie
  4. Sends all of this to KillScale's purchase endpoint

Now KillScale knows: order #1234 for $87.50 came from ad ID 23851234567890123.

The Confirmation

Simultaneously, Shopify sends a webhook to KillScale with the full order details. KillScale matches this webhook to the purchase event using the order ID. This double-confirmation ensures accuracy:

The Dashboard

In KillScale's dashboard, you now see:

This entire flow—from click to attributed revenue—works even if the customer takes days to purchase, as long as it's within the 30-day cookie window.

Verifying Your Setup

Once you've installed both snippets, you should verify everything is working before you trust the data. Here's how:

Test the Main Pixel

  1. Visit your site in a browser
  2. Open Developer Tools (F12 or right-click → Inspect)
  3. Go to the Console tab
  4. Refresh the page
  5. Look for a network request to app.killscale.com/api/pixel/pageview

If you see the request with a 200 status code, the pixel is firing. If you don't see it, double-check that you pasted the snippet correctly and replaced YOUR_PIXEL_ID_HERE with your actual pixel ID.

Test the Purchase Script

This one requires making a test purchase:

  1. Add UTM parameters to your store URL manually: https://yourstore.com?utm_content=test123
  2. Browse normally and add a product to cart
  3. Check out using Shopify's Bogus Gateway (a test payment method)
  4. Complete the purchase
  5. On the Order Status Page, open Developer Tools and check the Console
  6. Look for a network request to app.killscale.com/api/pixel/purchase

If you see the request, the purchase script is working. Now check KillScale's dashboard—within a few minutes, you should see a purchase event appear with utm_content: test123.

Verify the Cookie

To confirm UTMs are being saved correctly:

  1. Visit your site with a UTM: https://yourstore.com?utm_content=test456
  2. Open Developer Tools → Application tab (Chrome) or Storage tab (Firefox)
  3. Look at Cookies → your domain
  4. You should see a cookie named ks_utm with value test456

If the cookie isn't there, the Main Pixel might not be firing or the UTM isn't in the URL.

What You'll See in Your Dashboard

Once conversion tracking is live, KillScale's dashboard shows you:

Attributed Revenue Per Ad

Every ad in your Performance Table shows the revenue it generated based on pixel attribution. You can see which creatives are actually driving sales, not just clicks.

Pixel Match Rate

This is the percentage of Shopify orders that have a matching pixel event. Target 85%+. If your match rate is lower, it means some customers are buying without the pixel firing (often due to ad blockers or analytics blockers).

What's a Good Pixel Match Rate?

  • 85-95% — Excellent. Most purchases are being tracked.
  • 70-85% — Good. Some customers are blocking tracking, but you're capturing most.
  • Below 70% — Check your setup. The pixel might not be firing correctly.

Attribution Waterfall

KillScale uses a waterfall attribution model to ensure every order is attributed to an ad when possible:

  1. Shopify UTM — If the order has a last_utm_content value (from Shopify's native UTM tracking), use that
  2. KillScale Pixel — If not, use the UTM from the pixel purchase event
  3. Meta API — If neither, fall back to Meta's reported conversion data
  4. Unattributed — If none of the above, the order counts toward revenue but isn't credited to any ad

This waterfall ensures you're using the most accurate attribution source available for each order. First-party data (Shopify UTMs and your pixel) takes priority over third-party data (Meta's pixel).

True ROAS Calculations

With accurate conversion tracking, your ROAS calculations are based on real data:

No more guessing. No more trusting Meta's estimates. You see the actual performance of every campaign, ad set, and ad.

"Before KillScale's pixel, I was making decisions based on Meta's data, which was showing 40% lower revenue than I was actually getting. I was killing ads that were profitable because Meta couldn't see the conversions. Now I have real data." — Sarah K., DTC brand owner

Without Conversion Tracking

  • No idea which ads drive sales
  • Scaling based on clicks, not revenue
  • Killing profitable ads due to incomplete data
  • Guessing at ROAS
  • Can't prove ad spend is profitable
  • Dependent on Meta's limited reporting

With Conversion Tracking

  • See revenue per ad in real-time
  • Scale ads with proven profitability
  • Kill ads that don't drive sales
  • Accurate ROAS for every campaign
  • Clear proof of ad performance
  • First-party data you own

Troubleshooting Common Issues

Pixel is firing but no purchases are showing

Check that Snippet 2 is installed on the Order Status Page, not on the checkout page or cart page. It should only fire after a completed purchase.

Purchases are showing but revenue is wrong

Verify that the {{ total_price }} Liquid variable is formatted correctly. It should be {{ total_price | money_without_currency }} to strip currency symbols.

Cookie isn't persisting between pages

Make sure the cookie is set with path=/ so it's available across your entire domain, not just the landing page.

Pixel match rate is below 70%

This could mean:

UTMs aren't being captured

Check that your Facebook ads are actually appending UTM parameters. In Ads Manager, verify that URL parameters include utm_content={{ad.id}}.

Beyond the Basics

Once you have basic conversion tracking working, there are optional enhancements you can add later if needed:

Event Tracking

Track additional actions like Add to Cart, Initiate Checkout, or Lead Form submissions. This helps you understand the full funnel, not just the final purchase.

Multi-Touch Attribution

If customers often click multiple ads before buying, you can implement multi-touch attribution models that credit multiple ads for a single sale.

Server-Side Tracking

Send conversion data from your server instead of the browser. This is more reliable (can't be blocked) but requires more technical setup.

Cross-Domain Tracking

If your checkout is on a different domain than your main site (e.g., Shopify checkout on a separate subdomain), you need to pass the cookie across domains.

But for 90% of small businesses, the two-snippet setup above is all you need. Start simple, get accurate data, make better decisions. Add complexity only when you have a specific reason to.

Set up real conversion tracking in 10 minutes

KillScale's first-party pixel works where Meta's pixel doesn't. Two snippets, no developer, accurate attribution. See exactly which ads are profitable and which are bleeding money.

Start Free — No Credit Card Required