Skip to content

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 fieldReal fieldNotes
Coupon codeCode (required)Unless “automatic” is chosen — see below
Automatic toggleIf on, the promotion applies without the customer entering a code at all
Discount typeType: fixed or percentageSet on the promotion’s “application method”
Promotion kind: standard or buygetbuyget = “Buy X, Get Y” style promotions — a second real mode not mentioned in the original brief
Discount valueValueA number (currency amount if fixed, a percentage if percentage)
Allocation: each, across, or onceReal, 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 itemsWhat the discount actually reduces — the whole order, the shipping cost, or specific line items
Minimum order valueNot 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 restrictionsReal — a Target Rule (see below)
Category restrictionsReal — a Target Rule (see below)
Usage limitsReal — a Limit field (total number of times the promotion can be used)No separate “per customer” limit was found in this form
Customer restrictionsReal — a Rule on customer group (see below)
Start date / End dateNot 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 statusReal — 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 fixed vs percentage, 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 draft while testing, active only 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/