I ran an AI-pattern detector across 18 marketing pages. The surprise wasn't enterprise marketing.
A small browser tool that scores text for the patterns that show up when something is written, or co-written, with a language model and then not edited. I expected enterprise AI-marketing to score worst. The data went the other way.
I built a small browser tool that scores text for the patterns that show up when something is written, or co-written, with a language model and then not edited. Em-dashes, formula phrases, certain favourite words, sentence-length cadences. Six families, weighted, in about 300 lines of JavaScript. You paste text and get a number between 0 and 100. Higher means smellier.
If you came here from somewhere that linked to the tool, that’s it: piiiico.github.io/llm-smell-check.
This post is about what happened when I started running it on real sites for my day job — selling AEO (Answer Engine Optimisation) to Norwegian companies. I was expecting one thing. I found something else.
The expected story
The narrative I went in with was the obvious one. AI-first companies pump out vendor copy with no human in the loop. So Salesforce Einstein, Glean, Writer.com, Jasper, HubSpot AI — these should be the worst offenders. 60s, 70s, the chef’s-kiss of unedited slop. Norwegian SMBs, who can barely afford a copywriter much less an LLM workflow, should be clean.
That was the prediction. Here is what actually happened on 18 marketing pages I tested live on 29–30 May 2026, with three calibration samples at the bottom for context.
The data
| Site | Score (0–100, lower = cleaner) |
|---|---|
| Norwegian SMB websites | |
| increo.no | 0 |
| studionetting.no | 0 |
| aspit.no | 0 |
| tine.no | 0 |
| involve.no | 6 |
| visma.no | 18 |
| English-language “AI-first” enterprise marketing | |
| glean.com | 0 |
| salesforce.com / Einstein | 6 |
| writer.com | 6 |
| copy.ai | 6 |
| lindy.ai | 12 |
| databricks.com / artificial-intelligence | 18 |
| jasper.ai | 24 |
| copysmith.ai | 24 |
| hubspot.com / artificial-intelligence | 26 |
| writesonic.com | 26 |
| anyword.com | 26 |
| relevanceai.com | 40 |
| Calibration samples (for reference, not live sites) | |
| A 200-word paragraph I wrote, packed with AI patterns on purpose | 72 |
| Generic ghostwriter LinkedIn post (representative sample) | ~55–65 |
| Press-release boilerplate (template) | ~55–65 |
Every live row can be re-tested by pasting the page’s body text into the tool. The calibration rows are reference samples, not live URLs.
The highest score in the live enterprise set was 40 (Relevance AI). Most of the marketing pages I expected to embarrass landed in the 6–26 range. Norwegian SMBs were not noticeably worse.
Why this is the wrong shape
It took me an afternoon to work out why my prediction was off. Boring reason. There is a human copywriter in the enterprise marketing loop. There almost has to be. The marketing function at a series-B SaaS company has a budget. That budget pays for someone, often a senior person, whose entire job is to make sure the homepage doesn’t sound like the rejected first draft. They will strip the em-dashes. They will swap leverage for use. They will catch in today’s rapidly evolving landscape in code review and delete it.
The unedited slop lives somewhere else. It lives where there is no copy editor and no budget for one. Three places I found it consistently:
- Ghostwriter LinkedIn posts. The personal-branding industrial complex has discovered LLMs and is shipping straight to feed. Voice mismatch, formula phrases, choppy paragraphs designed to look “engaging”. A representative sample scored in the high 50s. My calibration paragraph, hand-built to be maximally smelly, scored 72.
- Press releases. Templated by definition, now templated and AI-padded. They were already smelly. They have got smellier.
- Blog spam. SEO content farms publishing raw LLM output for the long tail. These don’t usually rank, which means they don’t usually get tested. But run the tool on a Medium tag page and you’ll see what I mean.
The enterprise marketing pages are not where the language-model damage is. They have copy editors.
Why I think this matters for AEO
I sell answer engine optimisation. The pitch is “we make sure your brand gets cited inside ChatGPT and Google AI answers.” A reasonable question is: if AI-generated marketing copy is everywhere, won’t the AI models start citing AI-generated copy back to us?
Sort of. But the parts they cite most reliably are the parts with structure: schema markup, FAQ blocks, clear claims with sources. The “smell” patterns the tool catches — those are mostly unstructured prose that no model is going to quote verbatim. They are decorative.
What gets cited is the part the marketing copy editor also cares about: clear, specific, claim-and-source structure. So the pattern of “competent enterprise marketing is fine, ghostwriter LinkedIn slop is dire” maps almost perfectly onto “competent enterprise marketing wins the AEO race, LinkedIn ghostwriting goes nowhere.”
The smell test and the AEO test are not the same test, but they answer to the same underlying virtue. Edit your text.
How the tool works (short version)
Six families of patterns:
- LLM vocabulary at unnatural density (delve, tapestry, leverage, holistic, ensure, navigate, foster, paramount). Weighted by density, not presence.
- Em-dash overuse (Paul Graham uses them constantly and is fine. The threshold is density × density-spike.)
- Formula phrases ("it's not just X, it's Y", "in today's rapidly evolving", "the future of X is here")
- Choppy emphasis (long runs of 3-to-8-word sentences for artificial gravitas)
- Contrastive negation ("this isn't about X. it's about Y.")
- Synthesising three-item lists (where the third item magically combines the first two)
Each family scores 0–100, weighted, blended. The whole thing is ~300 lines of vanilla JS and runs in your browser. Nothing gets sent anywhere. Code is at github.com/piiiico/llm-smell-check.
The detector has known weaknesses. Quoted LLM vocabulary in a discussion about LLM vocabulary scores moderate. Wikipedia table cells trigger the choppy-sentence count. Short text gets no signal. It is a heuristic for spotting unedited model output in mid-length prose, not a verdict on authorship.
What I’d actually do with this
If you run marketing for a B2B company: paste your homepage, your top three product pages, and your most recent press release into the tool. If anything clears 30, the copy editor pass got skipped or the LLM workflow snuck in. Fix the press release first. Nobody is going to defend a press release.
If you run an agency: this is a fast way to ship a “your content sounds AI-generated” finding to prospects, if it actually does. Don’t fabricate the finding. Fabricated findings burn you the first time someone runs the tool themselves.
If you run a personal brand: read your last LinkedIn post out loud. If it sounds like a deck from a sales kickoff that nobody attended, the tool will probably agree.
A note on what this tool is not
It is not an AI-content detector in the GPTZero or Originality.ai sense. Those are ML classifiers that try to guess authorship. They have known false-positive problems — multiple detectors flagged sections of the U.S. Constitution as AI-generated when journalists tested them in 2023, which is the reason serious educators dropped them. This tool does not do that. It checks for unedited model output, which is a different and easier question. Edited model output passes, because editing is exactly the act of removing the smell. Use it on your own copy as a draft-quality signal, not on someone else’s text as a verdict.
One ask
If you build something in this direction, especially for non-English text, send me what you find. The Norwegian pattern file in check.ts was built for our agency’s prospect research and would benefit from peer review. German and Spanish are the obvious next adds.
— Håkon
Score your own site for AEO
Same engine our paid analysis runs on. 30 seconds, no email. The full report is Norwegian — but the score and gap list below are universal, and email gets you the English write-up.
Free, 5 audits per hour per IP. Runs live against your domain.