Competitor Ad Strategy Brief — Offers, Messaging & Changes
Pricing
from $15.00 / brand strategy brief
Competitor Ad Strategy Brief — Offers, Messaging & Changes
Turn supplied Meta ad JSON or selected Apify datasets into a brand research report: observed offers, messaging, CTAs, destination URLs, sample changes and test hypotheses. Printable HTML + JSON. Free fictional demo. No AI key.
Pricing
from $15.00 / brand strategy brief
Rating
0.0
(0)
Developer
El Fajad
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Competitor Ad Strategy Brief
Turn one advertiser's supplied ad records into a structured research brief: recurring offers and messaging, calls to action, creative formats, landing-page destinations, differences against a previous sample, and campaign ideas to test. Get a printable HTML report, traceable source evidence and JSON for agency, CRM and AI workflows.
This is an analysis Actor. Bring an existing ad dataset or paste JSON. It does not collect ads, run another paid Actor, fetch landing pages, download creatives or require an AI API key.
Try the fictional demo first
{"mode":"demo"}
Demo always uses the fixed fictional Demo Supply examples. It ignores custom ad records and does not trigger the paid strategy-brief event. Any platform startup event shown in Pricing still applies. Demo output and HTML are clearly marked fictional.
Open Brand brief → Open printable report. Print the HTML page to save a PDF. The demo includes a current/previous comparison so you can inspect the result before supplying your data.
Analyze an Apify ad dataset
{"mode": "dataset","brandName": "Your competitor","currentDatasetId": "YOUR_17_CHAR_DATASET_ID","previousDatasetId": "OPTIONAL_PRIOR_DATASET_ID","observedAt": "2026-09-28T12:00:00Z","previousObservedAt": "2026-09-21T12:00:00Z"}
- Collect/export ads using your existing workflow. For example, Apify's Facebook Ads Scraper returns compatible Meta snapshot fields. Its collection fees are separate and are not included in this Actor's report price.
- Select Select Apify ad datasets as the input mode. Use the dataset picker to select the current and optional prior datasets.
- Supply a label and, if known, collection timestamps. Source rows must describe one advertiser; mixed advertisers are rejected.
- Set maximum charge to at least $15.01 for a real report, then run. Default demo spending settings may be too low for paid mode.
- Open the printable report or use the output JSON.
The Actor has Limited permissions. The storage pickers grant READ only to the datasets you explicitly select. It does not modify source data. In API calls, pass the source IDs in the declared input fields so Apify can apply the same scoped storage permissions.
The first 100 dataset rows are analyzed. If the source is larger, the report explicitly warns about sampling. Filter your upstream collection to a single advertiser before running; this Actor does not search an entire multi-brand dataset for a matching name.
Paste ad JSON instead
{"mode": "inline","brandName": "Example brand","currentAds": [{"id":"sample-1","advertiserName":"Example brand","body":"Save 20% on our starter kit.","cta":"Shop now","landingPageUrl":"https://example.com/kits","format":"IMAGE","isActive":true,"startDate":"2026-09-01"},{"id":"sample-2","advertiserName":"Example brand","body":"Free shipping on your first order.","cta":"Shop now","landingPageUrl":"https://example.com/kits","format":"VIDEO","isActive":true,"startDate":"2026-09-10"},{"id":"sample-3","advertiserName":"Example brand","body":"See our simple everyday routine.","cta":"Learn more","landingPageUrl":"https://example.com/how-it-works","format":"VIDEO","isActive":true,"startDate":"2026-09-15"}]}
These are synthetic format examples, not real advertiser evidence. Inline mode requires 3–100 distinct ads with usable copy. Optional previousAds accepts an earlier array for the same advertiser. Download Normalized ad snapshot from a prior run and reuse that array as previousAds.
Supported fields include the normalized example above and common Meta export fields: adArchiveId / adArchiveID / ad_archive_id, pageId / pageID, snapshot.pageName, snapshot.body.text, snapshot.cards, snapshot.ctaText, snapshot.linkUrl, snapshot.displayFormat, startDateFormatted, isActive and publisher-platform arrays. Media-only rows without usable copy are excluded. Count-only and error rows are not treated as ads.
What you receive
| Output | What it establishes |
|---|---|
| Offers and messaging | Selected English/Arabic phrases observed in ad copy, with counts, sample shares and source evidence |
| CTAs, formats and platforms | Distribution of supplied metadata; missing values remain Unknown |
| Destination URLs | Supplied URLs grouped after removing common tracking parameters; pages were not visited |
| Repeated copy | Exact normalized copy across distinct ad IDs; duplicate rows for the same ID are merged |
| Observed ad age | Supplied start date to observation reference for ads explicitly marked active; no success inference |
| Previous-sample comparison | New to sample, not seen in current sample, creative record changes and explicit status changes |
| Test hypotheses | Suggested experiments based on observed phrases; measure results in your own campaigns |
| Printable HTML | Reviewable report with coverage, exclusions and evidence links |
Source links use supplied public HTTP(S) URLs or a Meta Ad Library link derived from a supplied numeric archive ID. The Actor does not verify that these links are live. For missing IDs, copy fingerprints and input row numbers provide provenance; text changes can then appear as new/missing records.
No “winning ad,” competitor ROAS, spend, conversion, profit or revenue estimate is generated. A long observed age does not prove uninterrupted delivery. An ad absent from your current sample may still be running.
Inputs and limits
| Field | Use |
|---|---|
mode | demo (default), inline or dataset |
brandName | Required for real reports; up to 120 characters |
currentAds, previousAds | Inline JSON arrays, maximum 100 rows each |
currentDatasetId, previousDatasetId | Selected read-only datasets for dataset mode |
observedAt, previousObservedAt | Optional non-future ISO dates; previous must precede current when both supplied |
reportLabel | Optional printable report heading, up to 120 characters |
Maximum input size is 5 MiB. Trim unused large creative/detail fields from inline input. At least three distinct usable ads are needed for a paid report. Missing advertiser identity is reported as an unverified label; known conflicting advertisers are rejected.
observedAt is supplied by you. When omitted, analysis time is used as the age reference and source freshness remains unknown. This Actor does not automatically maintain cross-run history: select a previous dataset or supply previousAds for comparisons.
Pricing and billing
Launch report price: $15 per delivered brand brief, event strategy-brief, covering up to 100 current and 100 previous rows. The Pricing tab is authoritative. Collection by other Actors is separate.
- Fixed fictional demo: no strategy-brief event.
- Real usable report: one strategy-brief event, including when no configured theme is found or no previous snapshot was supplied.
- Empty/unusable input, fewer than three distinct usable ads, mixed advertisers or insufficient budget: no report event.
- Startup event: expected $0.00005 per run at supported memory sizes, including demos and failed input runs.
- No separate dataset-row charge or platform-usage pass-through is intended.
The HTML report is saved before its dataset row is charged. The Actor checks the report-event budget first and skips already-delivered results if the same run is resurrected. Set $15.01 as your run cap for one real report; a cap is not a minimum charge. Plan restrictions may prevent real reports when your available run budget is lower. The fictional demo remains available with a small cap.
Output records
The default dataset contains one brief with brandName, isDemo, analysisId, generatedAt, observedAt, counts, summary, themes, repeatedCopy, ctas, formats, platforms, landingPages, longevity, comparison, testHypotheses, normalized ads, coverage, reportUrl and reportKey.
Default key-value store:
brief-<analysisId>.html: printable HTML.ADS-SNAPSHOT: normalized ad array for reuse as inlinepreviousAds.RUN-SUMMARY: delivery/demo/budget status.
Download important output before Apify retention expires.
API and MCP
Use elfajad/competitor-ad-strategy-brief through the official Apify client, API or MCP server after publication. Input, output and dataset schemas describe the workflow.
import { ApifyClient } from 'apify-client';const client = new ApifyClient({token: process.env.APIFY_TOKEN});const run = await client.actor('elfajad/competitor-ad-strategy-brief').call({mode: 'dataset', brandName: 'Your competitor',currentDatasetId: process.env.SOURCE_DATASET_ID}, {maxTotalChargeUsd: 15.01, memory: 256});const {items} = await client.dataset(run.defaultDatasetId).listItems();
Development and support
Node.js 22+, Apify SDK (Apache-2.0), ipaddr.js (MIT). Deterministic analysis; no proprietary model or paid enrichment provider. No VPS.
npm cinpm testnpm run sample
Use the Issues tab for reproducible problems. Include the run ID and non-sensitive field names; do not publish private ad datasets, tokens or payout details.