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 archiveCoupon 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
percentdiscountsvaluepercent off the subtotal.fixeddiscountsvalueunits ofcurrency.trial_extensionaddsvalueextra days to the plan's trial.single_use_per_userblocks 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.