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.

Set up in minutes Cancel anytime CAD pricing Live status: /api/health

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/evaluate is a dry run that consumes nothing; /v1/redeem commits atomically and is idempotent via idempotencyKey — retries replay, never double-spend.
POST /v1/evaluate
# 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

$39/mo
  • 10,000 cart evaluations / month
  • 5 active campaigns
  • Unlimited coupon codes
  • Email support
Start free

Scale

$249/mo
  • 1,000,000 cart evaluations / month
  • Unlimited active campaigns
  • Unlimited coupon codes
  • Priority support + Slack
Start free

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.