Google keeps a public ad library: the Ads Transparency Center. Type a company name and you can scroll through the ads it runs on Search, YouTube, Display and Shopping. It is a goldmine for competitor research, with one catch: it is an infinite wall of cards. There is no export, Search ads are shown only as screenshots, and comparing two companies means a lot of squinting.
So I exported it instead. Below: what 50 of the newest ads from monday.com and Asana (25 each) say about how two direct competitors are fighting for the same buyers, and how to run the same analysis on your own competitors in a couple of minutes.
Disclosure: I built the scraper used here (link at the end). The numbers are from a run on 10 October 2026; ads change daily.
What the export looks like
Each ad becomes one row: advertiser, format (text, image, video), the ad copy (Search ads are read from the screenshot with OCR), the YouTube video ID for video ads, the countries it ran in, and the first shown / last shown dates plus the number of days it has been running. That last field turns out to be the most interesting one.
The whole pull — 50 ads, 29 with extracted copy, two advertiser profiles — took under two minutes and cost about $0.19.
Finding 1: they are not even playing the same format
| monday.com | Asana | |
|---|---|---|
| Newest 25 ads | 16 video, 9 search text | 25 search text |
| Median days running | 263 | 122 |
| Oldest ad still running | first shown Oct 2021 (1,812 days) | first shown Jun 2023 (989 days) |
Among their 25 newest creatives, monday.com spends most of its effort on YouTube video; Asana is almost entirely in Search. If you sell in this category and only watch competitors' search ads, you would miss most of what monday.com is doing.
Finding 2: the longest-running ads are the ones to study
A useful rule of thumb in ad research: advertisers rarely keep paying for an ad that does not perform, so ads that have been running for months or years are probably working.
monday.com's oldest still-active search ad was first shown in October 2021:
What Makes monday.com Better? Choose monday.com to Build Workflows Perfectly Customized to Your Team's Needs.
Its next-longest runners lean on the same idea, "100% customizable", plus a scheduling angle ("The #1 Online Schedule Platform"). Asana's longest runner (since June 2023) is a free-tool hook: "Free Calendar Tool for Teams – See Asana in Action". Five years of one message is a strong signal of what converts for monday.com; Asana keeps coming back to free templates and tools as the entry point.
Finding 3: both are pivoting to AI and agencies
The newest creatives tell you where each company is heading:
- Asana, September 2026: "Agentic Work Management — drafts context-aware briefs, summaries, communications and slides from live Asana data" and "Asana Client Management — a branded client portal".
- monday.com, July 2026: "CRM for Marketing Agencies — Win more clients for your marketing agency. Focus on deals, let AI do the admin", plus new Spanish-language calendar ads ("Calendario Compartible Equipos").
Both are now selling AI that does the busywork, and both are going after agencies. monday.com is also localising (Spanish), while the Asana ads in this sample that list countries were shown most often in Germany and France.
How to do this for your own competitors
You can reproduce the exact run from a ready-made example — monday.com vs Asana — and change the names. The input is just:
{
"searchQueries": ["monday.com", "Asana"],
"maxAdsPerAdvertiser": 25,
"includeAdText": true,
"ocrAdText": true
}
You can also search by domain ("domains": ["yourcompetitor.com"]) to catch every advertiser linking to a site — handy for spotting resellers or people bidding on your brand.
Then rank the export the way I did above:
import pandas as pd
df = pd.read_json("dataset.json")
ads = df[df["type"] == "ad"]
# Format mix per competitor
print(ads.groupby(["advertiserName", "format"]).size().unstack(fill_value=0))
# Longest-running ads = the messages they keep paying for
cols = ["advertiserName", "format", "daysShown", "firstShown", "adText"]
print(ads.sort_values("daysShown", ascending=False)[cols].head(10).to_string())
# What changed recently
print(ads.sort_values("firstShown", ascending=False)[cols].head(10).to_string())
For ongoing monitoring, schedule the run weekly with startDate set to last week (only ads shown in that window) and compare the creativeIds with the previous export: anything new is a creative launched since your last check — the closest thing to a "competitor just started a new campaign" alert.
Caveats
- No spend or impressions. The Transparency Center shows what ran, where and when, not budgets or results. "Days running" is a proxy, not proof.
- OCR is imperfect. Search ads are published as images; the text is read with English OCR. Expect small artifacts ("Al" for "AI", stray "Sponsored" labels), and non-Latin ads come out garbled.
- Regions are partial. Google lists countries for some ads only.
- Fresh data, moving target. These are the 25 newest creatives per advertiser on the day of the run, not their full history.
The scraper is open source (GitHub) and runs hosted on Apify, pay per ad: Google Ads Transparency Center Scraper. If you want the technical side — the RPC endpoints behind the Transparency Center and the OCR pipeline — I wrote that up in an earlier post.
Top comments (0)