Two buckets, and only one of them is evidence
A branded query contains your company name or something close enough to it: last agency, lastagencyhere, last agency pricing, last agency reviews. A non-branded query doesn't: seo agency in bangalore, how much does seo cost in india, what is a canonical tag.
The distinction matters because the two buckets are fed by completely different machines. Brand search is demand that already exists — someone heard of you at a trade show, saw a Meta ad, read a founder's LinkedIn post, was referred by a customer, or watched thirty seconds of a podcast. They then use Google as a very expensive address bar.
Non-brand search is demand you didn't create. Somebody had a problem, described it to Google, and your page was the answer. That's the only bucket SEO can honestly claim, and it's the one that scales past the people who already know you exist.
Which sets up the conflict. Run a television campaign, hire a PR firm, put the founder on a popular podcast, or simply have a good quarter, and branded search rises. If your agency reports total organic clicks, it just got paid for all of it.
The regex, written out
Search Console does this natively and free. Open the Performance report, add a Query filter, and choose Custom (regex) rather than Contains. The RE2 syntax is used, and matching is not case-sensitive by default — which saves you writing every capitalisation variant.
Then run the same regex twice: once with Matches regex to get your branded numbers, once with Doesn't match regex to get non-branded. Two exports, one subtraction, done in about four minutes.
- Escape any dot, plus, brackets or hyphen in your brand with a backslash.
a\.b\.canda.b.care different expressions; the second matches almost anything. - Include your product names and your founders' names if people search those to reach you. They're brand demand, not category demand.
- Prepend
(?-i)only if you genuinely need case-sensitive matching. Almost nobody does. - Search Console's Performance report holds 16 months, so build the split once and you get a year-over-year comparison immediately.
- Start with the brand itself, spaced and unspaced:
last\s*agency. - Add the domain and any name you trade under:
lastagencyhere|last agency here. - Add the misspellings people actually type. Get them from Search Console itself: filter queries by Contains on a three-letter stem of your brand and read what comes back. Real ones, not imagined ones.
- Add anything a phone keyboard autocorrects your name into. If your brand is a normal word, this list is long.
- Join every alternative with the pipe character and check the total click count still looks sane:
last\s*agency|lastagency|lastagencyhere|lasagency|lastagancy. - Save it somewhere the whole team uses — the contract, the reporting doc, the dashboard config. A regex that changes between months makes the trend line meaningless.
The two traps that quietly break the split
Both of these are common in India specifically, and both make the branded bucket look far smaller than it is — which flatters the agency.
Trap one: a brand made of ordinary words
Plenty of Indian companies are named things like Precision Engineering, Sunrise Industries, National Traders or Metro Tubes. Match on precision engineering and you sweep in every person searching for precision engineering as a category — genuine non-brand demand — and file it as brand.
The fix is a second condition rather than a broader one. Require the brand phrase plus a brand-shaped tail: \b(precision engineering)\b.*(pvt|ltd|limited|reviews|contact|address|careers|price list|catalogue) and, separately, \bprecision engineering\b on its own only if the click-through rate on those queries is obviously brand-like — 30%+ with you in position one.
If you genuinely can't separate the two, say so in the report rather than picking whichever reading suits you. An honest "14% of queries are ambiguous, here's the range" is worth more than a false clean number.
Trap two: Hindi, Devanagari and phonetic spellings
This one is missed almost universally. Indian buyers search brand names in Devanagari, in Roman transliteration, and in whatever spelling their keyboard suggested. A brand called Rajdhani gets searched as rajdhani, राजधानी, rajdhaani, raajdhani and rajdani, and only the first is in most agencies' regex.
The same applies to Tamil, Telugu, Bengali, Gujarati and Marathi scripts if you sell into those markets. Search Console reports the query as typed, so the Devanagari string is sitting right there in your export.
Practical method: export twelve months of queries, sort by clicks, and read the top 300 by hand once. It takes twenty minutes and you'll find spellings you'd never have guessed. Then add them to the regex and never do it again for a year.
Why GA4 can't produce this split on its own
This is the reason the split goes missing from so many reports, and it isn't always dishonesty. It's a tooling limit.
Google Analytics has no search-query dimension for organic Google traffic. The query never reaches the browser, so no tag can capture it. GA4 can tell you a session came from google / organic, and nothing about what the person searched to get there. Grouping by landing page is a poor substitute, because one page serves brand and non-brand queries at once.
You can link a Search Console property to an Analytics web data stream, which surfaces query data inside two Analytics reports. Even then the queries only pair with a handful of dimensions — landing page, device, country — and they don't join to your key events. So you still cannot say "non-brand organic produced 11 qualified leads last month" from GA4 alone.
The workable arrangement is boring and it works: take clicks and queries from Search Console, take leads and revenue from your CRM, and join them on landing page and date. Analytics sits in the middle as the behavioural layer, not as the source of truth. There's more on why the two tools never agree if the discrepancy is what's bothering you.
How we report it, and why our guarantee depends on it
We freeze one number on day one: your trailing-90-day qualified leads from organic search. Not traffic, not rankings, and specifically not branded organic. If we haven't beaten that number in 90 days, we keep working free until we do.
That commitment only means something if brand search is excluded, and the reason is uncomfortable for us. Suppose you appear on a well-watched podcast in month two. Brand search doubles. Total organic leads jump. If our baseline counted brand, we'd have won a guarantee we did nothing to earn, and you'd have paid a bonus to the wrong team.
So the regex goes into the engagement document before work starts, alongside the frozen number. You can read it, argue with it, and audit it in your own Search Console at any point. If we want to change it mid-engagement, we have to ask, and the old version stays in the report as a comparison.
Every monthly report we send carries four lines above everything else: non-brand clicks, brand clicks, qualified leads from organic, and the baseline. Charts come after. The full reporting standard covers the rest, and how to set a baseline covers the day-one exercise.
The verdict
Branded organic traffic belongs in your report as context — it tells you whether the market is thinking about you at all, and a sudden fall is an early warning worth having. It does not belong in an SEO baseline, an agency bonus calculation, or any sentence beginning "organic is up".
Non-branded organic clicks, and the qualified leads that follow them, are the number to hold an engagement to. They're harder to move, slower to move, and impossible to inflate with someone else's campaign, which is exactly what makes them worth measuring.
Build the regex once, put it in writing, and re-read the top queries every twelve months. It's the cheapest piece of honesty available in SEO reporting, and it takes an afternoon.