Brand tracking: follow a brand, get its ads, reach and spend every day
Follow a brand once and adlibrary reads its Meta, Google, YouTube and LinkedIn ad accounts every night: reach, spend, launches, audience, winners and a PDF report.

Sections
Brand tracking is the difference between a bookmark and a daily job. Saving an advertiser used to give you a page id and a shortcut back to search. Everything after that stayed manual: open the library, scroll, guess what changed since last week.
With brand tracking you follow a brand once, adlibrary reads its ad accounts on Meta, Google, YouTube and LinkedIn every night, and the brand page fills up with reach, estimated spend, launches, stops, audience and winners.
This post walks through every mechanism of competitor ad tracking that shipped on 14 September 2026, including how the numbers are computed and where they deliberately stop.
TL;DR: Brand tracking in adlibrary: follow a brand on the Advertisers page and adlibrary crawls its Meta, Google, YouTube and LinkedIn ad accounts daily. You get one brand page with per-platform reach, estimated spend and CPM, launch and stop charts, EU audience breakdown, auto-scored Meta winners, inferred ad sets, semantic search inside the brand, a daily digest, a PDF report, and the same data through the API and MCP. Following is free during beta.
Brand tracking starts with a brand, not an ad account
Type a name into the search box on the Advertisers page. One query runs against three platforms in parallel: Meta page typeahead, Google Ads Transparency Center advertisers, and LinkedIn companies.
Candidates that already belong to a tracked brand carry a "tracked as" tag, so you see at once whether someone else has done the competitor ad research work. If you have never matched ids across platforms before, finding a brand's advertiser id explains what each one looks like.
Pick the accounts that belong to the brand. Several per platform is fine, which matters for a brand like Nike with regional Meta pages. Name it, follow, done. Brand tracking is on.
Brands are shared objects. One canonical brand exists per set of accounts. If any id you picked already belongs to a brand, you follow that brand instead of creating a duplicate, and the extra ids you added become proposals.
Any follower can propose a missing ad account by pasting an Ad Library link or an id. Three followers voting adds it. The creator can rename the brand or set its domain.
Following is free during beta. Unfollowing keeps the brand and its history for everyone else. When we migrated the old Advertisers feature, every saved advertiser was copied into a followed brand once, so nobody starts brand tracking from zero.

What happens the night after you follow
The first crawl starts the first time the brand page is opened. That is deliberate: when we migrated 3,500 saved advertisers, we did not want 3,500 crawls firing at once.
After that, a daily job runs at 02:00 UTC for every followed brand. That job is the whole point of brand tracking: the competitor monitoring runs whether or not you open the app.
Each platform is read differently, because each library discloses different things.
- Meta. The Graph API
ads_archiveendpoint, active ads, all 247 countries requested. Meta only discloses ads shown in the EU under the Digital Services Act. That EU-only rule is why most "estimated spend" figures in this industry are a guess about Europe wearing a global label. To cover the rest, every crawl also walks the public Ad Library website filtered to the United States through a residential proxy, active ads only, up to 8 pages of 200. Both sources are merged by ad id, and each Meta ad is tagged with where it was seen: EU, US, or both. - Google. Ads Transparency Center search per advertiser, active ads, up to 50 pages of 40. Google caps the walk at 1,000 ads per advertiser, so large advertisers are flagged as truncated. Error-page creatives are filtered out.
- YouTube. Google video ads with a YouTube video id get real stats from YouTube: views, likes, comments, duration, upload date, unlisted flag, and the landing page from the description. These refresh in rotation, 300 ads per advertiser per day, oldest first.
- LinkedIn. Company ad library, 25 per page, up to 20 pages.
Every ad brand tracking sees is stored once in a shared corpus, one row per ad across all brands, with its raw payload.
Each row gets a 768-dimension embedding of its text plus a vision description of the creative, and concept tags for hook, offer and format, the same AI enrichment that runs on search results. That corpus is what powers semantic search and winners.
Every day, every active ad gets one snapshot row: reach, reach source, reach growth since yesterday, estimated spend for the day, CPM, days running. Ads that disappear get an end date.
Meta ads additionally get one enrichment call on discovery: landing URL, CTA, publisher platforms, EU audience breakdown by age, gender and country, and declared targeting. Media that fails to load is retried by the daily job.
The brand tracking page: one header, four platforms
The header shows logo, name, verified badge, category, and a short bio Gemini writes from the ads and the page facts. Below it sit the links found in ads (domains, socials) and similar brands. Three buttons: Follow or Following, mute notifications, download PDF report.
The stats row is active ads, reach, estimated spend over the last 30 days (with the number of days actually covered), CPM, followers. Hover any stat and you get the per-platform breakdown with the platform logo, which is what cross-platform ad tracking used to need a pipeline for.
YouTube is split from Google everywhere in the product: header, insights, ads chips, ad sets, launches. YouTube reach is views and is priced as video, so mixing it into Google would distort both.
The ad accounts row lists every account with platform logo, name, active ad count, a link to that platform's ad library, and an "Add account" tile with the open proposals count.

On day one of brand tracking, while data is still coming in, a "Setting up tracking" card lists each step: sources crawled, first snapshot, insights on day two, winners. Click "Notify me when it is ready" and you get a bell notification and a mail when insights land. The page updates live while the crawl runs. No reload needed.

Insights: coverage, platforms, over time, audience
The Insights tab is where brand tracking pays off. It opens with secondary stats: launched in the last 7 days, reach per day, spend per day, running since, and the share of active ads that carry reach data.
A coverage note states what share of active ads report measured reach versus modelled. That line is the honesty check for every number below it.
The platform table breaks down active ads, reach, 7-day reach growth, 7-day spend and CPM per platform.

Three charts follow, toggled by day, week or month, each stacked per platform with fixed colours: Meta blue, Google green, YouTube orange. Hover gives you each platform plus the total.
- Ads launched and stopped. Launches above the axis, stops below. Launches go back to the oldest ad, before your follow date, so you see the brand's cadence, not just what happened since you showed up.
- Reach growth. Daily delta, floored at zero.
- Estimated spend. Derived from reach growth and CPM, explained in the numbers section below.
Together with the ad timeline on each ad, these charts are the brand tracking view for media buyers: cadence first, spend second. The audience block comes from Meta's ad transparency disclosure for the EU: reach by age and gender, top countries by reach, declared gender, declared age ranges, placements across Facebook, Instagram, Threads, Messenger and Audience Network, and declared locations.

Winners (beta): scored on runtime, reach and concentration
The old standalone Winners page is gone. Winners now run inside brand tracking, automatically on brand initialisation and after every daily refresh. Meta ads only for now. Google produced too many "winners" with the current scoring, so it stays excluded until the scoring fits.
Each ad is scored on runtime (days on air), measured reach, and reach concentration, meaning the share of the brand's total reach this one ad takes. Ads are tiered into winner and high-confidence winner. Ads without reach data still score on runtime and concentration.
Grouping runs on the embeddings. Ads at 0.93 cosine similarity or above are one concept: same idea, different cuts. Themes across concepts form at 0.88. Matches with ads from other brands you follow appear at 0.85, capped at six.
For every winner, Gemini writes a breakdown from the creative, its vision description and the concept tags: hook, offer, format, visual angle, why it works. Across all winners it summarises the brand's winning formula as "what wins" chips with percentages.
Views: swipe (default, one winner at a time, variants collapsed at the bottom), tiles, a drawer with the full breakdown, and the ad modal on top.
Winners are saved into the corpus, so semantic search can find ads like this winner across brands. Known limitation: the scoring is generous on evergreen Meta brands, where long-running catalog ads score high on runtime alone. If you want the reasoning behind the tiers, winner scoring explained covers it, and the winning ads framework covers what to do with them.

Ads tab: inferred ad sets, filters, one URL per ad
The Ads tab is where brand tracking turns into creative research. Two views: Ad sets (default) and All ads, plus a "New since last visit" chip. The chip runs on a 30-minute session rule so a reload does not wipe the list. Platform chips carry logos and counts. YouTube here means Google ads with a YouTube video.
Ad sets are inferred, because Meta publishes no campaign ids. A set is the same account plus the same launch day plus the same landing page, or a near-identical creative.
Each card shows ad count, spend per day (sum of the ads' daily estimates), launch date, reach, video count and a sample creative that prefers video and plays on hover. Open a set to get its ads.

All ads filters: format (image, video, carousel), market (All, Europe, United States; Meta ads carry the region tag, Google and LinkedIn count as Europe), launched from and to, and sort by reach, newest or longest running.
Every card carries a platform tag linking to the original ad in the platform's library. YouTube ads get a popout with both the Transparency Center link and the YouTube link. Data-provider ads never link out.
A days-running badge and impressions or reach sit on every card. YouTube ads fall back to the embed player when the mp4 cannot be resolved, show real views, likes and comments, pull the landing page from the video description, and get a download button.
Every ad has its own URL: ?ad=<key> on the brand page, updated as you open and close the modal, and /ads/<key> as a standalone page. The share modal splits "share with adlibrary users" (app link) from "share with anyone" (public share link).
The detail modal shows EU audience data in English and a dash for metrics the platform does not publish, such as YouTube shares or hidden comments.
Search by meaning inside a brand
The search field above the ads embeds your query and matches it against the brand's ads by content. That includes what is visible in the image or video through the vision descriptions, and the transcript, not only the caption. "Black hair" finds the model, not the word.
Two filters: Winners only, and Angle and format. The second exposes the concept tags: hook type, offer type, and format such as talking head, UGC, studio, b-roll, static or carousel.
Tags detected in your query are pre-selected. The same search runs across all followed brands through the API and MCP as search_ads_by_meaning, so brand tracking doubles as a swipe file that fills itself.

Feed, notifications, digest, PDF report
The Feed tab (beta) is brand tracking across your whole roster: new ads from all followed brands, newest first, with an "only new" toggle on by default that marks ads viewed. The bell carries "Insights are ready" for brands you asked about and new ads per brand since your last visit.
E-mail is one daily digest per user with launched and stopped ads per followed brand, sent only when something happened, plus a one-time "your insights are ready" mail. Both go through SES with one-click unsubscribe.
Toggle "Brand updates" in Settings, or mute a single brand from its page. If your Monday starts with a manual competitor check, this digest is the morning routine automation without the script, and it slots into the media buyer daily workflow as the first tab.
The brand tracking PDF report sits next to the bell. Pick a range (7, 30, 90 days, all time, or custom), tick sections (Overview, Platforms, Winners, Over time, Audience, New ads in range), and choose whether to split charts by platform (default on).
It renders server-side with vector charts and the brand logo, and the numbers match the page. Granularity is automatic: day up to 62 days, week up to a year, month beyond. The API and MCP return the same file through get_brand_report.
There is also a small founder note, bottom right, with a short video and a feedback button. Feedback is stored and mailed to Murat.
How the numbers are computed
Every figure in brand tracking follows one rule: never a modelled fallback for spend. Empty beats invented. Here is the chain.
| Figure | Source and formula |
|---|---|
| Reach | In order: YouTube views (when stats were fetched), Meta EU total reach (bucket midpoint), Google BigQuery EU impressions midpoint, else the platform's own impression figure (labelled estimated when modelled). No source means reach is null. |
| Reach growth | Today's reach minus yesterday's, floored at 0. |
| CPM | Meta from page size (followers) or from the daily delivery rate. Google by format: video $10, display $3, text $4. LinkedIn by format times a geo multiplier. All USD. Sanity-check any of them against the CPM calculator. |
| Estimated spend per ad per day | Reach growth / 1000 × CPM. On first observation: lifetime reach / 1000 × CPM / days running. |
| YouTube spend | Lifetime views include organic history, so unlisted videos use views over days since upload, and public videos get no day-one estimate. A day without a stats refresh carries the previous daily rate. A refresh day spreads the growth since the last refresh evenly over that span. |
| Brand totals | Sum over active ads. Brand CPM = spend / reach growth × 1000 on days with delivery. |
| US-only Meta ads | Listed, but no reach, no spend, and not counted in the winners' reach signal. |
If you want the longer argument for why estimated spend is a range and not a fact, estimated ad spend data explained and the guide on tracking competitor ad spend go deeper. The standalone ad spend estimator uses the same CPM logic for a brand you do not follow yet.
Brand tracking API and MCP: the same data, no credits
Everything above is under /api/brands, with an API key or a session. The brand tracking API is the part built for scripts, agents and the Claude Code workflows that already use the search endpoints:
GET /api/brandslists followed brands.POST /api/brandsfollows by name plus ids.PATCH /api/brands/{id}renames,DELETE /api/brands/{id}unfollows.POST /api/brands/{id}/followhandles follow, unfollow, notify and ready.GET /api/brands/{id}/profilereturns facts, stats, per-platform breakdown, sources, proposals and the new-ads count.GET /api/brands/{id}/tracking?granularity=&days=returns totals, series per period including per-platform flows, platform stats, audience and reach sources.GET /api/brands/{id}/tracking/ads?status=&platform=&format=®ion=eu|us|us_only&from=&to=&sort=&set=returns ads from the corpus. No credits.GET /api/brands/{id}/tracking/sets,GET /api/brands/{id}/winners, andGET /api/brands/{id}/report?from=&to=§ions=&breakdown=1for the PDF./api/brands/{id}/proposalsand.../proposals/{pid}/votefor account proposals.GET /api/feed,GET /api/notifications,GET /api/ads/{key}, plus the semantic search endpoint.
The old Advertisers API (/api/advertisers with /curate and /search) is unchanged and keeps its own storage, so existing scripts keep working next to brand tracking. Search candidates gained a tracked field. Every call, error and result is logged with area, code, brand, user and channel (app, api, mcp).
MCP 0.3.0 ships 24 tools. New for brand tracking: follow_brand (accepts a pasted ad library link), list_followed_brands, unfollow_brand, get_brand_profile, get_brand_insights, get_brand_ads (youtube, format, region, launch range, sort), get_brand_sets, get_brand_winners, search_ads_by_meaning, get_feed, get_notifications, get_brand_report.
The hosted connector at mcp.adlibrary.com is already on 0.3.0, and @adlibrary/mcp 0.3.0 is on npm for npx. Old tools such as list_saved_advertisers and save_advertiser are unchanged. If you have not connected it yet, the MCP setup post takes two minutes. API keys remain a Business-tier feature.
FAQ
How do I track a brand's ads across Meta, Google and LinkedIn? Use brand tracking: search the brand on the Advertisers page, tick its accounts on each platform, name it and follow. The first crawl starts when you open the brand page, and a daily job at 02:00 UTC keeps it current.
Is brand tracking free in adlibrary? Following is free during beta. Reading the tracked ads through the API costs no credits. API keys and MCP access need a Business subscription.
Why does a Meta ad show no reach or spend? Meta only discloses reach for ads shown in the EU. An ad seen only in the US is listed with its creative and runtime, but reach and spend stay empty. Nothing is modelled to fill the gap.
How does brand tracking estimate ad spend? Reach growth since yesterday divided by 1,000, times a CPM per platform and format. YouTube uses views as reach. If there is no reach source, there is no spend figure.
Why are there no Google winners yet? The runtime and concentration scoring produced too many Google "winners" to be useful. Google is excluded from winners until the scoring fits its data.
The Meta Ad Library and the Google Ads Transparency Center show you today. Brand tracking shows you the slope: what a brand launched, what it stopped, what it keeps paying for, and who it reaches.
Put the five brands you check by hand every week into brand tracking, put the rest of the list into a competitor watchlist, and let the 02:00 job do the checking.
Want the daily job running on your competitors? Follow your first brand or start a free trial. Plans on the pricing page.
Further Reading
Related Articles

Use adlibrary inside Claude: official MCP server setup (2-minute connector)
Paste https://mcp.adlibrary.com/adl_your_key into Claude → Settings → Connectors. Claude then searches ads, resolves brands, scans winners, and runs AI cre

Estimated Ad Spend Data: How It's Calculated and When to Trust It
Every estimated ad spend number is modeled, not billed. See how impression buckets and CPM models build the estimate, the error bands, and the safe uses.

How to Detect Winning Ads Programmatically (Winner Scoring Explained)
Detect winning ads programmatically: why ad longevity beats vibes, how winner tiers and composite scores work, and a scan-to-brief workflow with real code.

Cross-Platform Ad Tracking: Competitor Ads in One Pipeline
Track competitor ads across Meta, Google, and LinkedIn in one pipeline: resolve IDs, curate with one call, dedup by ad key, report from a unified timeline.

Find Any Brand's Advertiser ID (Meta, Google, LinkedIn)
How to find any brand's advertiser ID on Meta, Google, and LinkedIn: manual lookup routes, one-call API resolution, and the ID mix-ups that kill workflows.

Build a DTC Competitor Watchlist That Maintains Itself
Build a DTC competitor watchlist that maintains itself: pick 5-15 brands, save advertisers once, run scheduled API sweeps, review monthly.

Media Buyer Morning Routine: Automate the Competitor Check
Media buyer morning routine, automated: an overnight competitor scan, diff logic, and a 7:30 Slack digest replace 20 minutes of tabs. Working code inside.
Claude Code + AdLibrary API: Building Agentic Marketing Workflows That Actually Ship
Build unattended competitor intelligence workflows using Claude Code and the AdLibrary API. Includes real API call patterns, two worked examples, and observability practices.