Early access

Every ad platform reports its own conversions. Trailhead reports what actually happened.

Trailhead measures from your side of the fence. Clicks are captured on your own domain, revenue comes out of your own systems, and the two are joined by hard evidence in a strict order. Every figure on a Trailhead dashboard traces back through a named rule to a specific click and a specific payment.

No third-party pixel. Capture sets no cookies. Write-back runs in sandbox until you clear it for a specific ad account.

The Trailhead dashboard: revenue, attributed and unattributed revenue, spend, blended ROAS and match rate as headline tiles, above a daily chart of attributed revenue against spend.
Attributed and unattributed revenue sit side by side. The revenue Trailhead cannot join to a click keeps its own bucket and its own number, because spreading it across channels is how a dashboard starts flattering itself.
Click evidence captured on arrival
gclid· gbraid· wbraid· msclkid· fbclid· UTMs· Consent Mode v2
The problem

The platforms grade their own homework

Every ad platform reports its own conversions, and every one of them is structurally motivated to claim as many as it can. Two platforms routinely both take credit for the same sale. Modeled conversions fill the gaps with estimates. And none of it is connected to what landed in your bank account.

A $40 lead that became a $12,000 job and a $40 lead that ghosted look identical in a platform dashboard. So claimed performance keeps looking better than the business feels, and budget gets allocated on numbers produced by the party selling the ads.

The tools that promised to fix this mostly moved the problem. Another pixel on your site, another vendor holding your customer data, another model producing numbers nobody can trace.

What a platform can tell you

Its own claimed conversions, and its own cost.

  • conversions
  • cost
  • cost / conv.
  • conv. value (modeled)

What your books can tell you

Money, with no idea where it came from.

  • invoice
  • closed job
  • order total
  • refund

Trailhead is the join between those two lists.

How it works

Click in, revenue out, and back to the optimizer

Five stages, each one deterministic. Run the same data through twice and you get the same answer twice.

  1. Capture A one-line snippet posts click ids, UTMs and consent signals to a worker on your own subdomain. No cookies, no logging, an empty 204 back.
  2. Identity Leads arrive over signed webhooks. Email and phone are hashed at the front door and only the hashes are kept.
  3. Revenue Closed jobs, paid invoices, orders and refunds arrive by CSV upload or webhook. Money becomes integer micros or it is rejected.
  4. Stitch Revenue is joined to a click by three tiers of evidence, strongest first, inside a 90-day lookback. Every match records which tier made it.
  5. Attribute Five models computed side by side in integer micros, so per-channel revenue sums to the total exactly.
  6. Write back A dry-run plan, then a hash-bound approval, then an idempotent send. Sandbox until an account is cleared.

Capture runs on your property

A lightweight Cloudflare Worker runs on a subdomain you own, with a direct-post fallback if you would rather skip it. It sets no cookies, logs nothing, and answers with an empty 204. Ad-click context survives navigation in the visitor's own sessionStorage, not in anything Trailhead plants.

The landing URL is stored with its query string removed, so tokens and personal data that ride in URLs never persist. A click carrying no joinable signal at all is not stored. Trailhead keeps evidence, not exhaust.

Identifiers are hashed at the front door

Email is lowercased and hashed with SHA-256. Phone is normalized to E.164 and hashed. Only the hashes persist, and matching runs on hashes end to end. Raw request bodies are never stored; the audit archive is a field allowlist with the identifier sources redacted.

Webhook retries deduplicate at the database, so a replay cannot double-count a lead. Duplicate click beacons collapse into one click by construction.

The stitch

Three tiers of evidence, and a fourth we refuse to build

The stitch engine joins an outcome to a lead by hard evidence, strongest first, inside a 90-day lookback with a one-day grace for clock skew. The first tier that yields a lead wins, and the match records which one it was, so you always know how solid a number is.

What matches nothing stays visible as unmatched. It is a number Trailhead shows you, not a number it hides.

  1. Click id

    The same platform click identifier on both sides. Strongest evidence there is.

  2. Phone hash

    E.164-normalized, SHA-256. The same person called and the same person paid.

  3. Email hash

    Lowercased, SHA-256. Weaker than a phone in home services, stronger in retail.

  4. Same afternoon, probably the same person

    There is deliberately no time-window-only tier. Matching on proximity alone is attribution by hope, and it is the single easiest way to make a report look better than the business.

Attribution

Five models side by side, because the disagreement is the finding

Switching models is one click. Comparing them is a table, because the useful question is rarely "what is the number" and usually "how much does the number depend on which story I tell".

The five

Last-touch, first-touch, linear, time-decay with a 7-day half-life, and position-based at 40/20/40. All deterministic, all computed in code.

Exact money

Every figure is an integer in micros end to end. Revenue split across touchpoints uses largest-remainder allocation, so per-channel numbers sum to the total to the cent, every time.

Honest buckets

Channel resolution goes click-id type, then UTM alias, then direct. Spend is prorated to the window by day overlap. Unattributed revenue keeps its own bucket.

The model comparison table: the same revenue attributed under last-touch, first-touch, linear, time-decay and position-based, with the per-channel totals differing by model and every column summing to the same total.
Same revenue, five stories. In the demo workspace, paid social is worth almost nothing on last-touch and a great deal on first-touch, because it is where people first hear about the business and search is where they call. Cut it on the last-touch number and the search campaigns get quietly more expensive.
The working surface

What you actually look at

Six screens. Each one answers a question somebody asks out loud in a meeting.

The live feed: clicks and leads arriving in near-real time, each row carrying a type badge and a consent badge.
Live feed. Clicks and leads arriving with type and consent badges. The fastest way to confirm capture is wired correctly, and the first screen anyone opens after installing the snippet.
The outcomes screen: a revenue summary with stitch-tier badges on each row, a source list, CSV upload, and a button to run the stitch.
Outcomes. Revenue with a stitch-tier badge on every row, so a strong match and a weak one never read the same. Sources, CSV upload, and one button to run the stitch.
The reconciliation screen: Trailhead's numbers next to each platform's claims, a labelled blended view carrying a double-count warning, an alignment ratio, and a data-hygiene score out of 100.
Reconciliation. Your numbers next to each platform's claims, with an alignment ratio and a hygiene score out of 100 computed from four weighted components. When there is not enough data to score, it abstains and says why.
The guided setup wizard: six steps down the left, each with a state, and the current step verified against the workspace's own captured data.
Guided setup. Six steps, progress held on the server so it resumes on any device. Every step is checked against your workspace's own data before it goes green. A step is never done because somebody ticked a box.

And an export you can hand to anyone

One click produces a standalone HTML report with the numbers baked in. No login, no link that expires, nothing that phones home. Put it next to what the platforms told you for the same period. The gap between those two documents is the reason this product exists.

Write-back

Review first, transmit second

Smart bidding optimizes toward whatever conversions it is given. Give it form-fills and it buys form-fills. Give it banked revenue and it starts buying customers. Closing that loop is the point, and it is built deliberately backwards from most tools.

01

Dry-run plan

Trailhead assembles the exact per-account payload and shows you every candidate and every exclusion, each with its reason. Nothing leaves the building at this stage.

02

Hash-bound approval

Approving locks the plan by content hash and by connector-config digest. Change the dataset, the account or the conversion action and the approval is void. What you approved is exactly what can go, or nothing goes.

03

Idempotent send

Every conversion carries a per-outcome idempotency key in a permanent ledger. Renaming an action, retrying a batch or re-running a plan cannot re-transmit a conversion.

A write-back dry-run plan: tiles counting the candidates, their total value and the number excluded, a status of dry_run, the plan hash the approval binds to, and candidate rows showing whether each one matched on a click id or on hashed identifiers.
The plan. Every candidate, its value, and how it matched. The hash above the table is what an approval binds to, so a plan that changed after you read it cannot go.
The exclusions list from the same plan: a summary showing 11 excluded for no platform identifier and 94 for already being uploaded, above a table naming the rule that excluded each outcome.
And what will not go. Each exclusion names the rule that produced it. A plan that drops most of a batch is telling you something true about your data, and it says so before anything is approved.

Where this stands today. Adapters for Google, Microsoft and Meta are built against doc-verified fields, and the release runs write-back in sandbox by default: payloads are assembled, recorded and auditable, and nothing is transmitted. Live send is gated twice, once per build and once per workspace, and is turned on account by account as verification against a real account completes. You lose nothing waiting. The plans, approvals and ledger built in sandbox are the same objects that go live.

The suite

Three products, one operating loop

Trailhead is the middle step. Analyze what the platforms claim, attribute what actually happened, then act on both.

Analyze

TrailMap

Turns paid-media exports and connected accounts into a prioritized action plan. It answers what the platforms are claiming and what to do about it.

findtrailmap.com →
Attribute

Trailhead

Establishes what actually happened by joining first-party clicks to banked revenue. Trailhead imports TrailMap's claimed spend and exposes its own attributed-revenue feed for TrailMap to pull.

How the two connect →
Act

Outfitter

The execution layer. Build a batch of ad changes, dry-run it against the live account, publish only what a person approved. No data link to Trailhead exists yet; that is on the roadmap for both products.

adsoutfitter.com →
Candidly

What Trailhead does not do yet

The same honesty the product applies to your numbers, applied to itself.

  • Live conversion sending is being switched on account by account Write-back runs in review-first sandbox mode. Senders go live per account as verification completes, gated once per build and once per workspace.
  • No direct CRM API pulls ServiceTitan, Shopify and Magento are supported through their exports and webhooks with field-mapping templates. There is no API integration that reaches into them and pulls.
  • One attribution family Five deterministic models ship. A data-driven model is deliberately deferred until there is enough volume to make it honest.
  • Team invites hand you a temporary password You deliver it yourself. Email delivery is coming.
  • Single sign-on is not shipped OIDC is on the enterprise track and gets scoped with you rather than promised here.
  • TrailMap exchange is import and export, not a background feed The surfaces are live and connected customers use them today. Hands-off two-way synchronization is the next step, not the current state.
Questions

The ones that come up first

Do I have to put another pixel on my site?

No. Capture is a one-line snippet posting to a worker on a subdomain you own, or posting directly to your own signed endpoint if you would rather not deploy a worker. It sets no cookies and reads nothing about the visitor beyond the ad parameters already in the URL.

What happens to revenue that does not match anything?

It stays visible as unmatched, with its own number on the dashboard. It is never spread across channels to make the attributed figure look complete. A low match rate is a fact about your data collection, and hiding it would only delay fixing it.

How is this different from what my ad accounts already report?

Your ad accounts report their own claimed conversions. Trailhead reports revenue that arrived in your systems, joined to a click by a rule you can name. The reconciliation screen puts the two next to each other, including an explicit warning that platform numbers overlap and a blended total will double-count.

Can I see what would be sent before anything is sent?

That is the entire design. Every write-back starts as a dry-run plan listing candidates and exclusions with reasons. Approval binds to the plan's content hash, so a plan that changed after you reviewed it cannot go. And the release defaults to sandbox, where payloads are built and recorded and nothing is transmitted at all.

Where does my customer data live?

Email and phone are hashed at ingress and only hashes are stored. Raw request bodies are never persisted. Connector credentials and webhook keys are encrypted at rest with a key held outside the database, and no endpoint returns one. There is a per-person erasure operation and a full workspace purge behind a typed confirmation.

What does it cost?

$249 a month standalone, or $399 for TrailMap and Trailhead together. Full detail on the pricing page, including what is deliberately not a paid tier.

Find out what your ads actually did

Early access is open. We will wire capture with you, bring in your first outcomes file, and run the stitch on your real data so the first dashboard you see is your own.