What the builder checks
The rules the campaign builder enforces before you publish, what it blocks outright, what it warns about, and the handful of things to watch for that it does not catch yet.
The builder validates your campaign as you type and again before you publish. This page lists what it blocks (you cannot publish until it is fixed), what it warns about (you can proceed, but read the note), and what it does not catch yet (so you can check it yourself).
What is blocked
| Rule | Why |
|---|---|
| A campaign name is required | Any length is fine, even one character; it is internal and seeds the Shopify discount title |
| Two tiers cannot share a threshold | Duplicate thresholds are rejected, flagged the moment you type them |
| Percentage or amount tiers cannot be 0 | A zero-value tier would be a no-op discount |
| Set price cannot use Whole cart counting | This combination is rejected; use "Across matching products" or narrower |
| Buy X Get Y "Specific items" needs a filled pool | You must add at least one get variant before publishing |
| Targeting picks are required when the scope needs them | A products, variants, collections, or tags scope needs at least one pick |
| The end must be after the start | An end date at or before the start is rejected, and a campaign whose end has already passed cannot be published |
What warns you
- Targeting drift: when auto-join is off and a new product starts matching your collection or tag, the dashboard flags it (the product still gets the discount).
- The live example and receipt in the builder rail update as you type, so you can catch a set basis or repeat setting that produces a surprising result before you publish.
- Stacking conflicts between your campaigns are detected and surfaced, including when you would exceed the store-wide slot limit.
What to watch for yourself
A few things are not caught yet. None of them will break your store, but they are worth a manual check.
Set price is per unit, not the whole cart
A set price sets the price of each eligible unit, not a total for the cart. "Set price $25" means every eligible item is $25, not "any of these for $25 total".
Include and exclude conflicts
If the same product is in both the include and exclude lists, the exclude wins and the item is left out. The builder does not warn on the overlap yet.
Buy X Get Y "Specific items" needs its pool
This one is blocked at publish, but it is the most common reason a Buy X Get Y campaign will not save: make sure the get pool has at least one variant.
Money thresholds and multiple currencies
Spend thresholds are measured in your store currency, without conversion
A spend threshold and any fixed money amount are set in your store’s currency. At checkout, the amount arrives in the shopper’s currency and is compared against your number without converting between currencies. So a "spend $100" goal is measured as "spend 100" in whatever currency the shopper pays in, which is not equivalent across currencies. Percentage rewards are always correct in any currency. If you sell in several currencies, prefer percentage-based goals until full multi-currency handling ships.
A validation matrix (each rule with a concrete example) will be generated from the schema and tested fixtures.