Conversion intelligence for modern product and growth teams.
Convertly audits public websites for conversion readiness — trust, UX, CTAs, forms, and growth blockers — then returns a Growth Score with prioritized, consultant-grade recommendations.
Built by HM Coding.
Convertly is a conversion / CRO / business-readiness product.
| We are | We are not |
|---|---|
| Conversion, trust, growth, UX | An SEO platform |
| Weighted business-impact scoring | Keyword / rank tracking |
| Prioritized conversion fixes | Lighthouse / full Core Web Vitals lab suite |
| Supporting technical signals (light) | Search Console replacement |
Lightweight technical checks (H1, ALT, robots/sitemap, OG/Twitter cards, schema presence, mixed content) appear inside the existing conversion report as supporting signals — not a separate SEO product.
- Conversion audits — Page discovery, static + rendered acquisition, intent-aware rule packs
- Growth Score (Intelligence v4) — Weighted conversion impact (not issue count); category breakdowns and confidence
- SPA-aware reliability — Softens form/DOM findings when render confidence is low or OAuth/JS shells are detected
- Page Preview (Open Graph) — Report cards show the page’s
og:image(and favicon when present) as a supporting thumbnail — not a live screenshot or capture pipeline - Recommendations + playbooks — Rule-linked fixes with implementation guidance
- Live execution UI — Stage timeline, progress, bot-protection handling
- Exports — PDF and structured report exports
- Marketing — Home, sample report; Vertly on public pages
- Dashboard — Metrics, opportunity queue, recommendations, drafts
- Audits — History, detail reports with equal-height page cards, live execution, report actions
- Vertly — Rule-based Convertly product specialist (message-first routing + page context; not a general LLM chatbot)
- Workspace — Usage, audit ledger, domains
- Billing — Free / Starter / Growth / Scale via Razorpay (Stripe-ready abstraction)
- Settings — Profile (optional birthdate, country, avatar upload/crop), preferences, notifications, security, danger zone
- Birthday UX — On the user’s birthday (local timezone), Vertly hosts a one-time celebration card; corner launcher is suppressed while open
- Ops — Email notifications (Resend), Sentry (optional), product analytics events
- Auth — Cloudflare Turnstile on login/signup/forgot-password with a stable explicit render (avoids remount / StrictMode iframe races)
| Layer | Technology |
|---|---|
| Frontend | React 19, TypeScript, Vite 8, Tailwind CSS v4 |
| UI | shadcn/ui, Framer Motion, Lucide |
| Auth & DB | Supabase (Auth, Postgres, Edge Functions, RLS) |
| Payments | Razorpay subscriptions via edge functions |
Resend via email-notifications edge function |
|
| Render | Playwright render worker (Node.js) |
| Monitoring | Optional Sentry (production builds only) |
| Deploy | Vercel (client), Render/Fly (worker), Supabase (backend) |
Production client build uses vite build (see Vite CLI).
Full detail: Architecture.md.
Website → Discovery → Acquisition (static / render)
→ Website intent → Page intent → Applicability
→ Rule execution → Render reliability → Scoring → Recommendations
→ Snapshot (scores, intents, optional pagePreviews from og:image/favicon)
→ Persistence → Entitlement consume → Optional email
Audits run in the browser tab. Keep the tab open until completion.
Page Preview: During analysis, HTTPS og:image / favicon URLs already present in the parsed DOM are stored on the intelligence snapshot (pagePreviews) and rendered in the report as lazy-loaded thumbnails. Missing or broken images fall back to an empty state. This does not use screenshot APIs, storage buckets, or extra crawl requests at report time.
Message → Conversational intents → Scope → Domain → Subtopic
→ Local handler (product memory / audit / billing / …) → Response
Page-context suggestions enrich prompts; product answers come from the Vertly dataset/handlers — not an open-ended SEO chatbot.
Vertly can also host lightweight in-app moments (e.g. birthday celebration): the floating launcher can be suppressed while an overlay shows the companion character, then restore with an optional speech bubble on dismiss.
Convertly/
├── client/ # React SPA (Vite)
├── render-worker/ # Playwright POST /render
├── supabase/
│ ├── migrations/
│ ├── functions/ # Edge functions + _shared
│ └── scripts/ # OPERATIONS.md runbook
├── Architecture.md
└── README.md
| Route | Access | Screen |
|---|---|---|
/ |
Public | Marketing home |
/sample-report |
Public | Sample conversion audit report |
/login, /signup, /forgot-password |
Guest | Auth |
/reset-password |
Public | Password recovery |
/dashboard |
Authenticated | Dashboard |
/audit/new |
Authenticated | New audit |
/audits, /audits/:id |
Authenticated | History and report |
/workspace |
Authenticated | Workspace |
/billing, /billing/return |
Authenticated | Plans and checkout return |
/settings/* |
Authenticated | Profile, preferences, notifications, security, danger zone |
cd client
npm install
cp .env.example .env
npm run dev # http://localhost:5173
npm run typecheck
npm run lint
npm run build # vite buildPrerequisites: Node.js 20+, npm 10+. For the render worker: npx playwright install chromium.
Copy client/.env.example to client/.env and fill local values. Production must use real Supabase auth (not local auth). Optional local render worker: see render-worker/. Edge configuration for payments and email lives in Supabase Dashboard — never in the client bundle. Details: supabase/functions/PAYMENTS.md, NOTIFICATIONS.md.
Apply in timestamp order (supabase db push). Notable recent migrations:
| Migration | Purpose |
|---|---|
…_audit_engine.sql … business/payment foundation |
Core schema |
…_audit_entitlement_consumption.sql |
Entitlement ledger |
…_vertly_conversations.sql |
Vertly history |
…_fail_stale_audits_watchdog.sql |
Stuck-audit cleanup |
…_atomic_audit_start_entitlement.sql |
Start-race entitlement fix |
…_product_events.sql |
Product analytics |
…_service_role_notification_grants.sql |
Email function table grants |
…_profile_enrichment.sql |
Optional profiles.birthdate / country / avatar_url + public avatars storage bucket (RLS: own folder only) |
| Function | Role |
|---|---|
audit-fetch |
Server-side HTML / robots / sitemap fetch |
audit-render |
Playwright render proxy |
email-notifications |
Audit complete, score-drop, weekly digest (Resend) |
contact-enquiry |
Public contact form → HM Coding inbox |
delete-account |
Cancel provider subscription (if any), then delete account |
payment-checkout |
Start subscription checkout |
payment-portal |
Subscription management |
payment-cancel |
Cancel subscription |
payment-change-plan |
Plan change flow |
payment-webhook |
Provider webhook ingestion (no user JWT) |
Ops runbook: supabase/scripts/OPERATIONS.md.
- Never commit secrets or
.envfiles - Only public
VITE_*values ship to the browser; RLS protects data - Privileged keys stay in edge functions / hosting dashboards
- Payments and webhooks run server-side
- Render worker requires authenticated access in production
- Prefer
@/*imports; runnpm run typecheckbefore merge - Log with
createLogger()— no sensitive data in client logs - Premium dark SaaS UI; mobile-first; minimal focused diffs
- Do not redesign the audit engine, rewrite scoring, or reposition as SEO without explicit approval
| Branch | Purpose |
|---|---|
main |
Production |
fix/*, feat/* |
Work → main when ready |
- Conversion audit engine + Growth Score + confidence / SPA softening
- Open Graph Page Preview on report page cards (metadata thumbnails, not screenshots)
- Business foundation, billing, workspace ledger
- Vertly Convertly-only routing + expanded context suggestions
- Profile enrichment — optional birthdate, country, avatar; Vertly-hosted birthday card
- Turnstile captcha stability on auth forms
- Live execution, sample report, notifications plumbing
- Lightweight supporting technical signals in-report
- Team invitations / org workspaces
- Optional hosted LLM provider for Vertly (routing unchanged)
- Stronger crawl for geo-restricted / heavily blocked sites
- Real screenshot capture pipeline (placeholders today — separate from Page Preview)
- Server-side audit job runner (replace browser-tab engine)
Proprietary. © 2026 Convertly · HM Coding. All rights reserved.
- Branch from
main - From
client/:npm run typecheck,npm run lint,npm run build - Keep changes scoped; note migrations if schema changes
- Never commit secrets