How each number is calculated
Share of Voice accuranker
AccuRanker share of voice across tracked OBX keywords, read from the SEO
dashboard's site-full-history.json (visibility)
rather than re-pulled. Across a range it is a mean of daily values,
not a total. History cannot start before 2026-03-15 — AccuRanker
caps domain history at 100 days per call and its keyword history carries
rank but no SoV, so on longer ranges this line starts late. That is a
missing measurement, not a fall in visibility.
Impressions gsc
Google Search Console, property https://www.outerboxdesign.com/,
daily. Summed across the range. Whole-property: not restricted to
any page set, and not filtered to the pages the funnel below is about.
Search Console reports organic only, so this figure is organic by
definition. Clicks and CTR are still collected but no longer sit in
the funnel — sessions is the agreed traffic metric, and mixing
organic clicks into all-traffic sessions was the step that did not line
up. They are reserved for the organic tab.
CTR gsc, not in funnel
Never stored. Recomputed as SUM(clicks) / SUM(impressions)
over whatever range or chart bucket is on screen. Deliberately not an
average of daily CTRs — that weights a 100-impression day the same as a
100,000-impression day and inflates the figure.
Sessions ga4
GA4 sessions by date × sessionSourceMedium, summed.
All = every row. Organic = source/medium containing
“organic”. AI = source/medium matching ChatGPT, OpenAI,
Claude, Perplexity, Copilot, Gemini or Anthropic. AI is a subset of
referral traffic shown alongside organic, not a sibling of it — adding
the two double-counts. All three come from the same rows, so the total can
never disagree with its own splits.
Leads freshsales
Freshsales
contacts (not deals), pulled from the saved view
“New Leads 90d” 16002519248 — or
“All Contacts” 16000247494 on a backfill —
into daily files the SEO dashboard maintains. This dashboard reads those
files and re-pulls nothing.
A contact is counted only if it passes all four:
- It is a lead at all —
cf_date_lead_received is
non-empty. Contacts without it (imports, enrichments, non-lead records)
are dropped. That field is also the date the lead is filed under —
not created_at.
- It carries a rep-assigned score —
cf_obx_lead_score
is non-empty. Ungraded leads are excluded entirely (Adam, 2026-08-06).
Grading began in 2025, so these counts cannot be compared with
2024.
- It came from a web form or a phone call — either
cf_web_form_type is non-empty, or
cf_lead_event is Website Phone Call.
Those are the two sources that count as marketing (Adam,
2026-08-17). The four values the field actually holds are Website
Form Submission, Website Phone Call, Client Referral and blank; a
referral is not marketing-generated, so it is excluded.
Phone leads were counted for the first time on
17 Aug 2026. cf_web_form_type is filled on exactly
the form submissions and on nothing else, so it had been acting as a
form-only filter and no phone lead had ever been counted. Leads,
MQLs and inquiry value all step up on that date with no change in
demand behind it.
- Brand is OuterBox, or underivable —
cf_landing_page is parsed to a domain and mapped.
outerboxdesign.com counts; TopSpot, ADM and GRO are
excluded by design. A blank landing page also counts, because
brand is derived from that field — a blank one drops a real
OuterBox lead rather than proving it belongs elsewhere.
Adopted 2026-08-12 after checking against the CRM:
this rule reproduces the CRM's own figures exactly for the
last 30 days to 2026-08-11 (72 leads / 45 MQLs) where the
brand-only rule returned 67/42. Accepted risk: a blank-landing-page
lead belonging to another brand is counted here as OuterBox. The
real fix is populating cf_landing_page.
This risk is higher for phone leads than for forms. A form
type vouches for a form's origin; nothing vouches for a call, no
phone lead in the CRM has a landing page on our domain, and 5 of
the 12 phone leads are demonstrably TopSpot. The banner above the
chart publishes how many leads rest on this assumption.
A lead with a blank landing page, no web-form type
and no phone
event therefore never counts, because nothing ties it to any brand. That
residue is what the undercount banner measures.
Summed across the range. Segments, applied to the leads that already
passed all four:
Organic =
cf_first_touch_sourcemedium
begins “organic”;
AI = it contains “chatgpt”
or “claude.ai”, or begins “ai”.
The undercount percentage in the banner is measured over
all graded leads of every brand, not only OuterBox ones — so treat
it as the scale of the blank-landing-page problem, not as an exact
correction factor to add back to this number.
MQLs freshsales
The leads above whose score is 2 or higher, summed. Scores
arrive as strings like "5 - Great Lead" and the
leading integer is parsed out. This is a rep-assigned quality grade,
1–5 — a human judgement, not a behavioural or activity score, so
it moves with grading habits as well as with lead quality. Every exclusion
listed under Leads applies here too.
Open Opps freshsales
Freshsales deals from the saved view “OBX Pipeline”
16002519249, counted by created_at and
summed. So this is deals CREATED in the selected range — the
funnel flow — not the deals open right now, and a deal created in
the range still counts even if it was later lost. Sara's sheet says
“Open Opps”; confirm which reading is wanted.
Closed Deals freshsales
Same deal set, restricted to stage = Won
(deal_stage_id 16000343504) and filed by
closed_date, summed. Losses are excluded explicitly:
closed_date is stamped on lost deals too, so counting every
closed date inflates wins by the loss count.
Days to Close freshsales
For Won deals closed in the range only:
closed_date − created_at in days, discarding negatives.
Stored as a daily total and a daily count, so the range figure is
total days ÷ total deals — a mean weighted by deal volume,
never an average of daily averages, which would weight a one-deal
day like a five-deal day.
Attribution — read this
The bottom two stages are not marketing-attributed. A Freshsales
deal record carries no lead-source field, and the
deal → originating contact → first-touch
join is not built. Opps Created and Closed Deals therefore describe
the entire OuterBox pipeline, including deals marketing never
touched. They are an upper bound — and so are the
dollar amounts shown on them, which come from the same deal
records. The account-level inquiry value in the panel above is
marketing-scoped, so the two sets of dollars are answering different
questions and will not reconcile.
Deal history also cannot reach before 2026-04-10: the
“OBX Pipeline” view was created 2026-04-13, and the older views
that do reach 2024 mix every brand, which would break the OBX-only scope.
Marketing-generated accounts freshsales
Rebuilt from our own API, not from an exported report, so it can be
refreshed without waiting on anyone. It uses
the same definition of a
marketing lead as the funnel above — an OuterBox web form or
phone call, brand OuterBox or underivable — from a single shared
rule in the collector. The event field alone would conflate OuterBox and
TopSpot, which is why the landing-page domain is also checked. Validated
against the CRM's own export across 356 matched leads: all 191
OuterBox-domain leads were the right source with
no false
positives, and all 42 TopSpot ones were correctly excluded.
Corrected 17 Aug 2026. This panel previously
applied a stricter rule than the funnel — web forms only,
and an OuterBox landing page required. Leads with a blank landing page
were counted as leads in the funnel while their accounts' money was
silently dropped from these dollar figures, so the two disagreed about
the same leads on the same page. Aligning them raised inquiry value;
the size of the step is in the build notes.
Every account is counted once. An account reached
by leads on several days would otherwise be counted once per day, and a
client with several opportunities would inflate the total. The dedupe
happens across the whole selected window, not per day. Open and won
inquiry values are current account totals, which is the same
meaning those columns carry in the CRM export.
Inquiry value in dollars freshsales
Total inquiry value is
open_deals_amount +
won_deals_amount on the accounts reached by marketing leads,
each account counted once.
Closed won and
still open are the
two halves of that sum. It is the figure the CRM review named as the
priority, so it leads both the highlights and this panel.
It is not everything ever created. The account
record exposes open and won amounts and no lost equivalent, so an
opportunity that was created and then lost cannot be added back. The
total therefore runs short of true created value rather than over
it. These are also current account totals, the same meaning the
columns carry in the CRM export: changing the period changes which
accounts qualify, not how much each one is worth today.
Whole-pipeline dollar figures were
removed after the CRM review.
Deals carry no lead-source field, so a pipeline-wide total could not be
restricted to marketing-generated work the way Sara required, and
non-marketing sales are reported separately by Jeff and Josh.
Branded vs non-branded out of scope
Deprioritised at the CRM review, and no longer shown. Google
withholds the search term on rare queries — roughly a quarter of
impressions and nearly half of clicks — and those are overwhelmingly long
tail. Any split computed inside the visible slice reports branded at
roughly double its true share of clicks, which is not a number worth
putting in front of leadership. Both figures are still collected, so the
panel can return if the coverage problem ever does.
Impressions and AI gsc
Impressions already include AI Overviews and AI Mode. Google folds
generative-AI impressions into the web search type, which is
what we pull, and its own documentation states the generative AI report
“includes data from the Web search type in the Performance
report”. Nothing needs adding for AI visibility to be counted.
It cannot be split out, though: the API exposes no AI search type,
so the separate AI view exists only in the Search Console interface, and
it reports impressions only — no clicks, CTR or position.
Comparison & rollups
“vs Prior” compares against the immediately preceding window
of equal length. A delta is suppressed when the prior window
holds under 60% of the measured days the current one does — otherwise a
barely-measured period divides into a huge fake growth figure. Counts sum
across buckets; rates and durations rebuild from their own components;
index and duration metrics average. Weekly buckets start Monday and are
labelled by their first day, so a short trailing week is visible.
Missing data renders as “no data”, never as 0.
What’s changed in this build
14 Aug 2026
Lead definition widened. A lead now counts when it has a web-form
type and its brand is OuterBox or underivable. Brand is derived
from cf_landing_page, so a blank landing page was dropping
real OuterBox web-form leads. This matches the CRM's own reporting
exactly for the 30 days to 11 Aug (72 leads, 45 MQLs) where the previous
rule returned 67 and 42. Leads and MQLs are therefore higher than
before this date, without anything about demand having changed.
14 Aug 2026
Windows now end at the data, not at today. Every range previously
ran to the current date regardless of how far collection reached, which
dropped measured days off the back and added unmeasured ones at the
front. Published impressions and clicks were understated by roughly 8%
before this change.
14 Aug 2026
Added: the Updated stamp at the top, which separates when the
report was written from how far the data reaches; the branded vs
non-branded panel; the highlights block; and the theme switcher.
Every source was re-collected, moving the window forward to
14 Jul – 12 Aug.
17 Aug 2026
Funnel narrowed to the agreed spine — Share of Voice,
impressions, sessions, leads, MQLs, opps created, closed deals. Clicks
and CTR left the funnel: the review chose sessions over clicks “to
maintain consistent reporting”, and they are reserved for the
organic tab. That also settles the objection that impressions →
clicks → sessions was not linear, since the funnel now runs
impressions → sessions.
“Open Opps” renamed “Opps Created”, which
is what it always counted — deals created in the range, not
accounts currently holding one. That naming was the exact ambiguity
raised in review.
Revenue moved into the highlights and the
account panel above the chart, the dollar value of marketing-generated
opportunities having been named the CEO's priority.
The whole-pipeline dollar panel was retired: it summed every deal
in the view regardless of origin, while the review required these figures
be restricted to marketing-generated leads, and it produced a second
conflicting “won” figure. Clicks, CTR and the retired panel's
data are all still collected, so none of this needs a backfill to undo.
Conversion between MQLs and Opps Created is now
blank on purpose. It read 102.3% — 44 opps from 43 MQLs
— because MQLs are marketing-generated while opps and closed
deals cover the whole pipeline. A rate above 100% invites the reading
that every MQL converts and then some, when it really means the
numerator counts deals marketing never touched. It stays suppressed
until the attribution join exists.
17 Aug 2026
Built to the CRM review with Sara. Marketing-generated accounts and
inquiry value added, rebuilt from our own API access rather than her
exported report, since the export will not be re-sent for every refresh.
Days to Close removed at her request: too few measured days in a
window meant it moved on recency rather than describing anything. The
period options are now the three agreed — rolling 30 as the default,
month to date, and prior 90 — replacing the old five rolling windows.
Branded versus non-branded was retired from the report, having been
added the day before, once the Search Console sampling limits were shown;
its collector still runs, so it can return without a backfill. The
underlying days-to-close data is likewise still collected.
17 Aug 2026
Every percentage now means the same thing — change against the
prior period. Stage-to-stage conversion was removed: it put two different
meanings on the same “%” an inch apart, and it was unsound
across the marketing-to-pipeline boundary, where MQLs to Opps Created read
102.3%.
Opps Created and Closed Deals now carry a dollar amount beside the
count, by deal amount: created by create date, won by close
date, both following the selected period. The dollars are the sounder half
of each stage, since the counts are inflated by per-property line items
where one client signing ten rows reads as ten deals.
Removed: the All/Organic/AI segment toggle, the Daily/Weekly/Monthly
grain toggle, and vs Prior/No compare. All tabled rather than
abandoned — every segment and grain is still collected, so restoring
a toggle needs no backfill. Comparison against the prior period is now
always on. Every source was re-collected on this date.
17 Aug 2026
Phone calls now count as marketing leads. A marketing lead is an
OuterBox web form
or an OuterBox phone call (Adam). Phone leads had
never been counted: the rule keyed on
cf_web_form_type, which
is filled on exactly the form submissions and on nothing else, so it was
silently a form-only filter. Client referrals stay out, as they are not
marketing-generated.
The same change fixed a disagreement between two panels. The
accounts panel had applied a stricter rule than the funnel — blank
landing pages excluded — so leads counted in the funnel had their
money dropped from the dollar figures. Both now run off one shared
predicate in the collector.
Rolling 30 stepped up as a result, with no change
in demand behind it: leads 69 → 72, MQLs
43 → 44, accounts 65 → 72, total inquiry
value $1,180,145 → $1,257,645 (+6.6%), all of that step in
still-open value. Closed won did not move. Do not read the step as
growth, and do not compare a figure written down before this date
with one after it.
The weak point is brand attribution on calls. No
phone lead in the CRM has a landing page on our domain, and 5 of the 12
are demonstrably TopSpot, so the 7 admitted ones are counted as OuterBox
on probability rather than evidence. The banner above the chart publishes
how many leads rest on that assumption. Populating
cf_landing_page on phone leads is the fix.
17 Aug 2026
Total inquiry value added and given the lead position in both the
highlights and the account panel. The report previously showed open and
won separately and never added them, so the one figure the review named as
the priority was the one figure a reader had to work out themselves. The
panel now reads total, closed won, still open — the three the review
asked for — with deal counts against the two halves. The methodology
was also corrected: it still described the whole-pipeline dollar panel and
the branded panel as though both were on the page, a day after both were
removed.
14 Aug 2026
Pipeline in dollars added. Created, closed won and still open,
all from
amount on deals already collected, so no new
source was needed. Two things to hold on to.
Still open is a
point-in-time figure and will not move with the date picker; it
moved by about $100,000 during the day it was built, as the view grew
from 75 deals to 84. And
the dollars are sounder than the counts
right now: the counts are inflated by per-property line items, where one
client signing ten rows reads as ten closed deals, but the amounts still
sum to the real revenue either way. Deals also carry a probability
weighted
expected_deal_value, which for the open figure
would read $167,358 rather than the gross; the gross is shown to stay
consistent with created and won.
Retired 17 Aug 2026 — the panel is no
longer on the report, because it could not be restricted to
marketing-generated work. Inquiry value is now reported at the account
level instead. Kept here so a number written down from that panel can
still be traced.
12 Aug 2026
Retroactive revision is now measured. Leads enter the funnel only
once a rep scores them, and reps score late, so past days keep gaining
leads. The collector compares against what it previously stored and
reports the revision in the notes above rather than leaving it unstated.
Caveats also moved below the chart, and the methodology section was added.
Still open
Opps Created and Closed Deals still cover the whole OuterBox
pipeline, because deal records carry no lead source and the
deal-to-contact join is not built. Read those two stages as an upper
bound; the dollar figures above them do not share the problem, since they
come from the accounts marketing leads actually reached. Also unresolved:
how multi-property clients should roll up, since each property is its own
account.
Cost per acquisition is not possible yet and is not a calculation
we can derive: it needs spend, and no cost source is connected.
Vertical segmentation is waiting on the CRM — it needs the
industry tagging dropdown Sara is adding, so there is nothing to group by
yet. An organic tab is next, and clicks and CTR are already being
collected for it. AccuRanker is also
merging Share of Voice and AI Share of Voice into one configurable
metric in September, which will move the SoV figures when it lands; we
will address it as it rolls out.