How to get your site cited by AI assistants

Ranking gets you a link under an answer somebody already read. Being cited means you are the answer. They are different jobs, and the second one is mostly structural.

Short answer

An assistant cites a page it can lift a complete claim from and stand behind. That means the answer in the first forty words, a stable URL, an addressable heading on every section, one consistent description of who you are, and figures that carry a date and a source.

AEO Published
Book a strategy callAll insights

An AI overview now sits above the results and takes the click you used to get. So the question stops being where you rank and becomes whether you are the thing being quoted. This is the whole method we used on this site, with the figures and the commands that produce them, so you can check it rather than take it.

01

What cited actually means.

An assistant answering a question is not picking the highest-ranking page. It is picking a passage it can lift and stand behind. Those are different tests, and the second is harsher: the passage has to be complete without the page around it, specific enough to be worth quoting, and attached to someone who can be named.

Think about what happens when a model drafts an answer. It has a sentence it wants to make. It needs a source for that sentence. Paraphrasing a vague page costs it nothing and credits nobody. Quoting a precise page costs it a line of attribution and buys it a claim it can defend. Everything below is about making your page the cheaper of those two options to cite and the more expensive one to paraphrase.

That is also why this is structural work rather than writing work. You are not trying to sound authoritative. You are trying to be liftable.

02

Put the answer in the first forty words.

Open with the answer, before any context, and make it complete on its own. If your first paragraph needs the second to make sense, there is nothing to lift. Most pages fail here and nowhere else.

The test is mechanical. Delete everything on the page except the first paragraph. Does it still answer the question in the heading? If not, you have written an introduction, and an introduction is the part a model skips. Put the conclusion where the warm-up was and let the context follow it.

On this site that paragraph is a field on the post rather than a habit, which means it cannot be forgotten. Every Insight carries a short answer box above the body, and the same text becomes the definition on the glossary term the piece is filed under. One sentence, two jobs, no chance of the two drifting apart.

The heading above it matters as much. Make it the question in the words a person types, not the topic. "How much does a Webflow site cost in 2026" beats "Our pricing philosophy" every time, because the first one matches a query and the second one matches nothing.

The shape of a page an assistant can quote. Nothing here is a design decision; every band is a thing that has to be true before a passage can be lifted and linked.
03

Give every section an address.

A citation links to a place, not a page. If your sections have no ids, the best an assistant can do is link the whole document and hope the reader finds the paragraph. More often it just paraphrases instead, because an unverifiable link is worth less than no link.

So every section heading here renders as an h2 with an id derived from its own text, and the contents list at the top is built from those same headings rather than written by hand. The list cannot go stale, and every row in it is an anchor somebody can cite.

There is a trap underneath this one. These headings are set at h3 size because the pieces are short, and the obvious move is to make them real h3 elements. Do not. An h3 with no h2 above it breaks the heading tree, and the heading tree is how a machine works out which section a passage belongs to. Keep the element an h2 and change the type size instead. That is a CSS decision wearing an HTML costume, and getting it the wrong way round quietly drops your sections out of the index.

04

Describe yourself the same way everywhere.

An assistant reaches for names it keeps seeing described the same way in a lot of places. Not the name it has seen most often. The name whose description does not change.

That means your business name, address, phone number and one-line description match character for character across the page copy, the structured data, the footer, your Google Business Profile and anywhere else you are listed. One variant of your own name is enough to split you into two entities in a model that has no way to know they are the same company.

The practical version is to generate it from one place. On this site the Organization and the Person are built once and emitted on every page, so there is no second copy to drift. The same discipline applies to the things nobody checks: a trailing "LLC" in one place and not the other, two spellings of a street, a phone number formatted two ways.

This is also where we are weakest, and it is worth saying plainly: neither entity on this site carries sameAs links to its profiles yet. Those are the lines that tie a name on your site to the same name on a profile somebody else controls, which is exactly the corroboration this whole section is about. It is on the list. It is not done.

05

Structured data is a claim, not decoration.

JSON-LD does not make a page rank. What it does is state, in a form with no ambiguity, what the page is and what it asserts. A paragraph saying you have a five star rating is prose a model has to interpret. An AggregateRating node is a claim it can read.

The useful mental model is that each node is a sentence you are willing to be held to. So do not emit a node for something the page does not show. An FAQPage with questions nobody can see on the page is the oldest way to get your markup ignored, and it is also just dishonest.

The homepage here carries 11 distinct types and the reviews page carries 16, including Review and AggregateRating nodes built from the reviews actually rendered, so the markup cannot disagree with the page. The glossary adds DefinedTerm and DefinedTermSet. The Playbook adds TechArticle and VideoObject. None of that is decoration: every node corresponds to something a reader can see.

One trick worth knowing. A second node with the same @id merges into the first, so a page can attach a rating to the sitewide Organization without redefining the Organization. That is how the rating and the Organization stay in one piece instead of becoming two companies.

06

Publish the number, the date and where it came from.

"Most sites are too slow" gets paraphrased and uncredited. "The Iru went from 104.8 MB to 6.6 MB" gets quoted with a link, because the number came from somewhere and the somewhere is you. Specifics are the single cheapest thing you can add to a page, and almost nobody adds them, because specifics are checkable and vague copy is safe.

The failure mode is obvious once you have done it once: you write a number you half remember, it is wrong, and the piece is now a liability. So on this site a figure in a post has to trace to a source file before the build will run. A number that is not in the incident log, or in a research file with the URL and the date it was checked, fails the build. It is not a style rule. The deploy stops.

That gate had a hole until today. It read the fields that hold a sentence and ignored the rows of a table, which is exactly backwards: a table is the most liftable thing on a page, so an unsourced figure there is worse than one buried in a paragraph. It reads tables and list items now.

Every figure in this piece has a line in a research file in the repository giving the command that produces it. You do not need our tooling to copy that part. A text file with the number, the date and the URL you read it from is the whole idea.

07

Name the crawlers you are letting in.

Default robots.txt files are written for search crawlers, and plenty of hosts ship one that blocks anything they do not recognize. If you are going to be quoted, the thing doing the quoting has to be able to read you.

So name them explicitly rather than relying on a wildcard. This site names 8 AI crawler user agents and allows them: GPTBot, OAI-SearchBot and ChatGPT-User for OpenAI, ClaudeBot and Claude-SearchBot for Anthropic, PerplexityBot, and the two opt-in agents Google-Extended and Applebot-Extended.

The last two are worth understanding, because they are opt-outs wearing a different hat. Google-Extended and Applebot-Extended do not control whether you are crawled. They control whether what was already crawled can be used for AI answers and training. Leaving them disallowed, which some privacy-minded defaults do, removes you from the part you are trying to be in.

Check what you are actually serving rather than what you think you wrote. Fetch the file. It takes a second and it is wrong more often than you would like.

08

llms.txt, and what it is actually worth.

llms.txt is a plain text file at the root of a site that tells an assistant who you are, what you sell and which pages matter. It is a proposed convention, not a standard, and no engine has committed to reading it. Anyone telling you it is why a brand shows up in ChatGPT is guessing.

We ship one anyway, on every site, and ours links 22 pages. Not because it is the lever, but because it costs twenty minutes and it forces a genuinely useful exercise: saying what your business does in one paragraph a machine could repeat back. Most businesses cannot do that on request. The long version of this argument is in the piece on llms.txt.

Generate it from the same source as the site. Ours is written by a build script from the same post data that renders the pages, which means it cannot describe a page that does not exist. A hand-maintained llms.txt is a second copy of your site that starts rotting the day you write it.

09

Give your vocabulary a home.

Every business has terms it uses in a particular way. If you never define them, a model either guesses or substitutes the generic meaning, and in both cases the thing it says about you is slightly wrong in a way you will never see.

A glossary fixes this cheaply. Ours has 46 terms, each with an id, each emitted as a DefinedTerm inside a DefinedTermSet, and each one addressable so a piece can link straight to the definition it is relying on. When an Insight defines a term, the gate checks that the term actually exists on the glossary and that every anchor it links to resolves. A link to a definition that is not there fails the build, which is the only reliable way to keep a glossary honest once it is past about twenty entries.

Define the words a customer would type, not only the ones you invented. The invented ones matter, but they are not what anybody is searching for.

10

One subject, one URL.

This one cost us a rebuild today, so it is fresh. The Insights hub had category chips that filtered the grid in place and wrote a query string into the address bar. It looked like navigation and it worked well. It was also uncitable.

Nothing can quote a filtered view. The canonical pointed at the hub, the filtered state was JavaScript rather than a document, and an assistant asked who writes about this subject had one page to look at instead of one per subject. Every category is a real page now, with its own title, heading, lead and list, and the chips are plain links to them. The filtering script is gone entirely and the categories work with JavaScript turned off.

The general rule: if a view is worth sending someone to, it needs a URL. If it does not deserve a URL, it probably does not deserve to be a view. The same logic covers canonical tags, which exist to tell a machine which of several addresses is the real one.

While you are in there, make your internal links point at the final URL. Six posts on this site linked a path that redirects, and the gate counted a redirect as served, so nobody noticed for a week. A redirect works for a human and costs a hop for everything else.

11

Say when the page was last true.

A comparison written in March and unmarked in November is indistinguishable, to a machine, from one written yesterday. Which means it is treated as equally reliable right up until it is caught being wrong, and then the whole site is discounted.

Put the date on the claim rather than on the page. "Checked on 1 November 2026" inside a table caption travels with the table when the table gets lifted. A modified date in the page metadata is worth having too, but it sits in the markup, and markup does not travel inside a quote.

This is also the honest way to publish a figure that moves. Our reviews page never prints how many reviews there are, because that number changes and a page that states it goes quietly wrong between visits. The figures that are dated sit where the date is attached to them. Everything else on the page is written to still be true in a month.

12

Where this site stands, signal by signal.

Here is the whole method as a table, with what each item costs, what it is worth, and where this site actually is. The honest column is the last one.

The AEO signals on this site, checked on 1 November 2026. "Worth" is our judgment rather than a measurement, which the method section below is blunt about.
SignalWhat it takesWorthWhere we stand
Answer in the first forty wordsA field on every piece, and the discipline to delete the warm-upHighOn every Insight, and it doubles as the glossary definition
Addressable sectionsAn id on every heading, and a contents list built from themHighEvery heading on every piece, contents generated not written
One consistent entityGenerate the name, address and description from one placeHighGenerated sitewide, but no sameAs links on either entity
Structured dataEmit only what the page showsHigh11 types on the homepage, 16 on the reviews page
First-party evidenceA source file per figure, and a gate that enforces itHighThe build fails on an unsourced number, tables included
Crawler accessName the agents instead of trusting a wildcardMedium8 AI crawler user agents named and allowed
A glossaryA definition per term, each one addressableMedium46 terms, every anchor checked by the build
One URL per subjectPages, not filtersMediumA page per category since today, filter script removed
Dated claimsThe date inside the caption, not only in the metadataMediumOn the tables and the reviews page
llms.txtTwenty minutes, generated from the siteLowGenerated at build time, links 22 pages
13

How we checked, and what we cannot prove.

Everything above was read off the production site and this repository on 1 November 2026. Each figure has a command that reproduces it, recorded in the research file alongside the post, so you can run them against your own site and get a number that means the same thing.

Four gates stand between a change and a deploy here: the figure check, the content gate on titles, descriptions, glossary terms and internal links, a redirect proof that walks every URL this site has ever answered and fails if one of them takes more than one hop, and a UX audit across 8 widths. On 1 November 2026 that proof covered 307 old URLs, all of them landing in a single hop.

Now the part a piece like this usually leaves out. We cannot show you what any of it is worth. This site went live on 28 October 2026 and started publishing on 1 November. There is no before and after, no citation count, and no traffic figure, because inventing one would break the only rule that makes the rest of this page worth reading. Ask again in a quarter.

Two more honest limits. The sameAs gap in section four is real and it is probably the largest single thing missing here, which is an uncomfortable thing to write in a piece arguing for consistency. And llms.txt may turn out to do nothing at all; we ship it on the reasoning that twenty minutes is cheap, not on evidence that it works.

What we will claim is narrower than the usual pitch. This is what a site looks like when every one of these is enforced by a build rather than remembered by a person. Whether that gets you quoted is a question the next quarter answers, and we will publish that number whichever way it goes.

This is the method we run on client sites too, as part of the Site System. The launch side of it, the part that runs before a domain is pointed at anything, is the 5Four Launch Checklist.

Related: Answer Engine Optimization in the glossary, what llms.txt is worth, everything else filed under AEO.

John D Saunders, Founder / Creative Director at 5Four Digital
Written by
John D. Saunders
Founder / Creative Director, 5Four Digital

Designer, developer and educator in Miami. I run strategy and creative direction at 5Four Digital, a web design and development agency that leans on AI. I have spoken at AIGA, Adobe MAX and Webflow Conf, and I put the whole process on YouTube.

More about John

Common questions, answered.

They overlap and they are not the same job. SEO is about being found and ranked among a list of links. AEO is about being the passage an assistant quotes inside an answer, which rewards a complete claim near the top of the page, an addressable section, and a source for every figure. A page can rank well and be useless to quote, and that is the common case.

Ready to stop paying the Ticket Tax?

Book a 30-minute call. We'll look at what you have, tell you which system to start with, and give you a clear price range before you leave the call.

Book a strategy callSee the Approval Loop