Traffic Desk: tag ad destinations so clicks are attributable

The Traffic Desk has been unmeasurable since it shipped. track.js reads ?v=
before it reads document.referrer, so every angle-linked ad click was filed
under "angle:graveyard" (or two/phone/pocket) and the referring domain was
discarded. Ad clicks, flyer QR scans, massifly angle links and Telegram angle
links all collapsed into the same four buckets — about 11,400 landings with
no attributable source between them — while networkadspace.com showed one
single visit against roughly 45,000 served impressions.

That reads as "the ads produce nothing." What it actually means is that
nothing carried a source.

Destinations now carry src=nas-banner or src=nas-text. `src` is checked
before `v` in track.js so it wins cleanly, and the landing page reads ?v=
separately so the angle hook is untouched. Split by format because we have
believed text outperforms banners for weeks without being able to show it.

This is the prerequisite for everything else here: pooled Ad Intel
benchmarks, judging which placements are worth expanding, and telling a
member what their impressions bought.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
martbost
2026-08-30 06:37:41 -05:00
parent 439c5885de
commit 3f48bdfd99
+14
View File
@@ -183,6 +183,20 @@ async function launch(opts) {
if (!opts.hasPage) throw new Error('Build your personal page first, then you can point ads at it.');
target = 'https://rmcircle.team/p/' + opts.id;
}
// Tag the destination so a click can be traced back to this network.
//
// Without this the Traffic Desk is unmeasurable: track.js reads ?v= BEFORE
// it reads the referrer, so every angle-linked ad click was filed under
// "angle:graveyard" and the referring domain thrown away. Ad clicks, flyer
// QR scans and massifly angle links all landed in the same four buckets,
// and networkadspace.com showed a grand total of 1 visit across ~45,000
// served impressions — not because the ads produced nothing, but because
// nothing carried a source.
//
// `src` wins over `v` in track.js, and the landing page still reads ?v=
// separately, so the hook keeps working. Split by format because we believe
// text outperforms banners and have never been able to show it.
target += (target.indexOf('?') === -1 ? '?' : '&') + 'src=nas-' + (isText ? 'text' : 'banner');
const idem = 'rmc-' + opts.id + '-' + monthKey() + '-' + crypto.randomBytes(6).toString('hex');
const payload = {