Every number BrandGrowth OS shows you comes from deterministic, published rules. The same inputs always produce the same result, each score traces back to the evidence behind it, and AI may phrase a result but never produces one. This page is the public methodology: what each engine measures, how the weights work, and — just as important — what happens when we cannot measure something.
verified ·
self-reported · estimated · not-measured), source, freshness (how old
the evidence is), and confidence (0–1).Weights are configuration, not code — they can be tuned per workspace without a deploy. A change to a formula, however, creates a new engine version, and every stored score records the version that produced it, so any number can always be explained by the rules in force when it was calculated.
A scan looks at your public presence the way a search engine and a customer would: the homepage, your robots and sitemap files, response headers, your TLS certificate, the domain's registration age, a linked contact page when one exists, and one deliberate not-found probe. Thirty checks across five weighted sections produce the score. Local and social checks marked (SR) are self-reported and visually labelled; (SR→V) means self-reported but we attempt public verification.
| # | Check | Wt | Pass rule |
|---|---|---|---|
| 1 | site reachable | 4 | HTTP 200 (or 3xx→200) on the homepage |
| 2 | HTTPS enforced | 5 | http:// redirects to https:// |
| 3 | certificate valid | 3 | TLS certificate valid ≥ 30 days |
| 4 | mobile viewport | 5 | viewport meta tag present |
| 5 | title quality | 4 | non-empty title under 160 characters |
| 6 | meta description | 4 | non-empty description, 50–160 characters |
| 7 | social preview basics | 5 | Open Graph title + image present |
| 8 | canonical link | 3 | canonical link resolves |
| 9 | custom 404 | 2 | the probe URL returns a 404 status, not 200 |
| # | Check | Wt | Pass rule |
|---|---|---|---|
| 10 | single H1 | 4 | exactly one H1 heading |
| 11 | heading hierarchy | 3 | at least two H2 headings |
| 12 | image alt sample | 4 | ≥ 80% of sampled images have alt text |
| 13 | content depth | 4 | extracted homepage text ≥ 300 words |
| 14 | structured data | 4 | JSON-LD or microdata present |
| 15 | sitemap valid | 4 | sitemap parses and is non-empty |
| 16 | robots sane | 2 | allows crawling (no blanket disallow) |
We never claim keyword positions. This section measures how ready your pages are to be read and indexed — not where you rank, which we cannot verify from a single site fetch.
| # | Check | Wt | Pass rule |
|---|---|---|---|
| 17 | name, phone, address on site | 5 | all three found on the homepage or contact page |
| 18 | Google Business Profile claimed (SR→V) | 4 | self-reported; verified when a maps link is found on the site |
| 19 | local keyword use | 2 | the business city or area appears in title, description or body |
| 20 | map or directions link | 2 | a maps embed or directions link on the site |
| 21 | opening hours shown | 2 | hours text on site (SR); verified when parsed |
| # | Check | Wt | Pass rule |
|---|---|---|---|
| 22 | profiles linked & reachable | 4 | the site links to the declared platforms and those URLs respond |
| 23 | brand consistency | 3 | site name or title contains the brand name |
| 24 | handle consistency | 3 | the same handle across at least two declared platforms |
| 25 | presence breadth | 2 | at least two declared platform accounts |
| 26 | activity recency | 3 | last public post under 60 days, only when a public feed is fetchable |
| # | Check | Wt | Pass rule |
|---|---|---|---|
| 27 | privacy policy page | 3 | linked, non-empty page |
| 28 | terms page | 2 | linked, non-empty page |
| 29 | domain age | 3 | registered at least a year ago (a new domain is noted, not punished) |
| 30 | no mixed content | 2 | the homepage loads no insecure subresources |
Take a site whose HTTPS checks fail while everything else passes, and whose local and social footprint is partly unverifiable. Its score lands in the high 70s — not because missing evidence was punished, but because a third of the audit could not run and the parts that did were mostly healthy. Each section scales by the points that could be measured, a check that runs and fails stays in its section's denominator (unlike one that cannot run at all), and the failures surface as Critical Opportunities rather than silently shrinking the number.
Failures and unverifiable checks become Critical Opportunities — the lead-gen payload of a report — each with a severity and the area of work it falls in:
| Trigger | Severity | Area |
|---|---|---|
| HTTPS missing or certificate invalid | critical | web |
| no mobile viewport | critical | web |
| no name/phone/address found | critical | local |
| Google Business Profile unverified and no maps link | important | local |
| no structured data | important | seo |
| no privacy policy | important | trust |
| social profile exists but is inactive or unverifiable | important | social |
| thin homepage content | minor | seo |
| only one social platform declared | minor | social |
BrandMatch compares a partner against your business profile (and any campaign overrides you set). Four weighted components, each shown separately so no single number has to be taken on faith:
Match % = 100 × (0.40·audience + 0.20·geography + 0.25·category + 0.15·budget),
then multiplied by the confidence factor.
When a component cannot be measured, its weight is removed and the rest is renormalised — the partner is not punished for our blind spot. A partner with no fee data scores on the other three and shows a "not measured" badge on budget. You get the total, the four sub-scores, the confidence, and a label per input.
For a future-dated, active opportunity:
| Component | Weight | How it scores |
|---|---|---|
| Category relevance | 0.35 | fit between your industry and the event's categories |
| Geography | 0.25 | event city in your markets scores 1; a national brand 0.8; same state 0.5 |
| Scale fit | 0.15 | audience size against your budget band: overlap 1, within 2× half, else 0 |
| Timing | 0.15 | credit grows with how far ahead the event is, full from 120 days out |
| Source quality | 0.10 | how the opportunity was found and how confident its source is |
Relevance = 100 × Σ(weight × component) × confidence, with a missing
component's weight redistributed rather than counted as zero. An event with no
footfall figure and no parseable start date is not dismissed — it simply scores
on what is known, with the gap labelled. Unknown source quality scores lower
than a verified public feed.
Every input is tagged as measured, a published benchmark, or manual
(your own assumption). Manual inputs outrank benchmarks and are highlighted, and
benchmarks always carry their source. From cost C, unique reach R,
engagement rate e, audience overlap o, response rate r, margin m and
average order value v:
relevant engagements = R × e × o
cost per engagement = C ÷ (R × e × o)
cost per 1,000 reach = C ÷ (R ÷ 1000)
cost per qualified lead = C ÷ (R × o × r)
break-even revenue = C ÷ m
break-even units = break-even revenue ÷ v
affordability = min(1, campaign budget ÷ break-even revenue)
Within a comparison set, options are ranked by:
| Component | Weight | Basis |
|---|---|---|
| Cost efficiency | 0.40 | log-scaled cost per engagement, relative to the set's best and worst |
| Affordability | 0.30 | break-even revenue against your budget |
| Audience relevance | 0.30 | audience overlap |
Ranking is scale-free: it compares your options against each other rather than against an absolute standard, so a small campaign can still rank its options honestly. Missing inputs leave the dependent metrics "not measured" — never a guess, and never an infinity.
Each engine's strongest results feed a single ranked list, so you are never choosing between four dashboards. A candidate's priority combines its own score with how much upside it carries, how actionable it is, and how fresh it is; a visibility finding weights severity and score gain most heavily, a partner weights match, ROI rank and actionability, and an opportunity weights relevance and timing. Where a component is genuinely unmeasurable it is dropped from the denominator instead of being scored as zero.
The Action Plan built from that list is ordered for effort:
The plan refreshes weekly or on demand, and items track to done with the measured score change.
Growth Score = 0.25·Visibility + 0.20·Match pipeline + 0.20·Sponsor pipeline
+ 0.15·ROI readiness + 0.20·Action completion
It is a weighted mean of the sections that are actually measured. A section you have not used yet shows "not measured" with the action that fills it, and if nothing is measured yet the Growth Score is blank rather than a zero — an unstarted workspace is not a failing one.
It is not a ranking claim: we do not assert keyword positions, and we do not score anything we cannot see. It is not a black box: the checks, weights and pass rules above are the ones the product runs. And it is not a guess at what matters commercially — where we lack a number (a fee, a footfall, a response rate), the product says so, and the gap itself becomes a next step.
For how AI is used alongside these deterministic engines, see How BrandGrowth OS uses AI.