Coupon Codes Testing Checklist (2026)

Coupon Codes Testing Checklist (2026)

February 16, 2026 · 18 min read · Testing Checklists

Coupon Codes Testing Checklist (2026)

This article delivers a concrete, checkable list of more than thirty test items that cover happy‑path flows, error handling, edge cases, accessibility, security, performance, and release readiness for coupon‑code features in web and mobile applications. Each item includes a clear pass criterion, a real‑world example, and notes on how manual, scripted, or autonomous approaches can satisfy it.

Use the tables and checklists below as a living reference you can bookmark, adapt to your sprint planning, or feed into a test‑management tool. The later sections show how an autonomous explorer such as SUSA can exercise most of these checks in a single pass, generating regression scripts without hand‑written test cases.

1. Why a Dedicated Coupon Codes Testing Checklist Matters in 2026

Coupon codes sit at the intersection of marketing, commerce, and user trust. A single mistake—accepting an expired code, leaking a discount to unintended users, or breaking checkout flow—can erode revenue, brand reputation, or compliance posture. In 2026, regulations around promotional pricing (e.g., the EU’s Omnibus Directive update) and heightened consumer expectations for transparent discounts make rigorous validation non‑optional.

A dedicated checklist helps teams:

The following sections break the checklist into logical groups, each with pass/fail criteria, illustrative examples, and guidance on manual versus automated execution.

2. Happy Path Test Cases

Happy‑path tests verify that a valid coupon behaves exactly as the business intends when applied under normal conditions.

2.1 Core Validation Flow

#Test DescriptionStepsExpected ResultPass Criteria
HP1Apply a valid percentage‑off coupon1. Add item to cart 2. Enter coupon code “SAVE10” 3. ApplyDiscount = 10 % of subtotal, tax recalculated, total updatedDiscount amount matches formula, cart total reflects new amount, coupon marked as “applied”
HP2Apply a valid fixed‑amount coupon1. Add items totaling $75 2. Enter coupon “FIVEOFF” 3. ApplyDiscount = $5, new total = $70 (pre‑tax)Discount equals coupon value, tax calculated on discounted subtotal
HP3Apply a free‑shipping coupon1. Add items qualifying for free shipping threshold 2. Enter “FREESHIP” 3. ApplyShipping cost set to $0, order total reflects removalShipping line shows $0, no hidden fees added
HP4Apply a coupon with minimum purchase1. Cart subtotal $48 2. Enter “MIN50” (requires $50) 3. ApplyError: “Minimum purchase $50 not met”Coupon rejected, cart unchanged, error message displayed
HP5Apply a coupon that stacks with another promotion1. Cart has auto‑applied 15 % seasonal sale 2. Enter “EXTRA5” (stackable) 3. ApplyTotal discount = 15 % + $5 off (or 5 % depending on rule)Final price matches combined rule, no double‑counting of same line item
HP6Apply a coupon limited to specific product category1. Add a qualifying SKU (e.g., “T‑SHIRT‑RED”) 2. Enter “CAT10” (10 % off apparel) 3. ApplyDiscount applied only to apparel line itemsNon‑apparel items remain at full price, discount correctly scoped
HP7Apply a coupon with usage limit per user1. Log in as user A 2. Apply “ONETIME” (max 1 use) 3. Complete order 4. Log in again, try to re‑applySecond attempt rejected with “Usage limit exceeded”System enforces per‑user limit, logs attempt, prevents reuse
HP8Apply a coupon with global usage limit1. Multiple users apply “GLOBAL50” until limit reached 2. Next user triesCoupon rejected with “Campaign exhausted”Global counter respected, no over‑issue beyond limit
HP9Apply a coupon that expires at a specific datetime1. Set system clock to 2025‑12‑31 23:59:59 2. Enter “YEAREND” (expires 2026‑01‑01 00:00:00) 3. ApplyDiscount appliedCoupon valid before expiry
HP10Apply a coupon after expiry1. Set system clock to 2026‑01‑02 00:00:01 2. Enter “YEAREND” 3. ApplyError: “Coupon expired”Coupon rejected after expiry date/time

Pass criteria summary: For each happy‑path case, the calculated discount, tax, shipping, and final total must match the business rule exactly, and the UI must reflect the applied state with an appropriate message or badge.

2.2 Manual vs. Automated Execution

3. Error Handling and Validation

Error handling ensures that invalid or malicious inputs do not crash the system, leak information, or create unintended discounts.

3.1 Input Sanitization

#Test DescriptionStepsExpected ResultPass Criteria
EH1Coupon code with leading/trailing spaces1. Enter “ SAVE10 ” (space before/after) 2. ApplySystem trims and accepts as valid “SAVE10”Discount applied correctly; no error due to whitespace
EH2Coupon code with case variation1. Enter “save10” 2. ApplySystem treats as case‑insensitive (if configured)Discount applied; otherwise proper error if case‑sensitive
EH3Non‑alphanumeric characters1. Enter “SAVE@10!” 2. ApplyError: “Invalid coupon format”System rejects with clear message, no internal exception
EH4Extremely long string (e.g., 500 chars)1. Paste 500‑character string 2. ApplyError: “Coupon code too long” or truncated safelyNo buffer overflow, no crash, response time < 2 s
EH5SQL‑like payload1. Enter “SAVE10' OR '1'='1” 2. ApplyError: “Invalid coupon” (no DB error exposed)No SQL error leaked in response, coupon rejected
EH6XSS payload1. Enter 2. ApplyError: “Invalid coupon”; script not renderedOutput encoded, no script execution in DOM
EH7Null / empty submission1. Leave field blank 2. Click ApplyError: “Please enter a coupon code”Validation fires before AJAX call
EH8Duplicate submission (rapid clicks)1. Click Apply button five times quicklyOnly one request processed, no duplicate discountIdempotent handling, server side lock or token

Pass criteria: All invalid inputs must be rejected with a user‑friendly message, never expose stack traces or database errors, and must not affect cart state.

3.2 Business‑Rule Violations

#Test DescriptionStepsExpected ResultPass Criteria
EH9Applying a coupon to a non‑eligible payment method1. Select gift‑card as payment 2. Enter “SAVE10” 3. ApplyError: “Coupon not valid with gift‑card payment”Coupon rejected, payment method unchanged
EH10Applying a coupon that conflicts with another active coupon1. Apply “FIRST10” 2. Attempt to apply “SECOND10” (non‑stackable)Error: “Only one coupon may be used”Second coupon blocked, first remains applied
EH11Applying a coupon after order placed1. Complete checkout 2. On order‑confirmation page, try to add couponError: “Coupon cannot be applied after purchase”No change to order total
EH12Applying a coupon that requires login when anonymous1. As guest, enter “MEMBER20” 2. ApplyPrompt to log in or error: “Coupon requires account”No discount applied until authentication
EH13Applying a coupon that exceeds maximum discount cap1. Cart $200, coupon “HALFOFF” (50 % off, max $40) 2. ApplyDiscount capped at $40, not $100System enforces cap, shows applied discount $40
EH14Applying a coupon that would make total negative1. Cart $5, coupon “TENOFF” (fixed $10) 2. ApplyError: “Discount cannot exceed order total”Order total stays $5, coupon rejected

Pass criteria: The system must enforce all configured constraints, return a clear explanation, and leave the cart/order unchanged when a rule is violated.

3.3 Automation Tips

4. Edge and Boundary Cases

Edge cases uncover defects that only manifest at limits of data types, timing, or state transitions.

4.1 Numeric Boundaries

#Test DescriptionStepsExpected ResultPass Criteria
EB1Zero‑value coupon1. Enter “ZERO” (0 % off) 2. ApplyDiscount $0, cart unchangedSystem accepts but shows no discount
EB2100 % off coupon1. Enter “FREE” (100 % off) 2. ApplyDiscount = subtotal, total $0 (tax may still apply depending on jurisdiction)If tax exempt, total $0; otherwise tax calculated on $0 subtotal
EB3Coupon with fractional percent (e.g., 12.5 %)1. Enter “HALF12POINT5” 2. ApplyDiscount = subtotal × 0.125, rounded per currency rulesRounding follows bankers’ rounding or half‑up as defined
EB4Minimum purchase exactly at threshold1. Cart $50.00, coupon “MIN50” (≥ $50) 2. ApplyDiscount appliedSystem uses >= comparison, not >
EB5Maximum purchase limit (if applicable)1. Cart $1,000.00, coupon “MAX1K” (valid ≤ $1,000) 2. ApplyDiscount appliedBoundary inclusive/exclusive per rule
EB6Usage count exactly at limit1. User has used coupon 4/5 times 2. Apply fifth timeDiscount applied, counter reaches limitNext attempt blocked
EB7Global limit exactly reached1. After 999 redemptions, user 1000 appliesDiscount applied, counter hits max1001st attempt rejected
EB8Expiry at midnight (timezone edge)1. Set server to UTC, coupon expires 2026‑02‑01 00:00:00 UTC 2. Change client to UTC‑59 → applyDiscount applied (still valid)System uses configured timezone consistently
EB9Expiry exactly at now (race)1. Deploy coupon with expiry = current timestamp 2. Rapid concurrent requestsSome requests succeed, some fail based on precise orderingSystem must handle race without double‑counting or negative counters
EB10Applying coupon after cart abandonment then restore1. Add items, apply coupon, abandon cart 2. Restore cart later (same session)Coupon still applied if not expired/usedPersistence layer retains coupon state correctly

Pass criteria: All calculations must respect the defined inclusivity/exclusivity of boundaries, rounding must match the finance spec, and state transitions (usage counters, timers) must be atomic.

4.2 State Transition Scenarios

#Test DescriptionStepsExpected ResultPass Criteria
EB11Applying coupon, then removing item that made it eligible1. Add qualifying item, apply coupon 2. Remove that item 3. Observe cartCoupon auto‑removed or error shownSystem either invalidates coupon or prompts user to adjust
EB12Applying coupon, then changing quantity below threshold1. Add 2× $30 item (total $60) 2. Apply “MIN50” 3. Reduce quantity to 1 (total $30)Coupon removed or cart blocked from checkoutSystem re‑validates on quantity change
EB13Applying coupon, then switching currency1. Cart in USD, apply coupon 2. Switch to EUR (price converted) 3. Observe discountDiscount converted correctly or clearedCurrency change triggers re‑evaluation of coupon applicability
EB14Applying coupon during a flash sale that changes prices mid‑checkout1. Start checkout, apply coupon 2. Backend updates sale price 3. Proceed to paymentEither discount recalculated or user warned of price changeSystem detects price mutation and either updates discount or aborts with clear message
EB15Applying coupon after a price‑adjustment coupon (stacking)1. Apply “10OFF” (10 % off) 2. Apply “EXTRA5” (additional $5) 3. Remove “10OFF”“EXTRA5” may stay or be removed depending on ruleSystem correctly handles dependent coupons

Pass criteria: Any mutation of cart contents, pricing, or eligibility triggers a re‑validation step; the UI reflects the current valid state without requiring a full page refresh unless unavoidable.

4.3 Automation & Autonomous Coverage

5. Accessibility (WCAG) Considerations

Coupon entry fields and associated messaging must be perceivable, operable, understandable, and robust for users with disabilities.

5.1 Keyboard Navigation

#Test DescriptionStepsExpected ResultPass Criteria
A1Focus reaches coupon input via Tab1. Tab through checkout form until coupon field receives focusVisible focus indicator (outline ≥ 2 px)Contrast ratio ≥ 3:1 against background
A2Submit via Enter key1. Focus coupon field, type code, press EnterApply action triggered same as button clickNo reliance on mouse-only events
A3Escape clears field, Focus stays in field clearedField empties, focus retained

5.2 Screen Reader Support

#Test DescriptionStepsExpected ResultPass Criteria
A4Label association1. Inspect coupon input presentScreen reader reads label when input focused
A5Error message announcement1. Enter invalid code, submitLive region (aria-live="assertive") announces “Invalid coupon code”Message appears within 200 ms
A6Success announcement1. Apply valid codeLive region announces “Coupon applied, you saved $X”Includes discount amount
A7Role of coupon applied badge1. After success, badge with text “Applied”role="status" or aria-live="polite"Assistive tech reads update without being intrusive

5.3 Color and Contrast

#Test DescriptionStepsExpected ResultPass Criteria
A8Error text contrast1. Trigger invalid couponError text color #D32F2F on white backgroundContrast ≥ 4.5:1 (AA)
A9Applied badge contrast1. Apply couponBadge background #1976D2, text whiteContrast ≥ 4.5:1
A10Focus indicator contrast1. Tab to coupon fieldOutline #0069C9 on field backgroundContrast ≥ 3:1 (AA)

5.4 Touch Target Size

#Test DescriptionStepsExpected ResultPass Criteria
A11Apply button size1. Measure buttonMinimum 48 × 48 dp (Android) or 44 × 44 px (iOS)Meets platform guideline
A12Coupon input height1. Measure input fieldHeight ≥ 44 pxEasy to tap

5.5 Automation & Autonomous Validation

6. Security and Privacy Checks

Coupon systems can be abused to extract discounts, enumerate valid codes, or leak personal data.

6.1 Rate Limiting & Enumeration

#Test DescriptionStepsExpected ResultPass Criteria
S1Brute‑force attempt1. Send 20 requests/sec with random 6‑char codesAfter N attempts (e.g., 100), server responds 429 Too Many Requests or introduces CAPTCHANo successful guess within limit, logs show throttling
S2Valid code leakage via response timing1. Measure response time for known valid vs invalid codeDifference < 50 ms (constant‑time comparison)Prevents timing attacks
S3Error message disclosure1. Submit invalid codeGeneric message “Coupon not found” (does not reveal whether code exists but inactive)No enumeration via error specificity
S4Coupon exposure in URL1. Apply coupon, observe network requestCoupon code sent via POST body, not query stringPrevents leakage via Referer or logs
S5Coupon code in client‑side storage1. Apply coupon, inspect localStorage/sessionStorageNo plain‑text coupon stored after navigationAvoids persistence that could be harvested
S6CSRF protection on apply endpoint1. Submit apply request without valid CSRF tokenServer rejects with 403 ForbiddenProtects against forced coupon application
S7SameSite cookie on session1. Inspect Set‑Cookie headerSameSite=Lax or StrictReduces CSRF risk
S8Information disclosure in error stack1. Trigger server error (e.g., malformed JSON)Response contains no stack trace or internal pathsPrevents leakage of implementation details

Pass criteria: All endpoints must enforce authentication where required, apply rate limits, use constant‑time validation, and never expose coupon existence via side‑channels.

6.2 Data Privacy

#Test DescriptionStepsExpected ResultPass Criteria
P1Coupon usage tied to user profile1. Apply coupon as logged‑in user 2. Check user profileUsage count incremented, but coupon code itself not displayed in plain text elsewherePrevents accidental exposure of code in UI
P2GDPR‑style right to be forgotten1. Request deletion of account 2. Verify coupon usage logs are anonymized or removed per policyNo personally identifiable data retained beyond allowed periodCompliance with data‑retention rules
P3Sharing coupon via social intent1. Click “Share coupon” button 2. Inspect generated linkLink contains a referral token, not the raw coupon codePrevents code leakage through sharing
P4Analytics event payload1. Apply coupon 2. Capture analytics requestEvent includes coupon ID (hashed) not plain codeEnsures analytics do not leak usable codes

Pass criteria: Personal data linked to coupon usage must be stored securely, accessible only to authorized services, and cleared according to retention policies.

6.3 Automation & Autonomous Validation

7. Performance and Load Testing

Coupon validation should remain responsive under peak traffic, especially during flash sales or holiday campaigns.

7.1 Response Time Benchmarks

#Test DescriptionLoad (VUs)DurationTarget 95th‑pct LatencyPass Criteria
P1Single coupon apply (cache warm)102 min≤ 150 msMedian and 95th‑pct within SLA
P2Burst of 500 applies/sec50030 s≤ 300 ms (95th)No error spikes, CPU < 70 %
P3Sustained load 1000 applies/min for 10 min100010 min≤ 200 ms (avg)Steady‑state, no memory leak
P4Concurrent coupon apply + cart modify200 VUs each doing apply + add‑item5 min≤ 250 ms (95th)System handles coupled operations
P5Cold start (first request after deploy)11 s≤ 500 msAcceptable warm‑up penalty
P6High‑validity coupon (many redemptions)1005 min≤ 180 ms (95th)Counter updates do not cause lock contention

Pass criteria: All latency metrics must stay within the defined SLA; error rates (5xx, 429) must remain below 1 %; system resources (CPU, memory, DB connections) should stay within provisioned limits.

7.2 Load‑Test Script Example (k6)


import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '30s', target: 200 },
    { duration: '1m', target: 200 },
    { duration: '30s', target: 0 },
  ],
};

const couponCode = '__VALID_CODE__';
const payload = JSON.stringify({ code: couponCode });

export default function () {
  const params = {
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${__ENV.TOKEN}`,
    },
  };
  const res = http.post('https://api.example.com/v1/cart/apply-coupon', payload, params);
  check(res, {
    'status is 200': (r) => r.status === 200,
    'latency < 300ms': (r) => r.timings.duration < 300,
    'coupon applied': (r) => r.json().applied === true,
  });
  sleep(1);
}

Run with k6 run coupon_load.js.

7.3 Autonomous Performance Observation

SUSA’s “impatient” persona issues requests as fast as the device allows, while the “power‑user” persona mixes coupon applies with cart modifications. The exploration engine records response times and flags any request exceeding a configurable threshold (default 500 ms). Over multiple runs, SUSA builds a baseline and alerts on regression.

8. Release Readiness and Regression

Before promoting a coupon‑related change to production, run a final verification that covers the checklist and ensures no regression in related flows.

8.1 Pre‑Release Checklist

AreaItemVerify
Happy PathAll core coupon types (percentage, fixed, free‑shipping, tiered) apply correctlyManual or scripted validation of discount math
Error HandlingInvalid inputs produce user‑friendly messages, no 500 errorsAutomated negative‑test suite
Edge CasesBoundary values (zero, 100 %, limits) behave as definedParameterized test data
AccessibilityKeyboard navigation, ARIA labels, contrast pass axe checksAutomated accessibility scan
SecurityRate limiting, CSRF tokens, constant‑time validation activeOWASP ZAP baseline scan
Performance95th‑pct latency < SLA under expected peak loadk6 or JUnitPerf test
RegressionExisting cart/checkout flows still pass after coupon changesFull smoke test suite
MonitoringAlerts for coupon‑service latency, error spikes, usage‑counter anomaliesDashboard verification
DocumentationRelease notes include any new coupon behavior, validation rules, and deprecationsProduct manager sign‑off
RollbackFeature flag or config toggle can disable new coupon type without redeployTest toggle in staging

Pass criteria: Every item must be marked PASS before the release is signed off. Any FAIL triggers a blocker ticket.

8.2 Regression Test Suite Example (Playwright)


import { test, expect } from '@playwright/test';

test.describe('Coupon regression suite', () => {
  test('percentage coupon applies correct discount', async ({ page }) => {
    await page.goto('/checkout');
    await page.fill('[data-testid="cart-item-quantity"]', '2');
    await page.fill('[data-testid="coupon-input"]', 'SAVE10');
    await page.click('[data-testid="apply-coupon"]');
    const total = await page.locator('[data-testid="order-total"]').innerText();
    expect(total).toBe('$18.00'); // assuming $20 subtotal, 10% off
  });

  test('invalid coupon shows error', async ({ page }) => {
    await page.goto('/checkout');
    await page.fill('[data-testid="coupon-input"]', 'BADCODE');
    await page.click('[data-testid="apply-coupon"]');
    const err = await page.locator('[data-testid="coupon-error"]');
    await expect(err).toHaveText('Coupon code not found');
  });
});

Run with npx playwright test coupon-regression.spec.js.

8.3 How SUSA Assists Release Readiness

9. Quick Reference Checklist (Copy‑Paste Ready)

You can paste this into your test‑management tool or a markdown note.


[ ] HP1 – Percentage‑off coupon applies correct discount
[ ] HP2 – Fixed‑amount coupon applies correct discount
[ ] HP3 – Free‑shipping coupon removes shipping fee
[ ] HP4 – Minimum‑purchase coupon rejected when threshold not met
[ ] HP5 – Stackable coupons combine per rule
[ ] HP6 – Category‑limited coupon applies only to eligible items
[ ] HP7 – Per‑user usage limit enforced
[ ] HP8 – Global usage limit respected
[ ] HP9 – Coupon valid before expiry datetime
[ ] HP10 – Coupon rejected after expiry datetime
[ ] EH1 – Leading/trailing spaces trimmed
[ ] EH2 – Case‑insensitivity handled per config
[ ] EH3 – Special characters rejected
[ ] EH4 – Overly long input rejected safely
[ ] EH5 – SQL‑like payload does not leak error
[ ] EH6 – XSS payload escaped
[ ] EH7

Test Your App Autonomously

Upload your APK or URL. SUSA explores like 10 real users — finds bugs, accessibility violations, and security issues. No scripts.

Try SUSA Free