11. Coupons & Discounts (Promotions)
[← Customer Management]/10-customer-management/ · [Index]/00-index/
11. Coupons & Discounts (Promotions)
Verified against: Medusa admin dashboard 2.18.0 (promotion-create form schema,
campaign-create form schema — source-read directly, node_modules/@medusajs/dashboard/src).
STATUS: Planned / Not yet used. The screen is real (it’s part of default Medusa — see [Section 2]/02-admin-dashboard/#promotions-coupons—discounts), but no promotion has ever been created for Sindhu Naturals. Everything below documents what the create form actually supports, not a working example. Do not invent real discount values — none exist yet.
Terminology note
Medusa calls this feature “Promotions,” not “Coupons” — see [Section 2]/02-admin-dashboard/#sidebar-structure. This section keeps the original brief’s “Coupons & Discounts” title since that’s the business concept, but every screen reference below uses Medusa’s real label.
Promotion creation — real fields
| Original brief field | Real field | Notes |
|---|---|---|
| Coupon code | Code (required) | Unless “automatic” is chosen — see below |
| — | Automatic toggle | If on, the promotion applies without the customer entering a code at all |
| Discount type | Type: fixed or percentage | Set on the promotion’s “application method” |
| — | Promotion kind: standard or buyget | buyget = “Buy X, Get Y” style promotions — a second real mode not mentioned in the original brief |
| Discount value | Value | A number (currency amount if fixed, a percentage if percentage) |
| — | Allocation: each, across, or once | Real, not in the original brief — controls whether the discount applies per matching item, split across them, or a single flat amount total |
| — | Target type: order, shipping_methods, or items | What the discount actually reduces — the whole order, the shipping cost, or specific line items |
| Minimum order value | Not a dedicated field — implemented via the generic Rules mechanism (see below) | |
| Maximum discount (a cap on a % discount) | TO BE CONFIRMED / not found as a dedicated field in the create form — only a max_quantity field exists, which caps how many items the discount applies to, not a currency cap on the discount amount | |
| Product restrictions | Real — a Target Rule (see below) | |
| Category restrictions | Real — a Target Rule (see below) | |
| Usage limits | Real — a Limit field (total number of times the promotion can be used) | No separate “per customer” limit was found in this form |
| Customer restrictions | Real — a Rule on customer group (see below) | |
| Start date / End date | Not on the promotion itself — only available if the promotion is attached to a Campaign (see below). A standalone promotion (no campaign) has no built-in date range | |
| Active/inactive status | Real — Status: draft, active, or inactive (three states, not two) |
Rules (how restrictions actually work)
Both “Minimum order value” and “Product/Category/Customer restrictions” are implemented through one generic mechanism: a list of Rules, each with an Attribute, an Operator, and a Value (e.g. “Customer Group — equals — Wholesale”). The exact list of attributes you can pick from is provided by the backend at the time you use the form, not fixed in the admin’s own code — so this wiki can’t enumerate every option without risking it going stale. In practice, this is where product/category/customer-group/minimum-spend restrictions all get configured.
Campaigns — how dates and budgets work
A promotion can optionally be attached to a Campaign (Promotions → Campaigns). A Campaign has its own real fields:
- Name, Description, Campaign Identifier
- Start Date, End Date
- Budget — a type (
spend,usage, or attribute-based variants), a limit, and a currency
IMPORTANT: If the business wants a promotion to automatically start/stop on specific dates, it needs to be created inside a Campaign, not as a standalone promotion — a standalone promotion has no date fields of its own.
Publishing checklist (once a real promotion is needed)
- Confirm the real discount value, minimum spend, and any restrictions with the business — do not invent these
- Decide
fixedvspercentage, and whether it needs a code or should be automatic - If date-bounded, create it inside a Campaign with real start/end dates
- Set Status to
draftwhile testing,activeonly once verified - Test against a real cart before announcing it publicly — this has never been done on this store
[← Customer Management]/10-customer-management/ · [Index]/00-index/ · [Next: Categories →]/12-categories/