Find the exact Sponsored Products search terms burning budget with no sales, then add them as negative keywords through DataDoe Actions - always a dryRun preview first, and a real change only on your explicit approval. The write follow-through to the wasted-spend watchdog. Live from DataDoe, runs in chat. Use for "wasted ad spend", "add negative keywords", "negate search terms", "search terms with no sales", "stop paying for these clicks", or "clean up my PPC".
The full skill specification, rendered straight from the source repository.
PPC Negative-Keyword Applier
Finds the exact Sponsored Products search terms that are burning budget with no
sales, then adds them as negative keywords through DataDoe Actions. It always
runs a dryRun first and shows you every change before anything reaches Amazon,
so it is safe to demo and safe to run. MCP-native end to end.
When to use this
Your ACoS is creeping up and you suspect junk search terms.
Weekly PPC cleanup: stop paying for clicks that never convert.
Right after a launch, when broad/auto campaigns catch a lot of irrelevant traffic.
Trigger phrases: "wasted ad spend", "negative keywords", "add negatives",
"search terms with no sales", "stop paying for these clicks", "clean up my PPC".
The framework. Find, confirm, apply
Find the wasteful terms from performance data (read).
Confirm the list and the exact match type with the user (nothing is
automatic).
Apply as negatives via a dryRun Action, review the validated payload,
then run for real only on explicit approval.
What counts as "wasteful" (defaults, tune per user)
A search term is a negative candidate when, over the last 30-60 days:
ad_spend >= 2x your target CPA (or >= the item price if you do not know CPA), AND
ad_orders = 0 (no attributed orders), AND
ad_clicks >= 10 (enough clicks to trust the zero).
Borderline (spend above target CPA but a few orders) -> list separately as "review",
do not auto-negate.
Configuration
MCP base: https://mcp.datadoe.com/mcp/v1
Read source: Search Term Performance (Ads) (table amazon_ads_search_terms_by_campaign_by_date).
Write action: AMAZON_ADS_TARGETS_ADD.
Currency/marketplace: read marketplace_country_code and use the matching Ads
marketplace code (e.g. DE for Germany, GB for the UK).
Step-by-step workflow (MCP-native)
Phase 1 - Find (read)
sellers_and_vendors_list -> pick the seller, keep sellerOrVendorId.
exports_sources_get (query "search term") -> confirm amazon_ads_search_terms_by_campaign_by_date is
enabled.
exports_create for amazon_ads_search_terms_by_campaign_by_date, last 30-60 days, columns:
ad_search_term, ad_keyword, ad_match_type, ad_campaign_id,
ad_campaign_name, ad_campaign_type, ad_group_id, ad_group_name,
ad_spend, ad_sales, ad_orders, ad_clicks. Filter to
ad_campaign_type = SPONSORED_PRODUCTS.
Poll, download, aggregate by ad_search_term (+ campaign/ad group). Apply the
wasteful rule above. Produce the candidate list with spend, clicks, orders,
and the target campaign/ad group ids.
Phase 2 - Confirm
Show the ranked candidate list (most wasted spend first) and the total spend
it would stop. Ask the user which to negate and at what match type
(NEGATIVE_EXACT is safest; NEGATIVE_PHRASE is broader). Do not proceed
without a selection.
Phase 3 - Apply (dryRun, then real)
actions_details_schema_get for AMAZON_ADS_TARGETS_ADD and read the exact
targetDetails shape before building the payload.
Build one targets[] entry per approved term, e.g.:
actions_start with dryRun: true. This validates the whole batch
without touching Amazon and works even if the Action type is disabled - this
is the safe demo path.
Show the validated result. Only if the user explicitly approves, call
actions_start again with dryRun: false, then poll actions_get until it
completes and report per-term acceptance.
Output format
text
1Negative-keyword candidates - {marketplace} - last {N} days
2Total wasted spend if applied: {currency}{sum}
34# Search term Spend Clicks Orders Campaign / Ad group Match
51 {term} {cur}{v} {n} 0 {campaign} / {group} NEGATIVE_EXACT
6...
78Dry run: {k} targets validated, 0 errors.
9Reply "apply" to add these negatives for real, or edit the list first.
Worked example (illustrative)
A term with ~€42 spend, ~61 clicks, 0 orders in an auto/discovery campaign: above
2x CPA, zero orders, plenty of clicks -> negative candidate. Proposed as
NEGATIVE_EXACT. Dry run validates 1 target, 0 errors. On "apply", the negative is
added and future spend on that term stops.
Quality self-check
Did I only include terms with enough clicks to trust the zero-order signal?
Did I keep each negative in its own campaign/ad group (ids from the data)?
Did I run dryRun and show the validated payload before any real write?
Did I get explicit approval before dryRun: false?
Is the marketplace code correct for the account?
Common mistakes
Negating a term after 2-3 clicks - too little data, you may kill a converter.
Adding a negative account-wide instead of to the campaign/ad group that spent.
Skipping the dry run. Always validate first; you are responsible for writes.
Confusing search term (what the shopper typed) with keyword (what you bid on) -
you negate the search term.
Notes
Write skill. It uses DataDoe Actions and only writes on explicit approval;
dryRun covers demos and testing with no live changes.
A DataDoe skill, built on the DataDoe Search Term Performance source +
AMAZON_ADS_TARGETS_ADD.