Coupon Codes Testing Checklist (2026)
Coupon Codes Testing Checklist (2026)
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:
- Isolate coupon‑specific logic from general cart/checkout tests.
- Detect regressions introduced by third‑party promotion engines or rule‑engine updates.
- Verify that accessibility and security controls stay intact when new coupon types (e.g., tiered, referral‑based, crypto‑backed) are added.
- Provide auditable evidence for stakeholders that promotional campaigns obey business rules and legal constraints.
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 Description | Steps | Expected Result | Pass Criteria |
|---|---|---|---|---|
| HP1 | Apply a valid percentage‑off coupon | 1. Add item to cart 2. Enter coupon code “SAVE10” 3. Apply | Discount = 10 % of subtotal, tax recalculated, total updated | Discount amount matches formula, cart total reflects new amount, coupon marked as “applied” |
| HP2 | Apply a valid fixed‑amount coupon | 1. Add items totaling $75 2. Enter coupon “FIVEOFF” 3. Apply | Discount = $5, new total = $70 (pre‑tax) | Discount equals coupon value, tax calculated on discounted subtotal |
| HP3 | Apply a free‑shipping coupon | 1. Add items qualifying for free shipping threshold 2. Enter “FREESHIP” 3. Apply | Shipping cost set to $0, order total reflects removal | Shipping line shows $0, no hidden fees added |
| HP4 | Apply a coupon with minimum purchase | 1. Cart subtotal $48 2. Enter “MIN50” (requires $50) 3. Apply | Error: “Minimum purchase $50 not met” | Coupon rejected, cart unchanged, error message displayed |
| HP5 | Apply a coupon that stacks with another promotion | 1. Cart has auto‑applied 15 % seasonal sale 2. Enter “EXTRA5” (stackable) 3. Apply | Total discount = 15 % + $5 off (or 5 % depending on rule) | Final price matches combined rule, no double‑counting of same line item |
| HP6 | Apply a coupon limited to specific product category | 1. Add a qualifying SKU (e.g., “T‑SHIRT‑RED”) 2. Enter “CAT10” (10 % off apparel) 3. Apply | Discount applied only to apparel line items | Non‑apparel items remain at full price, discount correctly scoped |
| HP7 | Apply a coupon with usage limit per user | 1. Log in as user A 2. Apply “ONETIME” (max 1 use) 3. Complete order 4. Log in again, try to re‑apply | Second attempt rejected with “Usage limit exceeded” | System enforces per‑user limit, logs attempt, prevents reuse |
| HP8 | Apply a coupon with global usage limit | 1. Multiple users apply “GLOBAL50” until limit reached 2. Next user tries | Coupon rejected with “Campaign exhausted” | Global counter respected, no over‑issue beyond limit |
| HP9 | Apply a coupon that expires at a specific datetime | 1. Set system clock to 2025‑12‑31 23:59:59 2. Enter “YEAREND” (expires 2026‑01‑01 00:00:00) 3. Apply | Discount applied | Coupon valid before expiry |
| HP10 | Apply a coupon after expiry | 1. Set system clock to 2026‑01‑02 00:00:01 2. Enter “YEAREND” 3. Apply | Error: “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
- Manual: Use a test‑card or sandbox payment gateway to complete an order after applying the coupon. Verify the order confirmation email shows the correct discount.
- Automated (scripted): Write a Playwright test that fills the coupon field, asserts the discounted price via
page.locator('.order-total').textContent(), and checks for success toast. - Autonomous (SUSA): Point the agent at the checkout URL; its “power‑user” persona will try common coupon patterns (e.g., “SAVE10”, “FIVEOFF”) and validate resulting price changes via DOM inspection. The agent logs any mismatch as a potential defect.
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 Description | Steps | Expected Result | Pass Criteria |
|---|---|---|---|---|
| EH1 | Coupon code with leading/trailing spaces | 1. Enter “ SAVE10 ” (space before/after) 2. Apply | System trims and accepts as valid “SAVE10” | Discount applied correctly; no error due to whitespace |
| EH2 | Coupon code with case variation | 1. Enter “save10” 2. Apply | System treats as case‑insensitive (if configured) | Discount applied; otherwise proper error if case‑sensitive |
| EH3 | Non‑alphanumeric characters | 1. Enter “SAVE@10!” 2. Apply | Error: “Invalid coupon format” | System rejects with clear message, no internal exception |
| EH4 | Extremely long string (e.g., 500 chars) | 1. Paste 500‑character string 2. Apply | Error: “Coupon code too long” or truncated safely | No buffer overflow, no crash, response time < 2 s |
| EH5 | SQL‑like payload | 1. Enter “SAVE10' OR '1'='1” 2. Apply | Error: “Invalid coupon” (no DB error exposed) | No SQL error leaked in response, coupon rejected |
| EH6 | XSS payload | 1. Enter 2. Apply | Error: “Invalid coupon”; script not rendered | Output encoded, no script execution in DOM |
| EH7 | Null / empty submission | 1. Leave field blank 2. Click Apply | Error: “Please enter a coupon code” | Validation fires before AJAX call |
| EH8 | Duplicate submission (rapid clicks) | 1. Click Apply button five times quickly | Only one request processed, no duplicate discount | Idempotent 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 Description | Steps | Expected Result | Pass Criteria |
|---|---|---|---|---|
| EH9 | Applying a coupon to a non‑eligible payment method | 1. Select gift‑card as payment 2. Enter “SAVE10” 3. Apply | Error: “Coupon not valid with gift‑card payment” | Coupon rejected, payment method unchanged |
| EH10 | Applying a coupon that conflicts with another active coupon | 1. Apply “FIRST10” 2. Attempt to apply “SECOND10” (non‑stackable) | Error: “Only one coupon may be used” | Second coupon blocked, first remains applied |
| EH11 | Applying a coupon after order placed | 1. Complete checkout 2. On order‑confirmation page, try to add coupon | Error: “Coupon cannot be applied after purchase” | No change to order total |
| EH12 | Applying a coupon that requires login when anonymous | 1. As guest, enter “MEMBER20” 2. Apply | Prompt to log in or error: “Coupon requires account” | No discount applied until authentication |
| EH13 | Applying a coupon that exceeds maximum discount cap | 1. Cart $200, coupon “HALFOFF” (50 % off, max $40) 2. Apply | Discount capped at $40, not $100 | System enforces cap, shows applied discount $40 |
| EH14 | Applying a coupon that would make total negative | 1. Cart $5, coupon “TENOFF” (fixed $10) 2. Apply | Error: “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
- Use parameterized test data (e.g., CSV of valid/invalid codes) with a data‑driven framework (TestNG, JUnit, pytest).
- Assert that response status codes are 400/422 for client errors, never 500.
- For security payloads, verify that response bodies do not contain the injected string (use
not.contains). - In SUSA, the “adversarial” persona automatically tries SQL, XSS, and length‑based fuzzing; any uncaught exception appears in the exploration report.
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 Description | Steps | Expected Result | Pass Criteria |
|---|---|---|---|---|
| EB1 | Zero‑value coupon | 1. Enter “ZERO” (0 % off) 2. Apply | Discount $0, cart unchanged | System accepts but shows no discount |
| EB2 | 100 % off coupon | 1. Enter “FREE” (100 % off) 2. Apply | Discount = subtotal, total $0 (tax may still apply depending on jurisdiction) | If tax exempt, total $0; otherwise tax calculated on $0 subtotal |
| EB3 | Coupon with fractional percent (e.g., 12.5 %) | 1. Enter “HALF12POINT5” 2. Apply | Discount = subtotal × 0.125, rounded per currency rules | Rounding follows bankers’ rounding or half‑up as defined |
| EB4 | Minimum purchase exactly at threshold | 1. Cart $50.00, coupon “MIN50” (≥ $50) 2. Apply | Discount applied | System uses >= comparison, not > |
| EB5 | Maximum purchase limit (if applicable) | 1. Cart $1,000.00, coupon “MAX1K” (valid ≤ $1,000) 2. Apply | Discount applied | Boundary inclusive/exclusive per rule |
| EB6 | Usage count exactly at limit | 1. User has used coupon 4/5 times 2. Apply fifth time | Discount applied, counter reaches limit | Next attempt blocked |
| EB7 | Global limit exactly reached | 1. After 999 redemptions, user 1000 applies | Discount applied, counter hits max | 1001st attempt rejected |
| EB8 | Expiry at midnight (timezone edge) | 1. Set server to UTC, coupon expires 2026‑02‑01 00:00:00 UTC 2. Change client to UTC‑59 → apply | Discount applied (still valid) | System uses configured timezone consistently |
| EB9 | Expiry exactly at now (race) | 1. Deploy coupon with expiry = current timestamp 2. Rapid concurrent requests | Some requests succeed, some fail based on precise ordering | System must handle race without double‑counting or negative counters |
| EB10 | Applying coupon after cart abandonment then restore | 1. Add items, apply coupon, abandon cart 2. Restore cart later (same session) | Coupon still applied if not expired/used | Persistence 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 Description | Steps | Expected Result | Pass Criteria |
|---|---|---|---|---|
| EB11 | Applying coupon, then removing item that made it eligible | 1. Add qualifying item, apply coupon 2. Remove that item 3. Observe cart | Coupon auto‑removed or error shown | System either invalidates coupon or prompts user to adjust |
| EB12 | Applying coupon, then changing quantity below threshold | 1. Add 2× $30 item (total $60) 2. Apply “MIN50” 3. Reduce quantity to 1 (total $30) | Coupon removed or cart blocked from checkout | System re‑validates on quantity change |
| EB13 | Applying coupon, then switching currency | 1. Cart in USD, apply coupon 2. Switch to EUR (price converted) 3. Observe discount | Discount converted correctly or cleared | Currency change triggers re‑evaluation of coupon applicability |
| EB14 | Applying coupon during a flash sale that changes prices mid‑checkout | 1. Start checkout, apply coupon 2. Backend updates sale price 3. Proceed to payment | Either discount recalculated or user warned of price change | System detects price mutation and either updates discount or aborts with clear message |
| EB15 | Applying 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 rule | System 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
- Manual: Use a device or browser to perform the above sequences, observing coupon badge and messages.
- Scripted: Write a Cypress test that adds/removes items, calls
cy.contains('Apply'), then asserts the presence/absence of the discount line. - SUSA: The “novice” and “power‑user” personas will add/remove items, change quantities, and switch currencies while the agent monitors the coupon line. If the agent detects a stale coupon after a mutation, it logs a potential defect.
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 Description | Steps | Expected Result | Pass Criteria |
|---|---|---|---|---|
| A1 | Focus reaches coupon input via Tab | 1. Tab through checkout form until coupon field receives focus | Visible focus indicator (outline ≥ 2 px) | Contrast ratio ≥ 3:1 against background |
| A2 | Submit via Enter key | 1. Focus coupon field, type code, press Enter | Apply action triggered same as button click | No reliance on mouse-only events |
| A3 | Escape clears field, Focus stays in field cleared | Field empties, focus retained |
5.2 Screen Reader Support
| # | Test Description | Steps | Expected Result | Pass Criteria |
|---|---|---|---|---|
| A4 | Label association | 1. Inspect coupon input | present | Screen reader reads label when input focused |
| A5 | Error message announcement | 1. Enter invalid code, submit | Live region (aria-live="assertive") announces “Invalid coupon code” | Message appears within 200 ms |
| A6 | Success announcement | 1. Apply valid code | Live region announces “Coupon applied, you saved $X” | Includes discount amount |
| A7 | Role of coupon applied badge | 1. 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 Description | Steps | Expected Result | Pass Criteria |
|---|---|---|---|---|
| A8 | Error text contrast | 1. Trigger invalid coupon | Error text color #D32F2F on white background | Contrast ≥ 4.5:1 (AA) |
| A9 | Applied badge contrast | 1. Apply coupon | Badge background #1976D2, text white | Contrast ≥ 4.5:1 |
| A10 | Focus indicator contrast | 1. Tab to coupon field | Outline #0069C9 on field background | Contrast ≥ 3:1 (AA) |
5.4 Touch Target Size
| # | Test Description | Steps | Expected Result | Pass Criteria |
|---|---|---|---|---|
| A11 | Apply button size | 1. Measure button | Minimum 48 × 48 dp (Android) or 44 × 44 px (iOS) | Meets platform guideline |
| A12 | Coupon input height | 1. Measure input field | Height ≥ 44 px | Easy to tap |
5.5 Automation & Autonomous Validation
- Manual: Use a screen‑reader (NVDA, VoiceOver) and keyboard only to navigate the checkout flow.
- Scripted: With axe‑core or @testing-library/dom, run
await axe.run()and assert zero violations of WCAG 2.1 AA. - SUSA: The “elderly” and “accessibility” personas increase interaction latency, use screen‑reader simulation, and verify ARIA attributes and contrast via automated checks embedded in the exploration engine. Any violation surfaces in the accessibility report.
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 Description | Steps | Expected Result | Pass Criteria |
|---|---|---|---|---|
| S1 | Brute‑force attempt | 1. Send 20 requests/sec with random 6‑char codes | After N attempts (e.g., 100), server responds 429 Too Many Requests or introduces CAPTCHA | No successful guess within limit, logs show throttling |
| S2 | Valid code leakage via response timing | 1. Measure response time for known valid vs invalid code | Difference < 50 ms (constant‑time comparison) | Prevents timing attacks |
| S3 | Error message disclosure | 1. Submit invalid code | Generic message “Coupon not found” (does not reveal whether code exists but inactive) | No enumeration via error specificity |
| S4 | Coupon exposure in URL | 1. Apply coupon, observe network request | Coupon code sent via POST body, not query string | Prevents leakage via Referer or logs |
| S5 | Coupon code in client‑side storage | 1. Apply coupon, inspect localStorage/sessionStorage | No plain‑text coupon stored after navigation | Avoids persistence that could be harvested |
| S6 | CSRF protection on apply endpoint | 1. Submit apply request without valid CSRF token | Server rejects with 403 Forbidden | Protects against forced coupon application |
| S7 | SameSite cookie on session | 1. Inspect Set‑Cookie header | SameSite=Lax or Strict | Reduces CSRF risk |
| S8 | Information disclosure in error stack | 1. Trigger server error (e.g., malformed JSON) | Response contains no stack trace or internal paths | Prevents 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 Description | Steps | Expected Result | Pass Criteria |
|---|---|---|---|---|
| P1 | Coupon usage tied to user profile | 1. Apply coupon as logged‑in user 2. Check user profile | Usage count incremented, but coupon code itself not displayed in plain text elsewhere | Prevents accidental exposure of code in UI |
| P2 | GDPR‑style right to be forgotten | 1. Request deletion of account 2. Verify coupon usage logs are anonymized or removed per policy | No personally identifiable data retained beyond allowed period | Compliance with data‑retention rules |
| P3 | Sharing coupon via social intent | 1. Click “Share coupon” button 2. Inspect generated link | Link contains a referral token, not the raw coupon code | Prevents code leakage through sharing |
| P4 | Analytics event payload | 1. Apply coupon 2. Capture analytics request | Event includes coupon ID (hashed) not plain code | Ensures 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
- Manual: Use OWASP ZAP or Burp Suite to perform active scanning on the apply endpoint; verify that rate‑limiting and authentication controls are triggered.
- Scripted: Write a k6 script that ramps up virtual users sending apply requests; assert that error rate stays below 1 % and that 429 responses appear after threshold.
- SUSA: The “adversarial” persona automatically attempts rapid-fire requests, timing analysis, and CSRF‑token omission. Any successful bypass or unexpected data exposure is flagged in the security report.
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 Description | Load (VUs) | Duration | Target 95th‑pct Latency | Pass Criteria |
|---|---|---|---|---|---|
| P1 | Single coupon apply (cache warm) | 10 | 2 min | ≤ 150 ms | Median and 95th‑pct within SLA |
| P2 | Burst of 500 applies/sec | 500 | 30 s | ≤ 300 ms (95th) | No error spikes, CPU < 70 % |
| P3 | Sustained load 1000 applies/min for 10 min | 1000 | 10 min | ≤ 200 ms (avg) | Steady‑state, no memory leak |
| P4 | Concurrent coupon apply + cart modify | 200 VUs each doing apply + add‑item | 5 min | ≤ 250 ms (95th) | System handles coupled operations |
| P5 | Cold start (first request after deploy) | 1 | 1 s | ≤ 500 ms | Acceptable warm‑up penalty |
| P6 | High‑validity coupon (many redemptions) | 100 | 5 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
| Area | Item | Verify |
|---|---|---|
| Happy Path | All core coupon types (percentage, fixed, free‑shipping, tiered) apply correctly | Manual or scripted validation of discount math |
| Error Handling | Invalid inputs produce user‑friendly messages, no 500 errors | Automated negative‑test suite |
| Edge Cases | Boundary values (zero, 100 %, limits) behave as defined | Parameterized test data |
| Accessibility | Keyboard navigation, ARIA labels, contrast pass axe checks | Automated accessibility scan |
| Security | Rate limiting, CSRF tokens, constant‑time validation active | OWASP ZAP baseline scan |
| Performance | 95th‑pct latency < SLA under expected peak load | k6 or JUnitPerf test |
| Regression | Existing cart/checkout flows still pass after coupon changes | Full smoke test suite |
| Monitoring | Alerts for coupon‑service latency, error spikes, usage‑counter anomalies | Dashboard verification |
| Documentation | Release notes include any new coupon behavior, validation rules, and deprecations | Product manager sign‑off |
| Rollback | Feature flag or config toggle can disable new coupon type without redeploy | Test 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
- Upload the latest APK or point SUSA at the staging URL.
- Select the “release‑candidate” persona set (includes power‑user, adversarial, accessibility).
- Start an exploration run; SUSA will traverse the coupon entry point, apply a variety of codes (generated from its internal dictionary), and validate discount calculations, error messages, and UI states.
- After the run, download the generated Appium (Android) and Playwright (Web) regression scripts. Commit them to your repo as baseline tests for the next cycle.
- The exploration report highlights any newly discovered dead ends, accessibility violations, or security gaps, giving you a concrete list of items to address before promotion.
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