FluxCo

What we learned shipping 30 marketing PRs

Two-column diagram. Left column labelled aligned: one oxblood vertical line passing cleanly through three layer bands (visible, machine-readable, outcomes). Right column labelled drifted: three short disconnected lines offset across the same three bands, with dashed arcs showing the gaps. Annotation reads page says X, schema implies Y, llms.txt points somewhere stale.

Most sites are invisible to AI search. When someone asks ChatGPT, Claude, or Perplexity a question in your category, the answer cites a few sites. Probably not yours. We have spent the last ten weeks doing something about that on our own two sites, and this is what stuck.

A concrete starting point: a pull request last month changed three words on our contact page. "If AI can help" became "how AI can help." Ten minutes. A year ago we would have filed a ticket. About thirty more PRs like that have shipped since, across copy, design, schema, crawler files, and measurement. The rest of this post walks through what they are, what we underestimated about them, and what we are still missing.

What this is and is not

What this is: a report on the on-site marketing surface and how we shipped changes to it. Copy, design, schema, the invisible files crawlers read, the analytics we use to watch them. Five categories of work, one operator moving across all of them.

What this is not: a marketing function. We do not cover positioning research, brand strategy, ICP work, lifecycle, paid acquisition, partner channels, PR, community, or category creation. None of those live in a PR queue, and most of them are exactly where we are weakest. The honest framing of this post is: the technical and on-site surface, moved at engineering speed, by a builder with no marketing pedigree.

The carousel version

For anyone who wants the eight-slide version (the one going up on LinkedIn) without the long-form context:

Or download the PDF if you want to share it.

The work

It splits five ways.

Copy. Five PRs that changed words on pages. Most were small. The bigger one was a site refresh that broadened our positioning from one product surface to apps, websites, and prototyping, and added our second city (Vancouver and Auckland). The most recent was a hero rewrite to an emotive frame: eyebrow "AI that earns its keep", H1 "Try AI on real work. Keep what sticks."

Aesthetic and UX polish. Hero v2 on FluxCo paired the new copy with an engraved-plate aesthetic. The home-page carousel used to flicker between slides; we replaced the cut with a crossfade. On ArchConvert: motion polish on Cooking mode, a renamed Ko-fi button with footer clearance, calculator height stabilised, a leftover white stripe cleaned out, the PWA install icon redrawn to match the in-app calculator. Each one is a separate craft. None of them are copywriting. All of them sit on the marketing surface.

Basic SEO. The compounding base. Geo meta tags for Vancouver. A blog description rewrite that broadened the topic from "floor plans and drawings" to "architecture and construction." An Umami analytics fix where a shared website ID was silently dropping all events on ArchConvert, caught only because someone went to read the analytics and found nothing there. An og:image plus a noscript fallback on the ArchConvert SPA so crawlers see an h1, a feature list, and the common conversions instead of an empty React shell. Schema and SEO coverage extended to the Cooking mode (cups, gas mark, fluid oz) while keeping "Imperial to Metric for Architects" as the anchor positioning.

GEO. Generative Engine Optimization. This is the new field and the one we are learning live. The seed was an AI Citation Strategist audit we ran on the FluxCo site in late April. The audit pointed at the highest-leverage fixes for AI recommendation visibility, and we worked through them one by one.

  • FAQPage JSON-LD with six questions targeting queries AI engines aren't yet answering well. Invisible to users, crawlable by bots.
  • An llms.txt file, an updated robots, and Article schema on the FluxCo blog.
  • Blog Article author switched from a string to a Person object with sameAs pointing at a Wikidata draft. LLMs cite named humans more readily than orgs. (Our template still defaults to Organization; the fix lives in built HTML per-post for now. Next ticket.)
  • A named methodology page at /how-we-work/ so AI tools have a proprietary framework to cite.
  • Link headers advertising the service doc, the llms.txt, and the sitemap, plus a Content-Signal header declaring our crawl posture.
  • Per-conversion routes with prerender, schema, and llms.txt examples on ArchConvert. The largest single push of the seven weeks.
  • A one-line change adding /conversions/ to the llms.txt index. Granular, on purpose.
  • Explicit allow-list for AI crawlers in robots (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, Bytespider) on ArchConvert.

Structural. Two bigger pushes. A port of the FluxCo site off the previous stack plus nine new pages and the GEO work. On ArchConvert, a homepage refocus around the calculator with the SEO hub moved to a separate /conversions/ route. The point of that split: keep the conversion surface separate from the search surface so each can be optimized without fighting the other.

Three things we underestimated

Each layer is a separate craft. Copywriting, hero-phrase selection, motion polish, schema markup, crawler posture, analytics plumbing, IA — different decision spaces, different failure modes. We used to lump them together. They do not lump.

Single-word PRs are real work. Each one carries an argument about what the page is doing. They cannot be batched without losing the argument.

The work after the merge is most of the work. Re-running the audit, scanning crawler logs, watching whether a llms.txt entry gets fetched, checking whether an FAQ schema actually answers the question it claims to. There is no commit to celebrate at the end of it.

The marketing builder

The role that makes this work is one operator owning the on-site surface — copy, design, schema, crawler files, IA — and shipping it in the same PR queue as the rest of the site. We have been calling that operator the marketing builder. Not the future of marketing. Real marketers do positioning, brand strategy, ICP work, lifecycle, paid, partner channels, PR, community, category creation. None of that lives in a PR queue. The marketing builder is the narrower wedge: the technical surface, moved at engineering speed, by one person.

The reason it matters is alignment. The visible copy, the design, and the machine-readable files crawlers see all carry messages about what the site is. Owned by three teams, they drift. Owned by one operator, an H1 change propagates to the FAQ JSON-LD in the same PR; a new route is added to the llms.txt index in the same commit; a positioning shift updates meta description, Person schema, and hero image together.

The friction that role removes is the one we underestimated most. The ticket-and-wait loop is what kept marketing surfaces stale. Doing the change in the same PR queue collapses the loop to about an hour.

What we are still measuring

Google Search Console is slow. Cloudflare bot analytics is faster — GPTBot, ClaudeBot, PerplexityBot, Google-Extended each show up with their own pattern — but it is a manual scan for us right now, not a dashboard. Both are leading indicators. The lagging one we are actually chasing is AI referral: a person landing on the site because ChatGPT, Claude, or Perplexity sent them. That is the outcome the whole exercise is optimizing toward. We do not have a clean read on it yet.

If you have done this work longer, or think we are watching the wrong signals, reach out or comment on the LinkedIn version. Brand and messaging are where we are most clearly missing expertise.

What we are grounded in

Most of the surfaces this post mentions are established practice. None of them are our invention.

  • llms.txt is the proposal by Jeremy Howard at Answer.AI for a Markdown index aimed at language models, spec at llmstxt.org. Adopted by Anthropic, Mintlify, and others.
  • Schema.org Article, FAQPage, Person, and BreadcrumbList JSON-LD are W3C-backed structured data, documented in Google's rich-results guidance and tied to the E-E-A-T quality-rater framework.
  • AI crawler controls (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, Bytespider) are documented per vendor: OpenAI, Anthropic, Perplexity, and Google publish their own user-agent strings and opt-out conventions.
  • GEO (Generative Engine Optimization) as a named discipline. Current academic work: "Generative Engine Optimization: How to Dominate AI Search" (Chen et al., Sept 2025) on the systematic earned-media bias of AI search systems. Current applied data: "AI Visibility in 2025" (Yext, Oct 2025) — 6.8M citations analyzed across Gemini, ChatGPT, and Perplexity.
  • Cloudflare bot analytics + Content Signals Policy are Cloudflare products; the Content Signals framework (a way for sites to declare AI training/search/AI-input posture) was announced on the Cloudflare blog.
  • RFC 8288 Link headers are the IETF standard we use to advertise the service doc, llms.txt, and sitemap.

What is NOT bounded in established practice yet: how to measure AI citation rate cleanly, how to attribute AI referral traffic when LLMs strip referrers, and the operator role we have been calling "marketing builder." Those are still being figured out. We are pointing at them, not claiming we have solved them.

Get in touch

If you are sitting on a site that takes a week and three tickets to ship a one-line copy change, or an audit you have been meaning to act on for a quarter, reach out to discuss.

Related articles