adlibrary.com Logoadlibrary.com
Share
Competitive Research,  Guides & Tutorials

Build a DTC Competitor Watchlist That Maintains Itself

A competitor watchlist in your head goes stale weekly. Build one on saved advertisers and scheduled sweeps instead, and it stays current without anyone remembering to check.

DTC competitor watchlist dashboard with brand cards and scheduled sweep calendar

Ask any DTC founder to name their five scariest competitors and you get a confident answer in seconds. Ask what those five brands launched on Meta last Tuesday and the confidence evaporates. That gap is what a DTC competitor watchlist closes: a fixed roster of 5-15 brands, resolved to their advertiser IDs once, swept by a scheduled script, and logged where the whole team can see it.

TL;DR: A DTC competitor watchlist that lives in your head goes stale within a week. Build one that maintains itself instead. Pick 5-15 brands across three buckets (direct, aspirational, adjacent), resolve each to its Meta, Google, and LinkedIn advertiser IDs with one free API call, save them once, then run scheduled curate sweeps that pull every new ad into a log automatically. Add a monthly portfolio review and the system survives founder vacations, team handoffs, and your own forgetfulness.

This guide walks through the full build: brand selection, ID resolution, saved advertisers, the sweep script, the logging schema, the monthly ritual, and the handoff path from founder-run to team-run.

Why a DTC Competitor Watchlist in Your Head Goes Stale

Most founders already do competitor research. They do it in browser tabs, at 11pm, when anxiety strikes. The problem is not effort. The problem is that memory-based monitoring fails in four specific ways.

Nobody owns the checking. When "keep an eye on competitors" is everyone's job, it is nobody's job. The Meta Ad Library is free and open, yet weeks pass between visits because no calendar slot exists and no owner is named. The research happens in bursts, usually triggered by a board meeting or a bad week of CPMs, which is exactly when it is least useful.

Nothing gets logged. You saw that competitor's new UGC ad two weeks ago. Was the offer 20% off or a free gift? Was it the same landing page? Memory flattens detail, and detail is where competitive intelligence actually lives.

Platforms multiply faster than habits. Your rivals run Meta, TikTok, YouTube, and Google simultaneously. Checking one library feels like diligence while three quarters of the picture stays dark. The manual version of monitoring competitor ads across all of them costs hours per brand per week.

You sample what interests you, not what threatens you. Founders gravitate to the brands they admire and skip the boring rival quietly eating their CPMs. A watchlist forces coverage. A head does not.

The fix is structural, not motivational. DTC marketing moves too fast for willpower. You need a system where the default state is "swept and logged" rather than "checked whenever someone remembers."

Pick the 5-15 Brands: Direct, Aspirational, Adjacent

A watchlist with 40 brands produces noise nobody reads. A watchlist with three misses the flanks. The workable range for a D2C operator is 5-15, split across three deliberate buckets.

Direct competitors (5-8 brands). Same product category, same buyer, same Meta auctions. These are the brands whose ads show up when your customer searches your category. You want every launch and every offer change logged. If your head of growth could only watch one bucket, it is this one.

Aspirational brands (2-4 brands). Companies two or three sizes up running the playbook you want in 18 months. You are not reacting to them. You are studying how the fastest-scaling DTC brands structure creative volume, seasonal pushes, and format mix. Their tests are funded by budgets you do not have yet, which makes their survivors free R&D.

Adjacent brands (2-3 brands). Different product, same customer. A sleep-supplement brand and a weighted-blanket brand sell to the same exhausted 34-year-old. Adjacent brands teach you hooks and angles before your direct rivals copy them. Some of the best cold-audience hooks working in DTC right now jump categories within weeks.

A worked example. A sleep-supplement brand doing €150k/month might build its DTC competitor watchlist like this: six direct rivals in the magnesium-and-melatonin aisle, three aspirational brands (a nine-figure supplement company, a sleep-tech hardware brand, a subscription wellness giant), and two adjacent picks (a weighted-blanket brand and a blue-light-glasses brand). Eleven slots, three lenses on the same customer, zero overlap in what each bucket teaches.

Before a brand earns a slot, verify it actually advertises at meaningful volume. Spot-check it in the Meta Ad Library and the Google Ads Transparency Center. A brand running four ads is not worth a recurring sweep slot. A brand running 80 is.

Cap the list at 15. Every brand you add dilutes review attention and adds sweep cost. The discipline of cutting a brand to add a brand is itself a useful quarterly exercise, and it keeps your DTC competitor tracking focused on threats rather than curiosities.

Resolve Each Brand to Its Advertiser IDs, Once

Here is the step most manual trackers never do, and the reason their tracking stays fragile: a brand is not one account. Nike alone operates Nike, Nike Football, Nike Run Club, and more. Searching by brand name every week re-does this resolution work badly, every time.

Resolve each watchlist brand to its platform IDs once. The AdLibrary API does this with a free call that fans out across Meta, Google, and LinkedIn in parallel:

bash
curl -G "https://adlibrary.com/api/advertisers/search" \
  -H "Authorization: Bearer adl_your_api_key" \
  --data-urlencode "q=Ridge" \
  --data-urlencode "country=US"

The response returns candidates per platform plus a best_match that only appears when at least two platforms agree on the normalized brand name, with a confidence score attached. You get the Meta page ID, the Google AR... advertiser ID, and the numeric LinkedIn company ID in one pass. The full walkthrough lives in how to find any brand's advertiser ID across Meta, Google, and LinkedIn.

Compare that with doing it natively. Meta's own Ad Library API is free, and worth using if political and social-issue ads on Meta are all you need. For commercial DTC ads it returns far less: coverage outside the EU and UK is limited to political and issue ads, access requires identity verification and an app, and tokens expire every 60 days. The paid route exists because the free route was built for transparency, not for competitor ad research. The limitations of Meta's Ad Library API are well documented and worth reading before you commit either way.

Two practical details. The country parameter defaults to US, so set it to your actual market when resolving regional brands, since the same brand name can resolve to different pages per market. And when a brand operates several Meta pages, collect all of them now. The save step in the next section accepts arrays of IDs per platform precisely so one watchlist entry can hold a brand's whole account sprawl.

Budget 20 minutes to resolve all 15 brands. Resolution calls are free, so check every candidate carefully: a wrong page ID pollutes every sweep that follows.

Save Each Advertiser So the Watchlist Outlives Your Memory

Resolution gives you IDs. Saving turns them into durable watchlist entries. One POST per brand:

bash
curl -X POST "https://adlibrary.com/api/advertisers" \
  -H "Authorization: Bearer adl_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Ridge",
    "domain": "ridge.com",
    "meta_page_ids": ["123456789"],
    "google_advertiser_ids": ["AR01234567890123456789"],
    "linkedin_company_ids": ["7654321"]
  }'

Saving is free. Each saved advertiser holds all of a brand's accounts per platform, so the Nike problem from the last section is solved at the data layer: every sweep automatically covers every account you attached. When a competitor spins up a new page, you PATCH the ID into the existing entry rather than rebuilding anything.

This mirrors how saved ads work in the AdLibrary app itself, except the saved object here is the advertiser, and the consumer is your script rather than your browser. The roster is the watchlist. Your memory is no longer load-bearing, which is the entire point.

With 5-15 brands saved, the setup phase is done. Everything from here on runs on a schedule.

Sweep log for a DTC competitor watchlist filling itself with competitor ad entries

Schedule the Curate Sweep

The sweep is one curate call per saved advertiser. It fans out to Meta, Google, and LinkedIn in parallel, dedupes the results by ad key, and hands back every recent ad plus pagination cursors. The whole watchlist sweep is a short loop:

python
import requests

KEY = "adl_your_api_key"
H = {"Authorization": f"Bearer {KEY}"}
BASE = "https://adlibrary.com/api"

advertisers = requests.get(f"{BASE}/advertisers", headers=H).json()["advertisers"]

for adv in advertisers:
    r = requests.post(f"{BASE}/advertisers/{adv['id']}/curate", headers=H, json={})
    data = r.json()
    for platform in ("meta", "google", "linkedin"):
        for ad in data.get(platform, {}).get("ads", []):
            log_ad(adv["name"], platform, ad)  # your sheet, DB, or Slack

Costs are predictable. The first curate call per advertiser opens a session and costs one credit. Continuation calls that pass the returned cursors back are free within the 30-minute session window, so paginating deep into a heavy advertiser does not multiply the bill. Two practical notes: the Google block requires a Pro or Business plan, and the API allows 10 requests per minute, so add a short sleep between brands and honor the Retry-After header on any 429.

The first call for each advertiser also returns a sources list, one entry per saved account with its ad count, which doubles as a health check on your ID resolution. A source showing zero ads for three consecutive sweeps means either the brand paused that account or you saved a stale ID, and both are worth a look. If two sweeps collide on the same advertiser, the API returns a 409 conflict rather than double-charging, so a retry after a few seconds is all the error handling the loop really needs.

Then put it on a clock:

cron
0 6 * * 1,4  /usr/bin/python3 /opt/watchlist/sweep.py

Monday and Thursday at 6am, fresh competitor ads land in your log before standup. A sensible cadence for a DTC competitor watchlist: twice weekly for direct competitors, weekly for aspirational and adjacent brands. The Meta ads cron job guide covers hosting and failure handling, and if you prefer visual builders over scripts, the same sweep runs as an n8n competitor monitoring workflow with zero code. More patterns live in the Python ad library API cookbook and the broader guide to automating competitor ad monitoring end to end.

This is the maintains-itself part. Nobody remembers to check. The checking happens anyway, through API access that does not care who is on vacation.

What to Log Per Sweep, and the Signals That Matter

A sweep that dumps raw JSON into a folder is archaeology, not intelligence. Log a fixed schema per ad so week-over-week diffs become trivial:

  • ad_key: the stable identifier across calls. Dedupe and store on it, per the API's own best practices.
  • Brand and platform: which watchlist entry, which network.
  • Format: image, video, carousel, or collection.
  • first_seen and runtime: when the ad appeared and how many days it has survived.
  • Impressions: Meta reports these as ranges, so treat them as magnitude bands rather than precise counts.
  • Estimated spend and heat score: the spend figure is an estimate, and heat is a 0-1000 momentum score. Both are sorting signals, not accounting data.
  • Landing page URL: offer changes show up here first.
  • Creative URL: so the ad is reviewable after the platform takes it down.

In practice one logged row reads like: meta_84412... | Ridge | facebook | video | first seen May 28 | 15 days | 100k-125k impressions | est. spend mid-four-figures | heat 640 | /carry-better-lp-v3. Fifteen seconds of scanning tells a media buyer more than an hour in a browser tab, because the row carries history and every prior sweep sits one line above it.

Where the log lives matters less than that it appends. A Google Sheet works to about 5,000 rows before scrolling gets painful. Airtable adds per-brand views and survives to roughly 50,000. Past that, a single SQLite file with three saved queries beats both and costs nothing. Pick whichever your least technical reviewer will actually open, because a log the head of growth never reads is the same as no log. Migrating later is one CSV export, so the first choice is not a commitment.

Four diffs against last sweep's log do most of the analytical work. New ad_keys mean launches. Ads crossing the 21-day runtime mark are proven: duds get killed in week one, so survivors signal conversion. A landing page URL change on an existing ad means an offer test. A format shift, say a brand suddenly going 80% video, means a strategy change worth a closer look at creative fatigue cycles on their account and yours.

Route the interesting rows somewhere visible. A Slack alert for new competitor ads takes 30 minutes to wire up, and an Airtable swipe file that files itself turns the log into a browsable swipe file for the creative team. When a competitor's volume jumps, run their numbers through the ad spend estimator to gauge how big the push really is.

The Monthly Portfolio Review Ritual

Sweeps collect. Humans decide. Block 45 minutes on the first Monday of every month, with the head of growth as owner, and run a fixed agenda:

  1. Volume per brand, month over month. Who scaled ad count, who went quiet? Quiet is information too. A direct competitor cutting volume by half may be reallocating to a platform you are not watching.
  2. The survivor list. Every ad now past 30 days of runtime, across all brands. This is the closest thing to a leaked "what converts in our category" report you will ever get.
  3. Deep teardown of the top three. Run the standout creatives through AI ad enrichment. One credit per ad returns a scene-by-scene transcript, the persuasion mechanics, and a 1:1 replication brief tuned to the format. The AI ad analysis at scale guide shows what the output looks like in practice.
  4. Actions, with owners. Each insight becomes a creative brief, a refresh-cadence adjustment, or a budget move sanity-checked against the ad budget planner and your ROAS calculator baselines.
  5. Roster hygiene. Prune brands that stopped advertising, promote a rising adjacent brand to direct, keep the list at 5-15.

The ritual matters because a DTC competitor watchlist without a review cadence degrades into a log nobody opens. The collection happens automatically all month. The 45 human minutes convert it into decisions.

What does good look like after 90 days? Three review cycles in, you should be able to answer questions that were pure guesswork before: which direct competitor refreshes creative fastest, what runtime distribution a healthy account in your category shows, and which adjacent-brand hook crossed into your aisle. Teams that run the ritual consistently report a second-order benefit too: creative briefs stop starting from a blank page, because every brief now opens with three competitor ads that already survived the market's vote.

A useful comparison point for the survivor list: the best DTC Meta ad formats of 2026 maps cleanly onto what you will see surviving in your own category.

Scaling From Founder-Run to Team-Run

Watchlists die at handoff. The founder builds it, the founder leaves for a two-week trip, and the sheet is stale on return. Three stages prevent that.

Stage one: founder plus script. You own the whole loop. Fine up to about eight brands. The trap is keeping resolution choices in your head, so write down why each brand is on the list and which bucket it belongs to. Future-you, six months from now, will not remember why a candle company is on a supplement brand's watchlist.

Stage two: named owner plus SOP. Hand the review to a head of growth with a written standard operating procedure: sweep schedule, log location, alert channel, review agenda, escalation rule ("ping the founder if a direct competitor launches 10+ new ads in a week"). The watchlist now survives any single person.

Stage three: team-run with scoped keys. An account holds up to 10 API keys, so give the growth team, the creative team, and any agency partner their own key. Rotating one key never disrupts the others. Agencies running this for multiple clients turn the same pipeline into client competitor reports that build themselves, one watchlist per client, and the automated competitor ad monitoring use case shows the full architecture.

One more handoff detail that saves a quarter of confusion: version the SOP next to the log, and date every roster change. When the watchlist drops a brand in March, the June reviewer needs to know that was deliberate, or the brand quietly returns and the buckets drift. A one-line changelog entry, "removed BrandX 2026-03-02, stopped advertising," is enough. Watchlists rarely die from missing data. They die from nobody trusting the data that is there.

What never gets delegated to the machine: the judgment calls. The sweep tells you a rival's 9:16 UGC ad survived 47 days. Deciding whether to brief your own version is still a human's job.

What a Self-Maintaining Watchlist Costs

Worked example for a 12-brand DTC competitor watchlist:

  • Direct brands swept twice weekly, others weekly: roughly 80 curate credits per month.
  • Monthly review enrichments, top creatives only: about 20 credits.
  • Occasional keyword searches when a new brand appears in your category: 10-15 credits.

Call it 110-120 credits per month, well inside the Business plan's 1000+ monthly credits at €329/mo, which is also the plan that includes API access, free integration help, and prioritized feature requests. Compare that line item with the alternative: a team member spending five hours weekly screenshotting ad libraries, producing a worse log with no history and no diffs.

Honest caveat, stated plainly: Meta's Ad Library API is free, and if political or social-issue ads on Meta are genuinely all you need, use it and save the money. A commercial DTC category, tracked across platforms with performance signals, is a different job. That job is what the free vs paid ad library API trade-off actually hinges on.

If you want to validate the data before automating, run a few searches on the Starter plan first, then move to Business for the API key.

Frequently Asked Questions

How many brands should a DTC competitor watchlist include?

Five to fifteen, split into direct competitors (5-8), aspirational brands two sizes up (2-4), and adjacent brands selling to the same customer (2-3). Below five you miss flanking threats. Above fifteen, review attention dilutes and the monthly ritual stops producing decisions.

How often should the watchlist sweep run?

Twice weekly for direct competitors, weekly for aspirational and adjacent brands. DTC creative cycles move in days, not months, and a Monday-plus-Thursday cron schedule catches most launches within 72 hours while keeping sweep costs around 80 credits per month for a 12-brand list.

What does an automated competitor watchlist cost to run?

Advertiser resolution and saving are free. Each sweep costs one credit per brand per session, and AI teardowns cost one credit per ad. A typical 12-brand watchlist consumes 110-120 credits monthly, inside the Business plan (€329/mo, 1000+ credits, API access included).

Can the watchlist cover TikTok and YouTube too?

Saved-advertiser sweeps fan out across Meta, Google, and LinkedIn. For TikTok, YouTube, Pinterest, and the rest of the 11 supported platforms, add keyword searches on your category and brand names through the same API, then log results into the same schema. Platform transparency sites like the TikTok Commercial Content Library and the LinkedIn Ad Library work for occasional manual spot-checks.

Do I need a developer to build this?

No. The whole system is one bearer-token API key, about 50 lines of Python, and a cron entry. There is no app review or OAuth flow, and Business plans include free integration help if you get stuck. No-code builders can replicate the entire sweep in n8n, Make, or Zapier.

Your DTC Competitor Watchlist, Running Itself

The brands you fear most are launching ads this week. The question is whether anyone on your team will know by Friday.

A DTC competitor watchlist that maintains itself answers that question structurally. Pick the 5-15 brands across direct, aspirational, and adjacent buckets. Resolve and save each advertiser once, for free. Let scheduled curate sweeps do the collecting, a fixed log schema do the remembering, and a 45-minute monthly review do the deciding. Hand it to a named owner with an SOP when the team grows.

The build takes an afternoon. The system then runs whether you remember it or remember nothing, which is precisely what your in-head watchlist could never do. Start with API access on the Business plan, resolve your first five brands today, and let the first sweep land before next week's standup.

Related Articles

Slack competitor ad alerts dashboard showing competitor ad notifications flowing into a Slack channel with creative thumbnails
Platforms & Tools,  Competitive Research

Slack Competitor Ad Alerts: A 30-Minute Build

Build Slack competitor ad alerts in 30 minutes: an incoming webhook, a Node poll script with first_seen filtering, dedup on ad_key, and cron scheduling.