|
<!doctype html> |
|
<html lang="zh-Hant"> |
|
<head> |
|
<meta charset="utf-8"> |
|
<meta name="viewport" content="width=device-width, initial-scale=1"> |
|
<title>Kolable 每日 12:00 折扣碼刪除作戰台</title> |
|
<style> |
|
:root{--ink:#10202a;--muted:#60707d;--paper:#f4f8fb;--card:#fff;--line:#d5e1ea;--blue:#1d4ed8;--green:#08785e;--red:#b13b2c;--amber:#9a6409;--violet:#6846b8} |
|
*{box-sizing:border-box}body{margin:0;background:var(--paper);color:var(--ink);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;line-height:1.5}header{background:#fff;border-bottom:1px solid var(--line);padding:30px clamp(18px,4vw,56px)}main{padding:24px clamp(18px,4vw,56px) 48px} |
|
h1{margin:0 0 12px;font-size:clamp(31px,4vw,54px);line-height:1.04;letter-spacing:0;max-width:1120px}h2{margin:0 0 12px;font-size:22px}h3{margin:0 0 6px;font-size:16px}p{margin-top:0}.sub{max-width:1120px;color:var(--muted);font-size:17px}.grid{display:grid;gap:16px}.kpis{grid-template-columns:repeat(4,minmax(0,1fr));margin-top:22px}.two{grid-template-columns:1.05fr .95fr}.three{grid-template-columns:repeat(3,minmax(0,1fr))}.four{grid-template-columns:repeat(4,minmax(0,1fr))}.flow{grid-template-columns:repeat(5,minmax(0,1fr))} |
|
.card{background:var(--card);border:1px solid var(--line);border-radius:8px;padding:18px;box-shadow:0 1px 2px rgba(16,32,42,.04)}.metric{font-size:34px;font-weight:800}.label{color:var(--muted);font-size:13px}.pill{display:inline-flex;border:1px solid var(--line);border-radius:999px;padding:4px 10px;font-size:12px;background:#fff;margin:0 6px 8px 0;white-space:nowrap}.ok{color:var(--green);font-weight:760}.bad{color:var(--red);font-weight:760}.warn{color:var(--amber);font-weight:760} |
|
table{width:100%;border-collapse:collapse;font-size:14px}th,td{text-align:left;padding:10px;border-bottom:1px solid var(--line);vertical-align:top}th{color:var(--muted);font-size:12px;text-transform:uppercase}code{background:#edf3f7;border-radius:4px;padding:1px 5px}.step{border:1px solid var(--line);border-radius:8px;padding:12px;min-height:132px;background:#fbfdff}.step strong{display:block;color:var(--violet);margin-bottom:6px}.source a{color:var(--blue);word-break:break-word} |
|
@media(max-width:960px){.kpis,.two,.three,.four,.flow{grid-template-columns:1fr}h1{font-size:34px}} |
|
</style> |
|
</head> |
|
<body> |
|
<header> |
|
<span class="pill">PLS production delivery pack</span><span class="pill">Solution: system / watchdog / eval</span> |
|
<h1>Kolable 每日 12:00 折扣碼刪除作戰台</h1> |
|
<p class="sub">把「每日 12 點後過期折扣碼直接刪除」做成直播上線前可驗收的 production pack:server-side 刪除、隔日不可輸入、checkout 阻擋、直播前 smoke test、稽核 log、回滾與例外規則。</p> |
|
<section class="grid kpis"> |
|
<div class="card"><div class="metric bad">12:00</div><div class="label">Asia/Taipei 到點後 expired code 必須刪除</div></div> |
|
<div class="card"><div class="metric ok">0</div><div class="label">隔日可被套用的過期碼</div></div> |
|
<div class="card"><div class="metric">15m</div><div class="label">直播前折扣碼 smoke test 窗口</div></div> |
|
<div class="card"><div class="metric warn">Audit</div><div class="label">每次刪除需有 code、直播、操作者、時間</div></div> |
|
</section> |
|
</header> |
|
<main class="grid"> |
|
<section class="grid two"> |
|
<div class="card"> |
|
<h2>本輪任務</h2> |
|
<p>Kolable 直播銷講場景的折扣碼會直接影響成交信任。若觀眾隔日仍能輸入昨晚碼,會破壞限時促銷可信度,也可能造成折扣濫用。本輪把過期處理從「看得到過期」升級成「server-side 刪除與驗收」。</p> |
|
<span class="pill">Owner: Louis</span><span class="pill">Tech owner: makarove</span><span class="pill">Supervisor: zihrou</span> |
|
</div> |
|
<div class="card"> |
|
<h2>不可偷懶規則</h2> |
|
<p>只在前端倒數或標 expired 不算完成。必須在後端刪除或停用折扣碼,checkout/API lookup 不得回傳可用結果,並保存 deletion audit。若第三方平台不允許刪除,則需改成 deactivate + blocklist + invalid-code event。</p> |
|
</div> |
|
</section> |
|
<section class="card"> |
|
<h2>D1 / D7 / D14 / D30</h2> |
|
<div class="grid four"> |
|
<div class="card"><h3>D1</h3><p>定義 coupon lifecycle、12:00 cleanup worker、checkout invalidation、直播前測試清單。</p></div> |
|
<div class="card"><h3>D7</h3><p>完成 staging worker 和 3 場直播折扣碼 dry-run,舊碼隔日不可輸入。</p></div> |
|
<div class="card"><h3>D14</h3><p>接入 admin console:活動、碼池、刪除紀錄、失敗重跑、LINE alert。</p></div> |
|
<div class="card"><h3>D30</h3><p>納入直播銷講 PMF 指標:轉換率、折扣濫用率、客服抱怨、交易額。</p></div> |
|
</div> |
|
</section> |
|
<section class="card"> |
|
<h2>Purpose-to-Purpose E2E</h2> |
|
<div class="grid flow"> |
|
<div class="step"><strong>原始目的</strong>每日直播折扣碼隔日不可輸入或使用。</div> |
|
<div class="step"><strong>產出物</strong>刪除流程、資料模型、API、watchdog、驗收清單。</div> |
|
<div class="step"><strong>人採用</strong>直播 PM 開碼,系統到點刪碼,QA 直播前驗證。</div> |
|
<div class="step"><strong>指標改善</strong>折扣濫用下降、信任提升、直播成交風險下降。</div> |
|
<div class="step"><strong>錢路徑</strong>保護限時優惠毛利,支撐月交易額 NT$ 1000 萬到 1 億。</div> |
|
</div> |
|
</section> |
|
<section class="grid two"> |
|
<div class="card"> |
|
<h2>Lifecycle Rules</h2> |
|
<table> |
|
<thead><tr><th>狀態</th><th>時間</th><th>系統行為</th></tr></thead> |
|
<tbody> |
|
<tr><td>scheduled</td><td>直播前</td><td>建立碼池,綁定 live_event_id、valid_until、usage_limit。</td></tr> |
|
<tr><td>active</td><td>直播中</td><td>checkout 可查詢,可套用,寫 usage event。</td></tr> |
|
<tr><td>expired_pending_cleanup</td><td>valid_until 到期到每日 12:00</td><td>checkout 立即拒絕;等待 cleanup worker 刪除。</td></tr> |
|
<tr><td class="bad">deleted</td><td>每日 12:00 後</td><td>刪除 server-side code;lookup 回 `not_found_or_expired`。</td></tr> |
|
<tr><td class="warn">cleanup_failed</td><td>刪除失敗</td><td>寫 audit、LINE alert、進 retry queue,checkout 仍由 blocklist 拒絕。</td></tr> |
|
</tbody> |
|
</table> |
|
</div> |
|
<div class="card"> |
|
<h2>Worker / API</h2> |
|
<p><strong>Cron:</strong> <code>0 12 * * *</code> Asia/Taipei,每日掃描 `valid_until < today 12:00` 且未刪除的折扣碼。</p> |
|
<p><strong>API:</strong> <code>POST /coupons/live-events/:id/codes</code>, <code>POST /coupons/cleanup/noon</code>, <code>GET /coupons/validate?code=</code>, <code>GET /coupons/audit</code>.</p> |
|
<p><strong>Guard:</strong> checkout validate 必須先查 `coupon_status` 和 `coupon_blocklist`,不能只依前端 timer。</p> |
|
</div> |
|
</section> |
|
<section class="grid three"> |
|
<div class="card"><h2>直播前 Smoke Test</h2><p>直播前 15 分鐘測 active code;直播後建立 expired test code;隔日 12:05 驗證 lookup 不存在、checkout 拒絕、audit 有紀錄。</p></div> |
|
<div class="card"><h2>權限 / 稽核</h2><p>直播 PM 可建碼;finance 可看折扣成本;system worker 可刪除;manual delete 需 supervisor approve。</p></div> |
|
<div class="card"><h2>下一輪升級</h2><p>做 admin console:碼池狀態、cleanup log、失敗重跑、LINE alert、交易額與折扣濫用率。</p></div> |
|
</section> |
|
<section class="card source"> |
|
<h2>Market Maturity Inputs</h2> |
|
<p>Shopify supports deactivating and deleting discounts; deactivated codes should return invalid discount behavior at cart: <a href="https://help.shopify.com/manual/products/discount-codes/managing-discount-codes">Shopify discount management</a>.</p> |
|
<p>WooCommerce marketplace has scheduled expired coupon cleanup products with cleanup logs and notifications, showing mature stores automate expired coupon removal: <a href="https://woocommerce.com/de/products/auto-coupon-cleanup/">WooCommerce Auto-Coupon Expiry Cleanup</a>.</p> |
|
<p>Bulk discount workflows warn that expired codes can accumulate and block code generation until removed, so cleanup is a production scalability concern: <a href="https://support.seguno.com/bulk-discount-code-generator/en/articles/13355252-what-do-i-do-if-i-m-running-out-of-codes">Bulk Discount Code Generator support</a>.</p> |
|
</section> |
|
</main> |
|
</body> |
|
</html> |