How to measure the return on a paid ad campaign
Paid ad return means revenue or expected value from people who came through an ad, divided by what you spent. Clicks and impressions are useful, but they are not return. To measure return you need three things: a clear conversion goal, campaign-tagged links, and a way to connect ad clicks to completed actions on your site.
Start with one clear conversion goal
Choose the action that matters: purchase, paid signup, trial start, booking, qualified lead, or download. If the action is not a purchase, put a value on it. For example, if one in ten free trial users becomes a paying customer and a customer is worth $200, a trial start is worth roughly $20 for return calculations. Use your own numbers; guesses should be labeled as guesses.
Tag every paid link before launch
Use UTM parameters on every ad destination URL. Keep the names consistent. For a Google search campaign:
https://example.com/landing?utm_source=google&utm_medium=cpc&utm_campaign=summer_launch&utm_content=blue_ad
Use utm_source for the platform, utm_medium for the channel, utm_campaign for the campaign, and utm_content for the ad variant. Check that redirects preserve these parameters before the campaign starts.
Track the campaign in your own analytics
The ad platform will report clicks and, if you install its pixel, conversions. Do not rely on that alone. Platform attribution can count view-through conversions or give credit to an ad when a visitor would have returned anyway. Your own analytics should record campaign visits and later conversions. measuremy.site tracked campaign links with UTM tags credit later traffic and signups, which helps when someone clicks an ad, leaves, and returns directly a few days later.
Calculate return in money, not clicks
Use two formulas:
- Return on ad spend: attributed revenue divided by ad spend. If you spend $300 and attribute $900 in purchases, ROAS is 3x.
- Cost per acquisition: ad spend divided by conversions. If you spend $300 and get 12 purchases, CPA is $25.
For non-purchase goals, multiply conversions by the expected value you set. Subtract refunds or cancellations that happen within your measurement window if you want a true return. Keep the date range the same for spend, visits, and conversions.
Use a consistent attribution window
A conversion may happen minutes or days after the click. Choose one window, such as 7 days after click, and apply it to every campaign. Check the ad platform's settings because the default window may not match your own reporting. If someone clicks an ad on one device and converts on another, last-click tracking may miss the connection. For a small site, last-click is usually the easiest place to start, but you should know that it undervalues ads that introduce people to you.
Build a funnel from ad click to conversion
Look at the path from the ad landing page to the confirmation page. A simple funnel might be:
- /summer-landing
- /signup
- /thank-you
If many paid visitors reach the landing page but few reach the signup step, the problem is probably the landing page or the offer. If many reach signup but few reach the confirmation page, the problem is probably the signup form or payment step. In measuremy.site, funnels are built from page paths and events, so you can check drop-off for paid visitors specifically.
Compare channels separately
Paid search and paid social often behave differently. Search ads usually reach people already looking for a solution, while social ads interrupt people and need more education before conversion. Use separate UTM campaigns for each channel, and compare them by CPA and ROAS, not just clicks. A channel with a higher CPA can still be worth it if those customers buy more later, but you need to know that before scaling spend.
Watch for misleading signals
A high click count with no conversions may mean the ad promises something the landing page does not deliver. A spike in landing page visits without a corresponding spike in signups may mean the audience is wrong or the page is slow. Bot clicks and accidental taps can also inflate ad platform numbers. Compare ad platform clicks with site visits for the same campaign. Large gaps are worth investigating before you spend more.
A small worked example
Suppose you spend $200 on a paid search campaign. The ad platform reports 80 clicks. Your analytics shows 60 visits from that UTM campaign. Ten visitors reach the signup confirmation page. If a signup is worth $30 to you based on your own conversion data, the campaign generated $300 in expected value. ROAS is 1.5x and CPA is $20. That is a real example only if your numbers match; use your own values.
What to do each week
Record spend, attributed conversions, revenue or expected value, CPA, and ROAS for each campaign. Pause the campaigns with the highest CPA first, but only after enough conversions to make a decision. Change one variable at a time, such as the landing page headline, the offer, or the ad creative. Do not change the UTM names mid-campaign unless you accept that old and new data will be split.
Paid ad measurement works when you connect spend to completed actions. Tag links properly, track conversions in your own analytics, calculate money in and money out, and use that to move budget away from campaigns that do not pay back.
See it on your own site
measuremy.site is cookieless analytics your coding agent can read. 30-day free trial, no card. Plans from $9/month.
Start free trial See the live demoAdd measuremy.site analytics to this project: connect the measuremy.site MCP server at https://a.measuremy.site/mcp for all my projects (claude mcp add --scope user; it signs in with OAuth, no key, and one sign-in covers every site), then tell me how to sign in. Details: measuremy.site/llms.txt
Free tools
- Free UTM link builder: Add utm_source, medium and campaign to any link.
- UTM link checker: Find broken UTM tags and see which GA4 channel a link lands in.
- Link shortener with click tracking: Short links with a click count by day and country.
More from the blog
- How to calculate your website conversion rate, and what to compare it to
- Is my A/B test result significant? A plain-English guide with a worked example
- What is bounce rate, how is it calculated, and is yours a problem?
- How to add a visitor counter to your website or GitHub README
- How much traffic does a website get? How to estimate any site's visits
- How to track QR code scans: count them, and see which poster worked
- How to see how many people clicked your link (without a paid shortener)
- How to check if your Google Analytics 4 tag is installed (and only counting once)
- Why GA4 shows your campaign traffic as Unassigned (and how to fix the links)
- Does your redirect keep your UTM tags? How to check before a campaign goes out
- How I built a self-hosted analytics MCP server on Cloudflare Workers and D1
- UTM tracking explained: what the parameters mean and how to use them
- Conversion funnel analysis for small sites: a practical guide
- Sudden drop in website traffic? A checklist for finding the cause
- What is an MCP server? A plain-English guide for people who run websites
- How to use analytics to decide what to write next
- How the Model Context Protocol Works
- Track File Downloads Without Guesswork
- Adding analytics to a Next.js app without slowing it down
- Core Web Vitals and Traffic: Is There a Link?
- Analytics After Cookies: What Actually Changes
- GDPR and website analytics: a practical guide for small sites
- How to Compare Website Analytics Tools by Privacy
- GA4 Events Explained for Beginners
- How to measure a newsletter send with UTM links
- How to track Hacker News traffic
- Adding Analytics to a Framer Site
- How to ask your coding agent about your analytics
- What Is Bounce Rate and How Is It Calculated?
- A practical website analytics retention policy
- Map your site's funnel from first visit to signup
- What Is a Good Bounce Rate?
- How to automate a weekly traffic report
- A Practical Privacy-Friendly Analytics Checklist
- Adding an MCP server to Claude Code
- How long should you keep analytics data?
- How to Build a Small MCP Server That Actually Helps
- How to Find the Biggest Drop Off in a Funnel
- What Is the Urchin Tracking Module?
- What Microsoft MCP servers actually do
- UTM parameters for email newsletters
- Track Button Clicks Without Google Tag Manager
- How to track the results of a social media post without cookies
- How to track traffic from a GitHub README
- How to measure a product launch without guessing