u/Shawntenam

Meta Ad Library + Claude Code: how I built a competitor positioning scraper, what the 18-column taxonomy looks like, and what I broke first.
▲ 5 r/ClaudeGTM+2 crossposts

Meta Ad Library + Claude Code: how I built a competitor positioning scraper, what the 18-column taxonomy looks like, and what I broke first.

I built a Meta Ad Library scraper for competitor positioning research. Pulls every active creative from a competitor's page, then runs Claude Code as a subprocess to classify each ad through an 18-column taxonomy (offer type, hook style, claim, CTA, audience signal, format, etc).

Output is a table you can read in 10 minutes. Tells you what story a competitor is paying to tell, on which audience, with which hooks. The Meta Ad Library is free and legally scrapeable. Most operators either don't know it exists or clicked through once and bounced because reading 400 ads by hand is brutal.

Pushed it as Chapter 15 of an open repo I'm building called gtm-coding-agent. Repo is a set of GTM workflows you can run from a CLAUDE.md file plus a script.

Direct link to the chapter: github.com/shawnla90/gtm-coding-agent/blob/main/chapters/15-meta-ad-intelligence.md

Four mistakes I made first, posting because they'll save you a weekend:

  1. Multiplexing the classifier across multiple competitors in one pass. Output degrades fast. The classifier confuses which company a creative belongs to and starts attributing the wrong claims. One pass, one competitor, every time.

  2. Going broad on scope. Pointing it at "all CRM vendors" produces a mess that tells you nothing actionable. One competitor, one campaign theme per pass.

  3. Trusting the full 18-column taxonomy. The first time I ran it I realized only six columns were actually shaping a decision. The other twelve were taxonomy padding. Cut what you don't use. Ask Claude how to adapt it for your category.

  4. Scaling before evaluating. Run it once on a competitor you know cold. Sanity check the table against what you already know. Then scale to ones you don't.

Claude Code as a subprocess is a pattern that took me a while to land on. The agent is not writing the analysis. It is running classification at scale. The judgment call about what to do with the table is still operator work. That distinction is the whole reason it works.

Shawn Tenam

Repo is public. Onboarding asks six questions and routes you to a chapter that matches your role:

git clone https://github.com/shawnla90/gtm-coding-agent.git ~/gtm-coding-agent

cd ~/gtm-coding-agent

claude

> help me set up

Happy to answer questions or take feature requests. or If you've built something similar I'd want to compare notes on taxonomy structure.

u/Shawntenam — 2 days ago

Which Devil Fruit would you choose, but there’s a catch

You can’t pick the obvious ones.

No Nika.
No Ope Ope.
No Gura Gura.
No Yami Yami.
No “I’d pick a Logia so nobody can touch me” answers.

I get it.😅

And obviously, if you know Oda, he’d pick the invisibility fruit. Most of us probably would too.

But I want the deeper answers.

The weird slept on fruits.
ones you actually have to think about.

Not which fruit is the strongest?

More like:

Which fruit fits how you’d actually move through the world?

I’m going with the Gasha Gasha no Mi, the Clank-Clank Fruit.

The ability to take objects apart and rebuild them into machines, armor, weapons, vehicles, or whatever structure you can imagine is kind of insane if you think like a builder.

What fruit are you picking if you actually have to think about how you’d use it, not just how broken it is?

u/Shawntenam — 5 days ago

Sharing a "workflow" from this weekend.

Streamed Silksong on Twitch and wanted automatic death/kill tracking on my overlay without using any game API or Twitch extension.

Claude Code built the whole thing in a couple back and forth sessions:

full disclosure this is the technical part written by claude...

The Silksong save file is encrypted binary at a known path. I pointed Claude Code at it and said "figure out the format and build me a counter."

It wrote a decryptor, then a Python daemon that polls the file every 5 seconds via mtime check. When the save changes, it decrypts and extracts two things:

  • Kills: sums playerData.EnemyJournalKillData.list[*].Record.Kills across all journal entries (set operation, authoritative)
  • Deaths: detects when playerData.HeroCorpseMarkerGuid changes value -- each death generates a fresh GUID, so a GUID change = one death

State persists in a JSON file with atomic writes (temp file then rename). Restarts don't double-count. Output goes to counters.json, and an OBS Browser Source polls that file every second to render the overlay.

https://reddit.com/link/1t43y46/video/xlbb4hutm8zg1/player

No SDK. No API calls. No overlay service subscription. Just file-watching, state reconciliation, and a 50-line HTML file reading local JSON.

Total stack: save_watcher.py (~200 lines), a shell wrapper for daemon start/stop/status, and an HTML overlay. The architecture is the same pattern as any "watch a folder for changes, extract data, render output" pipeline.

I know how this looks. GTM founder starts streaming games. Side quest energy. and yet...

All of it was built with Claude Code from the terminal.

The learning tax on every one of those things.

OBS WebSocket protocol, audio compression ratios, save file reverse engineering, overlay rendering. would have been days of documentation and YouTube tutorials.

With a coding agent, it was a weekend. That is the actual point.

If you are a founder trying to build content distribution and you think streaming or video production is "too technical" or "not worth the time investment". the math changed.

The tools are open source. The coding agent handles the parts that used to require specialized knowledge.

I am not leaving GTM to become a full-time streamer.

The stream IS the GTM play. It is live, synchronous content where people can watch real workflows, ask questions, and see how things actually get built.

reddit.com
u/Shawntenam — 9 days ago
▲ 10 r/ClaudeGTM+2 crossposts

Sharing a workflow I put together this week.

Wanted to build a lead list of every Y Combinator and a16z portfolio company + their founders for outbound.

Instead of paying for a scraper service, I had Claude Code write the whole pipeline: YC companies: Turns out the YC directory is all public.

The data lives as raw JSON on the backend. Claude Code wrote a headless fetch script that pulls it directly - no browser needed, no rate limiting issues.

Got ~4,000 companies with metadata in about 2 minutes.

a16z portfolio: This one needed Playwright since the site renders client-side.

Claude Code wrote a script with natural timing (random delays between navigations) to avoid getting flagged.

Pulled their full portfolio across funds. Enrichment: Piped both lists through Apollo.io public API to match founder names → emails and fill in company size/revenue data.

Total pipeline cost: $0 beyond my existing Claude Code subscription.

Claude Code figured out the YC backend was serving JSON before I even thought to check.

It just went headless on its own because it recognized the data didn't need a browser render.

If anyone wants to try something similar - check whether a "dynamic" site actually serves its data as static JSON before spinning up Playwright.

Saves a ton of time.

u/Shawntenam — 12 days ago

Every tool in the GTM stack sells "intent signals."

What they actually mean: company raised money, someone changed jobs, org is hiring SDRs. Org data. Commodity data. Every competitor has the same feed, running the same play on the same list.

What tools call "intent" is really qualification. Useful after you've already found someone actively looking. Not the thing that finds them.

Real signal is when an individual types the need out loud. A person on Reddit saying "we just ditched 6sense, need a signal layer that doesn't suck."

A LinkedIn thread comparing Clay alternatives.

A founder in a community asking if anyone's built custom enrichment for their stack.

Individuals, in their own words, needing something right now. That gap between "might need" (six org signals) and "does need" (they just said it) is where all the value lives.

If stacking six org signals is your whole outreach plan, you already lost.

While you're filtering the Clay table for accounts hitting 4 of 6, the person in r/sales typing "we need a new CRM tonight" is being sold by whoever replied first.

The actual play isn't complicated. 30 minutes a day reading where your ICP actually talks. Build a keyword watch list for the language that shows up right before someone switches tools.

A lightweight scanner (MCP works fine) pointed at the 4-5 subs where your people post, pulling the last 24h every morning. Ask your best customers where they were lurking when they were looking for you.

how are yall reasoning about this?

Anyone building a clean capture pipeline for surface-level social intent? What's the rough shape? Still running the org-signal stack, or somewhere between?

Shawn Tenam ⚡️

reddit.com
u/Shawntenam — 20 days ago

Keep getting asked the difference between these three. Writing it once.

All three are in the "identify the actual person who visited your site" category. All three integrate with Clay. None of them have native Claude Code or MCP integrations yet. The real 2026 unlock isn't identification. It's stitching the visit back to everything else you know about the person and account.

MidBound. Deterministic person-level ID, ICP scoring baked in, Clay integration native. $99/mo starter for 300 identified visitors, 14-day trial. Advising the co-founders, so grain of salt, but the tech is real. Best fit if your motion is CRM + sequencing and you care about accuracy over raw volume.

Vector. Contact-level identification plus direct sync to ad platforms (LinkedIn, Meta, Google, Reddit, X). Transparent about match rates: 90% LinkedIn, 30-45% smaller platforms. $399/mo Reveal, $3K+/mo Target, annual commitment on Target. Best fit if retargeting is the primary play.

RB2B. Fastest time to first lead in the category. Free tier is company-level only (their marketing is fuzzy on this). Person-level starts at $79/mo. Slack-first, US-only per GDPR. Best fit if your motion is reactive alerts on inbound.

Trade-offs, plainly stated:

Budget: RB2B $79 < MidBound $99 < Vector $399 to start.

Workflow: RB2B is Slack-native. MidBound is CRM + sequencing. Vector is ad platforms.

Geography: RB2B US-only. MidBound and Vector broader.

Accuracy posture: MidBound leans hard on deterministic + verified email. Vector is most transparent about variable match rates per platform. RB2B is less explicit about accuracy claims.

What I'm building on top.

A visitor-intel dashboard in Next.js + Recharts + SQLite with Claude Code doing orchestration. Treats the vendor as a data source, not the final UI. Heat maps by page, geography drilldown, visitor-to-deal timelines, ICP cluster overlays.

One specific observation from building this. The category is mostly solved at the identification layer.

Where it's still wide open is the layer that connects the visit to everything else you know about the person. That's where a dashboard on top of any of the three tools pays back, regardless of which one you pick.

Good luck out there. Category matters more than the tool at this stage.

u/Shawntenam — 26 days ago