# Watch competitors weekly (/use-cases/research/competitive-analysis)



Copy this prompt to start your first task:

<Prompt>
  Set up a Competitor Change Radar for [competitor name and link]. Start with a baseline profile of their positioning, pricing, and strengths and weaknesses, then check for public changes daily and only flag what actually matters.
</Prompt>

<LivePreview component="NewThread" scenario="{ draft: &#x22;Set up a Competitor Change Radar for [competitor name and link]. Start with a baseline profile of their positioning, pricing, and strengths and weaknesses, then check for public changes daily and only flag what actually matters.&#x22; }" />

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

"Watch competitors weekly" is the job of locking a small set of ASINs and the dimensions that matter, then letting a browser-driven collection run gather what Amazon has no API for. Each pass produces a diffable snapshot per ASIN — price, Buy Box owner, BSR, rating, review count and velocity, listing changes, coupons, ad placement — feeding a live comparison dashboard and a daily "Competitor Activity Brief" that comes with an actual recommendation attached, not just numbers. A same-day alert breaks that daily rhythm only for the handful of things that can't wait: a competitor's price drop past a threshold, a new entrant breaking into the top ranks, losing the Buy Box, or an abnormal spike in negative reviews.

<Callout type="warn">
  **Collection discipline, not optional:** runs 1-2 times a day with randomized delay between actions. Scraping Amazon at high frequency reliably trips anti-bot defenses, and a flagged account produces zero data going forward. If a CAPTCHA or login wall shows up mid-run, it stops and alerts a human rather than trying to force through it. At any real scale, it prefers paid data from a Keepa or Helium10 account you already log into over self-scraping the storefront directly. Self-scraping is the fallback for what those tools don't cover, not the primary source. And it never writes a silently empty field: a failed field extraction triggers a retry and an alert, because a page-structure change on Amazon's end blanks fields exactly this way, and a silent empty write is how that goes unnoticed for weeks.
</Callout>

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

<Steps>
  <Step>
    ### Hire a Researcher: write the bio around locked scope, not "track my competitors" [#hire-a-researcher-write-the-bio-around-locked-scope-not-track-my-competitors]

    Open **AI Teammates** in the sidebar, click **Hire AI Teammate**, and pick the **Researcher** template. The default bio is generic web research. Replace it on the Profile step so the teammate starts out already knowing this is a scoped, recurring collection job with a real procedure behind it, not an open-ended watch:

    <Prompt>
      You are a competitor-monitoring AI, skilled at continuously watching official sites, pricing, product updates, content, social media, and market moves. Set up a "Competitor Change Radar" automation for me, competitor: [competitor name and link]. Day one, build a baseline profile: positioning, target users, core features, pricing, recent updates, marketing messages, strengths and weaknesses, and risk to us; output what we need to watch and what action we can take today. After that, check for public changes every day and only report what's valuable: new changes, impact assessment, suggested action, whether it needs my decision; a short report when nothing major changed. Prefer running against public web pages first; proactively offer to connect when an official direct integration is available; use the browser skill as a guide when backend login is required.
    </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/researcher&#x22;, name: &#x22;Researcher&#x22;, bio: &#x22;You track a locked set of competitor ASINs on Amazon: price, Buy Box, BSR, ratings, review velocity, listing changes, coupons, ad placement. Amazon has no API, so collect via the browser skill, screenshotting each page as archive. Never write an empty field silently. Retry and tell me. Alert same-day for a price drop past threshold, a new top-rank entrant, losing the Buy Box, or a review spike; everything else waits for the daily brief. Hit a CAPTCHA or login wall: stop, don't force it.&#x22; } }" />
  </Step>

  <Step>
    ### Connect what actually has a connector: Notion for storage, Slack for alerts [#connect-what-actually-has-a-connector-notion-for-storage-slack-for-alerts]

    The comparison database and the alert channel are both real native connectors here. Amazon itself and the tools built to track it are not; that gap gets handled two steps down. [Connect your tools →](/connect/connect-tools-to-ai-teammates)

    <LivePreview component="AssistantIntegrations" />

    Notion holds the daily snapshot table: the thing every future diff compares against. Slack (or Gmail as a backup channel) is where the daily brief and same-day alerts land. One Slack-specific step matters here: the teammate's Slack app doesn't join channels by itself, so after connecting, invite it into the channel the alerts should land in — otherwise the brief is written but never arrives. [Connect Slack →](/connect/connect-tools-to-ai-teammates/connect-slack-to-ai-teammates) If you keep a paid Keepa or Helium10 account for historical price/BSR charts, that's not a connector either. It gets read the same way as Amazon itself, covered next.
  </Step>

  <Step>
    ### No connector for Amazon, so it collects through a real browser instead [#no-connector-for-amazon-so-it-collects-through-a-real-browser-instead]

    Neither Amazon's storefront nor Keepa/Helium10/Jungle Scout have an API Helio can connect to natively. There's no OAuth button for any of them. What this teammate actually does is install the **Stagehand Browser CLI** skill (Skills & Plugins → Productivity) and drive an actual browser: open the product page, read the price/BSR/rating/review-count/Buy-Box-seller fields, screenshot the full page as an archive. Login credentials for Seller Central or a paid Keepa/Helium10 account live in Helio's credential vault and get pulled at login time, never typed into a prompt or hardcoded anywhere. Vault access is granted per credential, so add those logins to the Vault and share each one with this teammate now — the first paid-account login blocks until you do. [Share credentials →](/connect/vault/share-credentials-with-teammates)

    <Prompt>
      Run one collection pass on ASIN [ASIN], our first tracked competitor. Open the product page, snapshot it, and pull price, BSR, rating, review count, and who currently holds the Buy Box. Screenshot the full page as an archive. Then open our search term and record where this ASIN and our own product rank, and whether either holds an ad placement.
    </Prompt>

    <LivePreview
      component="AssistantChat"
      scenario="{ assistantName: &#x22;Researcher&#x22;, messages: [
    { author: &#x22;user&#x22;, text: &#x22;Run one collection pass on ASIN B0FGSOFA1, our first tracked competitor. Open the product page, snapshot it, and pull price, BSR, rating, review count, and who currently holds the Buy Box. Screenshot the full page as an archive. Then open our search term and record where this ASIN and our own product rank, and whether either holds an ad placement.&#x22; },
    { author: &#x22;assistant&#x22;, text: &#x22;Opened the product page through the browser skill and took an accessibility-tree snapshot to locate the fields: price $649.00, BSR #142 in Furniture, 4.3 stars on 1,204 reviews, Buy Box held by the same seller as last check. Full-page screenshot saved as the listing archive. On the search term: this ASIN ranks #3 organic with a Sponsored Products placement above it; we're #7 organic, no ad placement currently. All five fields extracted cleanly. Nothing needed a retry.&#x22; },
  ] }"
    />
  </Step>

  <Step>
    ### Build the baseline in Notion, one row per ASIN and one snapshot per day [#build-the-baseline-in-notion-one-row-per-asin-and-one-snapshot-per-day]

    With one clean collection pass proven out, lock the full tracked set and the schema everything after this diffs against:

    <Prompt>
      Lock these as our tracked set: our own ASIN plus 4 competitors [list attached], and these keywords: [5-10 core search terms]. Run a full collection pass on all of them and save it to Notion as the baseline: one row per ASIN, columns for date, price, BSR, rating, review count, Buy Box seller, coupon, promotion, a listing-change flag, and the screenshot link. Every future run diffs against whatever's most recent in that table.
    </Prompt>

    <LivePreview
      component="AssistantChat"
      scenario="{ assistantName: &#x22;Researcher&#x22;, messages: [
    { author: &#x22;user&#x22;, text: &#x22;Lock these as our tracked set: our own ASIN plus 4 competitors [list attached], and these keywords: [5-10 core search terms]. Run a full collection pass on all of them and save it to Notion as the baseline: one row per ASIN, columns for date, price, BSR, rating, review count, Buy Box seller, coupon, promotion, a listing-change flag, and the screenshot link. Every future run diffs against whatever's most recent in that table.&#x22; },
    { author: &#x22;assistant&#x22;, text: &#x22;Set is locked: 5 ASINs (yours plus 4 competitors), 8 keywords. Collection pass done for all 5, Notion table built with today's row for each. One flag from this pass: one competitor is running a coupon we didn't know about, 15% off, no end date visible on the page. That's in the baseline now as day zero. Tomorrow's pass is the first real diff.&#x22; },
  ] }"
    />
  </Step>

  <Step>
    ### Automate the daily diff-and-brief [#automate-the-daily-diff-and-brief]

    Open **Automations** in the sidebar, click the **Create via Chat** dropdown, and pick this teammate. Once or twice a day, staggered (not on the hour, and not more often than that):

    <Prompt>
      Twice a day, staggered timing with a random delay between each ASIN, collect fresh data for the full tracked set through the browser skill. Diff against yesterday's row in Notion. Post a daily Competitor Activity Brief to Slack: what moved, by how much, and a recommendation (price-match, revise a listing, or respond to a review theme). If any field fails to extract, retry once, then flag it rather than writing it blank. That's usually a page-structure change on Amazon's end, not nothing to report.
    </Prompt>

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

  <Step>
    ### Same-day alerts, separate from the daily brief [#same-day-alerts-separate-from-the-daily-brief]

    Four things don't wait for tomorrow's brief: a competitor drops price past a threshold you set, a new competitor breaks into the top ranks for a tracked keyword, you lose the Buy Box, or a competitor's negative reviews spike abnormally (often a sign of a bad batch or a stockout, sometimes review manipulation):

    <LivePreview
      component="AssistantChat"
      scenario="{ assistantName: &#x22;Researcher&#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: we lost the Buy Box on our own ASIN sometime in the last 12 hours. A different seller now holds it at $2 under our price. That's a same-day issue, not a line in tomorrow's report, since every hour it sits is lost sales. Everything else from today's two passes is routine and will be in the regular brief.&#x22; },
  ] }"
    />
  </Step>
</Steps>

**Nothing here needs your approval by default:** every step reads a page — public storefront pages, or a paid Keepa/Helium10/Seller Central account through a vault-shared credential — and writes to Notion or Slack. Nothing is sent externally or is irreversible. See [Control](/ai-teammates/control) for what does pause for sign-off.

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

| Tip                                                | Description                                                                                                                                                                             |
| -------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Lock the tracked set before automating             | Confirm the exact ASINs and keywords once, in the baseline pass — every future diff compares against that fixed set, not a moving target.                                               |
| Prefer paid data over self-scraping at scale       | If you already log into a Keepa or Helium10 account, read from it. Self-scraping Amazon directly is the fallback for what those tools don't cover, not the primary source.              |
| Never let a failed field go in blank               | A missing price or BSR usually means Amazon changed its page structure, not that there's nothing to report. The teammate retries once, then flags it instead of writing an empty value. |
| Keep same-day alerts separate from the daily brief | Only four things justify an immediate ping — a threshold price drop, a new top-rank entrant, a lost Buy Box, or a review spike. Everything else waits for the brief.                    |

## Common Questions [#common-questions]

<Accordions type="single">
  <Accordion title="Does this workflow scrape Amazon directly?">
    Only as a fallback. It prefers reading from a paid Keepa or Helium10 account you already log into; self-scraping the storefront covers only what those tools don't.
  </Accordion>

  <Accordion title="What happens if a field fails to extract?">
    It retries once, then flags it and alerts rather than writing the field blank. A silently blank field is usually a sign Amazon changed its page structure, not that there's nothing there.
  </Accordion>

  <Accordion title="What triggers a same-day alert instead of waiting for the daily brief?">
    Four things: a competitor's price drop past a threshold, a new entrant breaking into the top ranks, losing the Buy Box, or an abnormal spike in negative reviews. Everything else goes in the next daily brief.
  </Accordion>

  <Accordion title="What happens if collection hits a CAPTCHA or login wall?">
    It stops and alerts a human rather than trying to force through. Pushing past a block risks getting the account flagged, which produces zero data going forward.
  </Accordion>

  <Accordion title="Does this need my approval to run?">
    No, once you've shared the needed logins in the Vault. Collection reads pages and writes to Notion/Slack — nothing here is sent externally or irreversible.
  </Accordion>
</Accordions>

<Cards>
  <Card title="Research" href="/use-cases/research" description="Back to the research use case overview." />

  <Card title="Research a market" href="/use-cases/research/market-research" description="Research the whole market, not just named competitors." />
</Cards>
