Communitygithub.com

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Installiert ein AI-Chatbot-Floating-Widget in der unteren rechten Ecke in ein bestehendes Next.js-Projekt (App Router oder Pages Router), voll responsive (Web + Tablet + Mobile), ruft LLM über OpenRouter auf, streamt Antworten, rendert Markdown in Assistenten-Bläschen und extrahiert/speichert Leads automatisch in Upstash Redis/Vercel KV.

Was ist MKT.LANDINGPAGE.SKILLS?

Dieser Skill integriert einen AI-gestützten Chatbot als Floating-Widget in bestehende Next.js-Projekte. Er unterstützt sowohl den App Router als auch den Pages Router und ist vollständig responsive für Web, Tablet und Mobile. Der Chatbot verwendet OpenRouter zur LLM-Kommunikation, wobei standardmäßig `google/gemini-3-flash-preview` zum Einsatz kommt, aber auf `anthropic/claude-sonnet-4.6` umgestellt werden kann. Eine Besonderheit ist die korrekte Darstellung von Markdown (fett, Listen, Links, Code) in den Assistenten-Nachrichten mithilfe von `react-markdown` und `remark-gfm`. Darüber hinaus verfügt der Bot über eine Wissensdatenbank aus FAQ und Produkt-/Kursdokumenten und kann automatisch Leads (Name, Telefon, E-Mail) extrahieren und in Upstash Redis oder Vercel KV speichern, sobald ein Nutzer vollständige Daten im Chat angibt. Die Lead-Erfassung erfolgt im Hintergrund ('fire-and-forget') und blockiert nicht den Stream. Der Skill erkennt automatisch die Projektstruktur (TypeScript/JavaScript, Router-Typ, Tailwind/CSS-Module, KV-Verfügbarkeit) und passt die generierten Dateien entsprechend an.

Funktioniert mit✓Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/lexuanthanhhy/MKT.LANDINGPAGE.SKILLS/tree/main/.claude/skills/biz-nextjs-chatbot-openrouter

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Biz Next.js Chatbot OpenRouter — AI-Chatbot-Floating-Widget in 1 Schritt auf der Website installieren

Dieser Skill fügt einen AI-Chatbot als Floating-Widget in ein bestehendes Next.js-Projekt ein. Das Widget befindet sich in der unteren rechten Ecke, ist voll responsive auf allen 3 Bildschirmgrößen, ruft LLM über OpenRouter auf, nutzt eine Wissensdatenbank aus FAQ + Kurs-/Produktdokumenten, rendert Markdown in Assistenten-Bläschen (fett für Zahlen/Preise, Aufzählungslisten, klickbare Links, Inline-Code) mittels react-markdown + remark-gfm, und extrahiert und speichert automatisch Leads (Name + Telefon + E-Mail) in KV (Upstash Redis / Vercel KV), sobald der Nutzer die vollständigen Informationen im Chat bereitstellt — der Admin kann diese über das /admin-Dashboard einsehen. Ziel: Solopreneure / Kursersteller mit automatischem 24/7-Support-Bot + passiver Lead-Erfassung direkt auf der Landingpage, keine verpassten Chat-Anfragen.

Grundsatz: Erkenne alles automatisch, was möglich ist (Next.js-Version, App/Pages Router, TS/JS, Tailwind/CSS), frage den Benutzer nur nach den 4 wirklich notwendigen Dingen: (1) welches Projekt bei mehreren, (2) FAQ, (3) Produktdokumente, (4) Ton/Brand-Name. Der Rest ist Code → live in wenigen Minuten.

Wann verwenden

Der Benutzer möchte:

  • Einen AI-Chatbot zur Kundenunterstützung auf die Landingpage (Kurs-/Dienstleistungsverkauf) setzen
  • Die Beantwortung wiederholter Fragen (Preis, Ablauf, Rückerstattung, Zielgruppe...) reduzieren
  • Ein kompaktes Chat-Widget in der unteren rechten Ecke, das den Inhalt nicht verdeckt
  • Einen Chatbot, der die Kurs-/Produktinhalte genau versteht (FAQ-gesteuert)
  • Ein bestehendes Next.js-Projekt (gerade /biz-sales-page-layout ausgeführt, oder ein älteres Projekt)

Wann NICHT verwenden

  • Das Projekt ist kein Next.js (reines React/Vite, Vue, Svelte, einfaches HTML) → dieser Skill ist auf Next.js spezialisiert. Eine Anpassung ist möglich, aber nicht optimal.
  • Es wird ein RAG-Chatbot (Retrieval-Augmented) mit einer Wissensdatenbank von tausenden Seiten benötigt → eine Vektor-DB (Pinecone/Supabase pgvector) ist erforderlich; dieser Skill verwendet einen einfachen System-Prompt, geeignet für ≤ 20K Token Wissen.
  • Es wird ein Sprach-Chatbot / multimodaler Chatbot (Bildversand) benötigt → dieser Skill ist text-only.
  • Es wird eine Speicherung des Chatverlaufs pro Benutzer in einer DB benötigt → dieser Skill ist zustandslos, mit flüchtigen Sitzungen; kann später erweitert werden.
  • Das Backend ist nicht Vercel-freundlich (erfordert Long Polling, persistentes WebSocket) → OpenRouter-Streaming funktioniert gut auf Vercel Edge, aber für separates WS sind andere Lösungen nötig.

Ausgabe für den Benutzer

Nach Ausführung des Skills:

  1. Neue Dateien im Next.js-Projekt des Benutzers:

    • components/Chatbot.tsx (oder .jsx) — Widget-UI (rendert Markdown via react-markdown + remark-gfm)
    • app/api/chat/route.ts (App Router) ODER pages/api/chat.ts (Pages Router) — API-Proxy zum Aufruf von OpenRouter + automatische Lead-Extraktion nach dem Stream
    • lib/chatbot-knowledge.ts (oder .js) — Wissensdatenbank + System-Prompt (enthält Block ANTWORTFORMATIERUNG + Block AKTIVE LEAD-ERFASSUNG)
    • lib/chat-lead.ts — NUR wenn das Projekt KV/Upstash hat — Extraktor + Speicherer, Deduplizierung nach Telefonnummer, TTL 90 Tage, Namespace chat-lead:{phone}
    • Markdown-Stile .chatbot-md an app/globals.css angehängt (aus templates/chatbot-markdown-styles.css)
    • .env.local wird erstellt/ergänzt mit OPENROUTER_API_KEY= (Platzhalter)
    • .env.example (falls noch nicht vorhanden) zur Dokumentation der Umgebungsvariablen
    • Einbindung von <Chatbot /> in app/layout.tsx oder pages/_app.tsx
  2. Zusätzlich installierte Pakete (über den aus der Lockdatei erkannten Paketmanager):

    • react-markdown — sicheres Rendern von Markdown (kein dangerouslySetInnerHTML nötig)
    • remark-gfm — GitHub Flavored Markdown (Tabellen, Autolink, Durchgestrichen)
  3. Klare Anweisungen am Ende der Sitzung:

    • 3 Schritte, die der Benutzer selbst ausführen muss: (a) OpenRouter API-Key holen, (b) in .env.local einfügen, (c) npm run dev zum Testen
    • Anleitung zum Wechsel des Modells zwischen Gemini und Sonnet
    • Anleitung zum späteren Aktualisieren der Wissensdatenbank

Arbeitsablauf

Schritt 1 — Next.js-Projekt erkennen

Suche nach Next.js-Projektkandidaten. Ausführen:

# Suche nach package.json mit "next" in den Abhängigkeiten, maximale Tiefe 4
find /Users/tonyhoang/Documents/GitHub -maxdepth 4 -name "package.json" -not -path "*/node_modules/*" 2>/dev/null | xargs grep -l '"next"' 2>/dev/null | head -20

(Falls sich der Benutzer in einem bestimmten Arbeitsverzeichnis befindet, priorisiere die Suche ab cwd abwärts, fallback auf ~/Documents/GitHub, falls nichts gefunden.)

Verzweigung:

  • 0 Projekte: Benutzer informieren und abbrechen. Vorschlag: "Haben Sie ein Next.js-Projekt? Falls nicht, möchte ich mit /biz-sales-page-layout ein neues erstellen und dann zurückkommen?"
  • 1 Projekt: Pfad vor dem Fortfahren mit dem Benutzer bestätigen: "Ich werde den Chatbot in [Pfad] installieren. Sind Sie einverstanden?"
  • ≥ 2 Projekte: Pfade + Namen (name aus package.json) in einer nummerierten Liste auflisten, Benutzer zur Auswahl auffordern: "Ich habe N Next.js-Projekte gefunden. In welches möchten Sie den Chatbot installieren?"

Schritt 2 — Projektkontext ermitteln

Nach Bestätigung des Projekts durch den Benutzer, lesen:

  1. package.json → prüfen:

    • TypeScript (ist typescript in den Abhängigkeiten?)
    • Tailwind (ist tailwindcss in den devDependencies?)
    • Paketmanager (Lockdatei: pnpm-lock.yaml → pnpm, yarn.lock → yarn, Standard npm)
    • Next.js-Version
  2. Verzeichnisstruktur → prüfen:

    • Existiert app/-Verzeichnis → App Router
    • Existiert pages/-Verzeichnis (und kein app/) → Pages Router
    • Beide existieren → Priorisiere App Router für neue Dateien (Next.js migriert zu App Router)
    • src/-Wrapper → Pfade anpassen (z.B. src/app/, src/components/)
  3. tsconfig.json → Pfad-Alias prüfen (@/* → ./src/* oder ./*)

  4. .env.local, .env.example → prüfen, ob bereits vorhanden

  5. KV/Upstash-Verfügbarkeit (für automatische Lead-Erfassung):

    • package.json enthält @upstash/redis ODER @vercel/kv → KV vorhanden → chat-lead.ts erstellen + in die Route einbinden
    • Datei src/lib/kv.ts (oder lib/kv.ts) mit Export kv vorhanden → vorhandenen Helfer nutzen (Camp-Muster)
    • Kein KV → Erstellung von chat-lead.ts überspringen, Benutzer informieren: "Projekt hat kein KV — automatische Lead-Erfassung ist deaktiviert. Ich kann mit /biz-setup-sepay-payment zuerst KV installieren und dann zurückkommen, um die Lead-Erfassung zu aktivieren, oder Sie überspringen diesen Schritt."

Diese Beobachtungen in einer kleinen Tabelle für die späteren Schritte speichern.

Schritt 3 — Wissensdatenbank vom Benutzer sammeln

Dem Benutzer 4 Fragen stellen (in einer Nachricht zusammenfassen, damit der Benutzer alles auf einmal beantworten kann):

Für eine präzise Antwort des Chatbots benötige ich 4 Dinge:

1. **FAQ** — Liste häufig gestellter Fragen + Antworten (Preis, Ablauf, Rückerstattung, Zielgruppe, Lernzeit, Unterstützung nach dem Kurs...).
   Bitte direkt hier einfügen ODER den Dateipfad angeben (.md / .txt / .docx).

2. **Produkt-/Kursdokumentation** — Detaillierte Kursbeschreibung: Name, Inhalt jedes Moduls, Lernergebnisse, Dozent, Boni, Preisstufen (falls vorhanden).
   Ebenfalls einfügen oder Dateipfad angeben.

3. **Brand-Name + Ton** — Name der Marke/des Kurses, damit der Chatbot sich vorstellen kann (z.B. "Assistent von AI Mastery"). Ton des Bots: freundlich (Standard) / formell / locker.

4. **Modell** — Standardmäßig `google/gemini-3-flash-preview` (schnell, günstig, gut für Support geeignet). Möchten Sie `anthropic/claude-sonnet-4.6` (höhere Qualität, ~10x teurer) für die frühe Phase? Dann sagen Sie Bescheid.

Können Sie alles auf einmal beantworten?

Wenn der Benutzer antwortet:

  • Wird nur ein Dateipfad angegeben → Datei mit dem Read-Tool lesen.
  • Wird der Inhalt direkt eingefügt → den eingefügten Inhalt verwenden.
  • Sagt der Benutzer "Generiere bitte Platzhalter für mich" → generische FAQ-Platzhalter erstellen und mit // TODO: user fill in markieren, damit der Benutzer weiß, dass er sie aktualisieren muss.
  • Kein Brand-Name → Standard "AI-Assistent" und Anrede "Sie".

Schritt 4 — Dateien im Projekt generieren

Die Vorlagen im templates/-Verzeichnis dieses Skills lesen und an das Projekt anpassen. Die Vorlagen:

  • templates/chatbot-knowledge.ts — Modul, das Wissensdatenbank und systemPrompt exportiert. FAQ, Produktinfo, Brand-Name und Ton hier einfügen. Enthält bereits Block ANTWORTFORMATIERUNG (Markdown-Regeln) + Block AKTIVE LEAD-ERFASSUNG (bringt dem LLM bei, nach Name/Telefon/E-Mail zu fragen, wenn Kaufsignale erkannt werden, zu danken und zu bestätigen, wenn der Benutzer die Daten angibt, NICHT "in der Datenbank gespeichert" sagen).
  • templates/Chatbot.tsx — Widget-Komponente, Tailwind-first. Importiert react-markdown + remark-gfm, rendert Assistenten-Nachrichten mit <ReactMarkdown remarkPlugins={[remarkGfm]}> (nur Assistent — Benutzernachrichten bleiben einfaches whitespace-pre-wrap). Wenn das Projekt KEIN Tailwind hat → Fallback templates/Chatbot-noTailwind.tsx + templates/chatbot.module.css.
  • templates/chat-route-app.ts — API-Route für App Router (app/api/chat/route.ts). Enthält bereits den Hook persistLeadIfReady, der nach Stream-Ende im Hintergrund ausgeführt wird — blockiert nicht die Antwort.
  • templates/chat-route-pages.ts — API-Route für Pages Router (pages/api/chat.ts).
  • templates/chat-lead.ts — NUR erstellen, wenn das Projekt KV/Upstash hat — Regex-Extraktion für vietnamesische Telefonnummern + E-Mail + Namensheuristik (Intro-Muster "Name X" / "ich bin X" / "Name: X"), saveChatLead dedupliziert nach Telefonnummer, TTL 90 Tage, Key-Namespace chat-lead:{phone}.
  • templates/chatbot-markdown-styles.css — CSS-Snippet für die Klasse .chatbot-md. MUSS an das Ende von app/globals.css angehängt werden (oder src/app/globals.css / styles/globals.css). Akzentfarbe (#fde68a / #f59e0b) vor dem Anhängen an die Markenfarbpalette des Projekts anpassen.
  • templates/env-instructions.md — Snippet mit Anleitung zum Abrufen des OpenRouter-Keys, Verwendung im letzten Schritt.

Regeln für die Anpassung von Vorlagen:

  1. TS vs JS: Wenn das Projekt nur JS hat, die Erweiterung .ts/.tsx in .js/.jsx ändern und Type-Annotationen entfernen (nicht nur die Dateinamen ändern). Die Beispieldatei lesen, parsen, Typen entfernen, die Datei schreiben.

  2. Pfad-Alias: Wenn tsconfig @/* auf ./src/* abbildet, müssen die Importe in der Vorlage @/lib/chatbot-knowledge verwenden und die Datei in src/lib/ abgelegt werden. Ohne Alias relative Pfade verwenden.

  3. Modell: Platzhalter __MODEL_ID__ durch das vom Benutzer gewählte Modell ersetzen (google/gemini-3-flash-preview oder anthropic/claude-sonnet-4.6).

  4. Brand: __BRAND_NAME__ und __BRAND_TONE__ ersetzen.

  5. Wissen: systemPrompt aus FAQ + Produktinfo in einer klaren, strukturierten Form aufbauen (siehe Vorlage). Den Block ANTWORTFORMATIERUNG im systemPrompt beibehalten — das lehrt das LLM, Markdown auszugeben, das für kleine Chat-Bläschen geeignet ist (fett statt Überschriften, kurze einzeilige Aufzählungspunkte).

  6. Markdown-Rendering-Pakete installieren (ERFORDERLICH — sonst zeigt der Chatbot rohes **bold** anstatt fett gedruckten Text im Bläschen):

    # Lockdatei erkennen → richtigen Paketmanager wählen
    npm install react-markdown remark-gfm
    # oder: pnpm add react-markdown remark-gfm
    # oder: yarn add react-markdown remark-gfm
    
  7. Markdown-Stile anhängen: templates/chatbot-markdown-styles.css lesen, Akzentfarbe an die Markenfarbpalette des Projekts anpassen (in globals.css nach --color-primary oder ähnlich suchen), dann an das Ende von app/globals.css anhängen (oder src/app/globals.css / styles/globals.css).

  8. Widget einbinden:

    • App Router: app/layout.tsx (oder src/app/layout.tsx) bearbeiten, import Chatbot from '@/components/Chatbot' und <Chatbot /> direkt vor </body> einfügen. Vor der Bearbeitung die aktuelle layout.tsx lesen, um Metadaten, Schriftarten und Provider zu erhalten.
    • Pages Router: pages/_app.tsx bearbeiten, Return-Wert umschließen: <><Component {...pageProps} /><Chatbot /></>. Vorhandene _app lesen, bestehende Provider beibehalten.
  9. Automatische Lead-Erfassung einbinden (nur durchführen, wenn KV in Schritt 2 erkannt wurde):

    • templates/chat-lead.ts in lib/chat-lead.ts (oder src/lib/chat-lead.ts) kopieren.
    • Wenn das Projekt NOCH KEINE lib/kv.ts hat → erstellen: import { Redis } from "@upstash/redis"; export const kv = Redis.fromEnv();
    • Route-Handler importieren: import { extractLeadFromMessages, saveChatLead } from "@/lib/chat-lead"
    • In der Stream-Schleife: assistantText verfolgen (Delta akkumulieren), wenn Stream geschlossen → persistLeadIfReady(history, assistantText) aufrufen (fire-and-forget, NICHT await im Response-Pfad).
    • System-Prompt: Sicherstellen, dass der Block AKTIVE LEAD-ERFASSUNG bereits in chatbot-knowledge.ts vorhanden ist (die Vorlage enthält ihn bereits).
    • Dem Benutzer bestätigen: "Ich habe die automatische Lead-Erfassung aktiviert — wenn ein Kunde Name/Telefon/E-Mail im Chat eingibt, speichert das System automatisch im KV-Namespace chat-lead:{TELEFONNUMMER}. Sie können die Leads unter /admin einsehen (falls /biz-admin-leads-dashboard installiert ist)."

Schritt 5 — .env.local + .gitignore einrichten

  1. Prüfen, ob .env.local bereits existiert?

    • Nein: Neu erstellen mit:
      # OpenRouter API-Key — Holen unter https://openrouter.ai/keys
      OPENROUTER_API_KEY=
      
      # Optional: Site-URL für OpenRouter-Referrer-Tracking (hilft bei Rate-Limiting)
      NEXT_PUBLIC_SITE_URL=http://localhost:3000
      
    • Ja: Die beiden Variablen anhängen, falls sie noch nicht vorhanden sind, vorhandene Variablen nicht überschreiben.
  2. .env.example aktualisieren (neu erstellen, falls nicht vorhanden):

    OPENROUTER_API_KEY=sk-or-v1-xxxxx
    NEXT_PUBLIC_SITE_URL=https://your-domain.com
    
  3. Prüfen, ob .gitignore bereits .env.local enthält? Falls nicht → .env.local und .env*.local anhängen.

Schritt 6 — Bericht an den Benutzer

Eine klare Zusammenfassung mit 4 Teilen ausgeben:

✅ Chatbot wurde erfolgreich in [Projektname] installiert

📁 Erstellte Dateien:
  - components/Chatbot.tsx (rendert Markdown via react-markdown + remark-gfm)
  - app/api/chat/route.ts
  - lib/chatbot-knowledge.ts
  - app/globals.css (Markdown-Stile .chatbot-md angehängt)
  - .env.local (Platzhalter)

📦 Installierte Pakete: react-markdown, remark-gfm

🔑 3 Schritte, die Sie selbst ausführen müssen, damit der Chatbot funktioniert:

1. OpenRouter API-Key holen:
   - Gehen Sie zu https://openrouter.ai → Registrieren (Sie können sich auch mit Google anmelden)
   - Gehen Sie zu https://openrouter.ai/keys → Create Key
   - Laden Sie Guthaben auf (https://openrouter.ai/credits) — Gemini 3 Flash ist günstig, $5 reichen für tausende Chat-Anfragen
   - Kopieren Sie den Key im Format `sk-or-v1-xxxxx`

2. Fügen Sie ihn in die Datei `.env.local` ein:
   OPENROUTER_API_KEY=sk-or-v1-xxxxx-hier-einfügen

3. Testen:
   [npm/pnpm/yarn] run dev
   Öffnen Sie http://localhost:3000 → klicken Sie auf die Sprechblase unten rechts

🔄 Modell zwischen Gemini ↔ Sonnet wechseln:
  Öffnen Sie `app/api/chat/route.ts`, ändern Sie die Variable `model:` am Anfang der Datei.
  - `google/gemini-3-flash-preview` (Standard, $0.075/1M Input, schnell)
  - `anthropic/claude-sonnet-4.6` (Premium, ~$3/1M Input, bessere Qualität)

📚 Wissensdatenbank später aktualisieren:
  Bearbeiten Sie `lib/chatbot-knowledge.ts` — fügen Sie FAQ und productInfo hinzu/ändern Sie sie, speichern Sie, Hot Reload.

Mobile-first responsives Design

Das Widget muss 3 Breakpoints erreichen:

BreakpointVerhalten
≤ 640px (mobil)Klick auf Sprechblase → Vollbild-Overlay (z-index 9999), Header mit X-Schaltfläche zum Schließen. Input am unteren Bildschirmrand verankert mit safe-area-inset, um nicht von der Tastatur verdeckt zu werden.
641–1023px (Tablet)Panel 380px × 70vh, unten rechts verankert mit 16px Abstand.
≥ 1024px (Desktop)Panel 400px × 600px, unten rechts verankert mit 24px Abstand. Sprechblase 60px rund.

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

Scaffold trang `/admin` CRM-style trực quan vào Next.js project (Supabase backend) — KHÔNG còn variant Vercel KV. Layout 1CRM-inspired: sidebar 3 tab (Tổng quan / Khách hàng / Email marketing) + popup nhập mã đăng nhập. **Tab Tổng quan**: 4 KPI cards (Tổng leads / Đã thanh toán / Tỷ lệ chuyển đổi / Doanh thu) có delta arrow vs kỳ trước, line chart leads+paid+revenue theo ngày dùng `recharts`, donut trạng thái paid/pending/expired, period selector pill 7d/30d/90d, list 5 thanh toán gần nhất. **Tab Khách hàng**: bảng leads + search + filter trạng thái + filter ngày + CSV export. **Tab Email marketing**: form soạn chiến dịch (tên + tiêu đề + body chọn định dạng **văn bản thường HOẶC HTML** + placeholder `{{name}}` + audience 4 loại all/paid/pending/last_days + tên người gửi) — có nút **Xem trước** mở modal iframe render đúng email thật (text → auto convert + wrap khung; HTML fragment → wrap khung, HTML đầy đủ giữ nguyên) → gửi bulk qua SMTP (reuse `nodemailer` của `biz-email-setup` — KHÔN

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

Đó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'.

Verwandte Skills