Skip to content
Module 03 of 09 · Basic to advanced

The Multi Location Dispensary Content System

What separates a location page system from a template, where genuinely local substance comes from, how to map keywords across stores, and the publishing gate that stops a bad page going live.

The Multi Location Dispensary Content System
Key takeaway

A template scales the writing. A system scales the collecting, which is the only part that was ever the bottleneck. The intake call with the store manager is the whole difference: without it, every location page is a template with better intentions.

A chain with forty stores has forty location pages, and on most cannabis sites those forty pages are one page. Not similar. One page, written once, republished under forty URLs with the city name swapped and the address block regenerated from a spreadsheet. Everybody involved knows this. Nobody planned it.

It happens because the alternative looks impossible. Forty genuinely different pages sounds like forty writing projects, and no marketing team has forty writing projects in it.

So the template gets built, the pages ship in an afternoon, and the problem is deferred until the day a reviewer opens three of them in a row and forms an opinion about all forty.

The way out is not more writing. It is a different production model, where the frame repeats and the substance does not, and where the substance is collected rather than invented. That model is what this module builds.

It is the third of six modules, and it is the part of dispensary SEO at scale that decides whether a chain compounds as it opens stores or accumulates liability with each one.

A template and a system produce the same page count

Both approaches end the quarter with forty URLs live. That is why the distinction never survives a project plan, where both appear as one line item called “location pages” with the same delivery date.

On the left, one page is written and the city name becomes a variable, producing forty URLs that carry one page of value. On the right, a fixed frame is combined with forty separate intakes, producing forty URLs that each carry something the others do not.
The same page count from either side. The divergence is upstream of the build, in where the local detail comes from.

A template is a writing decision made once and applied forty times. A system is a collection decision made forty times and applied through one frame. The template scales the writing. The system scales the gathering, which is the only part that was ever the bottleneck.

The reason this matters beyond tidiness is that Google’s scaled content policy does not test whether a human wrote the page. It tests whether many pages were produced primarily to hold rankings without adding value of their own.

Forty pages from one template answer that question badly regardless of who typed them, and how quietly location pages converge when nobody is measuring is the shape of the problem before anybody names it as one.

There is a commercial argument as well, and it is the one that actually moves owners. A templated page can only ever compete on proximity, because it says nothing a nearer store’s page does not also say.

A page that names the parking, the transit stop and the two neighbourhoods it genuinely serves can win searches from people who are not standing next to the store. That is the difference between forty pages that defend and forty pages that acquire.

What actually counts as content on a location page

Before you can measure anything you have to agree on what is being measured, and this is where most audits go wrong in the first ten minutes. A location page that renders at nine hundred words is usually carrying two hundred and forty of its own.

A location page broken into nine bands. Header, footer and schema are shared. The menu embed is not in the HTML at all. The opening paragraph, the neighbourhood section and the store detail section are the only blocks that carry words no other page on the site has.
Nine bands, three of which are yours. The word count in the CMS is not the word count that is being judged.

Work through it band by band. The header, navigation and footer appear on every page of every site and contribute nothing to distinctiveness.

The address and hours block has the same shape everywhere but different values, so it distinguishes the page as a record without distinguishing it as writing.

The compliance and licence block is identical by design and should stay that way, because rewording legal text for variety is how a chain ends up with forty slightly different disclaimers and no idea which one is current.

Then there is the menu, which is usually the largest visual element on the page and contributes nothing at all. It gets its own section later, because the misunderstanding around it is worth taking slowly.

What remains is the honest ratio: the number of rendered words on this page that appear on no other page of the same site. Not the CMS word count. Not the count including the menu.

That number is almost always lower than the team expects, and the gap between what they expect and what is there is the entire content problem stated in one figure.

Setting the similarity ceiling, then letting it refuse pages

A similarity ceiling is a number you decide in advance, above which a page does not publish. Somewhere near seventy percent of body text, measured with the shared furniture stripped out, is a defensible place to put it.

Every chain that has this problem measures it eventually. Most measure it wrongly, once, after a notice arrives, and then never again. Both halves of that are worth fixing: measure it correctly, and measure it before publishing rather than after.

Comparing raw HTML across forty location pages returns ninety one percent because navigation and footers are counted. Stripping the shared furniture first returns seventy eight percent, which is the number that reflects the writing. Below forty percent the pages are genuinely different, forty to seventy needs watching, and above seventy the site has one page on many URLs.
The raw number is inflated by furniture every site has. Strip it, then believe what is left.

Compare raw HTML and you will get a number in the high eighties or nineties for any site with a substantial navigation, including sites with excellent location pages.

It is a useless number in both directions: it condemns good pages and it flatters bad ones by making every result look the same.

Strip the shared furniture first, compare only the body text, and what comes back is roughly what a reviewer forms by eye when they open three pages in sequence.

Then set a ceiling, and set it as a policy rather than as a finding. Below forty percent the pages are genuinely different documents. Between forty and seventy they are a family, which is acceptable and worth watching.

Above seventy you have one page on many URLs, whatever the intention was. A tool that samples the pages in your sitemap and scores them against each other turns that from an argument into a number, which matters mostly because arguments about page quality are unwinnable and numbers are not.

The ceiling only does work if something enforces it. A threshold that exists in a document is a preference. A threshold wired into the publishing step, where a page above it does not go live, is a system.

That distinction reappears at the end of this module and it is the single thing that separates chains that stay clean from chains that clean up periodically.

Where local substance actually comes from

Here is the part that gets skipped, and skipping it is why the template exists. Genuinely local detail is not on the internet. It cannot be researched from a desk, generated from a prompt, or inferred from a map. It has to be asked for.

Geography, the building, the people, the customers, the local calendar and the nearby competition. Each has to be asked for rather than researched, which is the reason most chains fall back on templates.
Six wells, none of them online. This is the actual reason templated pages are templated.

Take them one at a time, because each produces a different kind of sentence.

  • Geography. Not the city, which every competitor also has. The lot behind the building, the junction people turn at, the landmark they give as a reference when a friend asks where the store is. “Two blocks north of the transit hub, behind the Otto Street lot” is a sentence no other page in the state contains.
  • The building. What it was before. Where the door actually is. Whether the signage is on the main road or around the side. Buildings in retail strips have histories that customers remember better than addresses.
  • The people. Who works there, how long they have, what they know well. A store where two budtenders are deep on concentrates is a different store from one where nobody is, and that difference is real, checkable and useful to a customer.
  • The customers. Who actually comes in, and at what hour. A store next to a hospital shift change has a different afternoon from a store next to a university. That shapes what the page should lead with.
  • The calendar. The local events, the seasonal swings, the weeks the hours change. This is the material that makes a page look maintained rather than deposited.
  • The competitive set. Who else is within a mile and what this store does that they do not. Later opening, a bigger lot, delivery that crosses a county line, a loyalty scheme that actually works.

Notice what is missing from that list: product descriptions, strain explainers, general cannabis education. All of it is available to every competitor, none of it is local, and a page padded with it is longer without being more distinct. Length was never the goal. Being unrepeatable was.

The intake is the system

If there is one idea in this module worth taking away, it is this one: the content system is not a writing process with a template attached. It is a collection process with a writing step at the end. The intake is the system, and everything downstream is assembly.

Eight questions asked of the store manager on a twelve minute recorded call, each mapped to the block of the page it fills: directions, history, products, frequently asked questions, parking, hours, seasonality and the one differentiating claim.
Eight questions, twelve minutes, one store manager. Everything the writer needs and nothing they have to invent.

Three practical rules make this work, and all three are learned the hard way.

First, it is a call, not a form. Managers do not fill in forms, and the ones who do fill them in with the same three adjectives every retail manager uses. On a call they talk, and inside the talking is the parking detail you would never have thought to request.

Second, record it and transcribe it. Notes taken live are a summary, and the summary is where the specificity dies. The phrase you want is usually the one the manager throws away halfway through an answer about something else.

Third, ask questions that cannot be answered with a slogan. “What makes this store special” produces marketing language. “What do people say when they give directions here” produces a landmark. “What do customers ask at the counter every day” produces the six real FAQ entries, and they are almost never the six a content brief would have guessed.

The whole art of the intake is in the phrasing of eight questions, and once phrased they are reusable for every store the chain will ever open.

Twelve minutes per store, once. For a forty store chain that is eight hours of manager time in total, and it is the eight hours that decides whether the other three hundred hours produce forty pages or one.

The page skeleton: fixed frame, variable substance

With substance collected, the frame can be rigid, and it should be. Consistency of structure is a feature: it makes the pages faster to produce, easier to audit, and easier for a returning customer to read. Sameness in the frame was never the problem. Sameness in the sentences was.

Eleven blocks in fixed order. Seven must carry different words on every store page. Three keep the same shape with the store own values. The compliance and licence block must be identical word for word on every page.
Eleven blocks, fixed order. Seven must differ, three share a shape, one must never be reworded.

Three classes of block, and it is worth being explicit about which is which before anybody starts drafting.

  • Blocks that must differ. The H1, the opening, getting here, what the store is known for, the people, the neighbourhoods served, the FAQ. Seven blocks. If any one of them could be lifted onto another store’s page without a factual error, it has not been written yet.
  • Blocks with a fixed shape and their own values. The NAP block and the schema. Same fields everywhere, different content in them, generated from one source of truth rather than typed forty times. Hand typing is how a phone number ends up correct on the page and wrong in the markup.
  • The block that must never vary. Compliance and licence text. One approved wording, published identically, changed in one place when the rules change. Rewriting it for variety creates forty documents nobody can audit and no legal benefit whatsoever.

The order matters as much as the contents. Put the differentiating material above the menu embed, because that is the part of the page that is read, and because a page that opens with a menu opens with somebody else’s content.

The neighbourhood and directions material sits directly under the opening, where it does the most work for both the reader and the search that brought them.

Mapping the keywords before anybody writes

A content system for one store is a writing exercise. A content system for many stores in one metro is an allocation problem, and allocation has to happen before drafting, because it decides what each page is for.

Five stores against five query types. Every store owns its brand plus city term and its neighbourhood terms. Product and delivery terms are assigned to a single store each. Two stores four miles apart are shown contesting the same near me phrase, which neither of them wins.
One term, one page, one owner. Contested cells are decisions nobody made, showing up as a ranking problem later.

The map is a grid: stores down the side, query types across the top. Brand plus city and the neighbourhood terms belong to the store they describe, and those assign themselves. The interesting rows are the ones that do not.

Product and service terms, such as a category page, delivery, curbside or same day, should be assigned deliberately to one page each, usually a hub page for the metro rather than to a store.

When two store pages both target the delivery term, both get written to rank for it, and the outcome is two stores fighting over one keyword where neither of them wins it. Google picks one, usually the wrong one, and it changes its mind periodically.

The generic “near me” term is the one that causes the most wasted effort in dense metros.

Two stores four miles apart cannot both own it, and in practice neither owns it, because the map pack resolves that query on proximity to the searcher rather than on which page tried harder.

Assign it to the metro hub, write the store pages for the searches proximity does not already decide, and stop spending on the one you cannot win.

When you inherit a site rather than build one, the cannibalization mapper will show you which pairs are already doing this.

Write the map down in a spreadsheet and put a name in every cell. Empty cells are opportunities. Cells with two names are the ranking problem you will otherwise diagnose in eight months’ time.

Titles and descriptions at fifty pages

The title tag is where a templated system is most visible, most damaging, and easiest to fix. It is also the only part of the page a searcher reads before deciding whether the page exists for them.

On the left, five titles built from one pattern where only the city name changes. On the right, five titles for the same five stores, each carrying a different reason to click: late opening, the street, same day delivery, the transit landmark, and pickup.
Fifty titles from one pattern say something about the fifty pages underneath, and it is read as one thing.

The standard pattern of service, city and brand is defensible for five pages and indefensible for fifty. It also wastes the most valuable characters on the page repeating a word the searcher already typed.

Build each title around the differentiator the intake produced: the late opening, the street name people use, the free lot, the delivery radius, the landmark two blocks away.

There is a compliance dimension here that catches people out, because a title is advertising in a way body copy sometimes is not, and what a cannabis title tag is allowed to claim is narrower than most teams assume. Price claims, potency claims and superlatives all belong to the part of the sentence you cannot use.

Meta descriptions get the same treatment for a different reason. Google rewrites them frequently, which is often taken as a reason not to bother, and that is the wrong conclusion.

It rewrites them when they do not match the query, and it uses them when they do. Fifty identical descriptions guarantee a mismatch on forty nine of them.

Checking how a title and description actually render before publishing takes seconds with a snippet preview, and doing it at draft stage rather than after indexing avoids the version of this job where you edit fifty pages twice.

The menu is not the page

This is the misunderstanding that survives every explanation, so it gets its own section. The menu is the reason the location page exists, it is what customers come for, it fills most of the screen. And it contributes nothing to whether the page ranks.

The same location page rendered twice. The customer sees a product menu filling most of the page. The crawler receives an iframe pointing at a third party domain, leaving only the two hundred and forty words written around it to carry the page.
What the customer sees and what the crawler receives are two different pages. Only one of them is being ranked.

Most dispensary menus are embedded from a third party platform inside an iframe or injected by a script after the page loads. In the first case the products live on another domain entirely and belong, for indexing purposes, to that domain.

In the second they may be rendered eventually or may not, depending on how the script behaves and what the crawler waited for.

Either way, planning content on the assumption that four hundred product names are carrying the page is planning on a page that does not exist.

The technical detail behind that, and how to tell which case you are in, is what module six covers.

The practical consequence for a content system is simple and it changes the brief: everything around the menu has to carry the page alone. Two hundred and forty words of genuinely local writing above and below an embed is a real page.

Sixty words of introduction above an embed is a redirect with decoration, and it is a very common shape on chain sites because the menu makes the page look full while it is being built.

Compliance multiplies with the page count

Every system that clones copy clones its mistakes at the same rate, and this is the risk that owners underestimate most consistently, because a template feels like a control rather than an amplifier.

One promotional sentence that is legal in a single state becomes a health claim and a price claim in three others. Copied into the template it publishes on fifty URLs at once. The gate checks every reusable sentence against every state before the copy is cloned.
A sentence approved once, cloned fifty times, in states with four different rulebooks.

A chain operating across state lines is operating under different advertising rules in each of them, and those rules change, so treat anything here as a prompt to check your own regulator rather than as the rule itself. Language that is unremarkable in one market is a health claim, a price claim or an inducement in the next.

Written once into the shared part of the template, that sentence publishes on every page simultaneously, and nobody re-reads the template after page two.

The fix is structural rather than vigilant. Reusable copy, meaning anything that appears on more than one page, gets checked against every state the chain trades in, once, before it is cloned.

Store specific copy gets checked against its own state at draft. Running the wording through a compliance checker at that point costs a minute and catches the categories people forget: potency and dosage claims, medical benefit language, discount and price framing, anything that reads as an inducement, and imagery or wording that could be read as appealing to minors.

Keep the approved wordings in one place with a date on each. When a state changes a rule, the job is to edit one entry and republish, not to search fifty pages for a phrase you half remember writing.

Schema for a chain: one organisation, many branches

Structured data is where the multi location model either becomes legible to Google or becomes confusing, and confusion here undermines work done everywhere else.

The brand is declared once on the homepage as an Organization with no address. Each store page carries its own Store node with its own address, coordinates and opening hours. Repeating the brand address on every branch, marking cannabis products up, or publishing a LocalBusiness node with no address are the three ways this breaks.
The brand once, each branch on its own page, with values that match the Business Profile exactly.

The structure is straightforward. The brand is declared once, on the homepage, as an organisation, and it does not need a street address.

Each location page carries its own node for that branch, with its own address, coordinates, telephone, opening hours and canonical URL. The store node points back at the brand as its parent. That is the whole model.

Three failures account for nearly all the broken implementations I see.

  • The head office address repeated on every branch page. Usually a theme setting applied globally. Forty pages claiming the same street address is a strong signal that these are not forty places.
  • Product markup on cannabis items. Ineligible by policy, no rich result to gain, and an unnecessary flag on a category of site that is already reviewed more closely than most.
  • A local business node with no address at all. This is a validation error rather than a judgement call, and it is the most common structured data error on cannabis sites because plugins and themes both generate a node and neither fills it in.

This is the content side of the model. What to mark up on the menu itself, and what to leave alone there, is module six.

Generate the markup from the same record that produces the on-page NAP block, so the two cannot disagree.

Match the Business Profile character for character, including suite formats, abbreviations and the phone number, because a mismatch between markup and profile is a small, silent inconsistency that costs trust at exactly the wrong layer.

The publishing gate

Everything above is a set of good intentions until something refuses a page that does not meet them. The gate is the mechanism, and it is deliberately boring: a short list of conditions, all of which must be true, checked at the moment of publishing rather than in a review afterwards.

  1. An intake exists for this store, recorded and dated. No intake, no page. This is the rule that does the most work and the one under the most pressure.
  2. Seven blocks contain material specific to this store. Read them against the nearest sibling page. If a block would be true of both, it fails.
  3. Body similarity against every existing location page is under the ceiling, measured with boilerplate stripped.
  4. The title and description are unique and neither is built from the standard pattern.
  5. No term on this page is already assigned to another page in the keyword map.
  6. Reusable copy has been compliance checked against every state, store copy against its own.
  7. Address, phone and hours match the Business Profile exactly, in the page, in the markup, and in the profile itself.

Seven conditions, a few minutes each, applied to every page forever. The reason to write them down rather than rely on judgement is that judgement degrades under deadline, and location pages are always built under deadline, usually the week a store opens.

Running the line without burning out

Forty pages built properly is a real amount of work and pretending otherwise is how the template comes back. What makes it survivable is treating it as a line with a rate rather than a project with a deadline.

Intake, draft, local check, compliance check, similarity check, publish, with the time and owner of each stage. Blocks are batched across stores rather than pages being written one at a time. The stage that fails is the intake, and a page without one is not written at all.
Six stages with an owner and a duration each. The stage that breaks is always the first one.

Batch by block, not by page

Batch by block rather than by page. Ten intakes in one week. Ten opening sections in one sitting, ten directions sections in the next, ten FAQ blocks after that.

Writing the same block ten times consecutively is uncomfortable and it is exactly what you want, because by the fourth one the ways in which these stores actually differ are impossible to miss.

Writing page one end to end, then page two end to end, produces the opposite: each page is drafted in isolation and drifts towards the same defaults.

Give every stage an owner

Give each stage an owner. The manager supplies the intake and signs off the local facts. The writer drafts. Someone who is not the writer runs the compliance and similarity checks, because people do not catch their own repetition. The gate belongs to whoever is accountable for the site, not to whoever is under pressure to launch.

Where the line actually breaks

Know where it fails, because it fails in the same place every time. Not the writing. The intake. Store nine does not return the call. The launch date does not move.

So store nine gets a page assembled from the corporate website, which is a template by another name, and nobody notices until the page count is thirty and six of them were built that way.

The rule that saves this is unpopular and it is the one that works: a page without an intake does not get written. Chase the call, or ship thirty nine pages.

Measure the line, not the pages

Measure the line rather than the pages. Pages published per week, intakes outstanding, average similarity of the last ten pages against everything before them, and how many pages the gate refused. That last number should not be zero. A gate that never refuses anything is not being applied.

None of this is clever. It is a collection process, a fixed frame, an allocation table and a gate, run at a rate the team can hold.

The reason so few chains do it is that the first two weeks produce fewer pages than a template would, and that is the only stretch where the template looks like the better decision.

If setting the line up is more than the team can absorb alongside running the stores, that is what the content system work we build for chains is for, and the free audit will tell you how far the current pages are from the ceiling before you commit to anything.

The next module deals with what you are allowed to say once you have somewhere to say it.

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

Rebuilding location pages across a chain is a programme rather than a rewrite. How that work is scoped →