Competitor & Influencer Monitoring System — Design Handoff¶
Date: 2026-07-27 Status: Design agreed, not yet built Purpose: Portable spec for an automated monitoring system that watches competitors, industry publications and influencers, then surfaces content opportunities for approval.
This document is self-contained. It was written in the legacy VoiceNut marketing repo and is meant to be copied into the current Vibe Marketing repo. It deliberately contains no relative links to the old repo — where it refers to project documents (brand voice, positioning, ICPs), substitute the equivalents in the new repo.
1. The Problem Being Solved¶
Monitor suppliers, competitors and key influencers in the wealth-management-AI space — their social posts, blogs, newsletters and websites. When something relevant appears, get a summary plus an assessment of whether it's a topic Dean should have a public view on. Approved topics become briefs for a contract writer.
Key constraint discovered during design: Dean approves content; a contractor writes it. So the output is not a reading list — it is a decision queue that produces contractor-ready briefs.
2. The Core Architectural Decision¶
Do not let the LLM do the polling. Split the system in two:
| Layer | Runs | Cost | Job |
|---|---|---|---|
| Collector (deterministic script) | Often | ~0 | Fetch sources → diff against seen-store → emit only genuinely-new items |
| Judge (Claude) | Only when the collector finds something | Low | Score relevance against positioning, propose an angle, draft a hook |
Pointing an LLM straight at websites produces duplicate reports, missed items, hallucinated posts and real cost. The seen-store is what makes the system trustworthy.
Collector (scheduled) → New-items queue → Claude judge → Digest + email
RSS + page-diff state.json reads brand voice, INBOX.md
+ Google News RSS (URL/content positioning, ICPs + daily email
hashes)
3. Hosting Decision: Azure Pipelines¶
Chosen: Azure Pipelines scheduled job.
The repo is a git repo hosted on Azure DevOps Repos (dev.azure.com/nutcracker2/AIMarketing/_git/...). A pipeline runs inside a checkout of the repo, so the seen-store and digest markdown are just files it commits and pushes. The repo is the database — no storage account, no Azure DevOps REST API plumbing, no container to keep alive.
schedules:
- cron: "30 4 * * *" # 06:30 SAST — daily digest
branches: { include: [master] }
always: true
Script step → git commit && git push. Secrets as pipeline variables. Microsoft-hosted agents include 1,800 free minutes/month; this job uses roughly one per run.
Alternatives considered and why they lost¶
- Azure Function (timer trigger). Better for sub-minute latency or an HTTP surface — neither is needed. Would require pushing markdown back through the Azure DevOps REST API, pure overhead versus a checkout. Becomes the right answer when you want one-click approve/reject links in the email (see §7). Plan it as v2, not v1.
- n8n in Docker (local). n8n earns its keep when you need dozens of SaaS connectors you don't want to code. This integration surface is narrow — RSS, HTTP, Claude, SMTP, git — and in code it's diffable, testable and reviewable rather than JSON in a browser UI. It also needs an always-on host, at which point the pipeline is free and already in the ecosystem.
- GitHub Actions. Not applicable — repo is on Azure DevOps, not GitHub. Azure Pipelines is the equivalent mechanism.
Caveat to handle first¶
Azure DevOps private projects require a one-off free-parallelism grant request from Microsoft before hosted agents will run (typically a couple of days' turnaround). If you don't want to wait, register a self-hosted agent on any always-on machine — works immediately.
4. Cadence Decision: Daily Digest + Tripwire¶
The original ask was 4–5 checks per day; the delivery preference is a daily email. These reconcile as two pipelines:
| Pipeline | Schedule | Behaviour |
|---|---|---|
| Daily digest | 06:30 SAST | Full sweep of all sources, writes markdown, sends the one email |
| Tripwire | Every 4 hours | Tier-1 triggers only — competitor pricing-page diffs, funding keywords in Google News, competitor product-page changes. Silent unless it fires. |
Rationale: across ~20 sources in this niche, genuinely new items appear maybe 5–10 times per week. Four digests a day trains you to ignore them. This gives one predictable email plus same-day alerting on things that actually matter (e.g. a competitor dropping UK pricing).
5. Sources — Three Tiers¶
Tier A — RSS / feeds (free, covers ~80% of what matters)¶
Competitors (verify feed URLs — not all confirmed to expose RSS):
- Jump — jump.ai (blog + the pre-meeting-prep product page)
- Zocks — zocks.io (blog + /press)
- Zeplyn — zeplyn.ai
- Marloo — marloo.com (UK/US — highest-priority for UK go-to-market)
- Practifi — practifi.com (CRM bundling threat)
- Vestmark — vestmark.com/press-releases
Industry commentary / influencers: - Kitces.com — the single highest-signal source in the space - WealthManagement.com - WealthTech Today - XY Planning Network advisor blog
UK: Citywire, Money Marketing, FTAdviser SA: Moneyweb
Underrated free source — Google News RSS. Gives funding rounds, launches and press coverage with zero scraping:
https://news.google.com/rss/search?q="Zocks"+OR+"Zeplyn"+advisor
/feed.
Tier B — No feed, monitor by diffing¶
Fetch → strip boilerplate → hash → compare. This is where the highest-value competitive intel lives: - Competitor pricing pages (Marloo publishes $99/adviser/month; Zeplyn ~$60–120/seat/month) - Product pages (Jump's pre-meeting-prep page changing matters more than any blog post) - Changelogs - Careers pages — a competitor hiring a UK salesperson is a strategic signal
Tier C — LinkedIn and X (be realistic)¶
LinkedIn has no API for reading other people's posts, and direct scraping violates their ToS and gets accounts restricted. Do not build a LinkedIn scraper. Options in order of preference:
- A third-party feed service (RSS.app, Fetchrss) producing RSS from public company pages — ~$10–40/month, and they carry the operational risk
- Google Alerts scoped to
site:linkedin.com - Accept that founders repost substantive content to a blog or newsletter you can watch legitimately
X now requires a paid API tier for anything useful.
Recommendation: ship Tiers A and B first. Add Tier C via a paid feed service only once the digests prove worth reading.
6. The Relevance Filter — The Actual Differentiator¶
Generic tools (Feedly et al.) tell you what happened. The value here is "does this touch my positioning, and do I have a contrarian take?" — which only works because the judge reads the project's own strategy documents: brand voice profile, positioning canvas, ICP definitions, and the competitive landscape analysis.
Per-item output: - Two-line summary - Relevance score 1–5 with reasoning (competitor claim / market signal / content angle / noise) - The angle — most often the systems-first vs transcript-first counter-position, an SA or UK spin, or an explicit "no view, skip" - A drafted hook in Dean's voice, so it's judgeable in three seconds
Only surface 3+. Everything else lands in a rolling log that's never read unless wanted.
Positioning context the judge must carry¶
- Retired framing: "meeting prep is an overlooked problem nobody is addressing." As of mid-2026 this is demonstrably false and signals a lack of homework.
- Live differentiation: competitors build prep primarily from meetings they recorded, so their output is thin until the advisor has months of history in their tool. The counter is prep synthesised from the advisor's existing systems — full value in week one.
- Whitespace: South Africa (effectively untouched), UK (contested by Marloo but not saturated), and the solo/small price band as incumbents drift enterprise.
7. Output Shape — Built Around the Approval Workflow¶
research/monitoring/
sources.yaml # the watchlist
state.json # seen-hashes, committed each run
INBOX.md # needs-your-call items, with checkboxes
archive/2026-07-27.md # daily digest snapshots
content/briefs/ # approved items become contractor briefs
The loop:
- Email lands at 06:30 with 1–3 candidates — what happened, why it touches the positioning, the angle, a drafted hook
- Dean ticks
- [x]on the items worth pursuing inINBOX.mdand pushes - Next pipeline run detects checked items and expands each into a full brief in
content/briefs/— angle, key points, source links, voice constraints pulled from the brand voice and positioning docs - The contract writer works from the brief
Git is the workflow engine; there is no UI to build.
Upgrade path: if ticking a checkbox in a file is too much friction, that is precisely the justification for the Azure Function — approve/reject URLs embedded in the email, function commits the decision. Do this only after the digest proves useful.
8. Two Implementation Details That Decide Whether This Works¶
Two-stage judging. Route every new item through a cheap model (Haiku) for relevance scoring against the ICPs and positioning — high volume, low cost. Only 3+ scorers go to Opus for the angle and hook. Keeps running cost in the low single-digit dollars per month rather than tens.
Strip boilerplate before hashing. Naive HTML hashing on Tier-B pages fires on every rotating testimonial and CSRF token. Extract the main content node, normalise whitespace, then hash. Otherwise you get a "Jump changed their pricing page" alert every single day and stop trusting the system — which kills it.
9. Build Order¶
- Request the Azure DevOps free-parallelism grant (do this first — it has a lead time)
sources.yamlseeded with the competitor and publication list in §5, Tiers A and B only- Collector script — fetch, boilerplate-strip, hash, diff against
state.json, emit new-items queue - Two-stage judge prompt, carrying the positioning context from §6
- Digest template (
INBOX.md) and contractor brief template (content/briefs/) - Two pipeline YAMLs — daily digest and tripwire
- Fill in secrets: Anthropic API key, SMTP or Resend/SendGrid/Azure Communication Services credentials
- Confirm the source list, then first run
Deferred to v2: Tier C social monitoring via paid feed service; Azure Function with one-click approve/reject.
10. Open Items¶
- [ ] Verify which competitor sites actually expose RSS (assumed, not confirmed)
- [ ] Decide email transport — Resend, SendGrid, or Azure Communication Services
- [ ] Confirm the influencer list beyond publications — named individuals to watch were never enumerated
- [ ] Confirm SAST vs UTC for the cron expressions (Azure Pipelines cron is UTC;
30 4= 06:30 SAST) - [ ] Decide whether the monitoring folders live in the marketing repo or a separate one
Appendix: Prompt to Resume This Work in the New Repo¶
I want to build the competitor/influencer monitoring system described in
MONITORING-SYSTEM-HANDOFF.md. Read that file first. Start at build step 2 — scaffoldsources.yaml, the collector, the two-stage judge prompt, the digest and brief templates, and both Azure Pipelines YAMLs. Use the brand voice, positioning and ICP documents in this repo for the relevance filter context. Leave secrets as placeholders and let me confirm the source list before the first run.