# Run SEO as a daily discipline (/use-cases/gtm-growth/seo-agent)



Copy this prompt to start your first task:

<Prompt>
  Set up a daily SEO workflow for [yourdomain.com], competing with [competitors]. Start with a baseline audit of titles, keywords, and technical issues, then check rankings and competitor content daily, and report the single best opportunity to act on.
</Prompt>

<LivePreview component="NewThread" scenario="{ draft: &#x22;Set up a daily SEO workflow for [yourdomain.com], competing with [competitors]. Start with a baseline audit of titles, keywords, and technical issues, then check rankings and competitor content daily, and report the single best opportunity to act on.&#x22; }" />

## What is this workflow? [#what-is-this-workflow]

Running SEO as a daily discipline means giving a teammate a fixed loop instead of a one-time scan: check Search Console access, pull the data, triage anomalies, and send an honest brief every morning — including an honest “no data today, here's why, here's the unblock” on days access is down, instead of a fabricated one. It builds and maintains a 4-layer keyword map (brand terms already ranking, real non-brand queries already surfacing, aspirational keywords worth building for, and comparison terms), routing each keyword to the page type built to earn it. Every Monday the brief turns into a ranked proposal — one to three moves, each naming the target keyword or page, the expected impact, and the cost — and every metadata, schema, or content gap it finds ships as a reviewable PR, tagged to a human reviewer, and verified against the live URL and a requested re-crawl after merge, never called “done” on the strength of a merged PR alone.

<Callout type="warn">
  **Always waits for a human:**

  * Merging any PR: it opens PRs and tags a reviewer, it never merges its own work and never pushes straight to main
  * Posting anything to LinkedIn, X, or Hacker News: it only drafts; you review the wording and post from your own account
  * Publishing a case study
  * Spending money on anything: no paid backlinks, no paid promotion, ever
  * Clicking “Request indexing” in Search Console: the re-crawl request is UI-only, so it preps the URL and asks, but a human clicks it

  **Not in scope, full stop:**

  * Buying backlinks, fake accounts, paid guest posts, comment spam, or reciprocal-link schemes. Proposed backlinks are always earned, drafted for a real account to post
  * Redesigning a page: it flags a layout that's hurting click-through rate, it doesn't ship a redesign
  * Deciding the product roadmap: it proposes what's worth building for search, you and the team decide what actually gets prioritized
  * Paid ads, or any channel besides organic search
  * Talking to customers directly
</Callout>

## How to use this workflow [#how-to-use-this-workflow]

<Steps>
  <Step>
    ### Hire the Growth Hacker, and write the bio around the daily discipline, not a one-time scan [#hire-the-growth-hacker-and-write-the-bio-around-the-daily-discipline-not-a-one-time-scan]

    Open **AI Teammates** in the sidebar, click **Hire AI Teammate**, and pick the **Growth Hacker** template. The default bio undersells this as a one-time audit. Replace it on the Profile step so the teammate starts out already knowing this is a standing operating role, not a checklist:

    <Prompt>
      You're our SEO teammate for [yourdomain.com]. You run search as a daily discipline, not a one-time scan. Each morning: check GSC access is alive, pull the data, triage anomalies, send me an honest brief (never fabricate one if auth is down). Mondays: propose 1-3 ranked actions, I'll pick one. Ship fixes as PRs against [your site's repo], never merge your own PR, never push to main. Draft LinkedIn/X posts for backlinks; I'll review and post them from my own account.
    </Prompt>

    Confirm the name and click **Create teammate**. They land in their own channel, which is where you'll send everything below. [More on hiring →](/ai-teammates/hire-an-ai-teammate)

    <LivePreview component="CreateAssistantPage" scenario="{ focus: &#x22;profile&#x22;, initialState: { start: &#x22;template&#x22;, templateRef: &#x22;@helio/growth-strategist&#x22;, name: &#x22;Growth Hacker&#x22;, bio: &#x22;You're our SEO teammate for helio.im. You run search as a daily discipline, not a one-time scan. Each morning: check GSC access is alive, pull the data, triage anomalies, send me an honest brief (never fabricate one if auth is down). Mondays: propose 1-3 ranked actions, I'll pick one. Ship fixes as PRs against helio-website, never merge your own PR, never push to main. Draft LinkedIn/X posts for backlinks; I'll review and post them from my own account.&#x22; } }" />
  </Step>

  <Step>
    ### Connect GitHub: the two-layer flow [#connect-github-the-two-layer-flow]

    Fixes ship as pull requests against the site's repo, never pushed directly. A workspace admin installs the GitHub App once, in **Settings → Integrations** (a one-time, workspace-level step), then grants this teammate the specific repo (here, `helio-website`) it's allowed to open PRs against. [Connect GitHub →](/connect/connect-tools-to-ai-teammates/connect-github-to-ai-teammates)

    <LivePreview component="AssistantIntegrations" />

    The weekly backlink drafts don't need any extra connection: posting stays with you (see the boundaries above), and Helio's LinkedIn connector is identity-only — it can't post or hold drafts anyway. The drafts land right here in the teammate's channel; you review the wording and post them from your own account.
  </Step>

  <Step>
    ### The Search Console gap: no native connector, so it reads GSC through a browser instead [#the-search-console-gap-no-native-connector-so-it-reads-gsc-through-a-browser-instead]

    Helio doesn't have a native Google Search Console connector. There's no “Connect Search Console” OAuth button to click, and none of the marketplace skills wrap its API either. What this teammate actually does is install the **Stagehand Browser CLI** skill (Skills & Plugins → Productivity) and use it to open Search Console the way a person would: log in, click into URL Inspection, read the Performance report. It's slower than an API pull and it can't do anything the Search Console UI itself can't do, but it's real data, not a guess, and it means the daily loop below doesn't stall on a connector that doesn't exist.

    Installing the browser skill doesn't grant a logged-in Google session, though — the teammate still needs the Search Console account's credentials to get past the login page. Add that Google account to the Vault and share it with this teammate before the Day 1 audit, or the first login attempt (and every daily loop after it) blocks. [Share credentials →](/connect/vault/share-credentials-with-teammates)

    <LivePreview component="AssistantSkills" />
  </Step>

  <Step>
    ### Kick off the Day 1–2 landscape audit and keyword map [#kick-off-the-day-12-landscape-audit-and-keyword-map]

    The first real work in a new SEO teammate's week is the baseline everything else compares against: pull every production URL, see what's actually indexed, then build the keyword map the daily brief will reference from here on. That starts broad, not with one page:

    <Prompt>
      Start the onboarding audit. Day 1: pull the sitemap for [yourdomain.com], run URL Inspection on every production URL through Search Console, and give me a coverage snapshot: how many pages are indexed, how many are “Crawled - currently not indexed”, and any canonical, robots, or schema warnings. Day 2: pull the last 90 days from Search Console and build a 4-layer keyword map: brand terms we already rank for, real non-brand queries we already surface on, aspirational keywords we could plausibly rank for, and comparison terms against [your top competitors]. Map each keyword to the page that should own it.
    </Prompt>

    <LivePreview
      component="AssistantChat"
      scenario="{ assistantName: &#x22;Growth Hacker&#x22;, messages: [
    { author: &#x22;user&#x22;, text: &#x22;Start the onboarding audit. Day 1: pull the sitemap for helio.im, run URL Inspection on every production URL through Search Console, and give me a coverage snapshot: how many pages are indexed, how many are “Crawled - currently not indexed”, and any canonical, robots, or schema warnings. Day 2: pull the last 90 days from Search Console and build a 4-layer keyword map: brand terms we already rank for, real non-brand queries we already surface on, aspirational keywords we could plausibly rank for, and comparison terms against Cofoundry, Delegate.ai, and TeamPilot. Map each keyword to the page that should own it.&#x22; },
    { author: &#x22;assistant&#x22;, text: &#x22;Working through the sitemap now. I'll walk each URL through Inspection in Search Console via the browser skill since there's no API connector for it, so Day 1 will take longer than an API pull would. Baseline snapshot coming once that's done: index status, plus any canonical, robots, or schema flags. For Day 2 I'll pull the 90-day Performance report the same way and lay out the four layers with a page owner for each keyword. I'll flag anything in Layer 3 (aspirational) that doesn't have a page built for it yet, since that's usually where the first few weeks of work come from.&#x22; },
  ] }"
    />
  </Step>

  <Step>
    ### Ship a fix for one surfaced gap: draft, PR, a human merges, then verify it actually landed [#ship-a-fix-for-one-surfaced-gap-draft-pr-a-human-merges-then-verify-it-actually-landed]

    Once the daily brief surfaces something real (a keyword the site should own but has no page for, a schema warning, a missing meta description), the response is the same every time: confirm the gap is real, draft the content, open a PR, and wait. This teammate never merges its own work:

    <Prompt>
      The keyword map flagged “[target keyword]”: we get impressions for it but no ranking page. [A competitor] has a dedicated page for it. Draft the content, convert it to a real page, add schema, and open a PR.
    </Prompt>

    <LivePreview
      component="AssistantChat"
      scenario="{ assistantName: &#x22;Growth Hacker&#x22;, messages: [
    { author: &#x22;user&#x22;, text: &#x22;The keyword map flagged “ai teammate for gtm teams”: we get impressions for it but no ranking page. Cofoundry has a dedicated page for it. Draft the content, convert it to a real page under /use-cases/, add schema, and open a PR.&#x22; },
    { author: &#x22;assistant&#x22;, text: &#x22;Confirmed: Search Console shows impressions with no clicks on that phrase, and Cofoundry has a dedicated page for the near-exact query. Drafted the page (headline, meta description, body, FAQ block) in the workspace first, then converted it to the site's real component shape on a new branch, added Article and FAQPage schema, and added the URL to the sitemap. PR #482 is open against helio-website and tagged to you for review. I don't merge my own PRs, so it sits until you approve it.&#x22; },
    { author: &#x22;user&#x22;, text: &#x22;Merged it.&#x22; },
    { author: &#x22;assistant&#x22;, text: &#x22;Confirming the fix actually shipped, not just that the PR merged. Curled the live URL, getting a 200, and the FAQPage schema validates clean in Rich Results Test. One last step needs you: requesting a re-crawl is UI-only in Search Console, so go ahead and hit “Request indexing” on the URL Inspection page when you get a second. I can't click that part myself.&#x22; },
  ] }"
    />
  </Step>

  <Step>
    ### Put the daily brief on automation [#put-the-daily-brief-on-automation]

    Open **Automations** in the sidebar, click **Create via Chat**, and pick this teammate in the New Thread composer that opens. This is the loop that runs every morning without anyone asking for it, and the one place “honest over polished” matters most, since a fabricated brief on a day access is down is worse than no brief at all:

    <Prompt>
      Every morning, run the daily loop: check that Search Console access is alive by logging in through the browser skill, pull 7-day totals, week-over-week change, yesterday's numbers, top queries and pages, and run URL Inspection on anything that looks off. Triage against last week: is CTR moving, are new queries appearing, is the indexed count dropping. Write the brief in our locked format and send it to me directly. If access is down, don't send a brief with made-up numbers. Tell me it's down, why, and what I need to do to fix it.
    </Prompt>

    <LivePreview component="NewThread" scenario="{ populated: false }" />
  </Step>

  <Step>
    ### Same-day escalation, and the Monday proposal that runs on top of it [#same-day-escalation-and-the-monday-proposal-that-runs-on-top-of-it]

    Most of what the daily loop finds waits for the brief. A short list doesn't: a canonical, robots, or noindex regression on a live URL; a previously-indexed page dropping out of the index; a schema warning in Rich Results Test; a Search Console manual action or security notice; or a ranking or CTR drop past a threshold you've agreed on for a page that matters. Those get a same-day DM, not a line in tomorrow's brief:

    <LivePreview
      component="AssistantChat"
      scenario="{ assistantName: &#x22;Growth Hacker&#x22;, messages: [
    { author: &#x22;user&#x22;, text: &#x22;Anything urgent today?&#x22; },
    { author: &#x22;assistant&#x22;, text: &#x22;One thing that can't wait for the brief: /product/automations picked up a noindex tag sometime in the last 24 hours. It was indexed and ranking for three non-brand terms as of yesterday's pull, and Search Console already shows it “Excluded by noindex tag”. That's a deploy-side change, not a content gap, so I can't fix it myself. Flagging now so it doesn't sit through the weekend. Everything else today is routine and will be in the morning brief as usual.&#x22; },
  ] }"
    />

    On top of that, Monday's brief turns into a proposal instead of just a report: one to three ranked actions, each naming the target keyword or page, the expected impact, and the cost, so you're picking from options instead of starting from a blank page every week.
  </Step>
</Steps>

**This flow waits for you on five things:** merging any PR, posting to LinkedIn, X, or Hacker News, publishing a case study, spending money, and clicking “Request indexing” in Search Console. Everything else — reading Search Console data, drafting content, opening PRs — runs on its own. See [Control](/ai-teammates/control) for how approval works in Helio generally.

## Tips for Better Results [#tips-for-better-results]

| Tip                                                    | Description                                                                                                                                             |
| ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Share the Search Console credential before Day 1       | There's no native connector, so this teammate logs in through a browser skill instead. Skip the Vault share and every login after the first blocks too. |
| Expect an honest “no data” day, not a fabricated brief | If Search Console access is down, the brief says so and tells you the unblock — it never invents numbers to stay on schedule.                           |
| A merged PR isn't “done” yet                           | The fix isn't verified until the live URL is curled and a re-crawl is requested — that check happens after you merge, not instead of it.                |
| Watch for same-day DMs, not just the morning brief     | Regressions like a noindex slip, an index drop, or a schema warning get flagged the day they're found, separate from tomorrow's brief.                  |

## Common Questions [#common-questions]

<Accordions type="single">
  <Accordion title="Does this teammate merge its own PRs?">
    No. It opens PRs against your repo and tags a human reviewer — merging always waits for you, and it never pushes straight to main.
  </Accordion>

  <Accordion title="What happens if Search Console access goes down?">
    It tells you honestly: that access is down, why, and what you need to do to fix it. It never sends a brief with made-up numbers.
  </Accordion>

  <Accordion title="Can it post the backlink drafts itself?">
    No. It only drafts LinkedIn, X, or Hacker News posts — you review the wording and post from your own account.
  </Accordion>

  <Accordion title="Does it click “Request indexing” after a fix ships?">
    No. Requesting a re-crawl is UI-only in Search Console, so it preps the URL and curls it to confirm the fix landed, then asks you to click it.
  </Accordion>

  <Accordion title="Is this a one-time SEO audit?">
    No. After the Day 1-2 onboarding audit and keyword map, it runs as a standing loop: a daily brief, a Monday ranked proposal, and same-day escalation for regressions that can't wait.
  </Accordion>
</Accordions>

<Cards>
  <Card title="GTM & Growth" href="/use-cases/gtm-growth" description="Back to the GTM & Growth use case overview." />

  <Card title="Run Google Ads end to end" href="/use-cases/gtm-growth/google-ads" description="Own the account, not a checklist: intake, keywords, daily optimization, and a self-refreshing report." />

  <Card title="Track KOL campaigns" href="/use-cases/gtm-growth/kol-tracking" description="Turn a confirmed KOL list into tracking links and a click-data report." />
</Cards>
