Skip to content

Coupons Admin

Endpoints

GET   /api/v1/admin/coupons                  list (sorted -createdAt)
POST  /api/v1/admin/coupons                  create
PATCH /api/v1/admin/coupons/:code            update
POST  /api/v1/admin/coupons/:code/archive    archive

Coupon fields

typescript
{
  code: string,                                       // 2–40 chars, uppercased on save, unique
  description: string,                                // 0–500 chars
  kind: "percent" | "fixed" | "trial_extension",
  value: number,                                      // >= 0; meaning depends on kind
  currency: "TRY" | "USD" | null,                     // null for percent / trial_extension
  applies_to: ("new" | "renewal" | "upgrade")[],      // default ["new", "upgrade"]
  allowed_plans: string[],                            // plan codes; empty = all
  min_amount: number,                                 // minimum cart value to qualify
  usage_limit: number,                                // 0 = unlimited
  usage_count: number,                                // read-only, incremented on use
  single_use_per_user: boolean,                       // default true
  valid_from: Date | null,
  valid_until: Date | null,
  is_active: boolean,
}

Behavior

  • percent discounts value percent off the subtotal.
  • fixed discounts value units of currency.
  • trial_extension adds value extra days to the plan's trial.
  • single_use_per_user blocks the same user from using the code twice; admin-issued codes for a single recipient typically leave this on.

Codes are case-insensitive

The code is uppercased and trimmed at create time; checkout matches case-insensitively.