BBrainyMetrics
Conversions APIs for 9 ad platforms

Know which ads actually make you money

BrainyMetrics follows every lead from the first ad click to the final sale, across devices, domains, calls and checkouts, then credits revenue to the campaigns, ad sets and ads that earned it.

  • 7 attribution models
  • First-party tracking
  • Call & booking tracking
  • Hourly spend sync
  • 9 conversion APIs
  • Funnels & dashboards

The problem

Every ad platform says it drove the sale

Meta, Google and TikTok each count conversions their own way, overlap with each other, and can't see refunds, phone deals or repeat purchases. So budgets get set on numbers nobody trusts.

Double-counted sales

Two platforms claim the same order. Your ad reports add up to more revenue than your bank account.

Broken journeys

A phone click, a laptop purchase and a checkout on another domain look like three different people.

Invisible revenue

Calls, CRM deals and renewals never reach the ad platform, so the ads that drive them look unprofitable.

How it works

From first click to final sale, and back to the ad

Ad clicks from Meta, Google and a newsletter land on your site and become tracked sessions, join into one person, who becomes a lead, books a call and buys; the revenue is credited back to the ads in your reports and sent to the ad platforms' conversion APIs.Meta adGoogle adNewsletteryoursite.comtracko.jssession · Spring Salesession · Brand searchsession · @oct-newsJJane Doe3 sessions · 2 devicesNew leadBooked callSale $1,000Credit · linearMeta ad$333Google ad$333Newsletter$333ROAS4.7xconversions API1Click captured2Session tracked3One person4Revenue recorded5Credit & feedback
attribution models
7attribution models
conversion APIs
9conversion APIs
integrations
40integrations
features
145features
A click on a Meta ad lands on your site; tracko.js reads the UTMs, ad ids and click id and records the session's channel, platform, campaign, ad set and ad.Your BrandSponsored30% OFFSpring Sale ends SundayShop nowyoursite.com/spring?utm_source=facebook…utm_sourcefacebookutm_campaignSpring Salebm_adset_id23851101bm_ad_id23851201fbclidIwAR2x9…Session recordedChannelPaid socialPlatformMetaCampaignSpring SaleAd setLookalike 1%AdVideo Hook AClick ids recognisedgclidfbclidttclidmsclkidwbraidli_fat_idScCid+17

01Tracking · Capture every click, on every page

Every ad click, decoded down to the ad

tracko.js reads UTMs, click ids and ad ids on landing and turns them into a session with its channel, platform, campaign, ad set, ad, keyword and placement. That's what lets reports join revenue with spend at the ad level.

What's included (5)+
  • UTMs plus 20+ click ids captured automatically: gclid, gbraid, wbraid, fbclid, ttclid, msclkid, li_fat_id, ScCid, rdt_cid, epik, twclid and more
  • Ready-made URL templates for Meta, Google, TikTok, Microsoft, LinkedIn and Snapchat, plus a URL builder for any landing page
  • Parameter names from other attribution tools are accepted, so you can switch without retagging
  • Tagging check warns when a platform with spend sends untagged or partly tagged clicks, with the fix ready to copy
  • Channels classified for you: paid search, social, display and native, organic, AI assistants (ChatGPT, Perplexity), email, SMS, affiliate, referral and direct
A third-party tracker is blocked by an ad blocker, while tracko.js served from your own subdomain loads and sets a first-party cookie that recognises the visitor weeks later.yoursite.comFirst-partyset by your serverad blockercdn.tracker-vendor.io7-day cookie in Safarisame site ✓t.yoursite.comCNAME → BrainyMetrics APIDay 1 · ad clickDay 21 · comes backSame visitor, still recognised

01Tracking · Capture every click, on every page

First-party tracking that ad blockers and Safari don't break

Serve tracko.js from a subdomain of your own site. The visitor cookie becomes first-party and server-set, so returning visitors stay recognisable for much longer.

What's included (5)+
  • Add t.yoursite.com with one CNAME record; BrainyMetrics verifies it over HTTPS
  • The async snippet never blocks rendering, and loading it twice is harmless
  • Single-page apps tracked out of the box, including hash routing and manual tracko('page')
  • Only accept events from your domains, exclude your own IPs, and set the session timeout
  • Verify installation per page, debug with ?tracko_debug=1 and read ids with tracko.getIds()
The visitor id travels from your site to a checkout on another domain and into an embedded booking iframe, so all three pages belong to one journey.yoursite.comcheckout.shop.io/?_bm=x7Q2checkout.shop.iobook.yoursite.com/?_bm=k9…book.yoursite.comBuy nowPay $197iframe · booking formvid_8f2cvid_8f2cvid_8f2c_bm_bmids from parentOne visitor · one session · three domainsStripe Payment Links → client_reference_idCalendly links & embeds → salesforce_uuid_bm removed from the URL, expires in 10 mintracko.decorate(url) for anything else

01Tracking · Capture every click, on every page

One journey across domains, checkouts and iframes

List your domains once. Links, forms and pop-ups between them carry the visitor along, and embedded forms ask the parent page for its ids.

What's included (4)+
  • Short-lived _bm parameter on links, form submissions and window.open, removed on arrival and expired after 10 minutes
  • Embedded forms and checkouts in iframes join the same session
  • Stripe Payment Links get client_reference_id and Calendly links and embeds get salesforce_uuid automatically
  • ManyChat ref links carry the visitor id into Messenger funnels; tracko.decorate(url) covers anything else
Newsletter, QR code and bio clicks go through a short tracking link that counts the click and redirects with UTMs, so the visit is credited to that placement instead of Direct.NewsletteremailQR codeprint · podcastInstagram biosocial/go/oct-newsshort tracking linkclicks1,2811,2821,2831,284302Lands onyoursite.com/offer?utm_source=newsletter&utm_medium=email&utm_campaign=oct&bm_sl=oct-newsUTMs you set are keptpause → 404, count keptWithout a linkDirectWith a linkEmail · newsletter · @oct-news/go/oct-news?email={{email}}→ reader identified on arrival

01Tracking · Capture every click, on every page

Tracking links for email, SMS, bios, podcasts and QR codes

Clicks from places that can't carry ad parameters usually land as Direct. A short link counts the click, adds your UTMs and a source tag, and redirects.

What's included (4)+
  • Presets for newsletter, SMS, Instagram bio, YouTube and podcast / QR
  • UTMs already on the destination are kept; parameters on the short link pass through
  • Add ?email={{email}} from your email tool to identify readers as they land
  • Pause a link (it returns 404) without losing its click count; compare links on the Source tag tab
On a sales page tracko.js measures video progress, scroll depth, engaged time, Core Web Vitals and rage clicks, and flags automated visits with a human score.yoursite.com/vsl25%25%50%50%75%75%Book a callrage click ×4Engaged timeScroll depth0:0812%0:4138%1:3664%2:1282%Core Web Vitals (this page view)LCP 1.8sCLS 0.02INP 140msVideo events · YouTube, Vimeo, Wistia, HTML5start25%50%75%completeBot filteringheadless → excludedHuman score92

01Tracking · Capture every click, on every page

Engagement, Core Web Vitals and bot filtering

Know whether a click turned into attention. Every page reports engaged time, scroll depth and Web Vitals, and automated visits are kept out of your numbers.

What's included (5)+
  • Engaged time (visible and active) and scroll depth per page, including SPA routes
  • Core Web Vitals: LCP, CLS, INP, FCP and TTFB
  • Video start, 25 / 50 / 75% and completion for HTML5, YouTube, Vimeo and Wistia
  • Rage clicks (4 rapid clicks in one spot) that point at broken UI
  • Headless and automated browsers excluded, with a 0-100 human score per session
The Live page streams events as they happen: page views, element views, clicks, form submissions, custom conversion events and orders.Live3 visitors active in the last 5 minutespage_view/pricing · Meta · Video Hook Aelement_viewpricing table seenclicktel:+1 555 987 0012form_submit[email protected] → new leadleadstarted_trialplan: pro · value 49conversionorderORDER-1001 · $197.00saletracko('track', 'started_trial', { plan: 'pro', value: 49 })<button data-tracko-event="watched_vsl">

01Tracking · Capture every click, on every page

Custom events, conversions and a live stream

Record anything in one line of JavaScript or one HTML attribute, mark it as a conversion to attribute it like a sale, and watch it arrive on the Live page.

What's included (5)+
  • tracko('track', name, props) or data-tracko-event on any element, with data-tracko-prop-* properties
  • Mark events as conversions (names seen in the last 90 days are suggested); a numeric value counts as revenue
  • Automatic clicks on outbound, tel:, mailto:, sms:, WhatsApp, Messenger, Telegram, downloads and buttons
  • Section impressions with data-tracko-view; ad pixel events observed for deduplication
  • Live page with pause and noise filters, plus a Traffic page of individual sessions
As a visitor fills a form, tracko.js recognises email, phone, name and the 'how did you hear about us' answer, never reads the password, fills hidden CRM fields and records a new lead with its source.Get the free guideEmailPhoneFirst nameHow did you hear about us?Password[email protected]+1 415 555 0199JaneInstagram••••••••Send me the guideemail ✓ identifiesphone ✓first_nameheard_about: Instagramnever readhidden fields filled: utm_*, gclid, tracko_vidNew leadJJane[email protected]First touchMeta · Spring SaleAdVideo Hook ASelf-reportedInstagramEarlier visitsattached (2)Repeat sendscount once / 30 min

02People · Know every person behind the clicks

Leads captured from any form, automatically

tracko.js recognises fields by type, name, label and autocomplete, so most forms work with no setup. The lead keeps the ad click that brought them in.

What's included (6)+
  • Regular forms, form-less React forms, shadow DOM widgets and same-origin iframes
  • HubSpot, Typeform, Calendly and Klaviyo embeds detected through their own events
  • Email, phone, names, company, address and coupon detected; passwords, cards, CVV and one-time codes never read
  • New and repeat leads counted separately; repeat sends within 30 minutes count once
  • Hidden CRM fields filled with UTMs, click ids, landing page, referrer and visitor id
  • Thank-you page URL parameters and marked-up elements identify buyers too; tracko('identify') for custom flows
A phone, a laptop and a tablet start as anonymous visitors. An email typed on the phone, a Stripe payment on the laptop and a fingerprint match on the tablet join them into one person with one journey.Instagram advid_a1typed email in a formGoogle searchvid_b7paid with the same emailDirect visitvid_c3fingerprint + network · 70%JPersonJane Doe[email protected]Stripe cus_P2x…fingerprint link · 70%Devices0123One journeyMeta adGoogleDirect$197Email or phone always beats a fingerprint.

02People · Know every person behind the clicks

Identity resolution across devices

The phone that clicked the ad, the laptop that paid and the tablet that came back become one person, from the strongest signal to the weakest.

What's included (6)+
  • Deterministic matches on email, phone (also by last 10 digits), your external id and Stripe / Shopify customer ids
  • Records that share an identifier merge automatically, with devices, orders and calls
  • Payment links, Shopify cart tokens and order notes tie a purchase to the exact browser
  • Optional fingerprint stitching (70% confidence) that never merges people and yields to any email or phone
  • Shared devices handled: each person keeps their own history
  • Person pages with LTV, identifiers, devices and a full timeline with credit badges
Opt-in identity network: one workspace contributes an identity with its browser fingerprint; another workspace that receives matches identifies an anonymous visitor with that fingerprint as a third-party match with a confidence score.Workspace AcontributesForm fill on site A[email protected]fp_91c · 82.14.6.xWorkspace BreceivesAnonymous visitor on site Bvid_z9 · fp_91cJane D.3rd partyfingerprint + IP /24 · 50%IdentitynetworkOpt-in, owner-controlled, with hard limitsTwo switches per workspace: contribute and receiveNever merges two people or replaces your own linksNever counts as an opt-in: no lead, webhook or CAPI eventGPC / Do Not Track browsers never shared or matchedSwitching contribute off removes what was sharedValues are flagged 3rd party until your site confirms them

02People · Know every person behind the clicks

Opt-in identity network

Workspaces that choose to can share identities with each other, so an anonymous visitor seen with a known fingerprint is recognised, with a confidence score.

What's included (4)+
  • Fingerprint matches, live and retroactive, and email / phone enrichment of missing fields
  • Confidence per match type, divided when a fingerprint was seen with several people
  • Owner-only switches to contribute and to receive; off by default
  • Network data is labelled third party and never counts as an opt-in
The same order arrives from a Stripe webhook, the Stripe API, tracko.js and the dataLayer; they merge into one order with server amounts and the browser's session, then a refund reduces it to net revenue.Stripe webhookserver · amount & statusStripe API syncserver · every 15 mintracko('order')browser · visitor & sessiondataLayer purchasebrowser · GA4 eventRefundcharge.refunded · $50ORDER-10014 copies → 1 orderCustomerJane DoeItemPro Course × 1SessionMeta · Video Hook ABuyer tag$Pro CourseRevenue$197.00$147.00net of refunds, in every report$197.00StripeShopifyWooCommercePayPalClickFunnelssysteme.ioGoHighLevelKajabiAPIZapier / Make

03Revenue · Record every dollar, wherever it's paid

Orders from every source, merged into one

Connect your checkout, funnel builder or CRM, or send orders from the browser and the API. The same order id from several sources becomes one order: server amounts, browser session.

What's included (6)+
  • Stripe, Shopify, WooCommerce, PayPal, ClickFunnels 2.0 and Classic, systeme.io, GoHighLevel, Kajabi, Leadpages
  • GA4 / GTM dataLayer purchases, tracko('order'), the server API and a Zapier / Make webhook
  • Refunds from every integration; reports always use revenue net of refunds
  • Line items, tax, shipping, discounts, coupons and hard costs for profit
  • Subscriptions and renewals marked recurring; Stripe trials, cancellations and plans
  • Buyers tagged $<product> automatically, so every report filters by product
Dynamic number insertion shows the visitor a tracking number; when they call it, the call is matched to their session and ad, then moves through booked, showed, qualified and closed.yoursite.com/contactGoogle · Search · BrandCall us(555) 123-4567(555) 987-0012swapped+1 415 555 0199 callsMatched to the sessionAnswered · 4:12 · Google › Brand › Ad 3Outcomeset on the Calls page, by API, or by your calendarBookedBookedShowedShowedQualifiedQualifiedClosed $2,500Closed $2,500Attribution report · Google › BrandCalls 1 · Booked 1 · Qualified 1 · Revenue $2,500 · Cost / qual. callNo-shows and cancellations never count as qualified

03Revenue · Record every dollar, wherever it's paid

Call tracking and booked-call outcomes

Dynamic number insertion shows each visitor their own number, so phone sales get the same attribution as online ones. Booked meetings are tracked through to closed.

What's included (6)+
  • Number pools swap numbers in text and tel: links, keeping your formatting, including content loaded later
  • Twilio, CallRail or any phone system through the API; the caller's number identifies the person
  • Bookings from Calendly, Acuity, OnceHub, GoHighLevel, Zapier / Make or the API
  • Outcomes: booked, showed, no-show, qualified, unqualified, closed with deal value, lost, cancelled
  • One call per person per window (default 30 days) so reschedules don't inflate results
  • Booked, Qualified and Cost per qualified call columns per ad

Attribution · Try it: seven models

One $1,000 sale, four touches, seven answers

Pick a model and watch the credit move across four touches.

Meta ad
$1,000
100% credit
Google search
$0
Counted, no credit
Newsletter
$0
Counted, no credit
Typed the URL
$0
Counted, no credit
Sale · ORDER-1001$1,000 · credited once
First click: 100% to the touch that first brought the person in. Good for: What creates new demand (prospecting).
Clicking Why? on a sale lists every visit by that customer and labels it: credited, counted with no credit, organic ignored, disregarded, outside the window or after the sale.ORDER-1001Jane Doe$197.00Why?Rules in forceLast non-direct90-day windowIgnore organic: onDisregard: @thankyou94 days beforeMeta · RetargetingOutside window20 days beforeMeta · Video Hook ACounted, no credit9 days beforeOrganic searchOrganic ignored3 days beforeEmail · @thankyouDisregarded1 day beforeGoogle · Search · BrandCredited 100%after the saleDirectAfter the sale

04Attribution · Credit the ads that actually earned it

Why did this sale get credited there?

Open Why? on any sale to see the rules in force and every visit by that customer, each labelled with what the model did with it.

What's included (4)+
  • Labels: credited (with share), counted with no credit, organic ignored, disregarded, outside window, after the sale
  • When nothing was credited it says why: no customer linked, no visits, all outside the window or disregarded
  • Disregarded sources (an order-confirmation email, a payment page) are removed from every journey
  • Lookback window, scientific window and ignore-organic settings rebuild credit in the background
The buyer saw an Instagram ad without clicking, then searched on Google. Click attribution credits Google; the self-reported answer says Instagram. Insights compares the two per answer with a click-match rate.How did you hear about us?Instagrambucket: Instagram → MetaWhat the clicks showIG ad, no clickGooglesearch click$297Click model: Google 100%Buyer says: InstagramInsights → Self-reportedAnswerLeadsSalesClick matchInstagram421131%Google30988%Podcast124—Word of mouth93—

04Attribution · Credit the ads that actually earned it

Self-reported attribution

Click models only see clicks. "How did you hear about us?" catches the Instagram ad someone saw, didn't click, and remembered.

What's included (3)+
  • Answers read from text fields, dropdowns and radio groups, identify(), the API and Shopify post-purchase surveys
  • Mapped to buckets: Facebook, Instagram, YouTube, TikTok, Google, AI assistant, podcast, influencer, word of mouth and more
  • Click match shows how often click attribution agrees with the platform the buyer named
With Meta spend sync, the attribution report adds blue platform columns: Meta's own 7-day click and 1-day view purchases and view-through revenue, shown next to your numbers but never added to them.AdSalesRevenuePlat. clickPlat. viewView rev.Video Hook A18$8,420219$3,960Carousel B7$2,3101014$5,880UGC Spark 311$4,970123$1,180Total36$15,700not added to your totalsSanity-check click trackingCompare Plat. click with Sales.Carousel B: 14 view sales yourclicks can't see. Judge the gap.Where it comes fromMeta: 7-day click, 1-day viewGoogle Ads: its own conversionsTikTok: Complete PaymentCSV / API: platform_* columns

04Attribution · Credit the ads that actually earned it

View-through, shown honestly

Platforms don't share who saw an ad. BrainyMetrics shows each platform's own click and view conversions beside your numbers, never mixed into them.

What's included (3)+
  • Meta 7-day click and 1-day view purchases, value and leads per ad
  • Google Ads and TikTok's own conversions from their spend syncs
  • platform_* columns for CSV and API imports from any other platform
Spend syncs every hour from Meta, Google and TikTok (or by CSV and API) and joins attributed revenue per campaign for ROAS and CPA, with a daily revenue-over-spend chart.Meta AdsGoogle AdsTikTok AdsCSV / APIhourly · last 3 days re-readCampaignSpendRevenueROASCPASpring Sale$4,210$18,9404.5x$111Search · Brand$1,120$9,8608.8x$51UGC Spark 3$2,480$4,9702.0x$225+ Profit, CPL, cost / new customer, cost / qualified callspendrevenue

05Reports · See what's working, in the numbers your business runs on

Spend synced hourly, ROAS and profit per ad

Connect Meta, Google and TikTok to pull spend per ad every hour, or import any platform by CSV or API. Spend joins attributed revenue without any mapping.

What's included (5)+
  • First sync imports 30 days, then hourly with the last 3 days re-read; backfill up to 730 days
  • CSV / API import for Microsoft, Snapchat, Pinterest, LinkedIn, X, Reddit, Taboola and Outbrain
  • ROAS, CPA, CPL, profit, cost per new customer and cost per qualified call on every row
  • Group by channel, source, platform, campaign, ad set, ad, creative, landing page, referrer, device, country, region or source tag
  • Drill Platform → Campaign → Ad set → Ad, filter by tag, sort and export CSV
Reconciliation puts actual revenue, tracked revenue and unattributed revenue side by side, then compares what each ad platform claims with the revenue traced to its ads, highlighting gaps over 25%.Actual revenue$52,400every sale, after refundsTracked$45,10086% tracking coverageUnattributed$7,300→ fix in Data cleanupBy ad platformwe tracedplatform claimsMeta+42%Google Ads+11%TikTok+8%Meta claims 42% more than its ads traceably drove: it's crediting itself with other channels' sales.

05Reports · See what's working, in the numbers your business runs on

Reconciliation: do the numbers add up?

Actual revenue, tracked revenue and unattributed revenue side by side, then what each ad platform claims next to what its ads traceably drove.

What's included (3)+
  • Tracking coverage as a percentage of real revenue, per day and per order source
  • Platform gap = (claimed − tracked) ÷ tracked, highlighted above +25%
  • Low coverage on a source points at a checkout without the snippet or orders without an email
Business dashboards show the KPIs each business model runs on, compared with the previous period: call funnel, e-commerce, SaaS and info product.Call funnelCall funnelE-commerceE-commerceSaaSSaaSInfo productInfo productShow rate74%▲ 6%vs previous periodClose rate28%▲ 3%vs previous periodCost / booked call$64▼ 9%vs previous periodROAS5.1x▲ 0.4vs previous periodFunnel by campaignLead → booked → showed → closedAOV$86▲ 4%vs previous periodNew customers412▲ 12%vs previous periodRefunded revenue2.1%▼ 0.3vs previous periodNew-customer ROAS2.9x▲ 0.2vs previous periodFunnel by campaignVisit → first purchase → repeat purchaseTrial → paid23%▲ 2%vs previous periodMRR$48.2k▲ 5%vs previous periodChurn rate3.1%▼ 0.4vs previous periodCost / subscriber$142▼ 6%vs previous periodFunnel by campaignLead → trial → first payment → renewalCost per lead$4.10▼ 8%vs previous periodRevenue / lead (30d)$11.80▲ 7%vs previous periodUpsell buyers (7d)18%▲ 2%vs previous periodROAS2.9x▲ 0.3vs previous periodFunnel by campaignLead → purchase → repeat purchase

05Reports · See what's working, in the numbers your business runs on

Business dashboards for your model

Pick call funnel, e-commerce, SaaS or info product and get the KPIs that business runs on, each compared with the previous period, plus its funnel by campaign.

What's included (4)+
  • Call funnel: show rate, close rate, cost per booked call, show and close, revenue per show
  • E-commerce: AOV, new vs returning customers, refunded revenue %, new-customer ROAS
  • SaaS: trials, trial → paid, MRR, active subscriptions, churn, cost per subscriber
  • Info product: cost per lead, revenue per lead within 30 days, upsell buyers within 7 days
A funnel follows people step by step: lead, booked, showed, closed, with conversion rates, drop-offs, median time between steps and a breakdown by campaign with cost per step.1,240Became a lead352Booked a call28%1.8dmedian261Showed74%3.2dmedian74Closed28%5.0dmedianclick any bar to see the people · "dropped off" lists who didn't continueBreak down by campaignSpendCost / closeROASSpring Sale · Meta640 → 210 → 160 → 48$4,210$885.7xBrand · Google380 → 98 → 71 → 19$1,120$598.1x

05Reports · See what's working, in the numbers your business runs on

Funnels that follow people step by step

Up to 10 steps, each counted only after the one before within your window. Break any funnel down by ad and see what each step cost.

What's included (4)+
  • Steps: visit, page view, lead, event, tag, pipeline stage, call, booked / showed / qualified / closed, purchase, first or repeat purchase, trial, subscription payment, renewal, cancellation
  • Conversion rate, drop-offs and median time between steps
  • Break down by channel, source, platform, campaign, ad set, ad, landing page or source tag, with spend, cost per step and ROAS
  • Templates for call funnels, e-commerce, SaaS trials and info products
The custom report builder adds a formula metric such as revenue divided by leads as a new column, then the report is pinned to a custom dashboard whose cards can be dragged into any order.Custom metricrevenue / leadsmoneyAddCampaignRevenueLeadsRevenue per leadSpring Sale$18,940212$89.34Search · Brand$9,860131$75.27UGC Spark 3$4,97096$51.77Custom dashboardpinned ✓ReportRevenue per leadFunnelLead → closedReportLead-to-sale % by ad6.2%

05Reports · See what's working, in the numbers your business runs on

Custom reports, custom metrics and your own dashboard

Build a report from any grouping and metric, write formulas like revenue / leads, and pin reports and funnels to a dashboard you arrange by dragging.

What's included (3)+
  • Formulas with + − × ÷ and parentheses, formatted as number, money, percent or ratio
  • Fix the attribution model per report, or follow the page picker
  • Drag cards to reorder; the order is saved for the whole workspace
Every number is clickable: clicking the 38 sales on a campaign row opens the people behind it with their share of credit, and the list exports to CSV for audiences.CampaignMeta › Spring SaleSessions2,914New leads212.5Sales38Revenue$18,94038 sales · the people behind the numberCredit follows the model (here linear), so the rows add up to 38.PersonCreditRevenueJJane Doejourney →1.00$197SSam Leejourney →0.50$148AAna Ruizjourney →0.33$99TTom Parkjourney →0.25$74… 61 more peopleCSVpeople.csv · audience

05Reports · See what's working, in the numbers your business runs on

Click any number to see the people

Every count on the dashboard, in the attribution report, in funnels and custom reports opens the people who make it up, with their share of credit.

What's included (3)+
  • Credit follows the model, so the people under a row always add up to the row
  • Each person links to their full journey
  • Export up to 5,000 people to CSV for retargeting and look-alike audiences
Lifetime value per lead grouped by the channel that first brought each lead in, next to cost per lead, and a cohort grid where each month's leads accumulate revenue over the following periods.LTV / lead by first touchwithin 90 days of opting inMeta$412CPL $38 → 11× returnEmail$340no ad costGoogle$286CPL $22 → 13× returnTikTok$198CPL $29 → 7× returnCohorts · revenue per leadby opt-in month, months after12345Jun406284106128Jul466890112Aug365880Sep4264Oct32Filter by first-touch channel or tagto compare how leads mature.Future periods stay blank.

05Reports · See what's working, in the numbers your business runs on

Lifetime value, cohorts, products and subscriptions

Decide what a lead from each channel is worth, watch cohorts mature, and see which products and plans each channel sells.

What's included (4)+
  • LTV per lead by first touch, over 7 days to all time, next to your CPL
  • Monthly or weekly cohorts with cumulative revenue, filtered by channel or tag
  • Products: units, customers, refunds, profit and AOV per product or category, credited by channel
  • Subscriptions: active, MRR, new, churned, rebills and rebill revenue by first-touch channel
A real purchase is hashed and sent server-side to the conversion APIs of nine ad platforms about 30 seconds later, reusing the browser pixel's event id so each platform deduplicates.Purchase$197[email protected]sha256 · 7d3f9a…fbc · gclid · ttclidevent_id: px_81f2from the browser pixel~30 s laterBrainyMetricsMetaGoogle AdsTikTokMicrosoftRedditSnapchatPinterestLinkedInXdeduplicated with pixel ✓value net of refundsleads sent tooactivity log per send

06Ad platforms & API · Feed the algorithms, and the rest of your stack

Server-side conversions for nine ad platforms

Purchases and leads are sent to each platform's conversion API about 30 seconds after they happen, from every source, including phone sales and CRM deals the pixel never sees.

What's included (6)+
  • Meta, Google Ads, TikTok, Microsoft, Reddit, Snapchat, Pinterest, LinkedIn and X
  • Hashed email, phone, name and address, IP, user agent and each platform's click id
  • Pixel event ids reused so platforms deduplicate browser and server events
  • Google enhanced conversions; test modes and test event codes; an activity log per send
  • Connect with Facebook, Google or TikTok in a few clicks, including manager (MCC) accounts
  • Meta Lead Ads imported with their ad, instantly or every 15 minutes
The Chrome extension adds a chip to every campaign, ad set and ad row in Meta Ads Manager and Google Ads with BrainyMetrics sales, revenue and ROAS, plus a floating totals bar with a model and date picker.Ads ManagerCampaigns · Last 7 daysCampaignResultsCost/resultSpentBrainyMetricsSpring Sale · Prospecting1,204$3.49$4,210ROAS 4.5x38 salesRetargeting · 30d612$2.61$1,600ROAS 2.1x9 salesUGC Tests389$6.37$2,480ROAS 2.0x11 salesLead form · Webinar910$1.98$1,800—no salesBrainyMetricsLast non-direct ▾Last 7 days ▾Alt+B show / hideSales 58 · Revenue $27,300 · ROAS 2.7x · Leads 312 · Qualified calls 14

06Ad platforms & API · Feed the algorithms, and the rest of your stack

Your attribution inside Ads Manager

A Chrome extension adds BrainyMetrics numbers to every campaign, ad set and ad row in Meta Ads Manager and Google Ads, next to the platform's own.

What's included (3)+
  • Choose the metrics: sales, revenue, ROAS, leads, qualified calls
  • A floating bar with totals, a model picker and a date picker
  • Connects with a read-only API key that's safe to share with the team; Alt+B to show or hide
Send orders, leads, calls and spend from your server with the API, read attribution back as JSON, and receive signed order, lead and call webhooks with the full journey in the payload.$ curl -X POST /api/v1/orders "order_id": "INV-2041", "total": 497, "email": "[email protected]", "visitor_id": "tvid_8f2c", "items": [ … ]→ 200 { "created": true }$ GET /api/v1/attribution?group_by=ad&model=first_clickServer APIPOST /orders · /refundPOST /leads · /callsPOST /appointments · /outcomePOST /ad-spendGET /attribution · /leads/journeyorder.createdOutbound webhookX-BrainyMetrics-Signature:t=1760090400,v1=9c1e…first_clickMeta · Video Hook Alast_clickEmail · newslettertouchpoints2 · linear credit 0.5person.tags$Pro Courseretried with backoff, up to 8×Eventsorder.createdorder.updatedlead.createdcall.createdcall.updated

06Ad platforms & API · Feed the algorithms, and the rest of your stack

API, webhooks and automation

Push data from your server, read attribution back, and get signed webhooks with the whole journey in the payload.

What's included (5)+
  • POST orders, refunds, leads, calls, appointments, call outcomes and ad spend
  • GET the attribution report, a lead's journey or one order's credit under every model
  • Full-access and read-only API keys
  • Signed order, lead and call webhooks with first click, last click and every touchpoint, retried with backoff
  • Zapier / Make / any-tool webhook for leads, orders, refunds, appointments and calls, no API key needed
Every 15 minutes the checks run; when visits stop, a critical alert opens, owners get an email, and it resolves itself once tracking recovers. A setup checklist ticks itself off from real data.Visits per hoursnippet removed in a deployCritical: No visits recorded in the last 24 hoursemail sent to ownersResolved automatically: visits are backkept 7 daysAlso checked every 15 minVisits droppedIntegration isn't syncingConversions rejectedSales without a tracked visitTracker errorsSetup checklistSnippet installedAd account connectedSales source connectedAds taggedFirst attributed saleConversions sent back (optional)

07Data quality & privacy · Keep the data honest, private and shared with the right people

Data health checks and alerts

Every 15 minutes each workspace is checked. When something affects your numbers an alert opens on the Data health page and in a banner, and owners and admins get an email.

What's included (4)+
  • No visits recorded, visits dropped, integration not syncing, conversions rejected, sales without a tracked visit, tracker errors
  • Each alert links to the page that fixes it and resolves itself once the check passes
  • A setup checklist that ticks itself off from your real data
  • Help requests arrive with a snapshot of alerts, setup progress and sync status attached
Data cleanup lists sales with no tracked click. A PayPal sale paid with a work email is matched to the lead with the same name; Attach merges them and the sale is credited to the ad that brought the lead in.Data cleanupsales ≥ $1,000 · last 7 daysPayPal · $1,500 · [email protected]no tracked clickSame name:Jane Doe · [email protected] · 6 visitsAttach$1,500JJane Doe[email protected]+ [email protected]Meta adDirectDirect$1,500Attribution rebuilt in seconds · Meta › Spring Sale gets the $1,500Future sales from [email protected] match automatically.

07Data quality & privacy · Keep the data honest, private and shared with the right people

Data cleanup for sales with no tracked click

Buyers who opted in with one email and paid with another show up in one list. Attach the sale to the right lead and attribution rebuilds in seconds.

What's included (3)+
  • Filter to sales or calls and by value, so you fix the ones that change decisions
  • Same-name suggestions, or enter the other email or phone from your CRM
  • Add a sale by hand (cash, bank transfer) or merge two records from a person's page
In required consent mode, events wait in memory while the cookie banner is open; when the visitor accepts they are sent, and if they decline nothing is stored. Consent is read from Google Consent Mode, IAB TCF, OneTrust and Cookiebot.yoursite.comWe use cookies for analyticsAcceptDeclineheld in memory, nothing storedconsent granted: queue sentBrainyMetrics6 events sent after consentConsent modeNo consent neededHonour Global Privacy ControlRequire explicit consentReads your banner automaticallyGoogle Consent Mode v2IAB TCF v2OneTrustCookiebotPassword & card fields never readSHA-256 before ad platformsSecrets encrypted at rest

07Data quality & privacy · Keep the data honest, private and shared with the right people

Consent and privacy built in

Choose a consent mode per workspace. In required mode nothing is stored or sent until the visitor agrees, and tracko.js reads your consent banner on its own.

What's included (4)+
  • No consent needed, honour Global Privacy Control, or require explicit consent
  • Google Consent Mode v2, IAB TCF v2, OneTrust and Cookiebot read automatically
  • tracko('consent', 'denied') stops tracking and deletes tracko cookies and storage
  • Customer data hashed (SHA-256) before it reaches ad platforms; secrets encrypted at rest
Invite teammates by email with a role. Owners, admins, members and viewers each get the access they need.Invite[email protected]Member ▾Send invitelink · 14 daysYYou[email protected]OwnerEverything, incl. owners & privacyPPriya[email protected]AdminSettings, integrations, API keys, teamAAlex[email protected]MemberAll reports + cleanup and mergesjoined ✓SSam[email protected]ViewerRead-only reports

07Data quality & privacy · Keep the data honest, private and shared with the right people

Workspaces, teams and roles

Run one workspace per business or client, and invite your team, agency or VA with exactly the access they need.

What's included (4)+
  • Owner, admin, member and viewer roles; a workspace always keeps an owner
  • Email invitations that expire after 14 days and only work for the invited address
  • Per-workspace currency, time zone (reports follow it), domains and settings
  • Flat monthly or yearly plans; pause billing while tracking keeps running

The complete list

Every feature, in one place

Tracking script (tracko.js)

23 features
  • Async snippet that never blocks rendering
  • UTM capture: source, medium, campaign, content, term
  • 20+ click ids: gclid, gbraid, wbraid, dclid, fbclid, ttclid, msclkid, li_fat_id, twclid, ScCid, epik, rdt_cid and more
  • Campaign, ad set, ad, keyword and placement ids and names
  • Parameter aliases from other attribution tools
  • Source tags (bm_sl) for emails, influencers and partners
  • URL templates for Meta, Google, TikTok, Microsoft, LinkedIn, Snapchat
  • URL builder for any landing page
  • Tagging check for untagged and partly tagged ads
  • Channel classification, including AI assistants
  • First-party tracking domain via CNAME
  • Server-set first-party cookies
  • Single-page apps and hash routing
  • Manual page views with tracko('page')
  • Cross-domain links, forms and window.open
  • Iframe hand-off for embedded forms and checkouts
  • tracko.decorate(url) for custom redirects
  • Stripe Payment Link, Calendly and ManyChat link decoration
  • Domain enforcement and excluded IPs
  • Configurable session timeout
  • Verify installation, debug mode and tracko.getIds()
  • tracko('ready') callback and tracko:ready event
  • Tracker error reporting
Learn more

FAQ

Questions, answered

What does BrainyMetrics do?

It tracks every visit to your site with its ad, campaign and source, ties visits to people when they share an email or phone, records their leads, sales and calls, and splits the credit across the ads and channels that led there, so you can see real ROAS per campaign, ad set and ad.

How is this different from Meta Ads Manager or Google Analytics?

Ad platforms count conversions by their own rules and often claim the same sale. Analytics tools usually credit the last click and don't see refunds, phone sales or CRM deals. BrainyMetrics counts each sale once from your own data, across every channel, with seven attribution models to compare.

How long does setup take?

Installing the snippet takes minutes. Connecting your payment processor and ad accounts takes a few more. Most data starts flowing immediately, and spend syncs import the last 30 days on the first run.

Does it track phone calls and booked calls?

Yes. Dynamic number insertion matches phone calls to the session that produced them, and bookings from Calendly, Acuity, OnceHub or GoHighLevel are tracked as booked calls with outcomes like qualified and closed.

Can it send conversions back to ad platforms?

Yes. Purchases and leads are sent server-side to Meta, Google Ads, TikTok, Microsoft, Reddit, Snapchat, Pinterest, LinkedIn and X, deduplicated with your existing pixels.

How do I know the attribution is right?

Every sale has a Why? view listing each visit and what the model did with it, every number opens the people behind it, and the Reconciliation page compares tracked revenue with your actual revenue and with what each ad platform claims.

What happens if tracking breaks?

Checks run every 15 minutes. If visits stop, a sync fails, conversions are rejected or sales arrive without a tracked visit, an alert opens in the app and owners and admins get an email. It resolves itself once the problem is fixed.

Is it privacy-friendly?

You choose the consent mode. In required mode nothing is stored or sent until the visitor consents, and BrainyMetrics follows Google Consent Mode v2, IAB TCF, OneTrust and Cookiebot. Password, card and one-time-code fields are never read.

See which ads actually make you money

Install one snippet, connect your checkout, and get attribution you can act on today.