Communitygithub.com

Biz Admin Leads Dashboard — CRM风格 /admin 面板 (Supabase)

为 Next.js 项目 (Supabase 后端) 生成一个 1CRM 风格的 /admin 管理页面,包含仪表盘概览、客户管理和邮件营销三大标签页。

admin 面板 (Supabase) 是什么?

此 AI 技能用于在 Next.js (App Router) 项目中快速创建功能完整的后台管理仪表盘,类似简化版的 1CRM。它专为使用 Supabase 作为数据库后端的企业主或小型团队设计。技能会搭建一个包含三个核心标签页的页面:仪表盘概览,显示 4 个 KPI 卡片(含环比变化箭头)、折线图和饼图;客户管理,提供可搜索、可筛选的列表并支持 CSV 导出;邮件营销,允许用户撰写纯文本或 HTML 格式的邮件,预览效果,并通过 SMTP 发送批量营销活动。该技能假设项目已集成支付处理(通过 `lib/leads-supabase.ts`)和 SMTP 功能,需要用户提供管理员密码。它会自动安装 `recharts` 图表库,在 Supabase 中创建邮件活动相关的数据库表,并在项目中生成 9 个核心文件。该技能的安全性通过 `timingSafeEqual` 比较密码和将管理员密码存储在环境变量中来保障。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/lexuanthanhhy/MKT.LANDINGPAGE.SKILLS/tree/main/.claude/skills/biz-admin-leads-dashboard

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

admin 面板 (Supabase) 是做什么的?

为 Next.js 项目 (App Router) 生成一个 1CRM 风格的 /admin 管理页面。包含3个标签页——总览 (KPI + 图表)、客户管理 (表格 + 筛选)、邮件营销 (撰写 + 批量发送 + 历史记录)。

核心理念:比 1CRM 更简化(使用统一密码,无多用户),但提供足够的图表、环比变化和邮件营销功能,足以满足 1-2 人企业主的需求。所有状态存储在 Supabase 中,生成的代码与现有项目独立。

/admin → 弹出“请输入管理密码” → 各标签页通过 /api/admin/{leads|dashboard|campaigns} 接口获取数据
                                  → 每次请求发送 x-admin-pass 请求头
                                  → 服务端使用 timing-safe 比较方法与 ADMIN_PASSWORD 环境变量进行比对

密码存储在 React state 中——刷新页面=重新弹出密码框 (有意的设计,简化流程,无需 session cookie)。

仅支持 Supabase — Vercel KV 变体已被移除。原因:邮件活动 (campaigns) 和发送记录 (campaign_sends) 需要 SQL JOIN 以及 service_role 绕过 RLS;KV 原生不支持此功能。


何时使用此技能

  • 项目已通过 lib/leads-supabase.ts (来自 biz-setup-sepay-payment 并选择了 Supabase) 集成了 Sepay 支付和潜在客户存储 → 需要视图层、仪表盘和邮件营销功能。
  • 用户想要一个 CRM 风格的管理页面:包含带环比变化的 KPI 卡片、按日统计的折线图、转化率环形图,并能向已注册客户发送促销邮件。

不适用场景:

  • 项目尚未创建 lib/leads-supabase.ts → 请先告知用户运行 /biz-setup-sepay-payment (选择 Supabase 后端) 进行初始化。
  • 项目使用 Vercel KV 而非 Supabase → 此技能 不再 支持 KV。用户只有两种选择:迁移到 Supabase 或自行手动移植代码。
  • 需要多管理员且带角色/权限功能 → 此技能使用统一密码,不适用。
  • 需要详细的邮件追踪功能 (如每个收件人的打开/点击统计) → 此技能仅追踪发送成功/失败状态。用户需要支持追踪功能的邮件服务,如 Resend、SendGrid 或 Brevo 的批量发送功能。

工作流程 (6 个阶段)

阶段 0: 检测 Next.js App Router + 验证 lib/leads-supabase.ts 存在 + 验证 SMTP 环境变量
阶段 1: 询问用户设置后台密码 (默认 123456) — 关卡 (GATE)
阶段 2: 安装 npm 依赖 recharts
阶段 3: 在 Supabase SQL 编辑器中运行 supabase-migration-admin.sql — 关卡 (GATE)
阶段 4: 将 ADMIN_PASSWORD 写入 .env.local 文件
阶段 5: 创建 9 个代码文件 (5 个库文件 + 4 个路由文件 + 1 个页面文件)
阶段 6: 三级测试 (curl 测试仪表板 API、UI 界面冒烟测试、发送测试邮件活动)

阶段 0 — 检测并验证依赖

# 检查 Next.js + App Router
test -f next.config.js -o -f next.config.mjs -o -f next.config.ts && echo "Next.js: ✓"
test -d app && echo "App Router: ✓" || { echo "✗ 需要 App Router。此技能不支持 Pages Router。"; exit 1; }

# 验证 Supabase 潜在客户存储
test -f lib/leads-supabase.ts && echo "Supabase store: ✓" || { echo "✗ 缺少 lib/leads-supabase.ts — 请先运行 /biz-setup-sepay-payment 并选择 Supabase"; exit 1; }
test -f lib/leads-store.ts && echo "Provider-agnostic wrapper: ✓"
test -f lib/supabase-admin.ts && echo "Service-role client: ✓"

# 验证 SMTP 环境变量 (来自 biz-email-setup)
grep -E "^SMTP_HOST=" .env.local && echo "SMTP_HOST: ✓" || { echo "✗ 缺少 SMTP 环境变量 — 请先运行 /biz-email-setup"; exit 1; }
grep -E "^SMTP_USER=" .env.local
grep -E "^SMTP_PASS=" .env.local
grep -E "^MAIL_FROM=" .env.local

# 验证包依赖
grep '"nodemailer"' package.json && echo "nodemailer: ✓"
grep '"@supabase/supabase-js"' package.json && echo "@supabase: ✓"

如果缺少 lib/leads-supabase.ts:

⚠ 我注意到项目还没有 Supabase 潜在客户存储。请您先运行 /biz-setup-sepay-payment (选择 Supabase 后端) 来连接支付功能、创建 leads 表和设置 RLS,然后再回来,我将为您搭建管理仪表盘。

如果缺少 SMTP 环境变量:

⚠ 我注意到 SMTP 尚未配置。邮件营销标签页需要通过 SMTP 发送邮件。请您先运行 /biz-email-setup 选择邮件提供商 (Gmail/Resend SMTP/Brevo/SendGrid/Zoho...),然后再回来,我将为您搭建管理仪表盘。如果您确认暂时不需要邮件功能,我也可以跳过此部分继续搭建。

向用户总结:

我已检测到:Next.js App Router ✓,Supabase 潜在客户存储 ✓,SMTP 配置 ✓。我将进行以下操作:

  1. 询问您 /admin 页面的访问密码
  2. 安装 recharts (用于折线图和环形图)
  3. 在 Supabase 中运行 SQL 迁移脚本以创建 campaigns 和 campaign_sends 表
  4. 将 ADMIN_PASSWORD 写入 .env.local 文件
  5. 生成 9 个文件 (5 个库文件 + 4 个路由文件 + 1 个页面文件)
  6. 指导您进行测试

准备好进入阶段 1 了吗?


阶段 1 — 询问密码 (关卡 GATE)

直接询问用户:

您希望为 /admin 页面设置什么密码?

  • 我建议使用默认密码:123456
  • 或者您也可以粘贴一个更强的密码用于生产环境 (至少 12 个字符,包含字母、数字和特殊字符)

请粘贴您的密码 (或直接输入 "123456" 使用默认值):

等待用户回复。获取用户粘贴的密码。如果为空 → 使用 123456。

在用户确认密码前,不要进入阶段 2。


阶段 2 — 安装 recharts

# 检测包管理器
test -f pnpm-lock.yaml && PM=pnpm
test -f yarn.lock && PM=yarn
test -z "$PM" && PM=npm

$PM add recharts  # 或: pnpm add recharts / yarn add recharts

nodemailer 已通过 /biz-email-setup 安装,无需再次安装。


阶段 3 — 运行 SQL 迁移脚本 (关卡 GATE)

指导用户:

请您打开 Supabase 控制台 → SQL 编辑器 → 新建查询 → 粘贴下方完整内容 → 点击 运行:

[在此处粘贴 templates/supabase-migration-admin.sql 的内容]

此 SQL 脚本将创建两个新表:campaigns (邮件活动主表) 和 campaign_sends (每个收件人的发送日志)。不会修改已有的 leads 表。

运行完成后,请在 SQL 脚本的结尾部分确认——您应该会看到 campaigns: 0 和 campaign_sends: 0。

等待用户确认“SQL 已执行完毕”后,方可进入阶段 4。


阶段 4 — 写入 .env.local

将以下内容追加到 .env.local 文件:

# Admin /admin page password
ADMIN_PASSWORD=<user-paste-from-phase-1>

如果 ADMIN_PASSWORD 已存在 → 询问用户是否覆盖 (默认不覆盖)。

确保 .env.local 已在 .gitignore 中:

grep -qxF ".env.local" .gitignore 2>/dev/null || echo ".env.local" >> .gitignore

阶段 5 — 创建 9 个文件

lib/admin-auth.ts          ← templates/lib-admin-auth.ts
lib/admin-stats.ts         ← templates/lib-admin-stats.ts
lib/campaigns.ts           ← templates/lib-campaigns.ts
lib/email-render.ts        ← templates/lib-email-render.ts
lib/mailer.ts              ← templates/lib-mailer.ts
app/admin/page.tsx         ← templates/app-admin-page.tsx
app/api/admin/leads/route.ts      ← templates/app-api-admin-leads-route.ts
app/api/admin/dashboard/route.ts  ← templates/app-api-admin-dashboard-route.ts
app/api/admin/campaigns/route.ts  ← templates/app-api-admin-campaigns-route.ts

邮件渲染模块:lib/email-render.ts 是 纯函数 模块 (不导入 nodemailer) —— 包含 textToHtml / wrapEmailHtml / personalize / renderCampaignEmail。lib/mailer.ts 重新导出这些函数并添加 SMTP transport。如此分离是为了让 app/admin/page.tsx (客户端组件) 能够直接导入渲染辅助函数用于“预览”功能,而不会将 nodemailer 打包到客户端 bundle 中。

注意:如果项目中已有来自 biz-email-setup 的 lib/mailer.ts:不要覆盖 —— 将此技能的邮件模块创建为 lib/admin-mailer.ts,并修改 app/api/admin/campaigns/route.ts 中的引用为 @/lib/admin-mailer。lib/email-render.ts 始终是安全的 (独立名称,不会冲突)。

注意导入别名:所有模板使用 @/lib/...。请确认项目中 tsconfig.json 的 paths 配置了 "@/*": ["./*"] (Next.js 默认配置)。如果没有,则需改为相对路径导入。

关于 lib/leads-store.ts 的注意事项:Leads API 路由从 @/lib/leads-store (来自 biz-setup-sepay-payment 的与具体数据源无关的包装器) 导入 listLeads。如果用户之前设置了 KV 后重命名了此文件,则需验证包装器指向的是 Supabase。

数据流图

浏览器 (admin/page.tsx)
  │  发起 fetch 请求 (携带 x-admin-pass 请求头)
  ├──► GET /api/admin/dashboard?days=30   → lib/admin-stats.ts → leads 表     → { kpi, timeseries, deltas }
  ├──► GET /api/admin/leads?status=...    → lib/leads-store.ts → leads 表     → { leads, stats }
  ├──► GET /api/admin/campaigns            → lib/campaigns.ts  → campaigns 表 → { campaigns: [...] }
  └──► POST /api/admin/campaigns   (请求体包含 bodyFormat: 'text' | 'html')
            └─► lib/campaigns.queryAudience(leads.where status/days)
            └─► lib/email-render.renderCampaignEmail(format, body) → { html, text } (渲染一次)
            └─► lib/campaigns.createCampaign (campaigns 行)
            └─► loop (节流 200ms):
                  lib/mailer.personalize(html/text per recipient)
                  lib/mailer.sendOne(to, subject, html)
                  lib/campaigns.logCampaignSend (campaign_sends 行)
            └─► lib/campaigns.setCampaignStatus (最终计数 + sentAt)
            return { successCount, failCount }

客户端预览 (不调用服务器): admin/page.tsx 直接导入 lib/email-render,
“预览”按钮渲染 { html } + personalize(模板) → 在 <iframe srcDoc sandbox> 中显示。

阶段 6 — 三级测试

测试 1 — 使用 curl 测试仪表板 API

PASS="<password-từ-phase-1>"

# 错误密码 → 应返回 401
curl -i http://localhost:3000/api/admin/dashboard -H "x-admin-pass: wrong"
# 期望状态码: 401, 响应体: {"error":"invalid_password"}

# 正确密码 → 应返回 200,包含 KPI 和时间序列数据
curl -s http://localhost:3000/api/admin/dashboard?days=7 -H "x-admin-pass: $PASS" | jq '.period, .deltas'
# 期望返回: period {days, leads, paid, revenue, conversionRate}, deltas {leadsPct, ...}

测试 2 — 浏览器 UI 冒烟测试

1. pnpm dev (或 yarn/npm)
2. 打开浏览器访问 http://localhost:3000/admin
3. 应看到“管理页面”弹出窗口 → 输入错误密码 → 应显示“密码错误,请重试”
4. 输入正确密码 → 进入仪表盘
5. 总览标签页:应看到 4 个 KPI 卡片、折线图、环形图、7天/30天/90天时段选择器正常工作
6. 客户管理标签页:应看到表格、筛选项和 CSV 导出按钮
7. 邮件营销标签页:应看到邮件撰写表单和历史记录列表 (初始应为空)
8. 邮件营销标签页:输入内容 → 点击“👁 预览”按钮 → 应弹出模态框显示邮件
   渲染效果 (切换“纯文本”和“HTML”格式以确认两种模式均正常)

测试 3 — 向自己发送测试邮件活动

重要:选择受众为 last_days = 7 (使用已设置的密码),并在邮件正文中包含 {{name}}。先向数据库中唯一的测试线索 (拥有者自己的测试数据) 发送测试邮件,以确认整个流程无误,再向实际用户发送。

1. 进入邮件营销标签页
2. 活动名称: "测试发送"
3. 邮件主题: "来自 /admin 的测试邮件 --- 您收到了吗?"
4. 受众: "最近几天" → 7 天
5. 邮件正文:
     你好 {{name}},
     
     这是一封从管理后台发送的测试邮件,用于确认 SMTP 配置正常。
     
     如果您收到了这封邮件,说明可以正式开始发送真实邮件活动了。
6. 点击“👁 预览”按钮 → 确认邮件显示正确 → 关闭模态框
7. 点击“立即发送”按钮 → 确认
8. 等待 10-30 秒 (200ms × 收件人数)
9. 验证:
   - 应出现绿色横幅:“已成功发送 X/X 封邮件 (0 次错误)”
   - 历史记录表格中应新增状态为“已发送”的行
   - 检查收件箱 → 应收到主题为测试内容的邮件,且 {{name}} 已被替换为实际名称

最终输出

✓ 已成功创建 /admin CRM 风格管理仪表盘 (Supabase + recharts + 邮件营销功能)

📁 新增文件 (9 个):
  lib/
    admin-auth.ts          (timing-safe 密码校验)
    admin-stats.ts         (KPI + 时间序列 + 环比变化)
    campaigns.ts           (CRUD + 受众查询)
    email-render.ts        (纯函数: textToHtml + wrapEmailHtml + renderCampaignEmail — 服务端和客户端预览共用)
    mailer.ts              (nodemailer 传输器 + 重新导出 email-render + 可选页脚)
  app/admin/page.tsx       (1CRM 三标签页 UI — 总览 / 客户管理 / 邮件营销 — 支持纯文本/HTML 格式 + 预览功能)
  app/api/admin/
    leads/route.ts         (GET 列表 + 筛选)
    dashboard/route.ts     (GET KPI + 时间序列)
    campaigns/route.ts     (GET 历史记录 + POST 创建并发送)

🗄  Supabase 数据库迁移:
  - 已创建 campaigns 和 campaign_sends 表 (RLS 拒绝所有,通过 service_role 绕过)
  - 您已成功执行 templates/supabase-migration-admin.sql ✓

📦 NPM 依赖:
  - recharts (已新安装)
  - nodemailer (已通过 biz-email-setup 安装)

🔐 环境变量:
  - ADMIN_PASSWORD 已写入 .env.local
  - .gitignore 已包含 .env.local
  - SMTP_* + MAIL_FROM 复用自 biz-email-setup

🧪 测试:
  1. ✓ 使用 curl 测试仪表板 API (测试 1)
  2. ✓ 浏览器 UI 冒烟测试 (测试 2)
  3. ✓ 已向项目所有者发送测试邮件 (测试 3)

🔧 您还需要做的:
  1. (如果部署到生产环境) 将 ADMIN_PASSWORD 添加到 Vercel 环境变量:
     vercel env add ADMIN_PASSWORD production
  2. 重新部署: vercel --prod
  3. 打开 https://<domain>/admin → 输入密码 → 确认三个标签页正常工作
  4. 首次发送真实邮件活动: 选择小范围受众 (如最近 7 天) 先测试
     确认 SMTP 提供商的速率限制,然后再扩大到 '所有'

模板文件

文件描述
templates/supabase-migration-admin.sql创建 campaigns 和 campaign_sends 表的数据库迁移脚本
templates/lib-admin-auth.tscheckAdminPass() timing-safe 密码比较
templates/lib-admin-stats.tsgetDashboardData(days) — KPI + 时间序列 + 环比变化
templates/lib-campaigns.tscampaigns 的 CRUD 操作 + queryAudience()
templates/lib-email-render.ts纯函数模块 — textToHtml() + wrapEmailHtml() + personalize() + renderCampaignEmail() (支持纯文本/HTML 格式)。不导入 nodemailer → 可在客户端组件中用于预览
templates/lib-mailer.tsnodemailer 传输器 + sendOne() + sleep() + 从 email-render 重新导出渲染辅助函数
templates/app-admin-page.tsx1CRM 风格页面,包含侧边栏 + 3 个标签页 + recharts。邮件标签页包含纯文本/HTML 格式切换和预览按钮 (iframe 模态框)
templates/app-api-admin-leads-route.ts潜在客户表 API (调用 listLeads())
templates/app-api-admin-dashboard-route.ts仪表盘分析 API
templates/app-api-admin-campaigns-route.tsGET 列表 + POST 创建并发送

反模式 (请避免)

  • ❌ 使用 === 比较密码 → 容易受到时序攻击 (timing attack)。模板通过 lib/admin-auth.ts 使用 crypto.timingSafeEqual 进行比较。
  • ❌ 在源代码中硬编码密码 → 容易忘记修改,导致生产环境部署时仍使用测试密码。始终通过 process.env.ADMIN_PASSWORD 获取。
  • ❌ 通过 URL 查询字符串传递密码 (?pass=123456) → 密码会泄露到浏览器历史记录和访问日志中。应使用 x-admin-pass 请求头。
  • ❌ 当用户只需要简单的后台功能时,单独创建登录页面 + session cookie + JWT。使用内联弹出窗口即可满足需求。
  • ❌ 将密码存储在 localStorage → 可通过 JavaScript 读取,导致 XSS 攻击泄漏密码。模板将密码存储在 React state 中 (刷新即丢失,此为有意设计)。
  • ❌ 跳过检查

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Best practices for Remotion - Video creation in React

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Deploy landing page / website (React, Next.js, Vite, static HTML) lên Vercel — tự kiểm tra Vercel CLI hoặc Vercel MCP đã cài chưa, nếu chưa thì cài qua npm/pnpm và hướng dẫn user authenticate (vercel login), tự detect framework (Next.js / Vite / CRA / static), auto-generate vercel.json khi cần, chạy `vercel --prod`, trả về live URL + inspect URL + hướng dẫn custom domain. USE WHEN user says 'deploy lên vercel', 'đẩy landing page lên vercel', 'publish website', 'go live', 'deploy nextjs', 'deploy react', 'deploy vite', 'tạo URL live', 'đưa lên production', 'biz-deploy-vercel', 'host landing page', 'vercel deploy', 'ship lên vercel', 'đẩy code lên vercel'. Skill này áp dụng cho cả case dùng Vercel CLI lẫn Vercel MCP server.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Setup SMTP-based email auto-responder cho landing page bán hàng — tự động gửi email sau khi user điền form (tên/SĐT/email), KHÔNG cố định vào provider nào. Skill này (1) hỏi user chọn SMTP provider (Gmail/Google Workspace, Resend SMTP, SendGrid, Mailgun, Brevo, Zoho, hoặc SMTP custom của hosting VN) và detect Next.js stack đang dùng, (2) đọc context từ `offer.json` + `conversion-copy.md` (từ `/biz-offer-alex-hormozi`) HOẶC đọc trực tiếp Next.js project đã build qua `ui-ux-pro-max` (file `app/page.tsx`) HOẶC đọc HTML landing page đã deploy để hiểu offer, dream outcome, mechanism, bonus. Lưu ý: skill `biz-sales-page-layout` đã DEPRECATED 2026-05-14 — pipeline mới skip layout/copy.json, (3) **draft 2 email**: email A — auto-responder gửi cho lead (warm welcome + deliver lead magnet/booking confirm/payment link tuỳ offer type), email B — notification gửi cho owner (lead alert + thông tin liên hệ), (4) **show draft cho user duyệt và chỉnh sửa** trước khi wire vào code, (5) cài `nodemailer`

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Cài chatbot AI dạng floating widget góc dưới phải vào project Next.js có sẵn (App Router hoặc Pages Router), responsive đầy đủ web + tablet + mobile, gọi LLM qua OpenRouter (mặc định google/gemini-3-flash-preview, có thể đổi sang anthropic/claude-sonnet-4.6), streaming response, RENDER MARKDOWN trong assistant bubble (bold / list / link / code) qua react-markdown + remark-gfm — KHÔNG hiện raw **bold** dạng text — có knowledge base từ FAQ + tài liệu sản phẩm/khóa học do user cung cấp để chatbot tự động trả lời khách hàng, và TỰ ĐỘNG EXTRACT + LƯU LEAD (tên + SĐT + email) vào Upstash Redis/Vercel KV dưới namespace `chat-lead:{phone}` khi user cung cấp đầy đủ thông tin trong chat — dedupe theo SĐT, TTL 90 ngày, fire-and-forget không block stream. Skill tự detect số lượng project Next.js — nếu có nhiều hơn 1 sẽ hỏi user chọn project nào để cài; tự detect TypeScript/JS, App Router/Pages Router, Tailwind/CSS module, KV/Upstash availability (skip auto-save nếu chưa có); tự install react-markd

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Đóng gói offer **không thể chối từ** (grand slam offer) theo phương pháp Alex Hormozi ($100M Offers) — nhận input pains/gains/customer jobs theo Value Proposition Design (Osterwalder 2014) + sản phẩm/dịch vụ, rồi sinh ra: (1) markdown report tiếng Việt đầy đủ Value Equation scoring + Core Offer + 3-4 Bonus stack + Guarantee + Urgency + Pricing, (2) offer.json structured cho pipeline downstream (`ui-ux-pro-max` build sales page production-ready), (3) conversion copy block (headline + subheadline + CTA) sẵn sàng paste landing page. 2 input mode: (B) user paste sẵn pains + gains + product, (C) user chỉ có sản phẩm — skill phỏng vấn theo VPD framework để surface pain/gain trước. Bonus stack mode hybrid: skill brainstorm 5-7 candidate có justification value rồi user pick/chỉnh 3-4 cái. Tiếng Việt thuần (xưng anh/chị), giá VND charm pricing (X99K), 3-tier decoy structure. USE WHEN user says 'đóng gói offer', 'tạo offer', 'thiết kế offer Hormozi', 'grand slam offer', 'value stack', 'offer sta

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Nâng cấp copy sales page tiếng Việt — biến copy có sẵn (từ `offer.json` + `conversion-copy.md` của `/biz-offer-alex-hormozi`, HOẶC từ Next.js project đã build qua `ui-ux-pro-max`, HOẶC user paste block copy bất kỳ) thành **copy chất lượng cao chốt đơn**: headline punchy hơn, pain agitation đau hơn, mechanism rõ hơn, benefit cụ thể hơn, FAQ xử lý đúng objection của thị trường VN, CTA mạnh hơn. Skill này có 3 INTENSITY LEVEL: (1) **Polish** — light edit + power word + sửa nhịp; (2) **Conversion-optimized** — rewrite 5 block critical + tạo A/B variants cho hero/CTA; (3) **Sales-letter** — long-form story-driven full rewrite kèm P.S.. Mỗi section áp dụng đúng formula thuyết phục (PAR cho pain, BAB cho solution, FEP cho benefit, PVEN cho final CTA, Star-Chain-Hook cho testimonial). Output gồm 4 file: `copy-upgraded.md`, `copy-variants.md` (A/B test bank — 3 hero + 3 CTA + 3 final-CTA), `copy-changes.md` (diff Trước/Sau + lý do), `copy.json` (structured downstream). Giọng văn tiếng Việt thuầ

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

⚠️ DEPRECATED (2026-05-14) — Skill này KHÔNG còn trong pipeline chuẩn. Quy trình mới đã bỏ bước wireframe markdown trung gian: sau `/biz-offer-alex-hormozi` đi THẲNG sang `ui-ux-pro-max` để build Next.js sales page production-ready (có design language nhất quán: style + palette + font pairing, không phải Tailwind defaults). Lý do deprecate: wireframe markdown làm thêm 1 bước trung gian không tạo giá trị — `ui-ux-pro-max` đọc trực tiếp `offer.json` đã đầy đủ anchor + core + bonus + guarantee + urgency + pricing rồi ra HTML production luôn. Chỉ dùng skill này KHI user EXPLICITLY yêu cầu wireframe markdown để review/in/share trước khi build code (rare case). KHÔNG trigger trên các keyword 'tạo sales page', 'tạo landing page bán hàng' nữa — những keyword đó giờ trigger `ui-ux-pro-max`.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

End-to-end Sepay VietQR payment infrastructure cho landing page Next.js — guide user setup Sepay account + bank linking + scaffold đầy đủ payment flow trong project. Skill này xử lý 7 phase: (0) detect Next.js stack + **HỎI user chọn lead store backend** (Vercel KV hoặc Supabase Free Postgres — default recommend Supabase do free tier rộng hơn ~50× + có SQL + admin UI), (1) GUIDE user đăng ký Sepay account tại my.sepay.vn + link bank account VN (Vietcombank/Techcombank/MB/ACB/VPBank/BIDV/...) + lấy API key + setup webhook URL trên Sepay dashboard, (2A nếu chọn KV) setup Vercel KV (install `@vercel/kv` + KV namespace + 4 env vars KV_*), (2B nếu chọn Supabase) setup Supabase project (tạo project tại Singapore region + chạy migration SQL tạo 4 bảng leads/phone_index/order_counter/webhook_dedup với pg_cron TTL cleanup + RLS deny-all + lấy SUPABASE_URL + SUPABASE_SERVICE_ROLE_KEY + Vercel Cron ping `/api/health` mỗi 6 ngày chống auto-pause), (3) scaffold `lib/leads-store.ts` (thin re-export

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Setup Telegram bot notification cho thanh toán thành công từ Sepay webhook trong Next.js project. Skill này: (1) hướng dẫn user 3 bước tạo Telegram bot riêng qua @BotFather + lấy bot token + chat_id (qua @userinfobot cho chat 1-1, hoặc /getUpdates API cho group), (2) tạo helper function `sendTelegramNotification()` reusable trong `lib/telegram.ts`, (3) detect existing Sepay webhook route trong project (thường là `/api/sepay-webhook`, `/api/payment-success`, hoặc tương đương) và wire Telegram call CÙNG CHỖ với email auto-responder (Resend) — gửi parallel qua `Promise.allSettled` để Telegram fail KHÔNG block 200 response trả Sepay (Sepay sẽ retry webhook nếu nhận non-200, gây duplicate notification), (4) draft message format mặc định tiếng Việt: emoji + tên khách + SĐT + email + amount (charm pricing VND định dạng `499.000đ`) + tên sản phẩm + timestamp giờ VN dd/mm/yyyy HH:mm, (5) update `.env.local` với `TELEGRAM_BOT_TOKEN` + `TELEGRAM_CHAT_ID`, add vào `.gitignore`, nhắc user paste vào

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Convert a single MP3 voiceover file into a single HeyGen avatar lip-sync MP4 video. Single-purpose — no planning, no SRT, no chunking, no Remotion compositing. Hybrid path — REST upload (helper script) + HeyGen MCP for video creation, because the post-2026 MCP no longer exposes an asset-upload tool. Reads avatar look pool (`HEYGEN_AVATAR_LOOKS`) from `.env` and HeyGen API key (`HEYGEN_API_KEY`) for the upload step. USE WHEN user says "tạo video heygen từ mp3", "mp3 to heygen", "heygen mp4 từ audio", "convert mp3 sang heygen video", "tạo avatar video từ file mp3", "lip sync mp3 heygen", "biến mp3 thành video heygen", or any time the user has exactly one MP3 file and wants exactly one HeyGen avatar MP4 out.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Demand-side market research cho digital product / service ở Việt Nam — đo cầu thật + WTP + channel-market fit + defensibility qua keyword volume, marketplace sales (Shopee/Unica/Edumall/Gitiho/KyNa), community signal (FB groups, TikTok hashtag, Zalo OA), competitor pricing, unit economics — không phải macro PESTEL. Output: keyword portfolio + Niche Score 100 điểm 7-dimension có evidence + go/no-go decision + falsification protocol. Force triangulate ≥3 sources cho mỗi claim quan trọng. USE WHEN user says 'nghiên cứu thị trường', 'market research', 'validate niche', 'keyword research', 'demand validation', 'niche có nên làm không', 'có ai làm chưa', 'thị trường đủ lớn không', 'có lời không', 'chọn ngách', 'kiểm tra cầu'. Cũng trigger khi user mô tả 1 ý tưởng kinh doanh cụ thể và muốn check feasibility. Skill này KHÔNG fit: high-ticket transactional sale (BĐS, ô tô), B2B enterprise (sales cycle 6+ tháng), hyper-local geo micro-market (1 toà nhà, 1 phường). KHÔNG làm: macro PESTEL/Porter

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Transcribe an MP3 voiceover into an SRT subtitle file and a word-level segments JSON using local OpenAI Whisper. Input is a single MP3 path; output is `<stem>.srt` + `<stem>_segments.json` written next to the MP3 (or to a custom output dir). USE WHEN the user says 'extract srt from mp3', 'trích srt từ mp3', 'transcribe voiceover', 'tạo file srt và segments', 'whisper transcribe', 'bóc transcript có timestamp', 'extract voiceover segments', 'tách SRT từ audio', or any time a downstream skill (plan-short-video-edit, heygen-remotion-short-video-editor) needs an SRT + word-level segments JSON from a voiceover MP3 and one does not already exist.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Convert Vietnamese/English script text to MP3 voiceover using ElevenLabs TTS API. Calls POST /v1/text-to-speech/{voice_id}, streams audio bytes, writes MP3 directly. Locked to Hoang's brand voice ID by default. USE WHEN user says 'tạo mp3 elevenlabs', 'elevenlabs tts', 'eleven labs voice', 'text to speech elevenlabs', 'tạo voiceover elevenlabs', 'đọc text bằng elevenlabs', 'tts elevenlabs to mp3', 'eleven labs script to mp3', 'voiceover bằng elevenlabs', 'giọng elevenlabs'.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

End-to-end orchestrator: **script → final MP4 16:9 (1920×1080) podcast-keynote**.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

End-to-end short-video pipeline — từ kịch bản (Việt/Anh) ra MP4 TikTok/Reels 9:16 hoàn chỉnh. Orchestrator 3 phase ghép skill có sẵn — (1) TTS provider chọn được giữa `mkt-elevenlabs-tts-to-mp3` (default, voice của Hoàng) hoặc `mkt-video-script-to-mp3` (MiniMax speech-2.8-hd), (2) checkpoint user duyệt MP3, (3) `heygen-mp3-to-mp4` lip-sync avatar HeyGen, (4) delegate Phase 3 packaging cho sub-agent `mkt-full-video-phase3-packager` (transcribe + scene outline + checkpoint + fan-out N scene writers parallel + scaffold + preview Studio). API key + voice ID cho cả 2 provider lưu ở `.env`. USE WHEN user nói "tạo full video từ script", "script to tiktok video", "pipeline full video heygen + hyperframe", "tạo video từ kịch bản đến mp4", "elevenlabs heygen hyperframe full pipeline", "minimax heygen pipeline", "kịch bản ra video tiktok", hoặc có sẵn 1 script + (optional) ảnh b-roll và muốn ra MP4 9:16 đóng gói có captions, SFX, b-roll.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Build a TikTok/Reels/YouTube **landscape 16:9 (1920×1080)** short video from a pre-recorded talking-head MP4 using HyperFrames — transcribe Vietnamese audio, scaffold a complete preview-ready 1920×1080 project with a slide pane (1200px) on the left and a floating avatar frame on the right, GSAP timeline có SPLIT↔PIP transitions (slide full-screen + avatar PIP corner thumbnail), breathing yoyo zoom + beat-driven punch-in trên avatar, 5 scene compositions kiểu "tier-row" pattern (post-stack hook / chats-stack problem / hero-orb solution / counter-row recap / terminal-row CTA), optional cream-paper editorial infographic image slots với `<img onerror>` fallback, 6 SFX wired tại scene boundaries, **NO captions** (giọng avatar là spine). USE WHEN user nói "edit video 16:9 từ HeyGen MP4", "scaffold project landscape", "podcast keynote editor", "talking head + slide editor", "build hyperframes 1920×1080", "tạo project 16:9 từ avatar mp4", "scaffold 16:9 hyperframes", "hyperframe landscape vide

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Pipeline đóng gói: từ MP4 quay sẵn (talking head 9:16) tới HyperFrames preview project hoàn chỉnh có captions, SFX, zoom hooks, b-roll toàn cảnh có hiệu ứng rich, và CTA finale.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Audit bài Facebook / Reels / YouTube để phát hiện 4 downward drivers (over-branding, over-production, stock imagery, standardized aesthetic) + frequency-over-quality. Mỗi anti-pattern bị drop ~75% performance nếu hiện diện. USE WHEN user says 'audit content', 'check anti pattern', 'content có lỗi gì không', 'kiểm tra over branding', 'vì sao video bị chết', 'vì sao post không ai xem', 'content audit', 'kiểm tra chất lượng content'.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Tìm viral pattern ở ngành khác (bác sĩ, luật sư, tài chính, bất động sản, thủ công) có thể apply cho niche AI/automation của Hoang. Ngách AI educator VN còn ít format được khai thác — cross-industry adaptation là blue ocean. USE WHEN user says 'tìm format ngành khác', 'cross industry research', 'học format từ ngành khác', 'blue ocean format', 'tìm format chưa ai làm', 'adapt format từ niche khác', 'cross industry viral'.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Rewrite CTA kiểu autocratic (Mua ngay! Follow ngay! Đăng ký liền!) sang 3 variants Democratic / Benevolent / Laissez-faire — reach 85% dân số thay vì chỉ 5% (action-based). Áp dụng cho landing page, caption FB, CTA video, email. USE WHEN user says 'rewrite cta', 'sửa cta', 'cta không autocratic', 'viết lại kêu gọi hành động', 'cta cho landing page', 'cta nhẹ nhàng hơn', 'inclusive cta', 'cta democratic benevolent'.

相关技能