The script would have taken an afternoon. Nobody was available to write it. Here is what that taught me about why large companies cannot automate simple things, and what AI actually changed.
A large publicly traded Canadian lender had a page on its website that said it served Canada. Which was true, and which was useless to a person in a town of eighteen thousand people typing the name of their town into Google at eleven at night.
That person was not asking whether the company existed. They were asking a much smaller and much more specific question: does this apply to me, here? The national page never answered it. So Google, quite correctly, sent them somewhere that did.
The fix is one of the most boring ideas in search. Give the question its own page. Do it for every town. This is called programmatic SEO, and the technical work involved is close to nothing.
Pages for Toronto, Ottawa and Montreal already existed, and they worked. They ranked and they produced volume, which is the outcome everybody expects, because those are the places everybody builds for.
The bet was that the long tail would match them in aggregate. Take the top five percent of Canadian municipalities by population, roughly two hundred and fifty eight of them, give each one a page, and the sum of all those small towns would rival the handful of big cities. Individually each page is a rounding error. Collectively they are a channel.
The bet was right, and the reason it was right is not sophisticated. Nobody competes for Sarnia. Every agency in the country is fighting over Toronto, and the search results for a town of eighteen thousand are frequently a directory listing and a map. A page that genuinely answers the question wins that page one almost by default.
It is worth being precise about the machinery, because the ambient understanding of SEO is mystical and the reality is plumbing.
A crawler is a program that fetches a page, reads the links on it, and adds those links to a list of pages to fetch next. That is the entire concept. It runs continuously, forever, across the public web. When you publish a page and reference it from a sitemap, you are adding a line to that list.
The index is what gets built from the crawl. For every meaningful word, the search engine keeps a record of which pages contain it and how those pages relate to each other. When someone searches, nothing is being searched in real time. The answer was computed in advance and is being looked up.
Which means the whole game is this: be the page that already exists for the question somebody is about to ask. Ranking well for "loan in Sarnia" is not a trick. It is having bothered to write something for a person in Sarnia when no competitor did.
I want to sit on that for one more second, because it is easy to be cynical about search engines and I think that is a mistake. There is a free, globally distributed index that will take a person in a small town, at midnight, with a specific and slightly embarrassing question, and route them to the one page on earth written for exactly them. No introduction, no fee, no permission. That is an absurd piece of public infrastructure to simply have available, and most of the people using it have no idea it is there.
Here is the part I used to leave out of this story.
I did not generate them. I rebuilt the same template roughly two hundred and fifty times, by hand, one page at a time.
To be clear about what the alternative looks like, this is genuinely the shape of the code. Read a list of places, loop over it, write a file:
import csv, pathlib
tpl = pathlib.Path("template.html").read_text(encoding="utf-8")
for row in csv.DictReader(open("municipalities.csv", encoding="utf-8")):
slug = row["name"].lower().replace(" ", "-")
out = pathlib.Path(f"loans/{slug}/index.html")
out.parent.mkdir(parents=True, exist_ok=True)
out.write_text(tpl.format(**row), encoding="utf-8")
Eight lines. The list of municipalities is a free download from the government census tables. It runs in under a second.
I did it by hand instead, and the reason is not interesting in a dramatic way. There was no SEO team. There had never been an SEO team. The company had paid for me to take an SEO course, I took it, and the work was sitting there unowned, so I picked it up. Every engineer who could have written those eight lines was committed to an internal CRM build that cost millions of dollars and was eventually shut down.
Nobody blocked me. That is worth saying plainly, because the version of this story where a villain protects their turf is a more satisfying story and it is not what happened. Everyone was busy with something that seemed more important at the time. The pages were not anyone's job, which is exactly why they were available to become mine.
People wanted numbers, and I did not have them for a while.
A few hundred small pages do not arrive, they accumulate. Each one has to be crawled, indexed, and then slowly earn trust for a term nobody was competing on anyway. The curve is flat and then it is not.
Seventy four thousand dollars in directly attributed sales from organic traffic, six months in, growing after that. Anyone auditing the project at week six would have found a person clicking save two hundred times and no revenue, and they would have been completely reasonable to kill it.
Budget the patience before you start. The work is cheap and the wait is not.
I was going to industry events through this period and meeting people who specialised in exactly this, including agencies with real programmatic capability. They were not hard to find and they were not bluffing. Firms like DAC run location pages as a product, off their own platform and their own listings database, at a scale no in-house team improvises.
So the obvious question is why a company with money would let a marketer do this by hand. The answer is that there were three doors, and every one of them is expensive in a different currency.
Change nothing, buy nothing, integrate nothing. Somebody just does the work, repeatedly, for weeks.
Cheapest to approve. Most expensive in human time. This is the door I walked through, because it was the only one that needed nobody's permission.
They already have the generator, the data, the templates and the track record. Pages typically live on their system, often on a subdomain or a hosted path.
Fast and proven. You are renting. The platform, the pipeline and a good deal of the domain equity sit with the vendor, and Google treats a subdomain as substantially separate from your main site.
The technically correct answer. It is also the one that wakes up procurement, legal, security review, and whoever owns the platform roadmap.
Right answer, enterprise timeline. Mid-market replatforms run three to six months and enterprise ones six to twelve, and roughly seventy percent of replatforming projects exceed budget.
Timelines and overrun rates via Core dna and Focus Reactive, which puts average migration overrun in the region of $315,000.
Here is the thing I did not understand at the time and consider the actual lesson.
When an agency builds programmatic SEO, or when I build it now on my own properties, it is programmatic from the first commit. There is a data source, a template, a generator, a canonical strategy and a sitemap, and all five exist before page one. The system assumes there will be thousands of pages, because that is what it was designed to produce.
Retrofitting that onto a mature company means installing all five into a stack built on the opposite assumption, which is that a page is a thing a human creates in an interface. That system may have no usable write API. It may have one behind a vendor contract. Adding a new directory of URLs may touch IT, brand, legal and web in the same week.
None of that is about the difficulty of generating a page. The generation was never the hard part. The hard part is that the write path belongs to something old, and nobody in the building has done this before, so there is no precedent to point at and nobody who can estimate it honestly.
Ambition makes it worse in a way I have watched repeatedly. A small good idea gets attention, and attention turns it into a program, and the program needs a business case and an owner and a steering committee, and it collapses under weight it did not need. Two hundred and fifty eight pages did not need a program. They needed one afternoon and one approval.
On approvals: the compliance review was real and I want to defend it. Those pages were financial services copy in a regulated market, and a regulated lender reviewing hundreds of pages of consumer lending language is doing its job. The way through was to make it one review instead of two hundred and fifty eight. Get the template approved. The pages are a consequence of the template.
Everything I have described was a resourcing problem. Somebody who could write eight lines of Python was not available to write eight lines of Python, and that turned an afternoon into months of clicking.
That constraint is gone, and I do not think most people have updated for it.
I build this way now. The pages on my own properties are generated, the sitemaps rebuild themselves on every run, and the thing that took me months at a company with a real budget takes me a single sitting. That is not a story about me getting smarter. The floor moved.
So the honest advice to anyone sitting on work like this inside a large organisation is to stop scoping it as a project. Bring it built. The ask is much smaller than the objection when the answer to "how long will this take" is that it is already done and needs a review.
I want to be careful here, because there is a tempting version of this ending that I do not think survives contact with evidence.
That CRM project, the one that consumed every engineer who might have helped me, cost millions and was shut down. It would be satisfying to say that AI would have saved it. Better tools, faster build, project delivered.
The research does not support that. Across studies of CRM implementation, something like sixty percent or more of failures are attributed to people and process, with the platform itself accounting for roughly six to ten percent. Enterprise projects fail at meaningfully higher rates than smaller ones, and the reason given is complexity and organisational politics rather than technology. AI would have made that CRM get built faster. It would not have touched the thing that killed it.
Which is the actual point, and it is the one worth leaving with.
The technical path just got extremely cheap. Two hundred and fifty eight pages is an afternoon now, and it will be less than that next year. The political path costs exactly what it cost in 2019. Nobody owning the work, no precedent to point at, a write path controlled by a system nobody wants to touch, and a good idea inflating into a program that dies of its own weight.
Plan for both. Budget the second one with the same seriousness you budget the first, because you will pay for both, and from here on the second one is the expensive half.
The Artificial Advantage: the frameworks behind everything here, written for professionals, not programmers.