The OuterBox Marketing Report

Highlights
Brand visibility through closed revenue

Reading the funnel…

The Funnel

click stages to chart them together · every percentage is change against the prior period

Share of Voice

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:
  1. 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.
  2. 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.
  3. 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.
  4. 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.