Which offer should I fix?
Finding the weak offers is two questions, not one — and asking only the first hides exactly the offers you most want to find.
Which of my offers are underperforming?
1. The weakest of the offers that earned
get_top_offers with order: "lowest".
get_top_offers order: "lowest" start: 2026-07-01 end: 2026-07-31Each row carries that offer's revenue, claims, and acceptance rate for the period.
Revenue is the only ranking this returns. The claims and the acceptance rate on a row are facts about that one offer — not columns to re-sort the list by. A "lowest acceptance rate" ranking is not something this tool can give you.
2. The offers that earned nothing at all
Here is the trap: an offer with no claim in the period is absent from that ranking entirely. It is not last — it is not there. The offers earning zero, the ones you are actually looking for, are the ones step 1 cannot show you.
search_offers with sort: "revenue_low" reaches them.
search_offers sort: "revenue_low" status: "active"Lowest first, including offers that never earned anything. That ranking is all-time rather than dated, which is the right lens for "this has never worked" as opposed to "this had a bad month".
3. Why it is weak
For each candidate, two reads:
get_offer_detail — is anything reaching it?
- Trigger conditions are ANDed. Several narrow conditions together can match almost no orders.
- A trigger resource deleted from Shopify is marked as deleted, and cannot match anything.
- Check the schedule: an offer that was only live for part of the period earned for part of it.
get_offer_stages — is the offer itself the problem?
- What it sells, stage by stage, each product with its own discount.
- An offer with plenty of impressions and almost no claims is usually a stage problem, not a trigger problem. Low impressions with a healthy setup is the opposite.
get_offer_stats for the placement. Many claims with low
revenue means the discount is doing the work; many impressions with no claims means the offer is
not.4. What to sell instead
recommend_products with the offer id.
recommend_products offerId: gid://application/campaign/1234Pass the offer id rather than naming a product — the app reads that offer's own trigger products and suggests what shoppers actually bought alongside them, ranked from real co-purchase history and padded with same-category best sellers when the history is thin.
A best-sellers-only result is a real answer, not a failure, and it names its own cause: nothing named, no product trigger on the offer, deleted triggers, or no such product. It never means "no bought-together history exists".
Putting it together
get_top_offers order=lowest → weakest among those that earned
search_offers sort=revenue_low → the ones that earned nothing (invisible above)
↳ get_offer_detail → is anything reaching it
↳ get_offer_stages → is the offer itself weak
↳ recommend_products offerId=… → what to put in it insteadSay which list it came from
"This is your worst offer" means two different things depending on the step it came from. An answer worth acting on says whether the offer earned poorly in the period, or has never earned at all — and that the first ranking omits every offer with no claims.