What our ads actually did
We run Meta ads for Harvv with our own pixel on the landing page. This is what the pixel caught, what we changed because of it, and what moved. Updated every hour.
One campaign, not our whole account. Every figure below is scoped to a single ad set, so nothing else we run is folded in to flatter it. We publish the results, not the targeting: you will not find the audience, the interests or the geo split here. You will find every number they produced.
What this is and is not. It is Harvv used on its own ad traffic: an observational record of one live campaign, with what the pixel found dated, what we changed in response, and the numbers on both sides. It is not a controlled experiment: there is no holdout, Meta's own optimisation keeps moving who sees the ad, and things we shipped on the same day cannot be separated afterwards. Where the page uses the word "better" it has cleared a significance test; everywhere else it is describing, not concluding.
Working back from $75 a signup
The goal is a cost, not a rate. Everything below is what that cost demands of the funnel, and where the funnel actually is. 118 sessions and $47.43 spent so far.
A signup here means an account was created. The landing page offers two other things to do, opening the booking calendar and submitting the free audit, and both are counted further down but neither is what the cost is judged on. The calendar is a click on an outbound link, so it cannot tell us a call happened. The audit does hand us a real lead, an address and a site, but a lead is not an account and neither is revenue. And $75 is a ceiling we chose, not a break-even we derived. Publishing it as though the unit economics produced it would be the same trick this page exists to avoid.
Zero signups so far, which is not yet evidence of anything: at the required rate the first one is not expected until about 187 sessions, and it takes about 560 before a continued zero means the rate is genuinely below target. We are 118 in.
- Click-through rate1.89%6,417 impressions
- Clicks that survived the load93.4%121 link clicks
- Sessions that read past the fold2.54%118 ad sessions
- Sessions that opened the calendar0.00%118 ad sessions
- Sessions that submitted the audit0.00%118 ad sessions
- Sessions that reached signup0.00%118 ad sessions
- Sessions that ended in a signup0.00%needs 0.54%118 ad sessions
Only the last stage carries a required number. A cost per signup does not dictate a click-through rate: there are many combinations of the stages above that land on the same $75, so the ones above are reported as they are rather than given a target they do not individually owe. The 560-session figure in the verdict is the rule of three: seeing zero of something in n tries puts the 95% ceiling on its rate at 3/n, so that is the point where a continued zero stops being a quiet spell and starts being evidence. Both thresholds are derived from the current cost per session and move with it; a figure quoted on an earlier date used the cost on that date.
7 days of this campaign
Running since 2026-09-01. Nothing before that date is counted anywhere on this page.
The funnel
Our own pixel counts more ad-tagged sessions than Meta reports landing page views: 118 against 113. Two different meters. Meta counts a view it attributes to one of its own clicks, measured by its pixel; ours counts a session that arrived carrying this campaign's tag, measured by our pixel, after two filters described below. Ours can include return visits and forwarded links that Meta would not attribute. The next block counts the steps between the two.
Two populations, not one. The first three stages are Meta's meter over the people Meta showed the ad to. The last three are our pixel's meter over sessions that arrived carrying this campaign's tag, and the signups whose record carried it through. Within each half every stage is a fraction of the one above it. Across the seam it is not, which is why no rate is printed there. Nothing on this chart is a site-wide number standing in for an ad-driven one.
Where the traffic goes between Meta's count and ours
Our server saw 605 requests for the page against Meta's 113 landing page views, more than Meta: the server count includes ad-review crawlers, our own previews and anyone who reopened or forwarded the link. From there to a published session the pixel has to load, run, and send a beacon before the visitor leaves, and then survive two filters. That path is where the difference between Meta's number and ours comes from, and each step of it is counted above.
"Stayed on the page" is 15 seconds of ACTIVE time, or scrolling past half, whichever comes first. Active, not wall clock: a tab left open in the background reads as a long visit on the clock and as nothing at all on attention, and on this campaign the median visit was 31 seconds on the clock and 1.1 seconds of attention. It is not a conversion and is never counted as one. It is here because it separates "the ad bought a reader" from "the ad bought a page load", which the numbers above cannot do on their own.
All three branches sit OUTSIDE the funnel above on purpose. Opening the calendar, submitting the audit and reaching the signup page are things a session can do and none of them requires another, so putting either in the column would make the stage under it read as a percentage of people who opened a calendar. They are drawn against the session count instead, which is the population they actually come from.
The calendar is a click, not a booked call. The link opens Google Calendar in a new tab and Google tells us nothing back, so we cannot know whether a call was booked and do not claim to. The audit submit is firmer: it hands us a URL and an email, so the lead is a real row rather than an outbound click we never hear about again. Neither is revenue, and the cost goal is judged on signups.
The numbers, and which way they are going
Each metric over every day of spend, with the most recent half of those days compared against the earlier half. A direction is only shown when both halves have enough behind them; otherwise the reason it is missing is printed in its place.
The grey line under some metrics is a third-party industry benchmark, not our measurement: where a published B2B/SaaS range sits, so a number has something to be read against. A position at the top of that range is a fact about the click, not a grade for the campaign: a cheap click that never reads the page is the most expensive thing an ad can buy, which is why the click metrics carry the share of sessions that read past the fold. Every one is sourced and dated below, and metrics with no citable benchmark deliberately show none rather than a made-up bar. Ranges move; ours are as of 2026-09.
Costs are better going down and rates are better going up, and which is which is set per metric rather than guessed from the arrow. Splitting the days in half is the comparison, not a rolling window: a window that can be slid until it looks good is not a measurement. With 7 days of spend on record, most of these will stay withheld for a while, and that is the correct output rather than a placeholder.
Which ad these numbers came from
Everything above is scoped to one campaign tag, and a campaign tag survives a change of ad. 3 creatives have run under it. They are listed separately because pooling them would hide the change, and no rate is compared between them: at these volumes that comparison would be noise, which is the thing this page refuses to publish.
| Creative (utm_content) | Sessions | Read past the fold | Days live |
|---|---|---|---|
ask_why | 117 | 2 | 2026-09-01 to 2026-09-05 |
ask_why_v2 | 11 | 1 | 2026-09-05 to 2026-09-06 |
ask_why_v3_slack | 5 | 1 | 2026-09-06 to 2026-09-07 |
The landing page also changed during this window, so a creative's numbers are not a clean read on the creative alone. The dated log above says what moved and when.
What we detected, what we changed, what happened next
Bundled by the day it shipped, because that is also the unit we can measure: things released together cannot be separated afterwards. Each date carries what our own product or its gates found, what we did about it, and the result measured over the 1,000 campaign sessions either side.
Detected The ad body was 563 characters. Meta shows about 125 before a "See more" that roughly 1% of readers tap, so the part a phone displayed cut mid-word inside the problem statement and never reached what the product does. The image said "aren't working", the ad headline said "Ask your client's site why", and the page H1 said the same as the headline: three phrasings of one idea. The Slack card on the image carried "62% of paid visitors" and "214 sessions" with nothing marking it as an example, on an ad whose whole promise is not publishing numbers we did not measure. And the image never showed Slack itself, only the word.
Changed Body cut to 122 characters so all of it shows above the fold. Image, ad headline and page H1 are now one sentence. The Slack card is labelled EXAMPLE, drawn with the same Slack sidebar chrome the homepage uses, and carries the Slack mark plus the four assistant logos the page shows. The creative is generated from the brand tokens by scripts/build-ad-creatives.js instead of by hand, so it cannot drift off-brand again, and create_adcreative now runs the copy validator before the API call, which is how 563 characters got through in the first place. Ad AGT_Harvv_Agencies_AskWhy_2026-09-06_ad3_slack replaces ad2; nothing else in the ad set moved.
Detected At 384x696, the most common screen in this campaign, the consent bar covered the bottom third of the first screen: exactly where the Slack example that the ad promises begins. The pixel's reading signal showed the subtitle was the only block most phone visitors ever had in view: 32 saw it and skipped, 7 skimmed, 11 read; every block below it was never in view for 30 or more sessions. 92% of phone visitors never scroll, so they saw the promise and not the proof. The most tapped thing on the page was "Accept all".
Changed Banner copy cut from 22 to 11 words and its mobile padding tightened. Subtitle cut from 31 to 15 words and the hero pulled up. Rendered at 384x696, the question and Harvv's answer are now both on the first screen. Not changed: the banner still shows, because UK visitors are in the targeting and a returning-visitor cookie needs consent there.
Detected On a real Android phone the URL field on /ask measured about 390px tall and the email field the same; on /ads-audit both were 190px. The rule was flex: 1 1 190px on the inputs, a sensible width in the desktop row, and on phones the form flips to a column, where flex-basis becomes the height. Four layout checks passed while the field we ask a paid visitor to type into was taller than their viewport is wide. /ads-audit was also rendering in the dark theme against a light-default site.
Changed flex-basis reset to auto inside the column rule on the three pages whose form flips (/ask, /ads-audit, /audit); /ads-audit rendered light. The layout gate now fails any text input taller than 80px at phone widths, and a planted copy of the bug reddened it before this shipped.
3 changes shipped together on this date, so any movement belongs to the batch and cannot be split between them.
11 of 1,000 sessions since this shipped, and 122 of 1,000 before it
- still measuring Scrolled at all 8.2% → 18.2%
- still measuring Reached the signup page 0% → 0%
- still measuring Hit a rage or dead click 3.3% → 18.2%
No verdict until the window fills. The numbers above are shown so the wait is visible, not so anyone acts on them: a rate read early moves on noise, and checking until it looks good is how you find a winner that is not there.
Detected Across 116 ad sessions in 5 days the median ACTIVE time on the page was 1.1 seconds, and 97 of them ended under 3 seconds. The wall-clock median was 31 seconds, which is a tab left open in the background, and reading that as attention is what made the traffic look ordinary. 107 of 116 never scrolled. Nothing on the page was touched: no form, no calendar click, no audit submit.
Changed The page now fires an "engaged" signal at 15 seconds of active time or 50% scroll, whichever comes first, and /experiment counts it as a branch beside the calendar and the audit. It is not a conversion and is never drawn as one. It exists to separate an ad that bought a reader from an ad that bought a page load, which no number already on this page could do. It is also the only optimisation goal this budget can reach: Meta needs about 50 events a week to learn, and at a $75 target cost that would be $536 a day against the $10 we spend.
Detected The ad sells an answer arriving in Slack or in your AI assistant. The page opened with a headline, a question, a paragraph, two buttons and a form asking for a URL and an email, and the Slack answer panel sat below all of it. Read-depth confirms it: the only blocks any visitor ever saw were the opening paragraph and the form subtitle, both above the fold, and every deeper block was seen only by the handful of sessions that scrolled at all.
Changed The Slack answer panel moved up into the first screen, directly under the opening line, with the question chips beneath it. The buttons and the audit form moved below it. The headline now matches the ad word for word, and the opening line names Slack and the assistant instead of describing the idea abstractly. Nothing was added or removed, only reordered and reworded.
Detected The ad set was set to the United States, Canada and Australia. Meta delivered 3,299 of 3,412 impressions to Canada. The United States got 16. Asking for the cheapest possible page load, which is what the optimisation goal and the bidding strategy together ask for, gets the cheapest country, and we never tested the market we meant to.
Changed Canada is out of the ad set and the United Kingdom is in, so it is now US, GB and AU. Everything else is untouched: the same interests, the same placements, the same budget. Canada is not being re-measured because 116 sessions of it is already enough to know. This will cost more per click and buy fewer visits a day, and that is the trade being made deliberately.
Detected Meta was selling us phones almost exclusively: 55% Android smartphone, 39% iPhone, 2% tablet, across 5,983 impressions. Our own pixel says phones do not read this page. On /ask over 7 days, excluding flagged traffic: 123 mobile sessions, 92% of which never scrolled at all, median active time 1.17 seconds, 2 that reached halfway. Against that, 9 desktop sessions, 56% never scrolled, median 3.77 seconds, 3 that reached halfway. Three of nine against two of 123. Desktop is a small sample and is reported as a lead rather than a proof, but site-wide the same split holds at larger n: desktop median active time is 172 seconds against 4 to 18 on mobile. This is not the scroll blind spot; every unload event carries the scroll high-water mark, 318 of 318 on mobile, and it reports zero.
Changed The ad set now asks Meta for desktop only. Estimated reach falls from about 138,500-163,000 monthly actives to 50,800-59,800, which is still far more than a $10 a day budget can exhaust. Nothing else moved: still Facebook feed only, still US/GB/AU. This is the cheapest test available of the one difference the data actually shows, and it is one setting to undo. Read the before-and-after on this page with care. Two audience changes landed within an hour of each other today: Canada was dropped for GB earlier, and Canada had been 3,299 of 3,412 impressions. Every rate that spans 2026-09-05 therefore compares three different audiences, not one, and no verdict should be drawn across that boundary.
4 changes shipped together on this date, so any movement belongs to the batch and cannot be split between them.
36 of 1,000 sessions since this shipped, and 97 of 1,000 before it
- still measuring Scrolled at all 7.2% → 13.9%
- still measuring Reached the signup page 0% → 0%
- still measuring Hit a rage or dead click 3.1% → 8.3%
No verdict until the window fills. The numbers above are shown so the wait is visible, not so anyone acts on them: a rate read early moves on noise, and checking until it looks good is how you find a winner that is not there.
Detected The funnel showed 60 landing page views from Meta and 17 sessions from our pixel, with a fixed sentence underneath saying our count was the larger. It was written when that was true and never re-checked against the numbers it sat under. Nothing on the page counted what happened between the two meters.
Changed The sentence is now computed from the numbers, and a new block counts each step: our server answering the request, the pixel reporting a session, the bot classifier keeping it, and the no-click gate keeping it. Every drop between two adjacent counts is one named cause. The change log states that figures quoted inside an entry are as of that date.
Detected The goal block divided spend by 17 sessions and printed $1.25 a session, and the trend strip on the same page refused the same division as too thin. The thresholds derived from that cost had tripled in two days. Two rules for one quotient on one page.
Changed One floor, defined once in the analysis module and used by both. Under 25 sessions the goal block says what it is waiting for instead of printing a cost.
Detected The first day of the campaign read 13 impressions, 0 clicks, 0 landing page views and 7 sessions. The ad-review crawlers Meta sends at ad creation arrived on the same calendar day the campaign started spending, so the day-level spend gate let them through as visitors.
Changed A day with spend but no Meta link click did not deliver a visitor from this ad. Tagged sessions on such a day are zeroed with a note, and the raw count stays visible in the reconciliation block so the removal is not silent.
Detected The trend strip labelled a 2.55% click-through rate and a $0.34 cost per click "best in class" against published ranges, on a campaign where no session had reached the signup page. Both figures were true and the word was praise for a stage whose output had not been measured.
Changed The standings now read "top of the published range" rather than "best in class", and every upstream metric carries the share of its sessions that read past the fold, or says that share is not yet measurable. A new metric, cost per session that read past the fold, sits beside cost per session.
4 changes shipped together on this date, so any movement belongs to the batch and cannot be split between them.
62 of 1,000 sessions since this shipped, and 71 of 1,000 before it
- still measuring Scrolled at all 7% → 11.3%
- still measuring Reached the signup page 0% → 0%
- still measuring Hit a rage or dead click 4.2% → 4.8%
No verdict until the window fills. The numbers above are shown so the wait is visible, not so anyone acts on them: a rate read early moves on noise, and checking until it looks good is how you find a winner that is not there.
Detected Measured in a real browser at phone size: the consent banner was 281px tall and covered a third of the first screen, sitting on top of both secondary buttons. Over the same 30 days its reject button was clicked more often than the page own audit button.
Changed Rebuilt it as a compact bar. It now covers 18% of the first screen instead of 33%, and its buttons meet the 44px minimum tap size we tell customers to meet.
Detected The chat button and the live tracker dock were pinned to the same corner with the same offsets. The dock renders above everything, so it covered 59% to 77% of the chat button at every scroll position. The button had zero clicks in 30 days.
Changed Moved the chat button to the opposite corner, and above the dock on phones where the two do not fit side by side. Nothing now covers it.
Detected On phones the three cards explaining what we find were collapsed, so the button inside each one was never drawn. Those buttons were not being ignored, they did not exist on screen. Phones are 68% of this page traffic.
Changed The cards now open by default. A visitor can still collapse one.
3 changes shipped together on this date, so any movement belongs to the batch and cannot be split between them.
89 of 1,000 sessions since this shipped, and 44 of 1,000 before it
- still measuring Scrolled at all 4.5% → 11.2%
- still measuring Reached the signup page 0% → 0%
- still measuring Hit a rage or dead click 6.8% → 3.4%
No verdict until the window fills. The numbers above are shown so the wait is visible, not so anyone acts on them: a rate read early moves on noise, and checking until it looks good is how you find a winner that is not there.
Detected This page reported today as zero spend all day while the campaign was delivering. The snapshot job was already running hourly, so cadence was never the cause: it asked Meta for date_preset last_30d, and Meta's last_Nd presets exclude the current day. No schedule could have fixed it.
Changed An explicit date range ending today. Verified against the live campaign: the preset returned 09-01 only, the range returned 09-01 and 09-02. Today's spend and impressions appear on this page from now on, so a same-day reader is no longer looking at a zero that reads like a result.
Detected The page published rates but never the number the campaign is actually judged on: what a signup costs against what we will pay for one. Without it a reader could not tell a working campaign from a failing one, and the obvious reading of zero signups was that the ads had failed.
Changed The goal is now stated at the top and worked backwards through the funnel. It also computes how much traffic is needed before zero signups means anything: about 226 sessions for the first one at the required rate, and about 677 before a continued zero is evidence rather than a quiet spell. At 31 sessions the honest verdict is that it is too early, and the page says that instead of implying failure. (Thresholds as of 2026-09-02, at $0.33 a session over 31 sessions; they move with the cost per session and the live goal block supersedes them.)
Detected The landing page had exactly one conversion, the signup, and it is the slowest thing on the funnel to fire. At the required rate and this budget, the first one was not expected for about two weeks, so there was nothing to read in between.
Changed A Book 15 minutes link now sits beside Start free on every call to action, and clicking it emits a custom event through the pixel's public API. It is counted as a branch off the funnel and labelled a click, not a booked call: the calendar is a Google link and Google reports nothing back to us. The cost goal is still judged on signups.
3 changes shipped together on this date, so any movement belongs to the batch and cannot be split between them.
118 of 1,000 sessions since this shipped, and 15 of 1,000 before it
- still measuring Scrolled at all 6.7% → 9.3%
- still measuring Reached the signup page 0% → 0%
- still measuring Hit a rage or dead click 13.3% → 3.4%
No verdict until the window fills. The numbers above are shown so the wait is visible, not so anyone acts on them: a rate read early moves on noise, and checking until it looks good is how you find a winner that is not there.
Detected The brief was agencies with at least two people. No ad platform sells headcount targeting, so it has to be inferred.
Changed Required a second signal: tools a staffed agency buys and a solo freelancer usually does not. Reach fell from 383,000 to 135,000, so it is filtering rather than rubber-stamping.
Detected The previous agency ad pointed at a comparison page: 29.7 KB compressed against our own 25 KB budget, with a headline that promised something the ad had not.
Changed A purpose-built page at 21.6 KB whose headline is the ad headline.
Detected Clicking a question wrote it into a box and stopped, then asked for a second click to see the answer. That is a dead click, the exact thing this product detects.
Changed Selecting a question now moves the question and the answer together.
Detected On a 375px phone the only call to action sat below the answer panel, off the first screen.
Changed A button now sits under the headline, measured at 450px on an 812px screen.
Detected Our own layout check flagged logo links at 34px and a button at 26px, under the minimum Apple and Google both publish and a defect this product reports to customers.
Changed All raised past 44px, verified at five screen widths.
Detected No signup record carried a campaign tag. The capture ran only inside the app, so anyone who arrived on a marketing page and clicked through to the signup form lost it on the way.
Changed First touch is now recorded on every marketing page. There is no backfill: what was never captured cannot be recovered.
Detected Creating the ad made Meta fetch the page: 8 sessions carrying the campaign tag and a click ID before a penny was spent. Our own bot check caught 1 of the 8.
Changed Days with no spend cannot report traffic, and flagged sessions are dropped.
This shipped on the campaign's own first day, so there is no earlier traffic to compare against. It cannot be scored, now or later. Batches from here on can be.
Detected Two Dallas trades concepts ran at 1.22% and 0.91% click-through, under the 1.5% floor, while 85% and 100% of their clicks survived the page load. The hook was failing, not the page. The agency concept then ran at 1.86%.
Changed Different audience and geography, so not a clean comparison, but enough to keep the agency angle and stop rewriting landing pages.
Detected Interest targeting alone reaches everyone who works in advertising, most of whom cannot buy software.
Changed Added a business-owner signal as a required second condition rather than a broader interest list.
This shipped before the campaign started, so there is no traffic from before it to compare against. It cannot be scored against this campaign, now or later.
Detected Our first campaign spent about $7 for zero signups: 174 clicks, 98.7% of them bouncing at under 10% scroll.
Changed Every campaign now optimises for landing page views, which only count when the page actually loads in a browser.
Detected Instagram sessions reported page-load times of 93 to 111ms on Pakistani mobile networks, which is physically impossible.
Changed Facebook feed only, on every campaign since.
This shipped before the campaign started, so there is no traffic from before it to compare against. It cannot be scored against this campaign, now or later.
"Better" and "worse" are only used when a two-proportion test clears 95% confidence; anything short of that reads as no detectable change, because on this much traffic a couple of points is noise. And none of this proves cause. The ad, the audience and the market all keep moving; this measures what happened after a change, not what the change did.
Any figure quoted inside an entry above is as of the date of that entry, computed on the data and the rules in force that day. The live blocks at the top of the page supersede it. Where the two disagree, that is the campaign moving or the measurement being corrected, both of which are recorded here rather than edited out.
Day by day
Spend and sessions are separate charts on purpose: they are different scales, and one chart with two y-axes can be made to show any relationship you like. Dashed rules on the rate charts mark the days we changed something. A day with fewer than 25 in its denominator is drawn as a gap, because a rate over a handful of events is not a rate.
What moves with what
Pearson correlation across the days above. Every figure carries the number of days behind it. Correlation is not cause, and at these sample sizes it is barely even correlation.
| Pair | Correlation | Days |
|---|---|---|
| Spend vs Ad sessions | +0.97positive95% interval +0.81 to +1.00 | n = 7 days |
| Spend vs Signups from this ad | not enough data yet | |
| Ad sessions vs Signups from this ad | not enough data yet | |
| Ad sessions vs Rage-click sessions | +0.03sign not established95% interval -0.74 to +0.77 | n = 7 days |
| Ad sessions vs Sessions reaching signup | not enough data yet | |
| Rage-click sessions vs Signups from this ad | not enough data yet | |
Every number, as a table
The same data behind every chart above, so nothing here is readable only as a shape.
| Date | Spend | Impr. | Clicks | LPV | Server saw | Tagged | Sessions | Read ≥50% | Calendar | Audit | Stayed | Reached signup | Signups | Rage | Dead |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2026-09-07 | $1.82 | 284 | 1 | 1 | 37 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2026-09-06 | $4.75 | 655 | 8 | 7 | 147 | 10 | 10 | 1 | 0 | 0 | 2 | 0 | 0 | 1 | 1 |
| 2026-09-05 | $11.37 | 2,065 | 24 | 24 | 118 | 25 | 25 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
| 2026-09-04 | $8.26 | 1,052 | 24 | 21 | 30 | 26 | 26 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2026-09-03 | $10.57 | 1,111 | 36 | 34 | 49 | 27 | 27 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2026-09-02 | $10.53 | 1,237 | 28 | 26 | 109 | 29 | 29 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 2026-09-01 note | $0.13 | 13 | 0 | 0 | 115 | 16 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
"Server saw" is requests for the landing page carrying this campaign's tag, counted server-side with no JavaScript involved, crawlers included. "Tagged" is every session our pixel reported with the tag, before any filter. "Sessions" is what is left after the bot classifier and the no-click gate, and is the number used everywhere else on this page. A day marked "note" had sessions removed; hover the mark for why. 2026-09-01: Meta recorded no link click on this day, so the 15 tagged session(s) did not come from the ad; treated as ad-review crawlers or forwarded links, not visitors
Take the raw data
Every daily row behind this page, as CSV: spend, impressions, clicks, landing page views, sessions, signup-page reach, signups, rage clicks and dead clicks. Free, but it needs an account, because an open export of a live campaign is a scraping target rather than a reader.
Sign up to downloadAlready signed inWhy we publish this
Harvv tells people what their visitors actually did, including when the answer is unflattering. It would be strange to sell that and keep our own numbers private. If the ads do not work, this page will say so.