Automate bookings, payments, orders, donations, and tickets on WhatsApp for 89+ business types.
CommerceTypeScript · PLpgSQLGitHub @cipherhqOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
WhatsApp-first automation platform for service businesses. Bookings, payments, orders — all through WhatsApp. Multi-country support (NG, US, UK, CA, GH) with Paystack + Stripe.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
WhatsApp-first business automation platform. Businesses connect their WhatsApp number and get AI-powered booking, payments, ticketing, ordering, and customer engagement -- all through conversational flows. Live in 5 countries (US, CA, NG, GH, UK) with multi-currency payment processing across 5 gateways.
See CLAUDE.md for golden rules, pre-change checklists, and deep implementation details.Read the full README ↗WhatsApp-first business automation platform. Businesses connect their WhatsApp number and get AI-powered booking, payments, ticketing, ordering, and customer engagement -- all through conversational flows. Live in 5 countries (US, CA, NG, GH, UK) with multi-currency payment processing across 5 gateways.
See CLAUDE.md for golden rules, pre-change checklists, and deep implementation details.
| Layer | Stack |
|---|---|
| Frontend | Next.js 14, React 18, TypeScript, Tailwind CSS |
| Admin Panel | Vite + React 18 (separate app in admin/) |
| Database | Supabase (PostgreSQL + Auth + Storage + Realtime) |
| Meta Cloud API | |
| Payments | Paystack (NG/GH), Stripe (US/GB/CA), Flutterwave, Square, PayPal |
| AI | Anthropic Claude (intent detection + voice transcription) |
| Resend | |
| Monitoring | Sentry + PostHog |
| Rate Limiting | Upstash Redis (in-memory fallback when unconfigured) |
| Deploy | Vercel (4 deployments) |
npm install
cp .env.example .env.local # Fill in required values
npm run dev # http://localhost:3000
# Admin panel (separate app)
cd admin && npm install && npm run dev # http://localhost:8083
app/
api/ # ~150 API routes
dashboard/ # Protected business dashboard pages
(auth)/ # Login, signup, forgot-password
(marketing)/ # Public marketing pages
get-started/ # Onboarding wizard
checkin/ # QR check-in pages (property, events)
lib/
bot/ # WhatsApp bot engine
bot.service.ts # Main orchestrator (~2,500 lines)
flows/ # 17+ conversational flows (executor, step-manifest)
handlers/ # 9 handler modules
channels/ # Channel resolution + message sending
payments/ # Gateway integrations (factory pattern)
capabilities/ # 24+ capability types, tier gating
supabase/ # 3 DB clients (browser, SSR, service)
pdf/ # PDF generation (invoices, receipts, tickets, contracts)
email/ # Email templates + sending
components/
dashboard/ # DashboardProvider, Sidebar, OnboardingChecklist
ui/ # Shared UI primitives
admin/ # Separate Vite admin panel
src/pages/ # 43+ admin pages
src/lib/ # Admin utilities
supabase/
migrations/ # 219 migrations (NNN_description.sql)
functions/ # Edge Functions (cron jobs)
Path alias: @/* maps to project root.
cxcmiqotkowhxinjbytg| Client | Import | Use case |
|---|---|---|
| Browser | createClient() from @/lib/supabase/client | Client components, respects RLS |
| SSR | createClient() from @/lib/supabase/server | Server components, reads cookies |
| Service | createServiceClient() from @/lib/supabase/service | Admin/cron only, bypasses RLS |
Named NNN_description.sql. Run on remote via Management API:
SQL=$(cat supabase/migrations/NNN_file.sql)
curl -s -X POST "https://api.supabase.com/v1/projects/cxcmiqotkowhxinjbytg/database/query" \
-H "Authorization: Bearer $SUPABASE_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d "$(jq -n --arg q "$SQL" '{query: $q}')"
See .env.example for the full list. Categories:
| Category | Examples | Notes |
|---|---|---|
| Supabase | NEXT_PUBLIC_SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY | URL and anon key are public; service key is server-only |
META_CLOUD_ACCESS_TOKEN, META_APP_SECRET | Never expose META_APP_SECRET to client | |
| Payments | STRIPE_SECRET_KEY, PAYSTACK_SECRET_KEY | Secret keys are server-only |
| AI | ANTHROPIC_API_KEY | Server-only |
RESEND_API_KEY | Server-only | |
| Analytics | NEXT_PUBLIC_POSTHOG_KEY | Public (browser-bundled) |
| Rate Limiting | UPSTASH_REDIS_REST_URL, UPSTASH_REDIS_REST_TOKEN | Optional; falls back to in-memory |
Rule: Never use NEXT_PUBLIC_ or VITE_ prefix for secret keys. They get bundled into browser JS.
npm run test # 517+ unit tests, Vitest
npm run test:e2e # Playwright smoke tests
npm run certify:local # Full production certification (see below)
Bot-specific testing uses a harness at lib/bot/__tests__/bot-harness.ts with mock sender, mock DB, and conversation fixtures.
Run all verification stages in order — lint, tests, builds, database, Playwright:
npm run certify:local # Full run
npm run certify:local -- --skip-install # Skip npm ci (faster reruns)
npm run certify:local -- --keep-services # Don't stop Supabase after
Requires: Node.js 20+. Optional: Docker (for local Supabase DB tests), Playwright browsers (npx playwright install chromium).
The script refuses to run if NEXT_PUBLIC_SUPABASE_URL points to production.
| Target | Command | URL |
|---|---|---|
| Main app | vercel --prod (from root) | waaiio.com |
| Staging | vercel --prod (staging branch) | staging.waaiio.com |
| Admin | cd admin && vercel --prod | admin.waaiio.com |
| Admin staging | cd admin && vercel --prod (staging) | admin-staging.waaiio.com |
Vercel Pro -- charges per deploy. Always ask before deploying.
Note: Vercel env vars are in the "blowded" project, not "waaiio".
Note: Admin VITE_API_URL must use https://www.waaiio.com (non-www redirects strip POST body).
changelog/unreleased/YYYY-MM-DD-<branch-name>.md (date, files, impact); fragments are collected into CHANGELOG.md before each release (see changelog/README.md)pending, success, failed, refunded (not "completed")pending, confirmed, in_progress, completed, no_show, cancelledbusinesses.payment_gateway overrides country defaultbusiness_id is the partition key; RLS enforces itSUPABASE_SERVICE_ROLE_KEY, META_APP_SECRET, etc.)USING(true) on user-facing tablesowner_id = auth.uid())timingSafeEqual for all token/OTP comparisonsAll payment webhooks follow the same pattern:
timingSafeEqual, reject if secret env var unsetpayment.amountpayment_status is already successpayment_status = 'success'Gateway-specific: Stripe checks amount_total, Paystack checks kobo, Square checks total_money.amount, PayPal checks amount.
Read CLAUDE.md before making changes. Key requirements:
npx next build + npm run test + trace every code pathchangelog/unreleased/ with date, what changed, which files, what could break (CLAUDE.md rule 16)| Task | Steps |
|---|---|
| New dashboard page | Create app/dashboard/{name}/page.tsx, add to Sidebar.tsx with capability gate |
| New bot flow | Create lib/bot/flows/{name}.flow.ts, register in registry.ts |
| New capability | Add to CapabilityId union + CAPABILITIES + CAPABILITY_TIER_REQUIREMENTS in lib/capabilities/types.ts |
| New migration | supabase migration new <name>, rename to NNN_, run via Management API |