14-day free trial · no card
Every promotion your marketing brain invents. One API call.
Percent, amount, BOGO, spend-thresholds, coupon codes, stacking rules — a headless promotions engine that prices any cart deterministically, to the cent.
POST /v1/evaluate · deterministic to the cent
For your business
Promotions your team can actually run.
No pricing-engine jargon, no spreadsheet math, no waiting on a developer for every campaign.
Launch a promo in minutes
The campaign wizard speaks plain language, not pricing-engine jargon: percent off, dollars off, buy-one-get-one, or spend-X-get-Y. Pick, set the value, go live.
Codes you control
Generate thousands of coupon codes with per-customer and total limits — vanity codes, patterns like SUMMER-####, and one-click disable if a code leaks.
Know what it cost you
Every campaign reports its redemptions and the discount it gave — lifetime and last 30 days — so you always know what a promotion actually cost.
For developers
Send a cart. Get exact numbers back.
One endpoint prices the cart; one commits it. Everything is integer cents, and every supplied code comes back applied or rejected with a machine-readable reason.
- Deterministic by construction. The engine is a pure function — no DB, no clock, no randomness inside the math. Same cart in, same price out, unit-testable to the cent.
- Cents-exact allocation. Discounts are distributed across matched lines with a largest-remainder allocation, so per-line discounts always sum exactly to the campaign total.
- Evaluate vs redeem.
/v1/evaluateis a dry run that consumes nothing;/v1/redeemcommits atomically and is idempotent viaidempotencyKey— retries replay, never double-spend.
# price a cart as the customer types (consumes nothing)
curl -X POST https://promokit.yagnotech.com/v1/evaluate \
-H "Authorization: Bearer sk_pk_..." \
-H "Content-Type: application/json" \
-d '{"cart":{"currency":"CAD","codes":["SAVE5","BOGUS99"],
"lines":[{"id":"1","sku":"latte","qty":2,"unitPrice":450,"tags":["drinks"]},
{"id":"2","sku":"muffin","qty":1,"unitPrice":375,"tags":["food"]}]}}'
{
"currency": "CAD",
"subtotal": 1275,
"discountTotal": 500,
"total": 775,
"appliedCampaigns": [{
"campaignId": "66d0…", "name": "$5 off with SAVE5",
"type": "amount_off", "discount": 500, "couponCode": "SAVE5",
"lines": [{ "id": "1", "discount": 353 }, { "id": "2", "discount": 147 }]
}],
"rewardLines": [],
"rejectedCodes": [{ "code": "BOGUS99", "reason": "campaign_expired" }]
} // 353 + 147 = 500 — always exact
Pricing
Flat monthly plans. Metered by evaluations only.
Start free for 14 days on Starter quotas — no card. Coupon codes are unlimited on every plan.
Starter
- 10,000 cart evaluations / month
- 5 active campaigns
- Unlimited coupon codes
- Email support
Growth
- 100,000 cart evaluations / month
- 25 active campaigns
- Unlimited coupon codes
- Priority email support
Scale
- 1,000,000 cart evaluations / month
- Unlimited active campaigns
- Unlimited coupon codes
- Priority support + Slack
Prices in CAD. 14-day trial on every plan, no card.
FAQ
Questions, answered.
Does it replace my checkout?
No — promokit is headless. You send the cart, it returns cents-exact line discounts, totals, reward items and a reason for every code that didn’t apply. Your checkout applies the numbers; payments, taxes and fulfilment stay exactly where they are.
Does it work in my currency?
Yes. Carts carry a currency field and every amount is integer cents (minor units), so the math is exact in any currency — no floating point, ever.
Can codes be abused?
Limits are enforced server-side: per-code max uses, per-customer caps and total campaign caps. Redemption is idempotent and consumes uses atomically, so retries and double-clicks never burn a code twice — and you can disable any code instantly.
How do stacking rules work?
Every campaign marked stackable applies, plus the single best non-stackable one — superseded codes are reported back so you can tell the shopper why. Priority controls application order, and a discount can never push a line (or the cart) below zero.
Price your first cart this afternoon.
Sign up, mint a key, evaluate a cart — three curls from start to a discounted total. Your trial starts the moment you do.