Theme

Sign inStart for free

Know which source paid you, and how we know.

Tally is revenue analytics that shows its work. It ties each sale from Stripe, Paddle, Lemon Squeezy or Polar to the visit that brought the buyer, and gives every sale a receipt: the evidence, the method that linked it, and how sure it is.

14 days free, no card needed.

Example
  1. Googlegoogle.comRedditreddit.com/r/SaaSChatGPTchatgpt.comNewsletterutm_medium=emailx.comt.co
  2. Read /pricingUnited StatesAustin · Safari on iOSRead /blog/stripe-feesGermanyBerlin · Firefox on LinuxRead /compareCanadaToronto · Chrome on macOSRead /United KingdomLeeds · Edge on WindowsRead /launchNetherlandsUtrecht · Chrome on Android
  3. $49.00 salecredited to Google$120.00 salecredited to Reddit$49.00 salecredited to ChatGPT$19.00 salecredited to Newsletter$79.00 salecredited to x.com
yoursite.comExample data

Revenue

$1,586

29%vs the 7 days before

after $39 in refunds and chargebacks

Conversion

1.0%

2%vs the 7 days before

Revenue per visitor

$0.51

2%vs the 7 days before

Linked to a visitor

86%

6 payments, $227 not linked. See what to fix

Visitors

3,086

30%vs the 7 days before

Pageviews

8,070

30%vs the 7 days before

Engaged time per visit

46s

6%vs the 7 days before

Live now

4

visitors in the last 5 minutes

Visitors and revenue

  • Visitors
  • Revenue
  1. GoogleOrganic Search949$303
  2. Direct698$292
  3. x.comOrganic Social387$260
  4. RedditOrganic Social234$111
  5. ChatGPTAI Assistants228$170
  6. Hacker NewsOrganic Social179$81
  7. NewsletterEmail128$92
  8. PerplexityAI Assistants76$55

Pages

  1. /1,997$797
  2. /pricing1,098$290
  3. /blog/stripe-fees549$91
  4. /docs351$36
  5. /compare293$28
  6. /changelog179$65
  7. /blog/launch-week160$20
  8. /signup122$37

A page's revenue is what visitors who viewed it paid afterwards in this period. One sale counts on every page its buyer saw, so the column adds up to more than the total.

Countries

  1. United States1,080$401
  2. Germany333$265
  3. United Kingdom291$284
  4. India205$212
  5. Canada163$70
  6. France119$37
  7. Netherlands96$35
  8. Brazil91$61

Devices

  1. Desktop2,095$834
  2. Mobile1,098$490
  3. Tablet97$40

What Direct was

Last 7 days · 831 visitors with no referrer

Visits that came with no referrer, and our best reading of each: a guess from the page they landed on, the device and the browser, not a certainty.

Our best reading

Typed or bookmarked

405 visitors · 49% of Direct

Someone typed your address or opened a bookmark: people who already know where to find you.

How we read it: No referrer, a landing on your home page or a one-part path such as /pricing, on a desktop.

Our best reading

Back from checkout

77 visitors · 9% of Direct

A buyer coming back from the payment page in a new visit. They were already here; this visit isn't a new arrival.

How we read it: A payment provider as the referrer, or a landing on a checkout success address, at the start of a visit.

Our best reading

Instagram in-app browser

63 visitors · 8% of Direct

Opened inside Instagram's own browser, which keeps the post or profile the link was in to itself.

How we read it: Instagram's mark in the browser's user agent, and no referrer. Sources count these visits under Instagram, Organic Social.

Our best reading

TikTok in-app browser

35 visitors · 4% of Direct

Opened inside TikTok's own browser, which keeps the post or profile the link was in to itself.

How we read it: TikTok's mark in the browser's user agent, and no referrer. Sources count these visits under TikTok, Organic Social.

Our best reading

LinkedIn in-app browser

21 visitors · 3% of Direct

Opened inside LinkedIn's own browser, which keeps the post or profile the link was in to itself.

How we read it: LinkedIn's mark in the browser's user agent, and no referrer. Sources count these visits under LinkedIn, Organic Social.

Our best reading

Facebook in-app browser

14 visitors · 2% of Direct

Opened inside Facebook's own browser, which keeps the post or profile the link was in to itself.

How we read it: Facebook's mark in the browser's user agent, and no referrer. Sources count these visits under Facebook, Organic Social.

Look closer

  1. Linked to a visitorHow much of the revenue is tied to a visit, with a link to the fix-it list for the rest.Coverage
  2. Revenue on every rowEach source, page and country with the money its visitors paid, and every sale with its receipt.Receipts
  3. What Direct wasVisits with no referrer, split into typed, shared links, returns from checkout and in-app browsers.Traffic
Fig. 1The dashboard itself, on an example site with made-up numbers. Pick a period, switch between sources and channels, hover the chart, or pick a reading of Direct.

What only Tally does

Of the revenue analytics we compared feature by feature in October 2026, DataFast and DataBull, neither does these four.

  1. Example

    $49.00

    1. First visit2 Oct
    2. Credited visit14 Oct
    3. Link14 Oct
    4. Payment14 Oct

    Checkout metadata, high confidence

    A receipt for every sale

    The visits behind it, what tied the payment to them, the method and how sure it is. When nothing links a sale, the receipt says so: it is never guessed.

    See a receipt
  2. Example

    86%linked

    FixCheckout Sessions without a visitor id9 payments, $343

    metadata: { tally_visitor_id: id }

    Coverage, with the fix

    How much of your revenue is linked to a visitor, each reason the rest isn't, and the code that fixes it.

    See the fix-it list
  3. Example

    Most clicked on /pricing

    1. #plan-pro .plan-cta424
    2. #billing-yearly31 rage236

    Replays and heatmaps beside the money

    Watch the recorded visit behind a sale from its receipt, and see where people click and how far down they read.

    See replays
  4. Example
    The customer ecosystem on the example site: thousands of visitors as glowing particles, gathered into named clusters and coloured by health.The customer ecosystem on the example site: thousands of visitors as glowing particles, gathered into named clusters and coloured by health.

    Labs: your customers, alive

    Visitors as a living ecosystem that moves week by week, and a river in pastels from first source to sale, drawn only from what they did.

    See Labs

01Traffic

Where visitors come from, in names you'd use.

Referrers become sources you recognise: t.co is x.com, chatgpt.com is ChatGPT, and news.ycombinator.com is Hacker News. Each source belongs to a channel, and people sent by AI assistants get a channel of their own. Every breakdown row shows its visitors and the revenue behind them.

AI crawlers are counted apart, never as visitors; most never run a page's script, so a few lines on your server report them. Other bots and automated browsers aren't counted at all. And Direct, the visits with no referrer, is read for what it most likely was: typed or bookmarked, a shared link, a return from checkout, or an app's own browser. The hero's dashboard shows it.

  • t.co/3xYq…x.comOrganic Social
  • www.google.deGoogleOrganic Search
  • chatgpt.comChatGPTAI Assistants
  • news.ycombinator.comHacker NewsOrganic Social
  • ?utm_source=newsletterNewsletterEmail
  • Instagram's in-app browserInstagramOrganic Social

Kept apart, not visitors

  • GPTBot
  • ClaudeBot
  • PerplexityBot
  • Bytespider
Fig. 2How a raw referrer becomes a source and a channel. AI crawlers are listed on their own.

Peak hours lays the period out by weekday and hour, for visits, sales or revenue, and names the busiest three hours only when the data supports it.

Example

Peak hours

Last 30 days · UTC

Busiest on Mondays, 14:00–17:00

2.1× the visits of an average three hours. Post around Mon 13:00 to be there as they arrive.

000102030405060708091011121314151617181920212223Total
Mon3,61741$1,651
Tue2,55130$1,165
Wed2,10623$981
Thu2,05722$942
Fri1,84421$874
Sat2,21324$1,007
Sun1,78620$827
All16,174181$7,447
Busiest three hours

Shades are each hour's average over the times this period holds it, so a weekday that comes round five times doesn't outshine one that comes round four. The totals beside and below are the period's actual sums, not averages.

Fig. 3Peak hours on the example site, over the last 30 days. Switch between visits, sales and revenue, or hover an hour.

02Visitors

Every visitor, where they came from, and what they paid.

One row per visitor: a friendly name and an avatar drawn from their id, where they are and on what, where their latest visit came from and the pages it took, engaged time per visit, and what they've paid. Open a row and every visit is there; the journey page has each page, goal and payment.

Sort by Likely to buy and the score says what drives it: coming back, and time on pricing and checkout. In cookieless mode a row is a visit, and the page says so.

Example

11,951 visitors · 124 paying · last 30 days

  1. Glad HamsterCustomerBerlin, Germany · Desktop · FirefoxRedditOrganic Sociallatest visit: 4 pages/blog/stripe-fees+2/thanks3 visits3m 08s median6m 42s longest$49

    Visits, last 30 days

    Whole journey
    1. RedditOrganic Social
      /blog/stripe-fees/pricing/signup/thanks

      4 pages · 6m 42s engaged · 1 goal$49 credited to this visit

    2. Directtyped or bookmark
      /pricing/docs

      2 pages · 1m 36s engaged

    3. GoogleOrganic Search
      /blog/stripe-fees/

      2 pages · 3m 08s engaged

  2. Cosy CapybaraAustin, United States · Mobile · SafariGoogleOrganic Searchlatest visit: 2 pages//pricing1 visit1m 11s engaged–

    Visits, last 30 days

    Whole journey
    1. GoogleOrganic Search
      //pricing

      2 pages · 1m 11s engaged

  3. Spry BisonToronto, Canada · Desktop · ChromeChatGPTAI Assistantslatest visit: 4 pages/compare+2/docs/api2 visits3m 57s median5m 44s longest–

    Visits, last 30 days

    Whole journey
    1. ChatGPTAI Assistants
      /compare/pricing/docs/docs/api

      4 pages · 5m 44s engaged · 1 outbound click

    2. PerplexityAI Assistants
      /compare

      1 page · 2m 09s engaged

  4. Snug CapybaraCustomerLeeds, United Kingdom · Desktop · EdgeNewsletterEmaillatest visit: 2 pages/changelog/2 visits1m 41s median2m 34s longest$120

    Visits, last 30 days

    Whole journey
    1. NewsletterEmail
      /changelog/

      2 pages · 2m 34s engaged

    2. Directtyped or bookmark
      /

      1 page · 48s engaged

  5. Bubbly LlamaUtrecht, Netherlands · Mobile · Chromex.comOrganic Sociallatest visit: 1 page/blog/launch-week1 visit1m 04s engaged–

    Visits, last 30 days

    Whole journey
    1. x.comOrganic Social
      /blog/launch-week

      1 page · 1m 04s engaged

  6. Velvet PenguinBengaluru, India · Desktop · ChromeHacker NewsOrganic Sociallatest visit: 3 pages/blog/stripe-fees/docs/pricing1 visit4m 56s engaged–

    Visits, last 30 days

    Whole journey
    1. Hacker NewsOrganic Social
      /blog/stripe-fees/docs/pricing

      3 pages · 4m 56s engaged

  7. Keen KoalaCustomerSão Paulo, Brazil · Tablet · SafariDirecttyped or bookmarklatest visit: 3 pages//pricing/signup2 visits1m 49s median3m 03s longest$29

    Visits, last 30 days

    Whole journey
    1. Directtyped or bookmark
      //pricing/signup

      3 pages · 3m 03s engaged · 1 goal$29 credited to this visit

    2. Directtyped or bookmark
      /

      1 page · 35s engaged

Fig. 4The visitor list on the example site, newest first, with a customer's visits unfolded.

03Revenue

Every payment, from four providers, in dollars, without the tax.

Connect Stripe, Paddle, Lemon Squeezy or Polar with a key you create, limited to what Tally reads and permission to add its own webhook. It brings in the last 365 days first, then each payment as it happens.

Stripe goes deepest: Checkout, Payment Links, subscriptions and invoices, and the snippet tags Payment Links by itself. The other three link a sale by the visitor's id passed into their checkout, or by the buyer's email.

New sales, renewals, upgrades, refunds and chargebacks are told apart. Amounts leave out tax and are converted to US dollars at the European Central Bank's rate for that day. A payment is counted once, however the provider reports it.

  • Stripe

    Reads
    Checkout, Payment Links, subscriptions and invoices, with refunds and chargebacks.
    Links a sale by
    The visitor's id in Checkout metadata, the tag the snippet adds to Payment Links on its own, Stripe's session id on your success page, or the buyer's email.
    Connected with
    A restricted key
  • Paddle

    Reads
    Transactions and subscriptions, with refunds and chargebacks.
    Links a sale by
    The visitor's id in Paddle.js customData, or in a transaction's custom_data, which renewals keep; or the customer's email.
    Connected with
    An API key with only the permissions it needs
  • Lemon Squeezy

    Reads
    Orders and subscription invoices, with refunds. Lemon Squeezy reports no chargebacks: it refunds a disputed order, and the refund arrives.
    Links a sale by
    The visitor's id in a checkout link's custom data, or in the API's checkout_data; or the customer's email, which is all that orders from before you connect can link by.
    Connected with
    An API key made just for this (they have no scopes)
  • Polar

    Reads
    Orders and subscriptions, with refunds, and lost disputes as chargebacks.
    Links a sale by
    The checkout's metadata, a checkout link's reference_id, or the customer's email.
    Connected with
    An organization token with only the scopes it needs
Fig. 5What each provider gives, and what ties its sales to a visit. An email match needs your app to tell the snippet who is signed in; only a hash of the address is kept.

Payments, Mon 2 to Sat 7 Nov

Example
DayKindFromNet of tax
Mon 2 NovNewStripeCheckout$49.00
Mon 2 NovNewLemon SqueezyCheckout link$120.00
Tue 3 NovUpgradeStripePlan change, prorated$30.00
Wed 4 NovRenewalPaddleMonthly subscription$49.00
Thu 5 NovNewPolarCheckout, €45.00 at that day's rate$48.65
Fri 6 NovRefundStripeOf a sale on 30 Oct−$49.00
Sat 7 NovChargebackPaddleDisputed by the card's bank−$19.00
Revenue for the week$228.65
Fig. 6A week of an example site's payments, from all four providers. Refunds and chargebacks count against the day they happen.

04Receipts

Every sale comes with its receipt.

A revenue number you can't check is a guess. Open any sale and Tally shows the chain behind it: the buyer's first visit, the visits after, the one that gets the credit, what tied the payment to that browser, and the payment, each with an id you can look up with your payment provider.

Then the method that linked it, and how sure that is. When nothing links a sale, the receipt says so. It is never guessed.

Three example sales

$49.00Pro plan, new subscriptionCheckout metadata, high confidence$120.00Team plan, paid by invoiceEmail match, medium confidence$29.00Starter plan, new subscriptionNone: not linked

A sale is credited to the buyer's last visit that didn't come direct. Renewals and refunds follow the sale they belong to.

ReceiptExample

$49.00

Pro plan, new subscription, paid 14 Oct, 16:42

  1. First visit2 Oct, 09:14

    From Google, landed on /blog/stripe-fees

    visitor7Hq2mK…xR

  2. 2 more visits6 Oct, 14 Oct

    Direct, then Reddit

  3. Credited visit14 Oct, 16:31

    From reddit.com/r/SaaS, landed on /pricing. The last visit that didn't come direct.

    session0192f3a1-7c…

  4. Link14 Oct, 16:40

    The Checkout Session carries the visitor's id in its metadata.

    checkoutcs_test_b1Fz…

  5. Payment14 Oct, 16:42

    $49.00, tax excluded

    paymentpi_3QJx8L…

Method
Checkout metadata
Confidence
High
Credited to
Reddit, Organic Social

ReceiptExample

$120.00

Team plan, paid by invoice, paid 2 Oct, 11:20

  1. First visit, credited28 Sep, 20:05

    From ChatGPT, landed on /compare. The last visit that didn't come direct.

    visitorQm81Zt…c4

  2. 1 more visit1 Oct

    Direct, signed in to the app

  3. Identify1 Oct, 09:12

    The app told the tag who was signed in. Only a hash of the address is kept.

  4. Link2 Oct, 11:20

    The invoice's customer has the same email hash. No checkout carried an id.

    email hash5d41402a…2a

  5. Payment2 Oct, 11:20

    $120.00, tax excluded

    invoicein_1QH7tA…

Method
Email match
Confidence
Medium
Credited to
ChatGPT, AI Assistants

ReceiptExample

$29.00

Starter plan, new subscription, paid 6 Nov, 08:12

  1. First visitUnknown

    Nothing ties the buyer to a visit.

  2. Credited visitNone

    No visit is credited, and none is guessed.

  3. LinkNot found

    No visitor id in the checkout, no tagged Payment Link, no success-page visit, no matching email.

  4. Checkout6 Nov, 08:11

    Created by your server without the visitor's id.

    checkoutcs_test_c9Ld…

  5. Payment6 Nov, 08:12

    $29.00, tax excluded

    paymentpi_3QK2rB…

Method
None
Confidence
None
Credited to
Nobody. It counts against coverage.

The coverage list says why, and what to change: see 05 Coverage

Fig. 7Three example sales and their receipts: linked by checkout metadata, by an email match, and not linked at all.

05Coverage

We tell you what we can't see.

Coverage is the share of your revenue that's linked to a visitor. Under it is the fix-it list: each reason a payment couldn't be linked, how many payments and how much money it involves, and the code that fixes it.

A payment nothing links stays unlinked and counts against coverage. If evidence arrives later, such as the buyer's visit to your success page, it's linked then.

Coverage, last 30 days

Example

86%

$3,294 of $3,830 in the last 30 days is linked to a visitor. 14 payments, $536, are not.

Fix it

  1. Checkout Sessions without a visitor id9 payments, $343

    Pass the visitor's id when you create the session, on the subscription too, so renewals follow. Snippets for Node, Next.js, Python, Ruby and PHP.

    const id = req.cookies._tally_vid;
    
    await stripe.checkout.sessions.create({
      // …your line items and URLs
      metadata: { tally_visitor_id: id },
      subscription_data: {
        metadata: { tally_visitor_id: id },
      },
    });
  2. A success page that doesn't say which checkout it was3 payments, $95

    Add Stripe's session id to the page buyers return to, and the visit there links the sale.

    success_url:
      "https://yoursite.com/thanks?session_id={CHECKOUT_SESSION_ID}"
  3. Payments with no checkout, such as invoices2 payments, $98

    Tell the tag who is signed in. The address is hashed as it arrives and compared with the buyer's; the address itself is never stored.

    tally('identify', { email: user.email });
Fig. 8An example site's coverage and its fix-it list, with the code for each fix.

06Path to purchase

How buyers find you, and who closes the sale.

Path to purchase is the journey behind the period's new sales: how long buyers take from their first visit, how many visits and pages it takes, and how many buy on the first visit. The flow chart runs from the source that first brought each buyer in to the one credited with the sale.

Lifetime value counts each customer under the source of their first visit, with everything they've paid since: renewals, upgrades and refunds included.

Example

Path to purchase

Last 30 days · 105 of 124 new sales, the ones linked to a visitor

Median time to buy

3days

from their first visit

Median visits

3visits

the one they paid in included

Bought on the first visit

12%

13 of 105

Pages before buying

11

median pages viewed

Where buyers came from, and who closed the sale

105 new sales: where each buyer first came from, and the source credited with the sale.

50% of new sales were credited to the source that first brought the buyer in. Hover or focus a flow for its numbers.

  1. Googlecredited toGoogle26
  2. x.comcredited tox.com10
  3. Other (3 sources)credited toOther (3 sources)10
  4. Directcredited toOther (3 sources)9
  5. ChatGPTcredited toChatGPT9
  6. Other (3 sources)credited toNewsletter9
  7. Redditcredited toReddit8
  8. Googlecredited toNewsletter6

6 smaller flows in the table below.

Show the flows as a table
105 new sales: where each buyer first came from, and the source credited with the sale.
Brought them inCredited with the saleNew salesShare
GoogleGoogle2625%
x.comx.com1010%
Other (3 sources)Other (3 sources)1010%
DirectOther (3 sources)99%
ChatGPTChatGPT99%
Other (3 sources)Newsletter99%
RedditReddit88%
GoogleNewsletter66%
DirectGoogle55%
x.comGoogle55%
RedditGoogle33%
DirectReddit22%
ChatGPTGoogle22%
Other (3 sources)ChatGPT1<1%

Time from first visit to purchase

  1. 13Same visit: 13 sales (12%), bought in their first visit
  2. 13Same day: 13 sales (12%), a later visit, under 24 hours after the first
  3. 301–3 days: 30 sales (29%), 1 to 3 days after the first visit
  4. 194–7 days: 19 sales (18%), 4 to 7 days after the first visit
  5. 151–2 weeks: 15 sales (14%), 8 to 14 days after the first visit
  6. 102–4 weeks: 10 sales (10%), 15 to 28 days after the first visit
  7. 51–3 months: 5 sales (5%), 29 to 90 days after the first visit
  8. 03+ months: 0 sales (0%), 91 days or more after the first visit

Pages buyers saw before paying

Share of the 105 buyers who viewed each page before paying

  1. /pricing96%, 101 of 105 buyers
  2. /71%, 75 of 105 buyers
  3. /signup63%, 67 of 105 buyers
  4. /docs38%, 40 of 105 buyers
  5. /blog/stripe-fees26%, 28 of 105 buyers
  6. /compare21%, 23 of 105 buyers
  7. /changelog8%, 9 of 105 buyers
  8. /blog/launch-week5%, 6 of 105 buyers

Only new sales count here. Renewals and upgrades belong to the visit that won the subscription, so counting them would count that journey again.

Fig. 9Path to purchase on the example site: the medians, the flow from first source to credited source, the time it takes, and the pages buyers saw. Hover a flow.
Example

Lifetime value by first source

All time: every payment since 1 Nov 2025. The period above doesn't apply.

First sourceCustomersLifetime revenueAverage valueRenewalsRepeat rate
GoogleOrganic Search325$40,560$12584552%
ChatGPTAI Assistants126$21,071$16739161%
Direct178$18,216$10237444%
NewsletterEmail94$17,362$18535769%
Hacker NewsOrganic Social84$11,741$14022755%
x.comOrganic Social115$10,190$8916133%
RedditOrganic Social84$9,016$10716040%
PerplexityAI Assistants42$6,342$15110157%
Every source1,048$134,498$1282,61651%

A customer is a visitor linked to a sale, counted under the source of their first visit. Lifetime revenue is net of refunds and chargebacks; repeat rate is the share who paid more than once (a renewal, an upgrade or another purchase). $13,167 from 426 payments not linked to a visitor is in no row.

Fig. 10Lifetime value by first source on the example site.

07What they read

Time on a page, counted only while someone reads.

The clock runs while the tab is in view and the visitor has scrolled, typed, tapped or moved the pointer in the last 30 seconds. A tab left open behind others for 8 hours adds nothing. The dashboard shows the median per visit, so one forgotten tab can't pull it up.

One pageview

Example

Open8m 35s

Engaged2m 05s

  1. 1m 10sReading and scrollingCounted
  2. 30sNo input yet: the clock keeps running for 30 secondsCounted
  3. 2m 30sStill no input: the clock stopsNot counted
  4. 4m 00sAnother tab in frontNot counted
  5. 25sBack, scrolling againCounted
Fig. 11An example pageview: open for 8 minutes 35 seconds, engaged for 2 minutes 5.

Pages adds how far down people scroll: each page's reading time and depth, how many reach the end, and how buyers read a page before paying against everyone who didn't.

Example

Reading time

38s

median per pageview

Scroll depth

59%

average depth, of 27,191 views measured

Read to the end

27%

of measured views reached 90% or more

What they read

29,238 pageviews · last 30 days

Open a page to see how far down people read it, and how buyers read it before paying.

  1. /pricing5,521 views78% scrolled on average58s reading time, median

    58s

    reading time, median per view

    78%

    scrolled, on average

    5,521 views · 5,190 with a measured depth

    How far down they read

    Share of measured views that scrolled at least this far

    1. 25% — reached a quarter of the page:95%
    2. 50% — reached half of the page:84%
    3. 75% — reached three quarters of the page:69%
    4. 90%+ — reached the end of the page:48%

    Buyers before paying vs didn't buy

    • Buyers, before paying149 views · 107 buyers96% scrolled on average,1m 41s reading time, median
    • Didn't buy5,337 views · 3,812 visitors61% scrolled on average,44s reading time, median

    35 views by buyers after paying are left out of both.

    Buyers are visitors whose first sale came after viewing this page; only their views before that payment count.

Reading time runs only while the tab is visible and the visitor is active; it's the median per view. A view with no engagement report counts as 0s of reading. Its scroll depth is unknown, so it's left out of every scroll figure rather than counted as 0%. 27,191 of 29,238 pageviews have a measured depth.

Fig. 12What they read on the example site, with the pricing page open: how far down it's read, and buyers against everyone else.

08Replay and heatmaps

Watch the visit that bought, and see where everyone clicks.

Turn replay on for a site and its recorded visits play back with every page, goal, rage click and payment on the timeline. A buyer's journey and their receipt link straight to the recording. Every input is masked and passwords are never recorded.

Heatmaps draw clicks, rage clicks, dead clicks and scroll depth over the page itself, for desktop, tablet and phone.

Fig. 13Recorded visits on the example site, each opening the player.
Example
A click heatmap of the example site's pricing page: clicks glow over the plan buttons, with rage clicks on the billing switch.A click heatmap of the example site's pricing page: clicks glow over the plan buttons, with rage clicks on the billing switch.
Fig. 14A click heatmap of the example site's pricing page, drawn over a recorded visit's page: where people click, and where they click in frustration.

Heatmap of /pricing, last 30 days

Example

09Live

Who is on the site right now.

The last five minutes on a globe or a flat map, with a list beside it: each visitor's flag, page, city and source. A new arrival rings in; a sale bursts in coral at the buyer's city. Click a visitor to find them, and replay the last eight hours in 15-minute steps.

Example
The live globe on the example site: visitors of the last five minutes pinned at their cities, in Europe and the Americas, with a sale bursting in coral.The live globe on the example site: visitors of the last five minutes pinned at their cities, in Europe and the Americas, with a sale bursting in coral.

Live

The globe and the map need JavaScript. The list beside them is as of loading this page.

1 visitor

in the last 5 minutes, from 1 country

Fig. 15The live view on the example site: who is there in the last five minutes, pinned where they are, with the list beside it. Play turns the real globe on.

10Labs

Your customers, as a living ecosystem and a river.

Two experimental views, drawn only from signals Tally has. The ecosystem places every visitor of the last 90 days by what they did, gathers them into clusters named by what stands out, and colours them by health; play it and it moves week by week.

The river follows visitors from the source that brought them, through the pages they reached, to whether they bought, week by week, coloured by source, by experience or by outcome. Health is our reading of renewals, refunds, chargebacks and recency, never a prediction.

Example

Labs

Customer ecosystem

Experimental

5,000 most recent of 31,979 visitors from the last 90 days. Each is placed by what they did, gathered with the ones most like them, and coloured by health.

The customer ecosystem on the example site: thousands of visitors as glowing particles, gathered into named clusters and coloured by health.The customer ecosystem on the example site: thousands of visitors as glowing particles, gathered into named clusters and coloured by health.

more engaged time, more visits, longer visits than the median

more revenue, more renewals, more quick exits

The picture needs JavaScript and WebGL 2. Everything it shows is in the table below.

What the picture shows, and what feeds it

Reading it

  • Position: Each particle is a visitor of the last 90 days, placed by its signals (below), standardised and projected to two directions with PCA, computed on our server the same way every time. Particles near each other did similar things.
  • Left to right: more engaged time, more visits, longer visits than the median (48% of the variation). The other way: less engaged time, fewer visits, shorter visits than the median.
  • Bottom to top: more revenue, more renewals, more quick exits (15% of the variation). The other way: less revenue, fewer renewals, fewer quick exits.
  • Clusters: k-means on the picture's three main directions, with the number of clusters chosen by how cleanly they separate (silhouette). Names come from each cluster's standout traits by fixed rules.
  • Size: for customers, lifetime net revenue; for everyone else, the visitor list's likely-to-buy score (a point a visit up to 10, two a minute on pricing and checkout pages up to 20).
  • Glow: how recently they were seen, brightest today and gone after two weeks.
  • Weeks: the slider replays the particles shown as they were at the end of each week. Each appears from its first visit in the 90 days, so the early weeks hold only those already around then.
  • Trails: where a particle was in the three weeks before the one shown, for the cluster you pick, and faintly for everyone while the weeks play.

Colour: customers' health

  • RenewingA customer whose last purchase or renewal is within their renewal cycle (30 days until they have one), or who has visited within it.
  • QuietA customer with no renewal and no visit for longer than their renewal cycle (30 days until they have one) and a few days' grace.
  • LostA customer whose most recent payment was refunded or charged back, with no purchase since.

Colour: everyone else's engagement

  • HotNot a customer; engagement 0.75 or more.
  • WarmNot a customer; engagement 0.5 to 0.75.
  • CoolNot a customer; engagement 0.25 to 0.5.
  • ColdNot a customer; engagement under 0.25.

Engagement is half engaged time a visit against the site's median, a quarter recency and a quarter return visits. Health and engagement are our reading of renewals, refunds, chargebacks and recency, not a prediction.

Signals

  • Visits · visits in the last 90 days
  • Engaged time · engaged time (the tracker's visible-and-active clock), outlier visits left out
  • Pages a visit · pageviews ÷ visits
  • Days since the last visit · days from the last visit to the snapshot
  • From search · share of visits from Organic and Paid Search
  • From social and video · share of visits from Organic and Paid Social and Video
  • From AI assistants · share of visits from AI assistants (ChatGPT, Claude, Perplexity …)
  • Direct · share of visits with no referrer
  • From links, email and ads · share of visits from referrals, email, affiliates and display
  • Pricing page views · views of pricing and plans pages
  • Checkout page views · views of checkout, cart, buy, upgrade, subscribe and billing pages
  • Goals completed · goals sent by the site's tag
  • Net revenue · payments linked to the visitor, refunds taken off (all time, US dollars)
  • Renewals · renewal payments
  • Refunds and chargebacks · refunds and chargebacks
  • Rage clicks · rage clicks per recorded visit (only where sessions were recorded)
  • Dead clicks · dead clicks per recorded visit (only where sessions were recorded)
  • Quick exits · share of visits with one page and under 10 s engaged
  • Engaged time against the site's median · the visitor's median engaged time a visit ÷ the site's median
  • Scroll depth · how far down pages were scrolled, on average (where the tag reports it)

Not yet: support tickets and reviews. They aren't connected, so nothing here is read from them.

The ecosystem as a table

The same clusters, with customers first by lifetime revenue and everyone else by likely to buy. Names open each journey.

Clusters, now
ClusterMembersCustomersNet revenueWhat sets it apart
Quick leavers2,0190$0Engaged time against the site's median: 0.1× on average, against 3.4× across everyone; Scroll depth: 33% on average, against 64% across everyone; Engaged time: 8s on average, against 11m 35s across everyone; Mostly from Google: 37% of them
Deep readers1,5070$0Scroll depth: 86% on average, against 64% across everyone; Quick exits: 0% of visits, against 31% across everyone; Engaged time against the site's median: 3.8× on average, against 3.4× across everyone; Mostly from Google: 42% of them
Deep readers who come direct1,0680$0Pages a visit: 5.5 on average, against 2.7 across everyone; Engaged time: 32m 05s on average, against 11m 35s across everyone; Visits: 4.3 on average, against 2.4 across everyone
Paying renewers who come direct406406$48,881Net revenue: $120 on average, against $9.78 across everyone; Goals completed: 9.2 on average, against 1.1 across everyone; Renewals: 2.1 on average, against 0.2 across everyone
Quick leavers: the first 3 of 2,019 visitors
VisitorHealthValueVisitsLast seen
Zippy Raccoon CoolLikely to buy 2 of 302
Sincere Ibex CoolLikely to buy 2 of 302
Calm Moose CoolLikely to buy 2 of 302
Deep readers: the first 3 of 1,507 visitors
VisitorHealthValueVisitsLast seen
Twinkly Fennec HotLikely to buy 14 of 304
Dandy Fennec HotLikely to buy 14 of 303
Rustic Squirrel HotLikely to buy 13 of 304
Deep readers who come direct: the first 3 of 1,068 visitors
VisitorHealthValueVisitsLast seen
Nifty Fennec HotLikely to buy 28 of 308
Glad Lynx HotLikely to buy 28 of 308
Upbeat Wombat HotLikely to buy 28 of 308
Paying renewers who come direct: the first 3 of 406 visitors
VisitorHealthValueVisitsLast seen
Merry Hare Renewing$693 lifetime11
Spry Raccoon Renewing$693 lifetime10
Curious Gecko Renewing$594 lifetime10
Fig. 16Labs: the customer ecosystem on the example site. Every visitor of the last 90 days placed by what they did, grouped and named by what sets each group apart, coloured by health.
Example

Labs

Flow riverExperimental

Where visitors come from, where they go, what it earns and how it went, week by week.

21,000 visitors · $8,691 net revenueLast 8 weeks

Flows · Last 8 weeks

First touchLanding pageKey page reachedOutcomeGoogle → /: 1,184 visitors (6%), $361 net revenue, Cool (−0.20)Google → /blog/*: 2,822 visitors (13%), $365 net revenue, Cool (−0.23)Google → /docs/*: 626 visitors (3%), $277 net revenue, Warm (+0.37)Google → /pricing: 610 visitors (3%), $494 net revenue, Neutral (+0.10)Google → /compare/*: 354 visitors (2%), $293 net revenue, Neutral (−0.05)Google → /changelog: 245 visitors (1%), $51 net revenue, Cool (−0.21)Google → /signup: 246 visitors (1%), $446 net revenue, Warm (+0.32)Direct → /: 2,483 visitors (12%), $880 net revenue, Cool (−0.17)Direct → /blog/*: 290 visitors (1%), $114 net revenue, Neutral (−0.09)Direct → /docs/*: 524 visitors (2%), $254 net revenue, Warm (+0.33)Direct → /pricing: 613 visitors (3%), $644 net revenue, Warm (+0.19)Direct → /compare/*: 93 visitors (<1%), $34 net revenue, Neutral (−0.03)Direct → /changelog: 132 visitors (<1%), $0 net revenue, Cool (−0.23)Direct → /signup: 312 visitors (1%), $516 net revenue, Warm (+0.27)x.com → /: 1,330 visitors (6%), $400 net revenue, Cool (−0.52)x.com → /blog/*: 735 visitors (4%), $127 net revenue, Cool (−0.40)x.com → /docs/*: 50 visitors (<1%), $79 net revenue, Warm (+0.27)x.com → /pricing: 154 visitors (<1%), $132 net revenue, Neutral (+0.04)x.com → /compare/*: 52 visitors (<1%), $0 net revenue, Cool (−0.19)x.com → /changelog: 146 visitors (<1%), $42 net revenue, Cool (−0.38)x.com → /signup: 48 visitors (<1%), $68 net revenue, Neutral (+0.10)Reddit → /: 380 visitors (2%), $196 net revenue, Cool (−0.14)Reddit → /blog/*: 825 visitors (4%), $41 net revenue, Cool (−0.16)Reddit → /docs/*: 175 visitors (<1%), $78 net revenue, Warm (+0.38)Reddit → /pricing: 87 visitors (<1%), $168 net revenue, Warm (+0.21)Reddit → /compare/*: 88 visitors (<1%), $37 net revenue, Neutral (+0.01)Reddit → /changelog: 70 visitors (<1%), $0 net revenue, Cool (−0.28)Reddit → /signup: 34 visitors (<1%), $44 net revenue, Warm (+0.23)ChatGPT → /: 406 visitors (2%), $137 net revenue, Cool (−0.13)ChatGPT → /blog/*: 151 visitors (<1%), $75 net revenue, Neutral (+0.02)ChatGPT → /docs/*: 119 visitors (<1%), $63 net revenue, Warm (+0.39)ChatGPT → /pricing: 234 visitors (1%), $124 net revenue, Warm (+0.18)ChatGPT → /compare/*: 505 visitors (2%), $252 net revenue, Neutral (+0.01)ChatGPT → /changelog: 16 visitors (<1%), $0 net revenue, Neutral (−0.04)ChatGPT → /signup: 43 visitors (<1%), $81 net revenue, Warm (+0.39)Hacker News → /: 275 visitors (1%), $88 net revenue, Neutral (−0.03)Hacker News → /blog/*: 646 visitors (3%), $93 net revenue, Neutral (−0.07)Hacker News → /docs/*: 120 visitors (<1%), $45 net revenue, Warm (+0.32)Hacker News → /pricing: 60 visitors (<1%), $14 net revenue, Warm (+0.32)Hacker News → /compare/*: 62 visitors (<1%), $0 net revenue, Neutral (+0.11)Hacker News → /changelog: 49 visitors (<1%), $0 net revenue, Cool (−0.16)Hacker News → /signup: 24 visitors (<1%), $41 net revenue, Warm (+0.32)Other sources → /: 915 visitors (4%), $354 net revenue, Cool (−0.14)Other sources → /blog/*: 1,063 visitors (5%), $193 net revenue, Neutral (−0.09)Other sources → /docs/*: 525 visitors (3%), $162 net revenue, Warm (+0.36)Other sources → /pricing: 329 visitors (2%), $375 net revenue, Warm (+0.35)Other sources → /compare/*: 304 visitors (1%), $161 net revenue, Neutral (+0.03)Other sources → /changelog: 345 visitors (2%), $177 net revenue, Cool (−0.14)Other sources → /signup: 101 visitors (<1%), $115 net revenue, Warm (+0.35)/ → Signup: 646 visitors (3%), $929 net revenue, Warm (+0.30)/ → Pricing: 1,704 visitors (8%), $1,253 net revenue, Neutral (+0.06)/ → Docs: 496 visitors (2%), $161 net revenue, Warm (+0.25)/ → No key page: 4,127 visitors (20%), $75 net revenue, Cool (−0.44)/blog/* → Signup: 260 visitors (1%), $412 net revenue, Warm (+0.40)/blog/* → Pricing: 662 visitors (3%), $530 net revenue, Warm (+0.21)/blog/* → Docs: 341 visitors (2%), $14 net revenue, Warm (+0.18)/blog/* → No key page: 5,269 visitors (25%), $51 net revenue, Cool (−0.33)/docs/* → Signup: 173 visitors (<1%), $334 net revenue, Warm (+0.43)/docs/* → Pricing: 141 visitors (<1%), $136 net revenue, Warm (+0.43)/docs/* → Docs: 1,825 visitors (9%), $489 net revenue, Warm (+0.35)/pricing → Signup: 643 visitors (3%), $1,078 net revenue, Warm (+0.32)/pricing → Pricing: 1,444 visitors (7%), $872 net revenue, Neutral (+0.12)/compare/* → Signup: 177 visitors (<1%), $341 net revenue, Warm (+0.43)/compare/* → Pricing: 574 visitors (3%), $396 net revenue, Warm (+0.17)/compare/* → Docs: 72 visitors (<1%), $39 net revenue, Warm (+0.31)/compare/* → No key page: 635 visitors (3%), $0 net revenue, Cool (−0.40)/changelog → Signup: 60 visitors (<1%), $164 net revenue, Warm (+0.53)/changelog → Pricing: 111 visitors (<1%), $67 net revenue, Warm (+0.24)/changelog → Docs: 101 visitors (<1%), $40 net revenue, Warm (+0.28)/changelog → No key page: 731 visitors (3%), $0 net revenue, Cool (−0.45)/signup → Signup: 808 visitors (4%), $1,311 net revenue, Warm (+0.31)Signup → Bought: 136 visitors (<1%), $4,568 net revenue, Warm (+0.54)Signup → Goal: 1,434 visitors (7%), $0 net revenue, Warm (+0.48)Signup → Left: 1,197 visitors (6%), $0 net revenue, Warm (+0.28)Pricing → Bought: 98 visitors (<1%), $3,255 net revenue, Warm (+0.49)Pricing → Goal: 756 visitors (4%), $0 net revenue, Warm (+0.55)Pricing → Left: 3,782 visitors (18%), $0 net revenue, Neutral (+0.07)Docs → Bought: 23 visitors (<1%), $742 net revenue, Very warm (+0.66)Docs → Goal: 401 visitors (2%), $0 net revenue, Warm (+0.56)Docs → Left: 2,411 visitors (11%), $0 net revenue, Warm (+0.33)No key page → Bought: 5 visitors (<1%), $126 net revenue, Warm (+0.38)No key page → Goal: 328 visitors (2%), $0 net revenue, Warm (+0.33)No key page → Left: 10,429 visitors (50%), $0 net revenue, Cool (−0.43)
SourceLandingKey pageOutcomeGoogle → /: 1,184 visitors (6%), $361 net revenue, Cool (−0.20)Google → /blog/*: 2,822 visitors (13%), $365 net revenue, Cool (−0.23)Google → /docs/*: 626 visitors (3%), $277 net revenue, Warm (+0.37)Google → /pricing: 610 visitors (3%), $494 net revenue, Neutral (+0.10)Google → /compare/*: 354 visitors (2%), $293 net revenue, Neutral (−0.05)Google → /changelog: 245 visitors (1%), $51 net revenue, Cool (−0.21)Google → /signup: 246 visitors (1%), $446 net revenue, Warm (+0.32)Direct → /: 2,483 visitors (12%), $880 net revenue, Cool (−0.17)Direct → /blog/*: 290 visitors (1%), $114 net revenue, Neutral (−0.09)Direct → /docs/*: 524 visitors (2%), $254 net revenue, Warm (+0.33)Direct → /pricing: 613 visitors (3%), $644 net revenue, Warm (+0.19)Direct → /compare/*: 93 visitors (<1%), $34 net revenue, Neutral (−0.03)Direct → /changelog: 132 visitors (<1%), $0 net revenue, Cool (−0.23)Direct → /signup: 312 visitors (1%), $516 net revenue, Warm (+0.27)x.com → /: 1,330 visitors (6%), $400 net revenue, Cool (−0.52)x.com → /blog/*: 735 visitors (4%), $127 net revenue, Cool (−0.40)x.com → /docs/*: 50 visitors (<1%), $79 net revenue, Warm (+0.27)x.com → /pricing: 154 visitors (<1%), $132 net revenue, Neutral (+0.04)x.com → /compare/*: 52 visitors (<1%), $0 net revenue, Cool (−0.19)x.com → /changelog: 146 visitors (<1%), $42 net revenue, Cool (−0.38)x.com → /signup: 48 visitors (<1%), $68 net revenue, Neutral (+0.10)Reddit → /: 380 visitors (2%), $196 net revenue, Cool (−0.14)Reddit → /blog/*: 825 visitors (4%), $41 net revenue, Cool (−0.16)Reddit → /docs/*: 175 visitors (<1%), $78 net revenue, Warm (+0.38)Reddit → /pricing: 87 visitors (<1%), $168 net revenue, Warm (+0.21)Reddit → /compare/*: 88 visitors (<1%), $37 net revenue, Neutral (+0.01)Reddit → /changelog: 70 visitors (<1%), $0 net revenue, Cool (−0.28)Reddit → /signup: 34 visitors (<1%), $44 net revenue, Warm (+0.23)ChatGPT → /: 406 visitors (2%), $137 net revenue, Cool (−0.13)ChatGPT → /blog/*: 151 visitors (<1%), $75 net revenue, Neutral (+0.02)ChatGPT → /docs/*: 119 visitors (<1%), $63 net revenue, Warm (+0.39)ChatGPT → /pricing: 234 visitors (1%), $124 net revenue, Warm (+0.18)ChatGPT → /compare/*: 505 visitors (2%), $252 net revenue, Neutral (+0.01)ChatGPT → /changelog: 16 visitors (<1%), $0 net revenue, Neutral (−0.04)ChatGPT → /signup: 43 visitors (<1%), $81 net revenue, Warm (+0.39)Hacker News → /: 275 visitors (1%), $88 net revenue, Neutral (−0.03)Hacker News → /blog/*: 646 visitors (3%), $93 net revenue, Neutral (−0.07)Hacker News → /docs/*: 120 visitors (<1%), $45 net revenue, Warm (+0.32)Hacker News → /pricing: 60 visitors (<1%), $14 net revenue, Warm (+0.32)Hacker News → /compare/*: 62 visitors (<1%), $0 net revenue, Neutral (+0.11)Hacker News → /changelog: 49 visitors (<1%), $0 net revenue, Cool (−0.16)Hacker News → /signup: 24 visitors (<1%), $41 net revenue, Warm (+0.32)Other sources → /: 915 visitors (4%), $354 net revenue, Cool (−0.14)Other sources → /blog/*: 1,063 visitors (5%), $193 net revenue, Neutral (−0.09)Other sources → /docs/*: 525 visitors (3%), $162 net revenue, Warm (+0.36)Other sources → /pricing: 329 visitors (2%), $375 net revenue, Warm (+0.35)Other sources → /compare/*: 304 visitors (1%), $161 net revenue, Neutral (+0.03)Other sources → /changelog: 345 visitors (2%), $177 net revenue, Cool (−0.14)Other sources → /signup: 101 visitors (<1%), $115 net revenue, Warm (+0.35)/ → Signup: 646 visitors (3%), $929 net revenue, Warm (+0.30)/ → Pricing: 1,704 visitors (8%), $1,253 net revenue, Neutral (+0.06)/ → Docs: 496 visitors (2%), $161 net revenue, Warm (+0.25)/ → No key page: 4,127 visitors (20%), $75 net revenue, Cool (−0.44)/blog/* → Signup: 260 visitors (1%), $412 net revenue, Warm (+0.40)/blog/* → Pricing: 662 visitors (3%), $530 net revenue, Warm (+0.21)/blog/* → Docs: 341 visitors (2%), $14 net revenue, Warm (+0.18)/blog/* → No key page: 5,269 visitors (25%), $51 net revenue, Cool (−0.33)/docs/* → Signup: 173 visitors (<1%), $334 net revenue, Warm (+0.43)/docs/* → Pricing: 141 visitors (<1%), $136 net revenue, Warm (+0.43)/docs/* → Docs: 1,825 visitors (9%), $489 net revenue, Warm (+0.35)/pricing → Signup: 643 visitors (3%), $1,078 net revenue, Warm (+0.32)/pricing → Pricing: 1,444 visitors (7%), $872 net revenue, Neutral (+0.12)/compare/* → Signup: 177 visitors (<1%), $341 net revenue, Warm (+0.43)/compare/* → Pricing: 574 visitors (3%), $396 net revenue, Warm (+0.17)/compare/* → Docs: 72 visitors (<1%), $39 net revenue, Warm (+0.31)/compare/* → No key page: 635 visitors (3%), $0 net revenue, Cool (−0.40)/changelog → Signup: 60 visitors (<1%), $164 net revenue, Warm (+0.53)/changelog → Pricing: 111 visitors (<1%), $67 net revenue, Warm (+0.24)/changelog → Docs: 101 visitors (<1%), $40 net revenue, Warm (+0.28)/changelog → No key page: 731 visitors (3%), $0 net revenue, Cool (−0.45)/signup → Signup: 808 visitors (4%), $1,311 net revenue, Warm (+0.31)Signup → Bought: 136 visitors (<1%), $4,568 net revenue, Warm (+0.54)Signup → Goal: 1,434 visitors (7%), $0 net revenue, Warm (+0.48)Signup → Left: 1,197 visitors (6%), $0 net revenue, Warm (+0.28)Pricing → Bought: 98 visitors (<1%), $3,255 net revenue, Warm (+0.49)Pricing → Goal: 756 visitors (4%), $0 net revenue, Warm (+0.55)Pricing → Left: 3,782 visitors (18%), $0 net revenue, Neutral (+0.07)Docs → Bought: 23 visitors (<1%), $742 net revenue, Very warm (+0.66)Docs → Goal: 401 visitors (2%), $0 net revenue, Warm (+0.56)Docs → Left: 2,411 visitors (11%), $0 net revenue, Warm (+0.33)No key page → Bought: 5 visitors (<1%), $126 net revenue, Warm (+0.38)No key page → Goal: 328 visitors (2%), $0 net revenue, Warm (+0.33)No key page → Left: 10,429 visitors (50%), $0 net revenue, Cool (−0.43)
What the river shows

Colour: first touch

  • Googlepeach
  • Directperiwinkle
  • x.comlilac
  • Redditmint
  • ChatGPTrose
  • Hacker Newsbutter
  • Other sourcesgrey

Each first touch has its own pastel, and its visitors keep it through every stage, so you can follow a source from where it lands to how the week ended. Each band fades a little toward the page it reaches. Point at a source to follow it alone.

A source keeps its colour from week to week, in every segment and on every visit; well-known sources have the same colour on every site. The colour says where visitors came from, nothing about how it went: colour by experience for that. Every band also names itself when you point at it, and the table lists every flow.

Width

Visitors: each counts once in each week they came, in exactly one node of every stage.

Every visitor is counted; nothing is sampled. Sources and landing pages past the six busiest are grouped as Other.

Glow

A coral glow around a flow, over any colouring, is the net revenue credited to its visits by attribution: every payment, refunds and chargebacks taken off. The more revenue, the stronger the glow; no revenue, no glow.

Stages

First touch is the source of the visitor's first visit Tally has. The landing page is the week's first visit's entry page, by its first path segment. The key page is the furthest of signup or checkout, pricing and docs pages the week's visits reached, by the words in their paths. The outcome is bought (a purchase credited to the week's visits), else a goal completed, else left.

How it went: the experience temperature

Cool: friction, worse than this site's usualWarm: better than usual

Grey: no signal could be read. It is never guessed.

In every hover card and in the table (colour by experience paints the river with it). Each flow is read against this whole site over the same weeks: the average of the signals below that it has, each from −1 to +1. A flow with few visits leans toward the site's usual, as if it had ten more visits like the site's, so a handful of visits can't paint it.

  • Engaged timeVisits longer than the site's median visit, against shorter ones: three in four longer reads fully warm on a busy flow, three in four shorter fully cool.Site median: 52s
  • Quick exitsVisits of one page with under 10 s engaged. 25 points fewer than the site's share is fully warm, 25 more fully cool.Site: 24% of visits
  • Scroll depthHow far down their pages visitors scrolled. 25 points deeper than the site's average is fully warm.Site average: 62% over 63,377 pages
  • Rage clicksThree or more clicks within a second in one spot, in recorded sessions only. 10 points fewer of the recorded visits than the site's share is fully warm.Site: 3% of 5,417 recorded visits
  • Dead clicksA click that changed nothing within a second, in recorded sessions only. 20 points fewer than the site's share is fully warm.Site: 3% of 5,417 recorded visits
  • Refunds and chargebacksRefunds and chargebacks per purchase credited to the flow. 25 points fewer than the site's rate is fully warm.Site: 20% of 262 purchases

Not yet: support tickets, reviews. They aren't connected, so they never colour a flow.

Fig. 17Labs: the flow river on the example site over eight weeks, from first touch to outcome. Width is visitors, colour the first touch, and the glow is revenue.

11Alerts

A message for every sale, wherever you read them.

A message for every sale, with where the buyer came from and how the sale was linked; a spike or a drop against the usual for that hour; trouble with a payment provider; and a daily or weekly digest. Quiet hours hold them until morning.

Example

A sale

Subject: yoursite.com: New sale: $49.00 from Reddit

First came from Google on 31 Oct; 3 visits; bought on a visit from Reddit: /blog/stripe-fees → /pricing → /signup → /thanks.͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ 

The daily digest

Subject: yoursite.com: Monday 9 November

Hacker News sent 34 visitors, up from 7 the day before.͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ 
  • SlackAn incoming webhook into one channel.
  • DiscordA channel's webhook.
  • TelegramYour own bot, into a chat or channel.
  • WebhookJSON to your endpoint, signed.
Fig. 18A sale alert and a daily digest for the example site, as the product writes them, and the five places they can go.

12API, CLI and MCP

Your numbers in your own tools.

Make a read-only key on a site's Setup page; only a hash of it is kept. The REST API answers with the dashboard's own numbers, the command line prints them as tables, and the MCP server lets an AI assistant ask its own questions.

Example

REST API

$ curl -H "Authorization: Bearer $TALLY_API_KEY" \
    "$TALLY_API_URL/api/v1/sites/k3xq2mfa7twp/breakdown/source?period=30d&sort=revenue"
{
  "dimension": "source",
  "linked_revenue": { "cents": 491707, "currency": "USD", "exponent": 2 },
  "rows": [
    {
      "channel": "Organic Search",
      "label": "Google",
      "paying_visitors": 27,
      "payments": 27,
      "revenue": { "cents": 103904, "currency": "USD", "exponent": 2 },
      "share": 0.2685,
      "value": "Google",
      "visitors": 3209
    },
    …
  ],
  "sort": "revenue",
  "total_visitors": 11951
}

Command line

$ tally sources --by revenue --period 30d
Last 30 days · 2026-10-12 to 2026-11-10 · UTC
11,951 visitors · by revenue

SOURCE       CHANNEL         VISITORS  SHARE    REVENUE  SALES
Google       Organic Search     3,209  26.9%  $1,039.04     27
Direct       –                  2,347  19.6%    $995.00     26
x.com        Organic Social     1,347  11.3%    $918.68     24
ChatGPT      AI Assistants        853   7.1%    $643.47     16
Reddit       Organic Social       931   7.8%    $449.47     12
Newsletter   Email                457   3.8%    $332.88      9
Hacker News  Organic Social       710   5.9%    $324.25      8
Perplexity   AI Assistants        290   2.4%    $214.28      5

MCP server: 16 read-only tools

  • list_sites
  • get_overview
  • get_breakdown
  • compare_periods
  • list_sales
  • get_receipt
  • get_coverage
  • list_visitors
  • get_visitor
  • get_realtime
  • get_goals
  • get_funnels
  • get_customer_value
  • get_peak_hours
  • get_engagement
  • get_purchase_paths
Fig. 19The example site's sources by revenue over the last 30 days, from the API and from the command line, and the MCP server's tools.

13Privacy

Three ways to count, and what each can't see.

Choose a mode for each site. Whichever you choose:

  • The visitor's IP address is used to find their city, then dropped. It's never stored, logged or written to disk.
  • Cookieless mode needs no cookie. It counts a visitor by a hash of the IP address and the browser with a salt that changes every day and is then deleted, so nobody can be followed from one day to the next. The hash is kept; the address never is.
  • Visitor ids never appear in logs.

The privacy notice says what is kept, for how long and who processes it, and the data processing agreement covers your visitors' data.

Cookie

A first-party cookie recognises returning visitors across days.

Cookie
One first-party cookie, for a year
Returning visitors
Recognised across days
Stripe Payment Links
Tagged with the visitor, so the sale links

Cookieless

No cookie. Each visitor is counted once per day.

Cookie
None
Returning visitors
Counted once per day
Stripe Payment Links
Not tagged, since there's no visitor id to add

Consent first

Cookieless until your banner reports consent, then a cookie.

Cookie
None until your banner says yes
Returning visitors
Recognised from the visit they consent on
Stripe Payment Links
Tagged once they consent
Fig. 20The three modes, and what each one shows.

14Switching from DataFast

Coming from DataFast? Swap one tag.

Tally reads what DataFast's tag reads, so the code on your pages keeps working: window.datafast() goals, data-fast-goal attributes with their data-fast-goal-* properties, and data-website-id in place of data-site.

Returning visitors keep their datafast_visitor_id, so checkout code that already reads it still links sales, and so does the datafast_visitor_id in your Stripe metadata.

  1. Remove: <script defer data-website-id="dfid_…" data-domain="yoursite.com" src="https://datafa.st/js/script.js"></script>
  2. Add: <script defer data-site="k3xq2mfa7twp" src="https://t.tallybyoutpost.com/script.js"></script>
  3. <button data-fast-goal="signup">Start free</button>
  4. window.datafast("checkout_started", { plan: "pro" });
Fig. 21The one line that changes on your pages. The lines under it keep working as they are.

15Setup

One tag, then watch the first visit arrive.

The tag is about 3 KB, loads with defer and has no dependencies, so it never holds up your page. Engaged time, goals and clicks on links to other sites come with it. A goal is tally('signup') or a data-tally-goal attribute on a button.

  1. Add your site

    Its name, its domain, and which of the three modes counts its visitors.

  2. Paste one tag

    In the head of every page. Routes in single-page apps are followed on their own.

  3. See the first visit

    The setup page waits for it and says where it came from.

  4. Connect payments

    Stripe, Paddle, Lemon Squeezy or Polar, with a key you create. The last 365 days of payments come in first.

<script defer data-site="k3xq2mfa7twp" src="https://t.tallybyoutpost.com/script.js"></script>

It works. Receiving visits.

First visitor: GermanyBerlin · Chrome on macOS · from x.com

Example
Fig. 22Setup, and the live check on the setup page, here with an example first visitor.

16Pricing

One plan. Every site. Priced by events.

Everything Tally does, on as many sites as you run. The price follows how many events your sites send in a month, and an event is a pageview or a goal.

$9 a month

Up to 10k events a month, billed monthly.

Start for free

14 days free, no card needed. Choose a plan before the trial ends; cancel any time.

Every plan includes

  • Every site you run, on one plan
  • Revenue by source, with a receipt and coverage for every sale
  • Stripe, Paddle, Lemon Squeezy and Polar
  • The visitor list, goals and funnels
  • Session replay and heatmaps
  • Alerts and digests by email, Slack, Discord, Telegram or webhook
  • A REST API, a CLI and an MCP server
Every step, in US dollars
Events a monthMonthlyYearly
10k$9$81$6.75 a month
100k$19$171$14.25 a month
200k$29$261$21.75 a month
500k$49$441$36.75 a month
1M$69$621$51.75 a month
2M$89$801$66.75 a month
5M$129$1,161$96.75 a month
10M$169$1,521$126.75 a month
  • Yearly

    Twelve months for the price of nine.

  • Founding members

    The first 100 customers get 30% off with the code FOUNDING, for as long as they stay subscribed.

  • Outpost customers

    50% off while you also have an Outpost plan.

The founding and Outpost discounts don't combine: you get the larger one. Both apply to yearly plans. More than 10M events a month? Write to hello@tallybyoutpost.com.

Questions

  • What does it cost?

    One plan with every site, priced by events: from $9 a month for 10k events to $169 a month for 10M. Yearly costs 9 months. Every account starts with a 14-day free trial, no card needed: choose a plan before it ends to keep tracking, and cancel any time.

  • Which payments does it read?

    Stripe's, Paddle's, Lemon Squeezy's and Polar's, each connected with a key you create. Stripe goes deepest: Checkout, Payment Links, subscriptions and invoices, with refunds and chargebacks. Paddle, Lemon Squeezy and Polar sales link by the visitor's id passed into their checkout, or by the buyer's email.

  • How is a sale credited when the buyer came several times?

    To their last visit that didn't come direct, or to their last visit if all of them did. The first visit is recorded too, and the receipt shows both.

  • Do I need a cookie banner?

    Cookieless mode sets no cookie. Cookie mode sets one first-party cookie, which in the EU and the UK usually needs consent; consent-first mode stays cookieless until your banner calls tally('consent', true).

  • Will the tag slow my site down?

    It's about 3 KB compressed, loads with defer and never delays a page or a link.

  • What does it record about my visitors?

    Pages, engaged time, scroll depth, goals and clicks on links to other sites, with the city and the browser. The IP address is used to find the city and dropped; it is never stored. Session replay is off until you turn it on; it masks every input and never records a password.

  • Who makes it?

    Tally is made by the team behind Outpost, the growth platform, at Tesseract Systems Corporation. It's a product of its own.

Anything else: hello@tallybyoutpost.com