Skip to content
Module 09 of 09 · Advanced

Dispensary SEO Reporting: What Actually Proves It Worked

Why the two numbers everyone watches do not respond to the work, what Search Console can and cannot see on a local business, why menu traffic never attributes, the four numbers that belong in a monthly report, and what to refuse to promise before somebody asks.

dispensary-seo-reporting
Key takeaway

Search Console covers web, image, video and news results. The map pack and every Business Profile interaction are outside it entirely, which means on a business discovered mainly in the pack, the report everyone treats as the whole picture is showing the smaller half. Four numbers carry a dispensary account, and none of them is average position or total organic sessions.

Every module before this one ends the same way. Here is the work, here is what it moves, and here is the number that will not move no matter how well you do it.

That thread has been running through the whole set without ever being picked up. Module 06 said the technical work will not change your ranking for your own store name. Module 07 said link building is the hardest thing in the programme to attribute. Module 08 said the qualification page can never be tied to a first purchase.

All three are true, and stated separately they sound like excuses. Stated together they are the actual subject: on a dispensary account, most of what you can measure easily is not what the work moves, and most of what the work moves is awkward to measure.

This module is about closing that gap honestly. What the platforms actually know, what they cannot see, which four numbers belong in a monthly report, and what to refuse to promise before somebody asks you to promise it.

It is the least glamorous module in the set and the one that keeps the other eight funded past month four. In cannabis SEO consulting specifically, where paid channels are closed and organic carries the entire weight, a report nobody believes ends the engagement faster than bad work does.

Everyone is checking the wrong number

Two numbers dominate the conversation on almost every account, and neither of them responds to the work.

Three numbers compared. The store name search, which the owner checks, was already fine and stays fine whatever the work does. Total organic sessions, which the agency reports, is dominated by brand traffic and returning customers and moves with things nobody controls. Non-brand product and place impressions, which almost nobody reports, is the number that actually responds to the work.
The first two are the ones being watched. The third is the one that answers the question both of them are asking.

The owner checks the store name. They search it on a Tuesday, they are first, and they conclude things are fine. Or a competitor’s ad appears above it and they conclude things are broken. Neither conclusion is connected to anything you did.

A brand search was already going to find you. That result is the most stable thing on the account and the least informative, which is a bad combination for the number an owner checks weekly.

The agency reports total organic sessions. On a dispensary site that figure is mostly returning customers typing the brand, plus whatever the menu pages happen to be doing, plus a blog post from two years ago that ranks for something irrelevant.

It moves with weather, holidays, a competitor opening, a price change and a platform update. It is a real number, it is just not a measurement of anybody’s work.

The number that responds is narrower and duller: impressions on non-brand searches that combine a product or category with a place, plus the profile’s own interaction counts. That is the demand you were not in before, which is the only thing organic work actually creates.

Which means the reporting conversation has to happen in the first week, not the fourth month. If the owner has been checking their store name for six months before anybody explains this, you are not correcting a metric. You are contradicting their experience.

What Search Console actually knows about a local business

This is the fact that reframes everything else, it is stated plainly in Google’s own documentation, and almost nobody working on local accounts has read it.

What the Search Console performance report covers and what it does not. Inside its scope: web results, image results, video results and news results, with query, page, country and device dimensions, about sixteen rolling months of history, and a table capped at one thousand rows. Outside its scope entirely: the map pack, Google Maps, and every interaction with the Business Profile, which reports separately and cannot be joined to this data.
For a business whose customers mostly discover it in the map pack, this report sees the smaller half.

Google’s documentation states the scope of the performance report directly. It covers web, image, video and news results. The map pack, Maps itself, and every interaction with your Business Profile are not in it and never have been.

For an ordinary website that is a footnote. For a dispensary, where a large share of discovery happens inside the pack without a website result being involved at all, it means Search Console is showing you a partial view and labelling it as your search performance.

The second thing worth knowing is how average position is defined. Google describes it as the position of the topmost result from your site, averaged across impressions. Not the position of the page you care about.

So on a query where your location page sits eighth and an old blog post sits fourth, your average position is four. The number is accurate and it is describing something you did not ask about, which is why it should never be a headline in a report.

Two practical limits follow. History runs about sixteen months on a rolling basis, so the month you are looking at now will be gone in a year and a half. And the table caps at a thousand rows, which sounds generous until you filter by page on a fifty store site.

None of this makes the tool less useful. It makes it a tool with a defined scope, which is a different thing from the complete picture, and treating it as the complete picture is the most common measurement error on local accounts.

The map pack is a surface, not a position

The other half of the picture has a stranger problem. There is no single number to report, because the thing being measured genuinely does not have one value.

Module 01 makes that point from the proximity side, which is where it explains why you rank where you do. Here it is a reporting problem: what goes in the row.

A grid of search points around a store, each showing a different map pack position for the same query. Close to the store the business is first, a mile out it is third, and beyond that it is absent entirely. Beneath, the reporting consequence: a single ranking number for a pack query is a fiction, and what can honestly be reported is presence across a fixed grid measured at a fixed interval.
Same query, same day, same store. The answer depends entirely on where the searcher is standing.

Your position in the pack changes with the searcher’s location, continuously. First outside the door, third a mile away, absent three miles out. All of those are true at the same moment, which means a single reported rank is a choice of location dressed up as a measurement.

What can be reported honestly is presence across a grid. A fixed set of points around the store, the same points every time, at the same interval, for the same short list of queries. What you are watching is the shape of the area you appear in, not a number.

Grid tools cost money and their numbers are directional rather than exact, which is worth saying to a client once rather than pretending otherwise. What they are genuinely good at is showing an area growing or shrinking over months, and that is the thing prominence work moves.

It also explains the pattern that produces most of the confusion on these accounts, which is how much of the pack proximity has already decided before any of your work gets a vote. A grid makes that visible instead of arguable.

The free half of this is the Business Profile performance report: searches, views, direction requests, calls, website clicks, and the rest. Those are real interactions with real intent behind them, and they are the closest thing to a conversion metric this industry has.

One catch worth building a habit around. Google does not publish how long it keeps that data, and the searches figure updates monthly and can lag by several days. Export it every month, to somewhere that is not Google, and stop assuming it will be there.

Query sets, which is the only way Search Console becomes useful

Within its scope, Search Console holds the most useful data on the account. The reason it usually produces nothing is that people read rows, and no individual row on a local account means anything.

Six query sets built from one Search Console export. Brand terms, which were always fine. Product and place terms, which is the set the work moves. Category and place terms. Near me and location terms. Medical and process terms from module eight. And menu or product page terms. Each set is tracked as a total rather than as individual rows, because a single query on a local account moves on noise.
Six totals instead of a thousand rows. Only one of the six answers the question the client is actually asking.

One query moving from position nine to position six tells you nothing. Forty queries in the same category moving together tells you something happened, and that is the unit you should be reporting in.

Build the sets once and reuse them forever. Brand. Product plus place. Category plus place. Near me and location terms. The medical and process language from module 08, if the store is dual licence. And menu or product page terms, kept separate for the reason in the next section.

The mechanics are boring and take an afternoon. A regular expression filter in the performance report for each set, or an export into a sheet with a classifier column. Either works, and the sheet version survives the thousand row cap by exporting in slices.

The set that proves the work is product and place, excluding brand and excluding menu URLs. That is somebody searching for something you sell, near somewhere you are, without knowing your name. Growth there is demand you did not previously have access to.

Report impressions on that set before clicks. Impressions move first, they move earlier, and on a set with real volume they are far less noisy. Clicks follow when position improves enough to matter, which is usually a month or two behind.

The menu, and why that traffic never attributes

Every dispensary account eventually reaches the question of how much money organic search made, and on most of them the honest answer is that it cannot be calculated.

Three menu integrations and where the transaction data ends up. An iframe puts the session and the order on the provider's domain, so none of it is visible in your analytics. A client side script keeps the browsing on your domain but usually hands the checkout to a third party. A server side integration keeps both, and almost nobody has one. Beneath, the honest proxies to report instead: menu page entries from organic, direction requests, calls and website clicks from the profile.
Two of the three architectures put the transaction somewhere your analytics cannot see it.

Module 06 covered the three ways a menu reaches a page. The measurement consequence is the part that module deliberately left alone, and it decides what a report can truthfully contain.

If the menu is an iframe served from the provider’s domain, the browsing and the order both happen on their property. Your analytics sees somebody arrive on a page and then stop, and it has no way to know whether that was a bounce or a four hundred dollar basket.

A client-side integration keeps the browsing on your domain, which is better, and then usually hands the checkout to a third party anyway. The session breaks at exactly the moment the value appears.

So when an agency reports revenue from organic on an account like this, they are estimating and generally not saying so. The estimate can be reasonable. Presenting it as a measurement is where it becomes a problem, usually about the time somebody compares it to the point of sale figures.

What you can report instead is a set of proxies that are actually measured. Organic entries to menu and category pages. Direction requests, calls and website clicks from the profile. Those are real counts of people doing something with intent, and none of them requires a claim you cannot support.

Before any of that means anything, it is worth counting how much of the menu is reachable at all, because a proxy built on menu page entries is worthless if the menu pages are not in the index in the first place.

Four things that break analytics on a dispensary site

Beyond the menu, this category has four specific ways of corrupting its own analytics, and all four are invisible unless you go looking.

Four failures specific to this category. An age gate implemented as a redirect can drop the referrer, so organic sessions are recorded as direct. A consent banner declined means no measurement at all, and the decline rate in this category is high. A menu on another domain splits the session in two. And a delivery or ordering handoff to a third party does the same at the point of purchase. Each one makes the numbers directionally useful and absolutely wrong.
None of these produce an error. They produce a number that looks fine and is smaller than the truth.
  • The age gate. If it is implemented as a redirect to a separate URL, the referrer can be lost on the way back, and the session gets recorded as direct. A site with an implausibly large direct channel usually has this rather than a loyal audience.
  • The consent banner. Declined consent means no measurement, and decline rates in this category run higher than most. Whatever share of your visitors decline is a share your reports do not contain at all.
  • The menu on another domain. Covered above. Two properties, two sessions, one customer.
  • The ordering or delivery handoff. The same break, at the moment of purchase rather than at the moment of browsing.

The correct response is not to fix all four, because two of them are compliance requirements and one is a platform decision. It is to know the size of each gap and to say so once, in writing, at the start.

A sentence in the first report saves an argument in the sixth. The numbers here are directionally useful and absolutely wrong, they undercount rather than overcount, and comparisons across months are valid because the same distortion applies to both.

One more thing worth checking rather than assuming, because it is stated wrongly constantly. In analytics, the retention setting on a standard property governs how far back you can build explorations, and it does not delete the standard aggregated reports. Those two are frequently confused, usually in the direction of panic.

The baseline you cannot recreate later

Every platform in this stack forgets. Search Console rolls off after about sixteen months. The Business Profile report has no published retention at all. Analytics explorations are bounded by a setting somebody chose once and never revisited.

Eight things to capture in the first week of an engagement and store outside the platforms: a full Search Console query and page export, a Business Profile performance export, a complete crawl of the site, a map pack grid snapshot for the priority queries, the current title tags and meta descriptions, the indexed page count, the referring domain list, and screenshots of the live search results for the top queries.
An afternoon in week one. There is no way to obtain any of it in month nine.

Which means the baseline is a one-time opportunity. Miss it and the question “what did it look like before we started” has no answer for the rest of the engagement, and that question always gets asked, usually by somebody who was not in the original meeting.

Take an afternoon in the first week. Export the full query and page data from Search Console, in slices if the row cap gets in the way. Export the Business Profile performance data. Run a complete crawl and keep the file.

Take a grid snapshot for the priority queries, save the current title tags and meta descriptions, record the indexed page count, and pull the referring domain list so module 07’s work has a starting point.

The step that feels unnecessary

Then the step that feels unnecessary and repeatedly is not: screenshot the actual search results for your top ten queries. Layouts change, competitors appear, features arrive and vanish, and in a year nobody will remember what that page looked like.

Store all of it somewhere that is not the platform it came from. The point of a baseline is that it survives independently of the tool that generated it, and a folder of exports has outlasted several analytics migrations on accounts I would rather not have had to reconstruct.

Real movement, seasonality, a SERP change, or noise

A chart moved. Before anybody explains why, it is worth being clear that there are four possible causes and only one of them is the work.

Four reasons a chart moves, each shown with the shape it makes. The work is a gradual rise across a whole query set that then holds. Seasonality is a repeating wave, only visible in a year on year comparison. A results page change shows two lines separating, impressions rising while clicks fall. Noise is a jagged line swinging on a handful of searches.
Three of the four have signatures. Learn them and most reporting arguments stop happening.

The work has a signature. It shows up across a whole query set rather than in a few rows, it appears gradually over weeks, and it holds. A single query jumping ten places overnight is almost never the article you published on Tuesday.

Seasonality has a signature too, and it is only visible in a year on year comparison. This category has holidays, weather effects and payday patterns, and a month on month chart will attribute every one of them to whoever last touched the site.

A results page change is the one people miss most often. Impressions rise while clicks fall, or the reverse, because the page around your result changed rather than your result. A new feature, a pack expanding, a competitor’s listing appearing above yours.

When impressions and clicks move in opposite directions, the cause is nearly always presentation rather than position, and checking how your result is actually rendering is a faster first step than rewriting anything.

Noise is the fourth and the most common on small accounts. A set with two hundred monthly impressions swings forty per cent on a handful of searches. Below a certain volume the percentage is a worse description of reality than the raw count, so report the count.

One discipline covers most of this. Compare year on year at set level, never call a two week movement, and when somebody asks about a spike, check whether it happened last year before you build a theory about it.

Reporting for a chain, where the average hides everything

On a multi store account there is one further failure, and it is the one that lets a serious problem run for two quarters without anybody noticing.

A fifty store account reported two ways. As an account total the line is flat across the whole period and nothing appears to be happening. Broken out into fifty bars sorted by change, eight are climbing strongly, thirty seven are unchanged and five have fallen hard, which averages to exactly the flat line beside it while describing three situations that each need a different response.
The same month, reported twice. One version has nothing in it and one version has the whole account in it.

Fifty stores. Eight climbing, five falling badly, the rest flat. The account total is unchanged, the report says steady, and the five stores in trouble stay in trouble until somebody happens to look at one of them individually.

The fix is to stop reporting the account as a unit. Report per store, sorted by change rather than by size, and show both ends of the list. The top five and the bottom five in one view answer more questions than a total ever does.

Sorting by change rather than by volume matters more than it sounds. Sorted by size, the same four flagship stores head the report every month and the ones that need attention sit in the middle where nobody scrolls.

Two chain specific checks belong in the same view. Whether two stores in one market have started trading positions, which is module 03’s cannibalisation problem showing up as a reporting artefact.

And whether a store that fell has a profile problem rather than a page problem. Those two look identical in a traffic chart and need completely different work, so the check is worth running before anybody is dispatched to rewrite a page.

The practical constraint is the thousand row cap again. On a fifty store site, filter by page path per store and export in slices, or move to a bulk export. Reading a chain account through the standard table means reading the largest stores and nothing else.

The monthly report, and the four numbers in it

Most monthly reports fail in the same way. Twenty charts, no argument, and nothing that answers the only question the person paying has, which is whether this is working.

A one page report structure. Four headline numbers: non-brand product and place impressions, map pack presence across the fixed grid, profile interactions covering direction requests calls and website clicks, and pages published against pages indexed. Then four sentences: what changed, what caused it, what happens next, and what it cost. Everything else goes in an appendix nobody is required to read.
Four numbers and four sentences on the first page. The other twenty charts go behind it.

Four numbers carry a dispensary account. Non-brand product and place impressions, which is the demand you have gained access to. Map pack presence across the fixed grid, which is the area you cover.

Profile interactions, meaning direction requests, calls and website clicks together, which is the closest thing to intent that is actually counted. And pages published against pages indexed, which is the only one of the four that catches a technical problem before it becomes a traffic problem.

Then four sentences, in this order. What changed. What caused it. What happens next. What it cost. A report that answers those four in plain language will be read by somebody senior, and a report that opens with twenty charts will not.

When the client wants a rankings table anyway

Many will, and refusing outright reads as evasion. Give them one, and make it the version that is true: a fixed list of tracked queries, the grid point each pack position was measured from, and the previous month beside it.

Naming the measurement point on every pack row is what makes the table honest, and it does the teaching for you. After two months of seeing the same query at different positions from different points, nobody asks for a single rank again.

What stays out of that table is average position from Search Console. For the reason in section two it is describing the topmost result from the whole site, so putting it next to a tracked pack position invites a comparison between two numbers that measure different things.

Everything else belongs in an appendix that exists to be checked rather than read. Nobody is offended by an appendix. People are offended by having to find the answer inside one.

The rhythm matters as much as the format. Monthly for the four numbers and the four sentences. Quarterly for the year on year comparison and the strategy conversation. Annually for anything involving a claim about what the programme achieved.

That cadence is worth agreeing in the first week alongside everything else, and it is one of the reasons the phases an engagement actually runs in are worth setting out before any work starts rather than being discovered by the client one report at a time.

What to promise, and what to refuse

The pressure to promise something specific is higher in this industry than in most, and the reason is structural rather than personal.

Two columns. Things to refuse: a position by a date, a traffic figure, revenue attributed to organic, a first page guarantee, and a fixed number of links. Things you can commit to: a diagnosis inside a stated window, a production rate, a named list of fixes, a reporting cadence on named metrics, and the honest ceiling of what the market allows. Beneath, the commercial argument that the client who demanded the guarantee was going to leave in month five regardless.
The left column loses the deal in week one. The right column loses it in month five, with an argument attached.

Because paid channels are closed, organic is not one line in a marketing budget. It is the marketing budget, which means the expectations that would normally spread across several channels all land on this one.

That is the same reason growth looks different when paid search is closed to you, and it is why the guarantee somebody else offered sounds so much more attractive to an owner in this category than it would in another.

Refuse a position by a date, because you do not control the results page. Refuse a traffic figure, for the same reason. Refuse revenue attribution on an account where the transaction happens on somebody else’s domain. Refuse a link count, for every reason in module 07.

What you can commit to is a diagnosis inside a stated window, a rate of production you can actually hold, a named list of fixes with an order, a reporting cadence on named metrics, and an honest ceiling on what the market allows.

The last one is the one people skip. Some markets are winnable and some are not worth the fee, and saying which before the contract is signed costs you occasional work and saves you the engagements that end badly.

This is commercially better than it sounds. The client who required the guarantee was going to be disappointed in month five whatever happened, and the ones who stay are the ones who wanted the honest version. That is roughly what every result published with its measurement window attached is meant to demonstrate.

A flat month, diagnosed in order

Sooner or later a month comes in flat and somebody wants an explanation the same day. Having an order to work through turns that into twenty minutes instead of an afternoon of theories.

Seven checks in order. Is it measurement or reality, checked by comparing two independent sources. Did the indexed page count change. Did anything change on the Business Profile. Did the results page change, shown by impressions and clicks diverging. Did a competitor change. Is it seasonal, checked year on year. And only then, is the work simply not landing yet. Each step eliminates a family of causes before the next one runs.
Seven steps, cheapest first. The last one is the answer people jump to and it is right least often.
  1. Measurement or reality. Check a second independent source before anything else. If the profile interactions moved and the site data did not, you have a tracking problem rather than a search problem.
  2. Indexation. Did the number of indexed pages change. A quiet drop here explains most sudden flatness and is the fastest thing on the list to check.
  3. The profile. Did anything change on it. An edit, a suggested change accepted, a category altered, a suspension. Module 01 and module 02 both live here.
  4. The results page. Impressions and clicks moving apart means presentation changed rather than position, which points at the page around your result.
  5. A competitor. Somebody rebuilt, somebody opened, somebody finally claimed their profile. Look before assuming it was you.
  6. Seasonality. Compare year on year. If the same dip appears in the same month last year, the explanation is the calendar.
  7. The work. Only now. Most of what was published last month has not been reflected yet, and this is the answer people reach for first and the one that is right least often.

Step two deserves its own habit, because it is cheap and it catches the expensive things. Fetching the page the way a crawler does takes under a minute and rules out a rendering failure, an age gate change and a server error in one pass.

What done looks like, and what ongoing actually buys

The last thing worth measuring is whether the engagement should continue, and almost nobody in this industry will say that part out loud.

Two columns. Work that finishes: the technical faults, the profile setup, the location page system, schema, the menu architecture, and the compliance pass. Work that does not finish: publishing, prominence and links, defending against competitors who are also working, and responding to platform changes. Beneath, the note that a client whose finishable work is done and whose market is small should be told so.
The left column ends. Charging a retainer for the left column after it is finished is the industry’s quiet default.

A large part of this work genuinely finishes. The technical faults get fixed once. The profile gets set up correctly once. The location page system gets built, the schema gets deployed, the menu architecture gets decided, the compliance pass gets run.

What does not finish is production, prominence, defence and platform change. Somebody has to keep publishing, keep earning mentions, keep watching competitors who are also working, and keep up with things Google alters without announcing.

So the honest version of an ongoing arrangement is a description of that second column, priced accordingly, rather than a retainer that quietly bills the first column for another year after it was completed.

Which produces the conversation nobody wants to have. A single store in a small market, with the finishable work done, does not need a monthly retainer. It needs a quarterly check and somebody to call when something breaks.

Saying that costs you an account and is the single most effective thing you can do for the ones that stay, because the clients who should be on a retainer stop wondering whether they are being managed or milked.

That is the set. The map pack and the profile, recovering when the profile is taken away, a content system that survives store fifteen, what you are allowed to say, and producing it at a rate you can hold.

Then making a crawler able to read the result, earning the prominence that decides the close calls, serving the second market that shares your address, and finally proving which of the rest of it actually did anything.

If you would rather have the whole programme run properly and reported the way this module describes, that is what an engagement covers, in phases, with the pricing stated, and the free audit produces the first version of the baseline in section seven at no cost.

Check your own site

Run the free check to see how your menu, age gate, and location pages appear to a search engine.

Run the Free Check