Keeping an eye on competitors usually means five tabs: the Meta Ad Library, the TikTok Ad Library, their pricing page, their store and their careers page. Each one is easy to check once and easy to forget the week after. What you actually want is a short note per competitor that says what is new, and silence when nothing is.
This post sets that up as a scheduled job.
Disclosure: I'm Aurelix, and I built Competitor Watch. It's a paid tool (prices below).
What it watches
You list each competitor once, as its domain (allbirds.com). The tool finds the rest itself and remembers it between runs:
- Meta ads: the brand's Facebook page, accepted only when its active ads link to that domain, so a same-name page of another business is never used.
- TikTok ads: the TikTok Ad Library, which covers the EU/EEA, the UK, Switzerland and Turkey.
-
Web pages you pick (
/,/pricing,/collections/new-arrivals): text changes, with prices that appeared or disappeared called out, so a pricing edit reads like$29 → $35. - Shopify products: new products and price changes per variant, from the store's public product feed.
- Jobs: new postings on Greenhouse, Lever, Ashby, SmartRecruiters, Workable, BambooHR or Workday.
The first run saves a baseline. Every later run with the same stateKey returns one competitor_report row per competitor with a summary in plain words and counts (new_meta_ads, pages_changed, new_products, price_changes, new_jobs), plus one change row per new item. Nothing is reported twice.
The weekly digest
pip install apify-client
import os
from collections import defaultdict
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("aurelix/competitor-watch").call(
run_input={
"competitors": ["allbirds.com", "glossier.com", "brooklinen.com"],
"sources": ["meta_ads", "website", "shopify", "jobs"],
"watchPaths": ["/", "/collections/new-arrivals"],
"stateKey": "client-acme",
}
)
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
changes = defaultdict(list)
for r in rows:
if r["record_type"] == "change":
changes[r["competitor"]].append(r)
for report in (r for r in rows if r["record_type"] == "competitor_report"):
print(f"\n{report['summary']}")
for c in changes[report["competitor"]][:5]:
if c["change"] == "price_change":
print(f" price: {c['title']} {c['previous_price']} -> {c['price']} {c['currency']}")
else:
print(f" {c['change']}: {c['title']} {c['url'] or ''}")
Run it once to save the baseline, then schedule it weekly (save the input as a task in the Apify Console and click Schedule). For a team channel, put a Slack incoming-webhook URL in slackWebhookUrl: each run posts one line per competitor when something is new. For an agency, use one task per client with the client's name as the stateKey, so each watchlist keeps its own memory.
A few input choices that matter:
-
Ads swipe file:
"sources": ["meta_ads", "tiktok_ads"]and a daily schedule. Every new ad is a row with its text, image, start date and a link to the ad in its library. SettiktokCountryto the European market closest to yours. -
Pricing pages: give a competitor as
{"domain": "notion.so", "pages": ["/pricing"]}to watch pages that only matter for that one. -
Shopify stores:
/collections/new-arrivalson the home domain plusshopifycatches launches, sales banners and price cuts in one run.
Why this tool
- One domain per competitor, and one report: new Meta and TikTok ads, text changes on the pages you pick, Shopify launches and per-variant price changes, and new job posts.
- $0.03 per competitor checked plus $0.001 per new item, so a quiet week costs $0.03 per competitor.
- What it doesn't cover: Google ads and news mentions.
If you only need every ad a brand runs (not only the new ones), with EU reach and targeting fields, the Facebook Ad Library Scraper is the better fit. For that route, see Monitor your competitors' Facebook and Instagram ads with Python.
Limits
- At most 30 ads per competitor and ad library per run. A brand that launches more than 30 ads between runs shows the newest 30; run it more often.
- TikTok covers the EU/EEA, the UK, Switzerland and Turkey only, and is the slowest source.
- Website changes are text changes. Images, layout and JavaScript-only content are not compared; a page that needs JavaScript is reported in the note and not charged.
- Shopify stores only, up to 5,000 products per store and run.
- Jobs only on the seven systems above. A company on another system gets no job results, and that search still counts as a competitor check.
- No Google ads, news, traffic or keyword data.
- Up to 25 competitors per run; use several state keys for longer lists.
Cost
At the time of writing the Store page lists $0.03 per competitor checked ($0.027 on paid plans), $0.001 per new item and $0.015 per run. A quiet week costs $0.03 per competitor. Five competitors checked daily with about 4 new items a day come to about $5.07 a month. The first run only saves the baseline, so it charges the per-competitor fee and nothing per item. Apify's free plan includes $5 of credit a month, about 160 competitor checks.
Top comments (0)