1<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/assets/logo-DJ4tBK6R.svg"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&family=Public+Sans:wght@400;500;600;700&family=Rubik:wght@500;600;700;800;900&display=swap" data-precedence="default"/><link rel="stylesheet" href="/assets/styles-27_1DD1P.css" data-precedence="default"/><title>SEO and AdWords | Patronage</title><meta name="theme-color" content="#00BAEE"/><meta content="Organic and paid search on one cadence â research, content, technical foundations, and measurement that connects rankings and spend to outcomes." name="description"/><meta content="SEO and AdWords | Patronage" property="og:title"/><meta content="Organic and paid search on one cadence â research, content, technical foundations, and measurement that connects rankings and spend to outcomes." property="og:description"/><meta content="https://www.patronage.com/offerings/seo-and-adwords" property="og:url"/><meta content="website" property="og:type"/><meta content="Patronage" property="og:site_name"/><meta content="SEO and AdWords | Patronage" name="twitter:title"/><meta content="Organic and paid search on one cadence â research, content, technical foundations, and measurement that connects rankings and spend to outcomes." name="twitter:description"/><link rel="modulepreload" href="/assets/index-LTx9hC-x.js"/><link rel="modulepreload" href="/assets/jsx-runtime-KJkY8l8U.js"/><link rel="modulepreload" href="/assets/react-dom-BsrxZfdi.js"/><link rel="modulepreload" href="/assets/grant-intake-form-load-DBSDlDMW.js"/><link rel="modulepreload" href="/assets/link-CGstYPl3.js"/><link rel="modulepreload" href="/assets/not-found-i5RsCZif.js"/><link rel="modulepreload" href="/assets/matchContext-Bnmix0ZT.js"/><link rel="modulepreload" href="/assets/lazyRouteComponent-_Jjj5ALS.js"/><link rel="modulepreload" href="/assets/useStore--qjjIxbZ.js"/><link rel="modulepreload" href="/assets/typography-D7XlU8Hz.js"/><link rel="modulepreload" href="/assets/client-BIf_QFFX.js"/><link rel="modulepreload" href="/assets/createLucideIcon-DPpjWo2z.js"/><link rel="modulepreload" href="/assets/arrow-down-BoulCAzc.js"/><link rel="modulepreload" href="/assets/arrow-right-DNev_-Fh.js"/><link rel="modulepreload" href="/assets/-loop-copy-5CgX5ru-.js"/><link rel="modulepreload" href="/assets/contact-dialog-CbNKiaXR.js"/><link rel="modulepreload" href="/assets/hero-steps-Dx7siS4z.js"/><link rel="modulepreload" href="/assets/shield-check-Dc3Hp1x3.js"/><link rel="modulepreload" href="/assets/x-Cx-Ku4iW.js"/><link rel="modulepreload" href="/assets/react-L34SwnVT.js"/><link rel="modulepreload" href="/assets/button-B6nzk0ZR.js"/><link rel="modulepreload" href="/assets/site-cta-actions-CmujAngx.js"/><link rel="modulepreload" href="/assets/section-C1yAwQru.js"/><link rel="modulepreload" href="/assets/flags-DzzekmRP.js"/><link rel="modulepreload" href="/assets/seo-DsghzmFX.js"/><link rel="modulepreload" href="/assets/content-8c6jeM0G.js"/><link rel="modulepreload" href="/assets/preload-helper-Czpn1I53.js"/><link rel="modulepreload" href="/assets/provider-logo-B5UKDv8z.js"/><link rel="modulepreload" href="/assets/-loop-help-copy-DAu6y59u.js"/><link rel="modulepreload" href="/assets/structured-data-C1TopLVj.js"/><link rel="modulepreload" href="/assets/numbered-content-list-DHeauvjr.js"/><link rel="modulepreload" href="/assets/section-header-kGLSHXIP.js"/><link rel="modulepreload" href="/assets/offerings._slug-BIDXdSvt.js"/><link rel="modulepreload" href="/assets/arrow-left-BIZiC48w.js"/><link rel="modulepreload" href="/assets/custom-link-LR6QYV3v.js"/><link rel="modulepreload" href="/assets/markdown-Dc8XZAeD.js"/><link rel="modulepreload" href="/assets/date-B5HXxW76.js"/><link rel="modulepreload" href="/assets/loop-sequence-BYzWuE5v.js"/><link rel="icon" href="/favicon-prod.svg" sizes="any" type="image/svg+xml"/><link rel="shortcut icon" href="/favicon.ico"/><link rel="apple-touch-icon" href="/apple-touch-icon.png"/><link rel="manifest" href="/manifest.json"/>
1<link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous"/><link href="https://www.patronage.com/offerings/seo-and-adwords" rel="canonical"/>
1<script> 2 (function(w,d,s,l,containers){var i=containers[w.location.hostname.toLowerCase()];if(!i){return;}w[l]=w[l]||[];w[l].push({'gtm.start': 3 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 4 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 5 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 6 })(window,document,'script','dataLayer',{"patronage.com":"GTM-5K4R276","www.patronage.com":"GTM-5K4R276"}); 7 </script>
7</head><body><a class="bg-background text-foreground focus:ring-primary fixed top-3 left-3 z-50 -translate-y-20 rounded-md px-4 py-2 text-sm font-semibold shadow-lg transition-transform focus:translate-y-0 focus:ring-2 focus:outline-none print:hidden" href="#main-content">Skip to main content</a><header class="border-border/70 fixed inset-x-0 top-0 z-40 border-b"><div class="bg-background/80 text-foreground backdrop-blur-md"><div class="mx-auto w-full [padding-inline:clamp(1.25rem,5vw,5.5rem)] max-w-7xl hidden min-h-16 grid-cols-[auto_1fr_auto] items-center gap-8 md:grid" data-component="container" data-gutter="default" data-width="full"><a href="/" class="inline-flex items-center justify-center transition-opacity hover:opacity-80"><img alt="Patronage logo" class="w-auto shrink-0 transition-[filter] duration-300 h-5 md:h-6" src="/assets/logo-DJ4tBK6R.svg"/></a><nav aria-label="Primary navigation" class="flex items-center justify-center gap-1"><a href="/loop" class="after:bg-primary relative inline-flex items-center px-3 py-2 text-sm font-medium transition-colors after:absolute after:right-3 after:-bottom-0.5 after:left-3 after:h-px after:origin-left after:scale-x-0 after:transition-transform hover:after:scale-x-100 text-muted-foreground hover:text-foreground">Patronage Loop</a><a class="after:bg-primary relative inline-flex items-center px-3 py-2 text-sm font-medium transition-colors after:absolute after:right-3 after:-bottom-0.5 after:left-3 after:h-px after:origin-left after:scale-x-0 after:transition-transform hover:after:scale-x-100 text-muted-foreground hover:text-foreground" href="/#services">Services</a><a class="after:bg-primary relative inline-flex items-center px-3 py-2 text-sm font-medium transition-colors after:absolute after:right-3 after:-bottom-0.5 after:left-3 after:h-px after:origin-left after:scale-x-0 after:transition-transform hover:after:scale-x-100 text-muted-foreground hover:text-foreground" href="/#work">Work</a></nav><div class="flex items-center justify-end gap-2"><button type="button" tabindex="0" data-slot="button" data-cta="get-in-touch" data-cta-destination="modal" data-cta-label="Get In Touch" data-cta-source="header-desktop" data-cta-track="click" class="group/button inline-flex shrink-0 cursor-pointer items-center justify-center border border-transparent bg-clip-padding whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/30 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 bg-primary text-primary-foreground hover:bg-primary/80 gap-1 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 [&_svg:not([class*='size-'])]:size-4 h-9 rounded-md px-4 text-sm font-semibold">Get In Touch</button></div></div><div class="mx-auto w-full [padding-inline:clamp(1rem,3vw,2rem)] max-w-7xl grid min-h-16 grid-cols-[auto_1fr_auto] items-center gap-3 md:hidden" data-component="container" data-gutter="tight" data-width="full"><a href="/" class="inline-flex items-center justify-center transition-opacity hover:opacity-80"><img alt="Patronage logo" class="w-auto shrink-0 transition-[filter] duration-300 h-4 md:h-5" src="/assets/logo-DJ4tBK6R.svg"/></a><div aria-hidden="true"></div><button type="button" tabindex="0" data-slot="button" aria-expanded="false" aria-label="Open navigation" class="group/button inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md border bg-clip-padding text-xs/relaxed font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/30 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 border-border hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:bg-input/30 [&_svg:not([class*='
7size-'])]:size-4 bg-background/45 hover:bg-background/80 size-11 justify-self-end shadow-sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-menu size-5" aria-hidden="true"><path d="M4 5h16"></path><path d="M4 12h16"></path><path d="M4 19h16"></path></svg></button></div></div></header><main class="min-h-screen pt-24 md:pt-28" id="main-content" tabindex="-1"><!--$--><div class="relative -mt-24 md:-mt-28" data-component="split-hero"><div class="grid md:grid-cols-2"><div class="relative w-full bg-[var(--section-background)] text-[var(--section-foreground)] py-0 dark flex" data-component="section" data-pattern="none" data-theme="dark" data-theme-color="slate"><div class="flex w-full flex-col justify-center gap-5 px-6 pt-36 pb-16 sm:px-10 md:pt-40 lg:px-14 lg:pb-20"><div class="font-mono text-[11px] font-medium tracking-widest text-[var(--section-accent)] uppercase">Organic</div><h2 class="font-display text-[clamp(2rem,3.5vw,4rem)] leading-[0.94] font-extrabold tracking-[-0.04em] text-balance text-[var(--section-heading)] max-w-md">Pages that genuinely answer the query.</h2><p class="font-body text-base leading-relaxed text-pretty text-[var(--section-muted)] max-w-md">Query-map research, content built for intent, technical foundations kept boring â authority that compounds instead of scattering across posts.</p></div></div><div class="relative w-full bg-[var(--section-background)] text-[var(--section-foreground)] py-0 dark flex" data-component="section" data-pattern="none" data-theme="dark" data-theme-color="primary"><div class="flex w-full flex-col justify-center gap-5 px-6 pt-36 pb-16 sm:px-10 md:pt-40 lg:px-14 lg:pb-20"><div class="font-mono text-[11px] font-medium tracking-widest text-[var(--section-accent)] uppercase">Paid</div><h2 class="font-display text-[clamp(2rem,3.5vw,4rem)] leading-[0.94] font-extrabold tracking-[-0.04em] text-balance text-[var(--section-heading)] max-w-md">Spend that lands on the same inventory.</h2><p class="font-body text-base leading-relaxed text-pretty text-[var(--section-muted)] max-w-md">The content inventory organic growth is built on is the same inventory a paid program lands traffic on â one measurement spine tells both sides what's working.</p></div></div></div><div class="relative w-full bg-[var(--section-background)] text-[var(--section-foreground)] py-0 light" data-component="section" data-pattern="none" data-theme="light" data-theme-color="white"><div class="mx-auto w-full [padding-inline:clamp(1.25rem,5vw,5.5rem)] max-w-7xl" data-component="container" data-gutter="default" data-width="full"><div class="flex flex-col gap-4 py-6 md:flex-row md:items-center md:justify-between md:gap-10"><div><h1 class="font-mono text-[11px] font-medium tracking-widest text-[var(--section-accent)] uppercase">SEO and AdWords</h1><p class="font-display text-base leading-normal font-semibold text-balance text-[var(--section-heading)] md:text-lg mt-2">One discipline, one cadence, one map of the questions worth answering.</p></div><button type="button" tabindex="0" data-slot="button" data-cta="get-in-touch" data-cta-destination="modal" data-cta-label="Start a conversation" data-cta-source="offering-seo-hero" data-cta-track="click" class="group/button inline-flex cursor-pointer items-center justify-center border border-transparent bg-clip-padding whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/30 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 bg-primary text-primary-foreground hover:bg-primary/80 gap-1 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 [&_svg:not([class*='
7size-'])]:size-4 text-sm h-11 shrink-0 rounded-md px-6 font-semibold">Start a conversation</button></div></div><div class="absolute inset-x-0 z-10 h-px bottom-0 bg-[var(--section-border)]"></div></div></div><section class="relative w-full bg-[var(--section-background)] text-[var(--section-foreground)] py-[var(--section-padding)] md:py-[var(--section-padding-md)] light" data-component="section" data-pattern="none" data-theme="light" data-theme-color="white"><div class="mx-auto w-full [padding-inline:clamp(1.25rem,5vw,5.5rem)] max-w-7xl" data-component="container" data-gutter="default" data-width="full"><header class="text-left"><span class="font-mono text-[10px] font-medium tracking-widest text-[var(--section-accent)] uppercase mb-2">How we work</span><h2 class="font-display text-2xl leading-snug font-semibold text-balance text-[var(--section-heading)] md:text-4xl">Content first, rankings second, conversion third</h2><p class="font-body text-lg leading-relaxed text-pretty text-[var(--section-muted)] mt-4">We work best with organizations that already have informational content â help pages, guides, answers people search for. We make that content rank organically, then optimize what happens after the click.</p></header><div class="mt-12 grid gap-5 md:grid-cols-3"><div class="rounded-lg border border-[var(--section-border)] p-7 md:col-span-2"><div class="font-mono text-sm font-medium text-[var(--section-accent)]">01</div><h3 class="font-display text-lg leading-normal font-semibold text-balance text-[var(--section-heading)] md:text-xl mt-3">Start from the content you already have</h3><p class="font-body text-sm leading-normal text-pretty text-[var(--section-muted)] mt-3">Search Console data, SERP analysis, and competitor coverage turn your existing expertise into a map of the questions your audience actually asks â informational queries included, because that's where underserved demand usually lives. That map, not a keyword-tool export, drives every brief.</p></div><div class="rounded-lg border border-[var(--section-border)] p-7"><div class="font-mono text-sm font-medium text-[var(--section-accent)]">02</div><h3 class="font-display text-lg leading-normal font-semibold text-balance text-[var(--section-heading)] md:text-xl mt-3">Make it rank</h3><p class="font-body text-sm leading-normal text-pretty text-[var(--section-muted)] mt-3">Briefs answer the query fully, pages are structured around search intent, and internal linking lets authority compound. AI drafts where it helps; editors decide what ships.</p></div><div class="rounded-lg border border-[var(--section-border)] p-7"><div class="font-mono text-sm font-medium text-[var(--section-accent)]">03</div><h3 class="font-display text-lg leading-normal font-semibold text-balance text-[var(--section-heading)] md:text-xl mt-3">Keep the foundations boring</h3><p class="font-body text-sm leading-normal text-pretty text-[var(--section-muted)] mt-3">Indexation, site structure, page speed, titles â the unglamorous work that decides whether good content gets seen at all. Fixed once and kept fixed.</p></div><div class="rounded-lg border border-[var(--section-border)] p-7 md:col-span-2"><div class="font-mono text-sm font-medium text-[var(--section-accent)]">04</div><h3 class="font-display text-lg leading-normal font-semibold text-balance text-[var(--section-heading)] md:text-xl mt-3">Then optimize the conversion</h3><p class="font-body text-sm leading-normal text-pretty text-[var(--section-muted)] mt-3">Once pages earn traffic, we tune what happens after the click: the action a visitor should take â a call, a signup, a donation â and the on-page path to it. Search gets reported against outcomes, not traffic, so the next round of work follows evidence.</p></div></div><div class="flex flex-wrap items-center gap-x-3 gap-y-2 font-mono text-[10px] tracking-[0.18em] text-[var(--section-muted)] uppercase mt-10"><span class="inline-flex items-center gap-3"><span><span class="text-[var(--section-accent)]">01</span> <!-- -->Research</span><span class="text-[var(--section-border)]">/</span></span><span class="inline-flex items-center gap-3"><span><span class="text-[var(--section-heading)]">02</span> <!-- -->Build</span><span class="text-[var(--section-border)]">/</span></span><span class="inline-flex items-center gap-3"><span><span class="text-[var(--section-accent)]">03</span> <!-- -->Foundations</span><span class="text-[var(--section-border)]">/</span></span><span class="inline-flex items-center gap-3"><span><span class="text-[var(--section-heading)]">04</span> <!-- -->Convert</span></span></div></div></section><section class="w-full bg-[var(--section-background)] text-[var(--section-foreground)] py-[var(--section-padding)] md:py-[var(--section-padding-md)] dark relative overflow-hidden" data-component="section" data-pattern="cross-hatch" data-theme="dark" data-theme-color="slate"><div aria-hidden="true" class="section-pattern-layer opacity-75" style="opacity:0.35"><div class="absolute inset-0 bg-[linear-gradient(45deg,var(--section-pattern-color)_1px,transparent_1px),linear-gradient(-45deg,var(--section-pattern-color)_1px,transparent_1px)]" style="--section-pattern-color:color-mix(in oklch, var(--white) 18%, transparent);background-size:22px 22px"></div></div><div class="mx-auto w-full [padding-inline:clamp(1.25rem,5vw,5.5rem)] max-w-7xl relative" data-component="container" data-gutter="default" data-width="full"><div class="grid gap-12 lg:grid-cols-[1fr_auto] lg:items-center"><div><div class="font-mono text-[11px] font-medium tracking-widest text-[var(--section-accent)] uppercase">In market â Steyer for Governor</div><h2 class="font-display text-2xl leading-snug font-semibold text-balance text-[var(--section-heading)] md:text-4xl mt-4 max-w-2xl">Approved policy copy became ten issue pages mapped to what voters actually type.</h2><p class="font-body text-base leading-relaxed text-pretty text-[var(--section-muted)] mt-4 max-w-xl">Rent control, tenant rights, eviction rules â paid search bought cheap informational demand while organic rankings caught up, and the incoming search terms showed exactly where the copy needed to get more practical and less legalistic.</p><a href="/case-studies/steyer-issue-pages" class="mt-6 inline-flex items-center gap-1 text-sm font-medium text-[var(--section-accent)] underline underline-offset-4 hover:text-[var(--section-heading)]">Read the case study<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right size-3.5" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></a></div><div class="flex gap-10 border-[var(--section-border)] lg:flex-col lg:gap-8 lg:border-l lg:pl-12"><div><p class="font-display text-4xl leading-none font-semibold text-[var(--section-heading)]">20,543</p><div class="font-mono text-[10px] font-medium tracking-widest text-[var(--section-accent)] uppercase mt-2">First-month impressions</div></div><div><p class="font-display text-4xl leading-none font-semibold text-[var(--section-heading)]">561</p><div class="font-mono text-[10px] font-medium tracking-widest text-[var(--section-accent)] uppercase mt-2">Engaged visits â one ad group</div></div></div></div></div></section><section class="w-full bg-[var(--section-background)] text-[var(--section-foreground)] py-[var(--section-padding)] md:py-[var(--section-padding-md)] dark relative overflow-hidden" data-component="section" data-pattern="campaign-terrain" data-theme="dark" data-theme-color="primary"><div aria-hidden="true" class="section-pattern-layer opacity-90"><svg class="absolute inset-0 size-full" preserveAspectRatio="none" viewBox="0 0 1200 720" xmlns="http://www.w3.org/2000/svg"><rect fill="var(--section-background)" height="720" width="1200"></rect><g fill-opacity="0.82">
7<polygon fill="color-mix(in oklch, var(--section-background) 78%, var(--section-heading) 22%)" points="0,0 220,0 120,180"></polygon><polygon fill="color-mix(in oklch, var(--section-background) 82%, var(--section-accent) 18%)" points="220,0 440,0 380,140 120,180"></polygon><polygon fill="color-mix(in oklch, var(--section-background) 88%, var(--section-heading) 12%)" points="440,0 640,0 580,160 380,140"></polygon><polygon fill="color-mix(in oklch, var(--section-background) 72%, var(--section-accent) 28%)" points="640,0 860,0 820,130 580,160"></polygon><polygon fill="color-mix(in oklch, var(--section-background) 82%, var(--section-accent) 18%)" points="860,0 1060,0 1020,160 820,130"></polygon><polygon fill="color-mix(in oklch, var(--section-background) 64%, var(--section-accent) 36%)" points="1060,0 1200,0 1200,210 1020,160"></polygon><polygon fill="color-mix(in oklch, var(--section-background) 94%, var(--section-heading) 6%)" points="0,0 120,180 0,260"></polygon><polygon fill="color-mix(in oklch, var(--section-background) 82%, var(--section-accent) 18%)" points="120,180 380,140 260,340 0,260"></polygon><polygon fill="color-mix(in oklch, var(--section-background) 72%, var(--section-accent) 28%)" points="380,140 580,160 480,360 260,340"></polygon><polygon fill="color-mix(in oklch, var(--section-background) 64%, var(--section-accent) 36%)" opacity="0.9" points="580,160 820,130 760,340 480,360"></polygon><polygon fill="color-mix(in oklch, var(--section-background) 82%, var(--section-accent) 18%)" points="820,130 1020,160 980,360 760,340"></polygon><polygon fill="color-mix(in oklch, var(--section-background) 64%, var(--section-accent) 36%)" points="1020,160 1200,210 1200,380 980,360"></polygon><polygon fill="color-mix(in oklch, var(--section-accent) 22%, var(--section-background))" opacity="0.95" points="760,340 980,360 1040,520 820,500"></polygon><polygon fill="color-mix(in oklch, var(--section-accent) 34%, var(--section-background))" opacity="0.85" points="980,360 1200,380 1200,540 1040,520"></polygon><polygon fill="color-mix(in oklch, var(--section-background) 88%, var(--section-heading) 12%)" points="0,260 260,340 180,520 0,460"></polygon><polygon fill="color-mix(in oklch, var(--section-background) 72%, var(--section-accent) 28%)" points="260,340 480,360 420,540 180,520"></polygon><polygon fill="color-mix(in oklch, var(--section-background) 64%, var(--section-accent) 36%)" points="480,360 760,340 820,500 420,540"></polygon><polygon fill="color-mix(in oklch, var(--section-background) 94%, var(--section-heading) 6%)" points="0,460 180,520 120,720 0,720"></polygon><polygon fill="color-mix(in oklch, var(--section-background) 88%, var(--section-heading) 12%)" points="180,520 420,540 360,720 120,720"></polygon><polygon fill="color-mix(in oklch, var(--section-background) 82%, var(--section-accent) 18%)" points="420,540 820,500 760,720 360,720"></polygon><polygon fill="color-mix(in oklch, var(--section-accent) 22%, var(--section-background))" opacity="0.9" points="820,500 1040,520 1000,720 760,720"></polygon><polygon fill="color-mix(in oklch, var(--section-accent) 34%, var(--section-background))" opacity="0.9" points="1040,520 1200,540 1200,720 1000,720"></polygon></g><polygon fill="color-mix(in oklch, var(--white) 18%, transparent)" opacity="0.05" points="980,360 1200,380 1080,430 1040,520"></polygon><polygon fill="color-mix(in oklch, var(--white) 18%, transparent)" opacity="0.05" points="580,160 820,130 760,100 640,120"></polygon></svg></div><div class="mx-auto w-full [padding-inline:clamp(1.25rem,5vw,5.5rem)] max-w-7xl relative" data-component="container" data-gutter="default" data-width="full"><div class="flex flex-col items-start justify-between gap-8 md:flex-row md:items-center md:gap-12"><div class="max-w-2xl"><div class="font-mono text-[11px] font-medium tracking-widest text-[var(--section-accent)] uppercase">Nonprofits</div><h2 class="font-display text-2xl leading-snug font-semibold text-balance text-[var(--section-heading)] md:text-4xl mt-3">Good SEO is good Grant SEO.</h2><p class="font-body text-base leading-relaxed text-pretty text-[var(--section-muted)] mt-3">A Google Ad Grant lives or dies on exactly what a search program builds â indexable mission content, informational query coverage, and conversion tracking Google can trust. If you're a nonprofit weighing the Grant, that's the narrower version of this conversation.</p></div><a href="/google-ad-grants" class="group/button inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md border border-transparent bg-clip-padding text-xs/relaxed font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/30 active:not-aria-[haspopup]:translate-y-
7px disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 bg-[var(--section-accent)] text-[var(--section-accent-foreground)] hover:bg-[color-mix(in_oklch,var(--section-accent)_86%,var(--section-foreground)_14%)] aria-expanded:bg-[var(--section-accent)] aria-expanded:text-[var(--section-accent-foreground)] h-7 gap-1 px-2 text-xs/relaxed has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5 h-11 shrink-0 rounded-md px-6 font-semibold">Our Grant work<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right size-4" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></a></div></div></section><section class="relative w-full bg-[var(--section-background)] text-[var(--section-foreground)] py-[var(--section-padding-less)] md:py-[var(--section-padding-less-md)] light" data-component="section" data-pattern="none" data-theme="light" data-theme-color="white"><div class="absolute inset-x-0 z-10 h-px top-0 bg-[var(--section-border)]"></div><div class="mx-auto w-full [padding-inline:clamp(1.25rem,5vw,5.5rem)] max-w-7xl" data-component="container" data-gutter="default" data-width="full"><div class="grid gap-8 lg:grid-cols-[minmax(0,16rem)_1fr] lg:gap-16"><div class="font-mono text-[11px] font-medium tracking-widest text-[var(--section-accent)] uppercase">Where this fits</div><div class="max-w-2xl"><p class="font-body text-base leading-relaxed text-pretty text-[var(--section-muted)]">Search compounds fastest when the landing surface can keep up. We often pair this program with web development so the pages winning impressions can be reshaped as quickly as the queries shift â and with campaign automation when search is one channel in a larger system.</p><div class="mt-5 flex flex-wrap gap-x-6 gap-y-2"><a href="/offerings/web-development" class="inline-flex items-center gap-1 text-sm font-medium text-[var(--section-accent)] underline underline-offset-4 hover:text-[var(--section-heading)]">Web development<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right size-3.5" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></a><a href="/offerings/campaign-automation" class="inline-flex items-center gap-1 text-sm font-medium text-[var(--section-accent)] underline underline-offset-4 hover:text-[var(--section-heading)]">Campaign automation<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right size-3.5" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></a></div></div></div></div></section><section class="relative w-full bg-[var(--section-background)] text-[var(--section-foreground)] py-[var(--section-padding)] md:py-[var(--section-padding-md)] light" data-component="section" data-pattern="none" data-theme="light" data-theme-color="light"><div class="absolute inset-x-0 z-10 h-px top-0 bg-[var(--section-border)]"></div><div class="mx-auto w-full [padding-inline:clamp(1.25rem,5vw,5.5rem)] max-w-7xl" data-component="container" data-gutter="default" data-width="full"><header class="text-left"><span class="font-mono text-[10px] font-medium tracking-widest text-[var(--section-accent)] uppercase mb-2">Keep reading</span><h3 class="font-display text-xl leading-snug font-semibold text-balance text-[var(--section-heading)] md:text-2xl">Related work and writing</h3></header><div class="mt-8 grid gap-4 md:grid-cols-3"><a href="/case-studies/steyer-issue-pages" class="group flex flex-col rounded-lg border border-[var(--section-border)] bg-[var(--section-background)] p-6 transition-colors hover:border-[var(--section-accent)]"><div class="font-mono text-[10px] font-medium tracking-widest text-[var(--section-accent)] uppercase">Case study</div><h3 class="font-display text-base leading-normal font-semibold text-balance text-[var(--section-heading)] md:text-lg mt-2">Ten Designed Issue Pages, Each Backed by Search</h3><p class="font-body text-sm leading-normal text-pretty text-[var(--section-muted)] mt-2 flex-1">Campaign issue pages usually arrive too late to shape the conversation. Approved policy copy became
7CMS pages with video, intent-mapped sections, and paid search campaigns that bought informational demand while organic rankings caught up.</p></a></div></div></section><!--/$--></main><footer class="relative w-full bg-[var(--section-background)] text-[var(--section-foreground)] py-[var(--section-padding-less)] md:py-[var(--section-padding-less-md)] dark" data-component="section" data-pattern="none" data-theme="dark" data-theme-color="black"><div class="absolute inset-x-0 z-10 h-px top-0 bg-[var(--section-border)]"></div><div class="mx-auto w-full [padding-inline:clamp(1.25rem,5vw,5.5rem)] max-w-7xl" data-component="container" data-gutter="default" data-width="full"><div class="mb-12 rounded-[8px] border border-white/12 bg-white/6 p-5 backdrop-blur-sm md:flex md:items-center md:justify-between md:gap-6 md:p-6"><div class="max-w-2xl"><div class="font-mono text-[10px] font-medium tracking-widest uppercase text-white/65">Start a conversation</div><h2 class="font-display text-xl leading-snug font-semibold text-balance md:text-2xl mt-4 text-white">Need the next campaign to learn faster?</h2><p class="font-body text-sm leading-normal text-pretty mt-3 max-w-xl text-white/72">Talk through your launch, campaign operations, or AI workflow. We will leave with a concrete first pass.</p></div><div class="mt-5 flex flex-col gap-3 sm:flex-row md:mt-0 md:shrink-0"><button type="button" tabindex="0" data-slot="button" data-cta="get-in-touch" data-cta-destination="modal" data-cta-label="Contact" data-cta-source="footer-sticky" data-cta-track="click" class="group/button inline-flex shrink-0 cursor-pointer items-center justify-center border bg-clip-padding whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/30 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 border-[var(--section-border)] bg-transparent text-[var(--section-heading)] hover:bg-[color-mix(in_oklch,var(--section-foreground)_8%,transparent)] hover:text-[var(--section-heading)] aria-expanded:bg-[color-mix(in_oklch,var(--section-foreground)_8%,transparent)] aria-expanded:text-[var(--section-heading)] gap-1 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 [&_svg:not([class*='size-'])]:size-4 text-sm h-10 rounded-md px-5 font-semibold">Contact</button><button type="button" tabindex="0" data-slot="button" data-cta="get-in-touch" data-cta-destination="modal" data-cta-label="Get In Touch" data-cta-source="footer-sticky" data-cta-track="click" class="group/button inline-flex shrink-0 cursor-pointer items-center justify-center border border-transparent bg-clip-padding whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/30 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 bg-[var(--section-accent)] text-[var(--section-accent-foreground)] hover:bg-[color-mix(in_oklch,var(--section-accent)_86%,var(--section-foreground)_14%)] aria-expanded:bg-[var(--section-accent)] aria-expanded:text-[var(--section-accent-foreground)] gap-1 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 [&_svg:not([class*='size-'])]:size-4 text-sm h-10 rounded-md px-5 font-semibold">Get In Touch</button></div></div><div class="grid gap-12 lg:grid-cols-[1.1fr_1fr] lg:items-start"><div><a aria-label="Patronage home" href="/" class="inline-flex transition-opacity hover:opacity-80"><img alt="Patronage" class="h-6 w-auto dark:brightness-0 dark:invert" src="/assets/logo-DJ4tBK6R.svg"/></a><p class="font-body text-base leading-relaxed text-pretty text-[var(--section-muted)] mt-5 max-w-lg">AI-enabled marketing operations for teams that need faster launches, clearer signal, and better campaign decisions.</p></div><div class="grid gap-10 lg:justify-self-end sm:grid-cols-2"><div><h2 class="font-mono text-[10px] font-medium tracking-widest text-[var(--section-accent)] uppercase">Navigation</h2><nav aria-label="Footer navigation" class="mt-5 flex flex-col gap-3"><a href="/loop" class="font-body text-sm leading-normal text-pretty text-[var(--section-muted)] transition-colors hover:text-[var(--section-heading)]">Patronage Loop</a><a class="font-body text-sm leading-normal text-pretty text-[var(--section-muted)] transition-colors hover:text-[var(--section-heading)]" href="/#services">Services</a><a class="font-body text-sm leading-normal text-pretty text-[var(--section-muted)] transition-colors hover:text-[var(--section-heading)]" href="/#work">Work</a><a href="/loop/open-source" class="font-body text-sm leading-normal text-pretty text-[var(--section-muted)] transition-colors hover:text-[var(--section-heading)]">Open source</a><a href="/privacy" class="font-body text-sm leading-normal text-pretty text-[var(--section-muted)] transition-colors hover:text-[var(--section-heading)]">Privacy</a><a href="/terms" class="font-body text-sm leading-normal text-pretty text-[var(--section-muted)] transition-colors hover:text-[var(--section-heading)]">Terms</a></nav></div><div><h2 class="font-mono text-[10px] font-medium tracking-widest text-[var(--section-accent)] uppercase">Contact</h2><div class="mt-5 flex flex-col gap-3"><button type="button" tabindex="0" data-slot="button" data-cta="get-in-touch" data-cta-destination="modal" data-cta-label="[email protected]" data-cta-source="footer" data-cta-track="click" class="group/button inline-flex shrink-0 cursor-pointer items-center border-transparent bg-clip-padding font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/30 active:not-aria-[haspopup]:translate-y-
7px disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 bg-transparent text-[var(--section-muted)] hover:bg-[color-mix(in_oklch,var(--section-foreground)_8%,transparent)] hover:text-[var(--section-heading)] aria-expanded:bg-[color-mix(in_oklch,var(--section-foreground)_8%,transparent)] aria-expanded:text-[var(--section-heading)] gap-1 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 [&_svg:not([class*='size-'])]:size-4 h-auto justify-start rounded-none border-0 px-0 py-0 text-left text-sm">[email protected]</button></div></div></div></div></div></footer>
7<script class="$tsr" id="$tsr-stream-barrier">(self.$R=self.$R||{})["tsr"]=[];self.$_TSR={h(){this.hydrated=!0,this.c()},e(){this.streamEnded=!0,this.c()},c(){this.hydrated&&this.streamEnded&&(delete self.$_TSR,delete self.$R.tsr)},p(e){this.initialized?e():this.buffer.push(e)},buffer:[]};$_TSR.router=($R=>$R[0]={manifest:$R[1]={routes:$R[2]={__root__:$R[3]={preloads:$R[4]=["/assets/index-LTx9hC-x.js","/assets/jsx-runtime-KJkY8l8U.js","/assets/react-dom-BsrxZfdi.js","/assets/grant-intake-form-load-DBSDlDMW.js","/assets/link-CGstYPl3.js","/assets/not-found-i5RsCZif.js","/assets/matchContext-Bnmix0ZT.js","/assets/lazyRouteComponent-_Jjj5ALS.js","/assets/useStore--qjjIxbZ.js","/assets/typography-D7XlU8Hz.js","/assets/client-BIf_QFFX.js","/assets/createLucideIcon-DPpjWo2z.js","/assets/arrow-down-BoulCAzc.js","/assets/arrow-right-DNev_-Fh.js","/assets/-loop-copy-5CgX5ru-.js","/assets/contact-dialog-CbNKiaXR.js","/assets/hero-steps-Dx7siS4z.js","/assets/shield-check-Dc3Hp1x3.js","/assets/x-Cx-Ku4iW.js","/assets/react-L34SwnVT.js","/assets/button-B6nzk0ZR.js","/assets/site-cta-actions-CmujAngx.js","/assets/section-C1yAwQru.js","/assets/flags-DzzekmRP.js","/assets/seo-DsghzmFX.js","/assets/content-8c6jeM0G.js","/assets/preload-helper-Czpn1I53.js","/assets/provider-logo-B5UKDv8z.js","/assets/-loop-help-copy-DAu6y59u.js","/assets/structured-data-C1TopLVj.js","/assets/numbered-content-list-DHeauvjr.js","/assets/section-header-kGLSHXIP.js"],scripts:$R[5]=[$R[6]={attrs:$R[7]={type:"module",async:!0,src:"/assets/index-LTx9hC-x.js"}}]},"/offerings/$slug":$R[8]={preloads:$R[9]=["/assets/offerings._slug-BIDXdSvt.js","/assets/arrow-left-BIZiC48w.js","/assets/custom-link-LR6QYV3v.js","/assets/markdown-Dc8XZAeD.js","/assets/date-B5HXxW76.js","/assets/loop-sequence-BYzWuE5v.js"]}}}
7,matches:$R[10]=[$R[11]={i:"__root__�",u:1791590662127,s:"success",ssr:!0},$R[12]={i:"�offerings�$slug�offerings�seo-and-adwords",u:1791590662127,s:"success",l:$R[13]={offering:$R[14]={name:"SEO and AdWords",summary:"Organic and paid search on one cadence â research, content, technical foundations, and measurement that connects rankings and spend to outcomes.",icon:"search",content:"Most SEO engagements are sold as deliverables: an audit, a keyword list, a quota of posts per month. The deliverables arrive on schedule; the results don't â because nobody tied the work to the queries people type, or to what those people do after the click.\n\nOur search work is easier to describe and harder to fake. Find the questions worth answering. Build pages that genuinely answer them. Keep the technical foundations boring. Measure whether search produced outcomes, not just traffic. Then do it again next week with better information.\n\n## What the work is\n\n- **Research that starts from queries, not categories.** Search Console data, SERP analysis, and competitor coverage produce a map of the questions your audience asks â informational queries included, because that's where underserved demand usually lives. That map, not a keyword-tool export, drives every brief.\n- **Content built to answer, not to fill a calendar.** Briefs answer the query fully, pages are structured around search intent, and internal linking lets authority compound instead of scattering across posts. AI drafts where it helps; editors decide what ships.\n- **Technical and on-page foundations, kept boring.** Indexation, site structure, page speed, titles and descriptions â the unglamorous work that decides whether good content gets seen at all. We fix it once and keep it fixed, instead of rediscovering it in every quarterly audit.\n- **Measurement that connects search to outcomes.** Rankings and traffic are leading indicators, not results. Every engagement defines the action a visitor should take â a call, a signup, a donation â and reports what search contributed to it, so the next round of work follows evidence.\n\n## One discipline, organic and paid\n\nBoth run on one query map, one measurement spine, and one weekly cadence of reading results and adjusting. The content inventory that makes organic growth possible is the same inventory a paid program lands traffic on, and the same conversion measurement tells both sides what's working.\n\nNowhere is that clearer than with the Google Ad Grant. A Grant lives or dies on exactly what a search program builds â indexable mission content, informational query coverage, and conversion tracking Google can trust. Good SEO is good Grant SEO, which is why our [Grant work](/google-ad-grants) audits the same foundations this program maintains. If you're a nonprofit weighing the Grant, that's the narrower version of this conversation.\n\n## What it looks like in market\n\nFor Steyer for Governor, approved policy copy became ten designed issue pages whose sections mapped to the questions voters were typing â rent control, tenant rights, eviction rules â with paid search buying cheap informational demand while organic rankings caught up. The renter-protection ad group alone turned 20,543 first-month impressions into 561 engaged visits, and the search terms coming in showed exactly where the copy needed to get more practical and less legalistic. [Read the case study](/case-studies/steyer-issue-pages).\n\n## Where this fits\n\nSearch compounds fastest when the landing surface can keep up. We often pair this program with [web development](/offerings/web-development) so the pages winning impressions can be reshaped as quickly as the queries shift â and with [campaign automation](/offerings/campaign-automation) when search is one channel in a larger system.",_meta:$R[15]={filePath:"seo-and-adwords.mdx",fileName:"seo-and-adwords.mdx",directory:".",extension:"mdx",path:"seo-and-adwords"},mdxSource:"Most SEO engagements are sold as deliverables: an audit, a keyword list, a quota of posts per month. The deliverables arr
7ive on schedule; the results don't â because nobody tied the work to the queries people type, or to what those people do after the click.\n\nOur search work is easier to describe and harder to fake. Find the questions worth answering. Build pages that genuinely answer them. Keep the technical foundations boring. Measure whether search produced outcomes, not just traffic. Then do it again next week with better information.\n\n## What the work is\n\n- **Research that starts from queries, not categories.** Search Console data, SERP analysis, and competitor coverage produce a map of the questions your audience asks â informational queries included, because that's where underserved demand usually lives. That map, not a keyword-tool export, drives every brief.\n- **Content built to answer, not to fill a calendar.** Briefs answer the query fully, pages are structured around search intent, and internal linking lets authority compound instead of scattering across posts. AI drafts where it helps; editors decide what ships.\n- **Technical and on-page foundations, kept boring.** Indexation, site structure, page speed, titles and descriptions â the unglamorous work that decides whether good content gets seen at all. We fix it once and keep it fixed, instead of rediscovering it in every quarterly audit.\n- **Measurement that connects search to outcomes.** Rankings and traffic are leading indicators, not results. Every engagement defines the action a visitor should take â a call, a signup, a donation â and reports what search contributed to it, so the next round of work follows evidence.\n\n## One discipline, organic and paid\n\nBoth run on one query map, one measurement spine, and one weekly cadence of reading results and adjusting. The content inventory that makes organic growth possible is the same inventory a paid program lands traffic on, and the same conversion measurement tells both sides what's working.\n\nNowhere is that clearer than with the Google Ad Grant. A Grant lives or dies on exactly what a search program builds â indexable mission content, informational query coverage, and conversion tracking Google can trust. Good SEO is good Grant SEO, which is why our [Grant work](/google-ad-grants) audits the same foundations this program maintains. If you're a nonprofit weighing the Grant, that's the narrower version of this conversation.\n\n## What it looks like in market\n\nFor Steyer for Governor, approved policy copy became ten designed issue pages whose sections mapped to the questions voters were typing â rent control, tenant rights, eviction rules â with paid search buying cheap informational demand while organic rankings caught up. The renter-protection ad group alone turned 20,543 first-month impressions into 561 engaged visits, and the search terms coming in showed exactly where the copy needed to get more practical and less legalistic. [Read the case study](/case-studies/steyer-issue-pages).\n\n## Where this fits\n\nSearch compounds fastest when the landing surface can keep up. We often pair this program with [web development](/offerings/web-development) so the pages winning impressions can be reshaped as quickly as the queries shift â and with [campaign automation](/offerings/campaign-automation) when search is one channel in a larger system.",slug:"seo-and-adwords"},caseStudies:$R[16]=[$R[17]={title:"Ten Designed Issue Pages, Each Backed by Search",summary:"Campaign issue pages usually arrive too late to shape the conversation. Approved policy copy became CMS pages with video, intent-mapped sections, and paid search campaigns that bought informational demand while organic rankings caught up.",projectSlug:"steyer-for-governor",offeringSlugs:$R[18]=["web-development","seo-and-adwords","campaign-automation"],date:"2026-07-09",template:"loop-campaign",client:"Steyer for Governor",window:"Mar - Jun 2026",surfaces:$R[19]=["Campaign website","Paid search"],team:"One campaign team",eyebrow:"Steyer for Governor - Issue pages",heroLines:$R[20]=[$R[21]={text:"Ten issue"},$R[22]={text:"pages,",tone:"mark"}
7,$R[23]={text:"live fast,",tone:"clip"},$R[24]={text:"backed by search.",tone:"pink"}],proofStats:$R[25]=[$R[26]={label:"Issue pages shipped",unit:"designed",value:"10"},$R[27]={label:"First page, brief to live",unit:"day",value:"1"}],loopTitle:"Designed pages. Search campaigns behind them.",loopIntro:"Approved policy language became pages voters could scan and campaigns that could respond to the queries voters used.",loopStops:$R[28]=[$R[29]={label:"SOURCE",sub:"One sheet, a tab per issue",title:"Approved policy copy"},$R[30]={label:"DESIGN",sub:"Hero, issue sections, video, CTAs",title:"Page structure"},$R[31]={label:"CONNECT",sub:"Sections mapped to voter questions",title:"Search intent"},$R[32]={label:"LAUNCH",sub:"Ad groups deep-linked by issue focus",title:"Paid search"},$R[33]={label:"VET",sub:"88 lines traced to source language",title:"Approved ad copy"},$R[34]={label:"FILTER",sub:"Waste cut before spend scaled",title:"Negative keywords"},$R[35]={label:"LEARN",sub:"Search terms guide the next pass",title:"Query behavior"}],outcomes:$R[36]=[$R[37]={body:"Housing, taxes, entertainment, electricity, gas prices, education, immigration, climate, healthcare, and AI policy each had a page built for voters to read, watch, and search.",label:"Issue pages shipped",unit:"designed",value:"10"},$R[38]={body:"Across the ten issue briefs, search was organized into 40 ad groups so ads, keywords, and landing-page sections could stay aligned by voter intent.",label:"Issue ad groups mapped",unit:"search",value:"40"},$R[39]={body:"Across the ten issue campaign briefs, search was mapped with 535 negative-keyword entries. The optimization review also marked 18 low-performing ad groups to pause, turning search-term review into a repeatable cleanup path.",label:"Search cleanup filters",unit:"negative",value:"535"}],creativeAssets:$R[40]=[$R[41]={height:941,kind:"image",label:"The healthcare issue page using the shared issue-page system",src:"/q/media/assets/steyer-issue-pages--healthcare",width:1440},$R[42]={height:941,kind:"image",label:"The climate issue page using the shared issue-page system",src:"/q/media/assets/steyer-issue-pages--climate",width:1440}],sections:$R[43]=[$R[44]={type:"loop",id:"loop",themeColor:"slate"},$R[45]={type:"mdx",id:"story",label:"The case study",themeColor:"white"},$R[46]={type:"outcomes",id:"outcomes",label:"By the numbers",title:"Search learned, then scaled.",body:"The first week answered the basic question: would voters who came from search stay with the issue page? They did. Week two turned that behavior into an optimization target. After that, the work was scale: more issue pages, tighter negative keywords, and a steady weekly average at a much lower cost per engaged visit.",table:$R[47]={caption:"Issue-search engagement and efficiency",columns:$R[48]=["Phase","Window","Engaged visits","Engagement efficiency","What it proved"],rows:$R[49]=[$R[50]=["Week 1 - initial learning","Mar 25-31","1,163","Baseline","The designed housing page could turn paid search clicks into engaged visits."],$R[51]=["Week 2 - scaling with optimization","Mar 31-Apr 7","2,794","+66% vs baseline","Once user_engagement became the optimization target, volume more than doubled while efficiency improved."],$R[52]=["Weeks 3-9 - scaled issue pages and optimization","Apr 7-Jun 2","4,900 avg / week","+245% vs baseline","Housing found its efficie
7nt baseline, then the five-issue platform held it through search-term and negative-keyword optimization."]]},themeColor:"light"},$R[53]={type:"cta",id:"cta",label:"Start a conversation",title:"Turn a launch into a page and channel plan.",body:"Bring us the issue, offer, or campaign you need in market. We will map the page, channel, and measurement path in one working session.",ctaLabel:"Get in touch",themeColor:"primary"}],content:"## Issue pages need speed and substance.\n\nA statewide campaign runs on issues - housing, gas prices, healthcare, education, climate, and whatever the news cycle adds next week. Each one needs its own page, but a page that is actually designed takes days: structure, visuals, resources, review, CMS work, QA. Under that pressure, most campaigns ship the simple version - approved policy text pasted into a CMS. The page exists, but it is not designed around what voters search for, watch, scan, or share.\n\n## Designed pages, not policy dumps.\n\nThe housing page went from scoped brief to a live, CMS-backed page in a day. Speed mattered, but the bigger shift was the quality of the output: approved policy text became a designed page with a hero, issue-focus sections, a video carousel, and inline calls to action instead of one undifferentiated column. A script pulled related YouTube videos for each issue so the page had motion and context, turning a static policy statement into something a voter could watch, scan, and follow.\n\n\n\n## Built around how voters search.\n\nThe issue-focus sections were not just layout - each one answered a specific search intent. The renters focus is the cleanest example: voters were not searching for \"housing policy architecture.\" They were searching for rent control, tenant rights, eviction rules, rent increases, and renter protection. The paid campaign grouped those questions together and sent them to `?focus=renters`, where the page opened on the relevant policy highlight instead of asking the voter to hunt for it.\n\n| Renters query group | Example keywords | Est. monthly volume | Landing focus |\n| --- | --- | --- | --- |\n| Rent control | `california rent control` | 1,400 | `?focus=renters` |\n| Tenant rights | `california tenant rights`, `california renters rights` | 1,900 | `?focus=renters` |\n| Eviction and rent increases | `california eviction laws`, `california rent increase` | 750 | `?focus=renters` |\n| High-intent long tail | `renters tax credit california`, `california tenant protection act`, `just cause eviction california` | Low volume, high intent | `?focus=renters` |\n\nIn month one, the Renter Protection ad group produced 20,543 impressions, 887 clicks, and 561 engagement conversions. Renters' search behavior showed exactly where copy needed to get more practical and less legalistic.\n\n\n\n## Detailed search campaigns, built from approved language.\n\nThe `vet-copy` step traced every headline and description back to the page - 88 lines, zero unapproved - so a deeply segmented search campaign came together from pre-approved text with minimal new review, not a fresh legal pass on every line. Ninety-nine negative keywords (58 campaign-level, 41 per ad group) filtered navigational and bargain-hunting queries before they spent a dollar.\n\nThere was no time to earn organic rankings, so the campaign bought the intent instead - informational queries like \"why are gas prices so high in California,\" cheap because few advertisers compete for them and dense with exactly the voters an issue page exists to inform. The bar was not the cheapest click; it was an engaged visit - ten seconds or more reading the policy. As search terms came in, the campaign had a reviewable path for tightening negatives, deep links, and copy around what voters were asking.\n\n| Search campaign layer | What it did | Why it mattered |\n| --- | --- | --- |\n| Approved-language source | 88 headlines and descriptions traced back to page copy | Fast launch without message drift |\n| Intent-mapped ad groups | Each housing theme matched a page section and `?focus=` deep link | Voters landed on the answer the ad promised |\n| Negative keyword system | 58 campaign-level and 41 ad-group negatives filtered waste | Spend went toward informational demand, not bargain or navigational searches |\n| Engagement bar | Optimization looked for visits with 10+ seconds reading policy | The campaign learned from actual issue interest, not click volume alone |\n\n## Fast pages only matter if they can learn.\n\nTen pages shipped, each with enough design, structure, and channel connection to do useful work in market: answer a voter question, carry a video, land a search ad, and feed the next optimization pass. That is the difference between a campaign ready to shape the conversation and one still waiting on the build.",_meta:$R[54]={filePath:"steyer-issue-pages.mdx",fileName:"steyer-issue-pages.mdx",directory:".",extension:"mdx",path:"steyer-issue-pages"},mdxSource:"## Issue pages need speed and substance.\n\nA statewide campaign runs on issues - housing, gas prices, healthcare, education, climate, and whatever the news cycle adds next week. Each one needs its own page, but a page that is actually designed takes days: structure, visual
7s, resources, review, CMS work, QA. Under that pressure, most campaigns ship the simple version - approved policy text pasted into a CMS. The page exists, but it is not designed around what voters search for, watch, scan, or share.\n\n## Designed pages, not policy dumps.\n\nThe housing page went from scoped brief to a live, CMS-backed page in a day. Speed mattered, but the bigger shift was the quality of the output: approved policy text became a designed page with a hero, issue-focus sections, a video carousel, and inline calls to action instead of one undifferentiated column. A script pulled related YouTube videos for each issue so the page had motion and context, turning a static policy statement into something a voter could watch, scan, and follow.\n\n\n\n## Built around how voters search.\n\nThe issue-focus sections were not just layout - each one answered a specific search intent. The renters focus is the cleanest example: voters were not searching for \"housing policy architecture.\" They were searching for rent control, tenant rights, eviction rules, rent increases, and renter protection. The paid campaign grouped those questions together and sent them to `?focus=renters`, where the page opened on the relevant policy highlight instead of asking the voter to hunt for it.\n\n| Renters query group | Example keywords | Est. monthly volume | Landing focus |\n| --- | --- | --- | --- |\n| Rent control | `california rent control` | 1,400 | `?focus=renters` |\n| Tenant rights | `california tenant rights`, `california renters rights` | 1,900 | `?focus=renters` |\n| Eviction and rent increases | `california eviction laws`, `california rent increase` | 750 | `?focus=renters` |\n| High-intent long tail | `renters tax credit california`, `california tenant protection act`, `just cause eviction california` | Low volume, high intent | `?focus=renters` |\n\nIn month one, the Renter Protection ad group produced 20,543 impressions, 887 clicks, and 561 engagement conversions. Renters' search behavior showed exactly where copy needed to get more practical and less legalistic.\n\n\n\n## Detailed search campaigns, built from approved language.\n\nThe `vet-copy` step traced every headline and description back to the page - 88 lines, zero unapproved - so a deeply segmented search campaign came together from pre-approved text with minimal new review, not a fresh legal pass on every line. Ninety-nine negative keywords (58 campaign-level, 41 per ad group) filtered navigational and bargain-hunting queries before they spent a dollar.\n\nThere was no time to earn organic rankings, so the campaign bought the intent instead - informational queries like \"why are gas prices so high in California,\" cheap because few advertisers compete for them and dense with exactly the voters an issue page exists to inform. The bar was not the cheapest click; it was an engaged visit - ten seconds or more reading the policy. As search terms came in, the campaign had a reviewable path for tightening negatives, deep links, and copy around what voters were asking.\n\n| Search campaign layer | What it did | Why it mattered |\n| --- | --- | --- |\n| Approved-language source | 88 headlines and descriptions traced back to page copy | Fast launch without message drift |\n| Intent-mapped ad groups | Each housing theme matched a page section and `?focus=` deep link | Voters landed on the answer the ad promised |\n| Negative keyword system | 58 campaign-level and 41 ad-group negatives filtered waste | Spend went toward informational demand, not bargain or navigational searches |\n| Engagement bar | Optimization looked for visits with 10+ seconds reading policy | The campaign learned from actual issue interest, not click volume alone |\n\n## Fast pages only matter if they can learn.\n\nTen pages shipped, each with enough design, structure, and channel connection to do useful work in market: answer a voter question, carry a video, land a search ad, and feed the next optimization pass. That is the difference between a campaign ready to shape the conversation and one still waiting on the build.",slug:"steyer-issue-pages"}],blogPosts:$R[55]=[]},ssr:!0}]})($R["tsr"]);$_TSR.e();document.currentScript.remove()</script>
7<script type="module" async="" src="/assets/index-LTx9hC-x.js"></script>
7</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.