Meta Ads4 prompts · controlled inputs

Analyze a competitor's Facebook ads.

This workflow returns one verified competitor ad analysis.

Verify one competitor identity, compare reuse-ranked and recent-launch samples, and turn explicit ad evidence into a concise competitor brief.

2discovery routes

Example run · 13 Oct 2026 · ~2 min

Published by Spytrend · 9 Oct 2026 · Methodology

Run in order

A 4-step competitor Facebook ads workflow

Prompts update with the controlled inputs above.

Validate and confirm identity

Run one exact-domain identity route and confirm one consistent advertiser.

View promptHide prompt
Prompt 01
Cost guard: before each paid Spytrend call, run the free `estimate_cost` with the same tool and arguments, estimate the cost and stay within the user's stated budget; if the user has not stated a budget, tell them the estimate before the first paid call. If pricing consent is required, show the returned terms and stop until the customer explicitly agrees; never accept on the customer's behalf. If a required call does not fit the stated budget, make no paid call and return `Budget limit prevents required research`; omit an optional call that does not fit and disclose reduced coverage. When opening ads with `get_ad`, skip multilang ads (`is_multilang`) and never call `get_media` after `get_ad`. Retry once only when `retryable=true`, after `retry_after_seconds`. Read `params.ignored` after every search; an ignored required filter never counts as applied. If a search reports `pagination.total_status=restricted` (a free-plan archive window; `meta.plan_window_cutoff` names the boundary), tell the user the result covers only ads that started on or before that date, and never report a zero from it as "no such ads exist". Cost notices are not part of the final customer report.
Analyze one competitor's active Meta ads using the connected Spytrend MCP.

Canonical domain: hellofresh.com
Country: United States/US
Lookback: the last 30 completed UTC days ending yesterday

Validate the canonical registrable domain, allowlisted country and lookback; exclude the open UTC date and retain the exact completed-day window for later Route B only. Use Meta only. Run exactly one logical identity search, plus only its permitted identical retry, with source=meta, exact landing domain, landing_domain_exact=true, countries=US, status_today=active and limit=1. Explicitly omit date_from, date_to, sort, dedupe, query, category and media filters from identity; the lookback must not restrict it. Do not browse, broaden, paginate or probe another call shape.

A completed exact zero is Complete: return `No active exact-domain ads were returned for United States` and stop the workflow without calling it unresolved. Otherwise open exactly the one returned ad. Confirm active status, country and exact registrable landing domain. Treat page and advertiser identifiers as identifiers only; do not infer a company name from the domain, title or URL. Do not call get_advertiser in standard mode. Use `Identity unresolved` only for failed ad verification, conflicting identities or exact-domain conflict.

For every identity search, identity-detail or advertiser-detail call that returns retryable=true with retry_after_seconds, wait that delay and perform exactly one identical retry. A second identity-search or identity-detail failure makes identity unavailable; never convert it into zero.

Retain for later steps: canonical domain; country; exact date window; identity-search completion and exact active total; the selected identity ad's exact ID; and its complete detail record. Return only canonical domain, retained date window, server-returned active exact-domain total and `Identity confirmed`, exact zero or unresolved. Hide retained IDs, calls and audit detail from the customer-facing response. Stop after Step 1.
Build two discovery views

Collect reuse-ranked and recent-launch samples sequentially.

View promptHide prompt
Prompt 02
Cost guard: before each paid Spytrend call, run the free `estimate_cost` with the same tool and arguments, estimate the cost and stay within the user's stated budget; if the user has not stated a budget, tell them the estimate before the first paid call. If pricing consent is required, show the returned terms and stop until the customer explicitly agrees; never accept on the customer's behalf. If a required call does not fit the stated budget, make no paid call and return `Budget limit prevents required research`; omit an optional call that does not fit and disclose reduced coverage. When opening ads with `get_ad`, skip multilang ads (`is_multilang`) and never call `get_media` after `get_ad`. Retry once only when `retryable=true`, after `retry_after_seconds`. Read `params.ignored` after every search; an ignored required filter never counts as applied. If a search reports `pagination.total_status=restricted` (a free-plan archive window; `meta.plan_window_cutoff` names the boundary), tell the user the result covers only ads that started on or before that date, and never report a zero from it as "no such ads exist". Cost notices are not part of the final customer report.
Using retained confirmed identity and inputs, run exactly two sequential active Meta searches with exact domain, landing_domain_exact=true, selected country, confirmed entity filter when supported, dedupe=false, limit=8 and no pagination.

Route A: no dates, sort_by=most_reused_creative, sort_order=desc.
Route B: retained completed-day date_from/date_to, sort_by=date, sort_order=desc.

If a route returns retryable=true with retry_after_seconds, wait that delay and perform exactly one identical retry. A second route failure makes that route unavailable and the run Partial; continue the other route. A completed zero is valid zero. Never convert an unavailable route into zero.

Retain for later steps every delivered candidate's exact ID, full returned row and A-only/B-only/overlap provenance, plus each route's completion state, exact total when returned, delivered-row count, overlap and unique-candidate count. Deduplicate exact IDs only after both responses. Preserve the exact active total retained from Step 1 as headline N; Route A's total may be unavailable and must not overwrite it. Use Route B's exact total as headline R only when Route B completes and returns it. If Route B remains unavailable after retry, retain R as `Unavailable`, never zero. Route A is not performance or core strategy; Route B does not prove tests or first use.

Return only A/B completion, delivered rows, overlap, unique candidates, retained identity-search active total, Route-B lookback total and Complete/Partial. Hide IDs, calls, parameters and audit detail. Stop after Step 2.
Verify evidence and patterns

Open a bounded candidate set and require explicit support for every repeated pattern.

View promptHide prompt
Prompt 03
Cost guard: before each paid Spytrend call, run the free `estimate_cost` with the same tool and arguments, estimate the cost and stay within the user's stated budget; if the user has not stated a budget, tell them the estimate before the first paid call. If pricing consent is required, show the returned terms and stop until the customer explicitly agrees; never accept on the customer's behalf. If a required call does not fit the stated budget, make no paid call and return `Budget limit prevents required research`; omit an optional call that does not fit and disclose reduced coverage. When opening ads with `get_ad`, skip multilang ads (`is_multilang`) and never call `get_media` after `get_ad`. Retry once only when `retryable=true`, after `retry_after_seconds`. Read `params.ignored` after every search; an ignored required filter never counts as applied. If a search reports `pagination.total_status=restricted` (a free-plan archive window; `meta.plan_window_cutoff` names the boundary), tell the user the result covers only ads that started on or before that date, and never report a zero from it as "no such ads exist". Cost notices are not part of the final customer report.

Using retained discovery evidence only, select up to four additional distinct candidates, taking up to two Route-B members with in-window start dates that differ from the retained identity ad and up to two of the highest-ranked Route-A members not already retained; fill any empty slot from the other route. Never invent route diversity.

Open each selected candidate once. Reuse the retained identity detail without reopening if its exact ID is selected. Maximum total: one identity detail plus four analysis details, so 3–5 ads are verified when enough candidates qualify. Require the same entity identifiers, exact domain, selected-country delivery and active status. Exclude failed, inactive, unavailable, off-domain, wrong-country or conflicting candidates without fallback search.

For every candidate-detail call that returns retryable=true with retry_after_seconds, wait that delay and perform exactly one identical retry. Exclude the candidate only after that retry also fails. Candidate-detail failure does not make successfully completed discovery Partial.

Compare explicit product/offer, message, CTA, returned destination/path and actual assets. Normalize assets only as Image, Video, Image and video, or Not returned. Multiple assets never prove Carousel or placement; URL structure does not prove fetched content. A repeated offer, message, CTA, media type or route needs two distinct verified ads and its support count. Never call a creative repeated, identical or reused without an explicit exact creative-family identity; similar copy/assets are insufficient. Do not merge materially different products.

Retain for Step 4 each verified member's exact ID, entity, offer/product, attributed message, actual media type, CTA, full safe returned HTTPS landing URL, normalized landing route, exact start date and A-only/B-only/overlap provenance. Also retain selected/verified/excluded counts, supported repeated-pattern membership and counts, verified Route-B date coverage, route completion states, headline N, headline R or `Unavailable`, and Complete/Partial. Return only selected/verified/excluded counts, A-only/B-only/overlap provenance, supported repeated-pattern counts, verified Route-B start-date coverage and Complete/Partial. Hide retained IDs, rejected-row detail, calls and audit detail from the customer-facing response. Stop after Step 3.
Present the brief

Return route-specific observations, comparisons, inspection links and evidence limits.

View promptHide prompt
Prompt 04
Using retained evidence only, without any research call, write a table-free customer report of at most 260 words.

Start with `# Competitor Facebook Ads: hellofresh.com`, then show server-returned active exact-domain matches, detail-verified ads, server-returned active lookback launches and Complete/Partial. When Route B remained unavailable after its permitted retry, print `Unavailable server-returned active lookback launches` and Partial; never print zero for that route.

Use only supported sections: up to two `Repeated patterns` with X/M support and only when at least two ads support it; `Reuse-ranked observation` only with verified Route-A members and without positions, reuse counts, family counts or performance language; `Recent observation` only with verified Route-B members whose detailed dates fall inside the retained window, never Route-A-only evidence and never called a test; one bounded `What stands out` comparison only when at least two ads were verified; `Inspect first` with at most three ads showing a plain-text media label, CTA and a full safe returned HTTPS URL behind the label `Landing page`; and at most two `Evidence & limits` bullets with A/B rows or route unavailability, overlap/unique count, inspected/excluded count and bounded coverage. Never print or link a media, preview, CDN or signed temporary URL. Omit an observation section when its route has no verified evidence. Use the retained Step-1 identity-search exact active total for headline N and the retained Route-B exact total for headline R, or the word `Unavailable` when Route B failed; never substitute Route A's aggregate total.

Never imply server totals were inspected. Keep delivery country separate from company location. Hide service name, tools, calls, parameters, IDs, rejected rows, timing, retries and usage. Do not infer targeting, audience, spend, performance, conversions, revenue, ROAS, profitability, market share, testing intent, causality or complete strategy.

End exactly: `Observed Meta ad activity describes a bounded archive sample, not targeting, spend, performance, conversions, revenue, ROAS, profitability, market share or complete strategy.` Stop after Step 4.
Use the complete workflow in one promptAll research stages and evidence rulesView promptHide prompt
Complete workflow
Cost guard: before each paid Spytrend call, run the free `estimate_cost` with the same tool and arguments, estimate the cost and stay within the user's stated budget; if the user has not stated a budget, tell them the estimate before the first paid call. If pricing consent is required, show the returned terms and stop until the customer explicitly agrees; never accept on the customer's behalf. If a required call does not fit the stated budget, make no paid call and return `Budget limit prevents required research`; omit an optional call that does not fit and disclose reduced coverage. When opening ads with `get_ad`, skip multilang ads (`is_multilang`) and never call `get_media` after `get_ad`. Retry once only when `retryable=true`, after `retry_after_seconds`. Read `params.ignored` after every search; an ignored required filter never counts as applied. If a search reports `pagination.total_status=restricted` (a free-plan archive window; `meta.plan_window_cutoff` names the boundary), tell the user the result covers only ads that started on or before that date, and never report a zero from it as "no such ads exist". Cost notices are not part of the final customer report.
Use the connected Spytrend MCP to analyze a bounded sample of one known competitor's active Meta ads.

Inputs: canonical domain hellofresh.com, country United States/US, lookback: the last 30 completed UTC days ending yesterday.

Complete every stage in one turn and return only the final customer report. Use Meta only. Do not browse, paginate, broaden inputs or probe alternate parameter shapes. Run searches sequentially.

1. Validate the canonical registrable domain, allowlisted country and lookback. Exclude the open UTC date and calculate the exact completed-day window. Invalid input returns exactly `Invalid controlled input configuration` without a call.
2. Run one logical identity search, plus its sole permitted identical retry: source=meta, exact landing domain, landing_domain_exact=true, countries=US, status_today=active, limit=1. Omit dates, sort, dedupe, query, category and media; lookback must not restrict identity. A completed exact zero ends Complete with `No active exact-domain ads were returned for United States`; make no further call.
3. Otherwise open the one identity ad and confirm active status, country and exact registrable landing domain. Treat page and advertiser identifiers as identifiers only; do not infer a company name from the domain, title or URL. Do not call get_advertiser in standard mode. Return `Identity unresolved` only for failed detail verification, materially conflicting identities or exact-domain conflict. Never switch entities.
4. Run two exact-domain active searches sequentially with the confirmed entity identifier when supported, countries=US, dedupe=false, limit=8 and no pagination:
   - Route A, reuse-ranked current sample: no dates, sort_by=most_reused_creative, sort_order=desc.
   - Route B, recent-launch sample: exact completed-day date_from/date_to, sort_by=date, sort_order=desc.
   Route A is not performance or core strategy. Route B does not prove tests, experiments or first use.
5. Retain provenance. After both calls, deduplicate exact IDs and keep totals, rows, overlap and unique candidates separate. Headline N is the identity-search exact active total; Route A never overwrites it. Headline R is Route B's exact total only when returned; after final Route-B failure it is `Unavailable`, never zero. An absent `dedupe=false` echo is not ignored unless stated.
6. Select up to four additional distinct candidates after discovery, taking up to two Route-B members with in-window start dates that differ from the retained identity ad and up to two of the highest-ranked Route-A members not already retained; fill any empty slot from the other route. Disclose limited route diversity; never invent it.
7. Open each selected candidate once. Reuse the retained identity detail without reopening when its exact ID is selected from A/B; in that case make no additional detail call. Maximum: one identity detail plus four analysis details, so 3–5 ads are verified when enough candidates qualify. A verified analysis member must match entity identifiers, exact domain, country and active status. Exclude failed, inactive, unavailable, off-domain, wrong-country or conflicting candidates without fallback search.
8. Compare explicit evidence only: concrete offer/product; message with advertiser claims attributed; CTA; returned destination/path; and actual assets normalized as Image, Video, Image and video, or Not returned. Multiple assets never prove Carousel, slideshow or placement. URL structure does not prove fetched page content.
9. A repeated offer, message, CTA, media type or normalized route needs at least two distinct verified ads and must show its support count. Do not merge materially different products to manufacture a pattern. Never call a creative repeated, identical or reused without an explicit exact creative-family identity; similar copy/assets are insufficient. Route-A observations describe only verified Route-A members, without positions, reuse counts, family counts or performance language. Recent observations describe only verified Route-B members whose detailed start dates fall inside the window; an in-window Route-A date alone never belongs in that section.
10. Every identity, discovery or candidate-detail call returning retryable=true with retry_after_seconds requires that delay and one identical retry. Final identity failure makes analysis unavailable; final A/B failure makes it Partial while the other continues. Completed zero is valid zero. Final candidate failure excludes and is disclosed without changing completed discovery to Partial. Never convert unavailable into zero.

Write a table-free report of at most 260 words. Start:
`# Competitor Facebook Ads: hellofresh.com`
`**[N] server-returned active exact-domain matches** · **[M] detail-verified ads** · **[R] server-returned active lookback launches** · **[Complete/Partial]**`

Use only supported sections: `Repeated patterns` (up to two, each X/M and only with at least two supporting ads); `Reuse-ranked observation` with verified A evidence; `Recent observation` with verified B members dated inside the window; `What stands out` (one comparison only when at least two ads were verified); `Inspect first` (up to three ads with a plain-text media label, CTA and full safe returned HTTPS `Landing page`); and `Evidence & limits` (up to two bullets covering rows or unavailability, overlap/unique and inspected/excluded counts, and bounded coverage). Never print or link a media, preview, CDN or signed temporary URL. Omit unsupported observation sections. When Route B failed, print `Unavailable` in place of R, never zero.

For identity-search zero, show title, zero summary, Result and one coverage bullet. For identity conflict, give only a short unresolved explanation without zero-market claims. Never imply server totals were inspected. Keep delivery country separate from company location. Hide service name, tools, calls, parameters, IDs, rejected-row detail, timing, retries and usage. Do not infer targeting, audience, spend, performance, conversions, revenue, ROAS, profitability, market share, testing intent, causality or complete strategy.

End exactly:
`Observed Meta ad activity describes a bounded archive sample, not targeting, spend, performance, conversions, revenue, ROAS, profitability, market share or complete strategy.`
Example output

HelloFresh: one offer, creator codes in the newest ads.

A live run on 13 Oct 2026 used hellofresh.com, the United States and a 30-day window. Five opened ads confirmed one advertiser: four repeat the 10-free-meals offer, and the three newest use first-person copy with personal promo codes.

Evidence boundaryOne ad's copy names a different promo code than its landing link, so the brief flags it for inspection instead of guessing which code is live.
Competitor ad brief sampleExample run · 13 Oct 2026
Offer or messageWhat the opened ads showEvidence
0110 free mealsFour of five opened ads lead with the offer; two of the newest add free breakfast for life.Repeated offer · 4 of 5 adsLanding page: hellofresh.com/pages/meal-kit-delivery
02Busy weeknights, no shoppingThree ads launched 8–9 Oct speak in first person about skipping meal planning and grocery runs, each with a personal promo code.Recent observation · 3 adsVideo · Sign up
03Cheaper than takeoutTwo ads compare home cooking with takeout; the reuse-ranked one claims half the cost.Message angle · 2 of 5 adsVideo · Sign up
Example run: identity check, two discovery views and 5 opened ads for hellofresh.com, United States
Methodology

How two discovery views become one evidence-led brief.

Published by Spytrend from the controlled workflow contract updated 9 Oct 2026.

Exact identity first

The workflow confirms one canonical domain and consistent advertiser before analysis.

01

Two bounded views

Reuse-ranked and recent-launch routes run sequentially with separate totals and provenance.

02

Explicit pattern support

Every repeated claim needs at least two distinct verified members and a visible support count.

03

No performance inference

Ranking and launch date are not presented as spend, testing intent or results.

04
FAQ

Before you run it.

Does reuse-ranked mean best-performing?

No. It is a bounded server ordering and is not evidence of performance or core strategy.

Does a recent launch prove a new test?

No. A returned start date does not establish testing intent or first use.

Can similar ads be called reused creatives?

No. Exact creative-family identity is required for that claim.

What happens if one discovery route fails?

The other route may continue, but the final result remains Partial and unavailable totals stay unavailable.

Spytrend MCP

Build a bounded competitor Facebook ads brief.

Connect Spytrend MCP, choose the controlled inputs and run the four prompts.