WanderingTechWanderingTech CRM blueprint

Lead capture and CRM blueprint

From a visitor’s first click to a booked, tracked lead.

A 6-step scoping form on my own site feeds a private Kanban board in real time, with the full brief, a pre-filled booking link and notes on every lead. Three flows and 41 steps, mapped from the first click to a moved card.

  1. 01Form
  2. 02Data path
  3. 03Dashboard
Stack
Vercel, Supabase (PostgreSQL), vanilla JavaScript
Flows
3: the form, the data path, the dashboard
Steps
41
Integrations
n8n webhook (optional), booking embed, Telegram alert (in progress)
Covers
Scoping form, live board, lead briefs, contract templates
Prepared by
Jam Susana
TriggerStepDecisionErrorEnd

V1 · Oct 2026

01

The three flows

What the visitor does, what happens to their data, and what I see on the other side.

Figure 01 · Flow map3 flows · 41 steps
FlowStarts whenBranches onStepsEnds with
01  Form FlowVisitor Arrives
wanderingtech.com loads in browser
All Fields Valid?15User Corrects + Retries
Lead Booked
02  Data PipelinesubmitForm() Called
Submit & Book Call → pressed by visitor
All Fields Valid?13User Corrects + Retries
Lead Captured & Booking Open
03  CRM DashboardNew Lead Inserted
Supabase leads table receives a new row
Card Interaction?13Stage Updated
Lead Reviewed
02

Building blocks

Every flow is assembled from the same small set of steps.

Figure 02 · Step catalog15 step types
StepWhat it does123Total
UI renderRenders or updates a UI component in the browser.2136
Form stepOne of 6 progressive steps in the automation scoping form.6··6
End nodeTerminal point · this flow path is complete.2226
TriggerEntry point that starts this data flow.1113
If / elseDecision branch based on validation result or user interaction.1113
Calendly embedInjects the Calendly iframe with pre-filled name + email params.12·3
Error stateHandles failed validation · no data is sent when this fires.11·2
Supabase insertInserts a new row into the Supabase PostgreSQL leads table.11·2
ValidationClient-side field validation before data is submitted.·2·2
Supabase readReads and streams data from Supabase in real-time.··22
Lead modalFull brief modal: all 20+ form fields + editable notes field.··22
n8n webhookPosts form payload to the configured n8n webhook endpoint.·1·1
NotificationFires a Telegram bot alert via n8n · currently in progress.·1·1
Kanban boardThe 5-column Kanban view with draggable lead cards per stage.··11
Supabase updateUpdates an existing leads row · stage change or notes.··11
03

The scoping form

Six short steps that capture what a call would otherwise have to ask.

Figure 03 · Form steps6 steps
StepNo.Asks for
About You1Name · Company · Role type (single select)
Pain Points212-item multi-select grid · trigger · frequency
Current Stack3Tools in use · desired output destination
AI & Goals4AI needs type · success definition text
Scope & Budget5Timeline · budget range · prior attempts
Contact & Submit6Email · preferred call time · extra context
04

The lead board

Five columns, one card per lead, and two things you can do with a card.

Figure 04 · Lead stages5 stages
StagesNewContactedProposalWonLost
When youStepWhat happens
A new lead arrivesPlace in "New" ColumnDefault stage on first insert
Drag a card to another columnDrag to Pipeline StageColumn drop event fires on drag end
The stage is savedPATCH Supabase RowUPDATE leads SET stage=? WHERE id=?
Click a cardOpen Lead ModalFull brief modal renders over Kanban
Read the briefShow 20+ Fields + NotesAll data · editable notes · Calendly link
05

From submit to booking

What happens to the data between the button and the booking page.

Figure 05 · Submit path9 steps
#Step typeStepDetail
01ValidationClient-side ValidationvalidateStep('submit') · email + name checks
02If / elseAll Fields Valid?Required fields + email format check
03ValidationCompile 20+ Fields to JSONFull form state serialized to data object
04n8n webhookPOST to n8n (if configured)try/catch · CONFIG.N8N_WEBHOOK endpoint
05NotificationTelegram Alert Firesn8n → bot notifies Jam of new lead in real-time
06Supabase insertINSERT to Supabasesupabase.from('leads').insert([data])
07UI renderShow Done StateStep 7 active · success checkmark renders
08Calendly embedBuild Calendly URLAppend ?email=&name= query parameters
09Calendly embedInject Calendly iframeInto #calendly-embed div · booking page open
06

Checks and limits

What stops a bad submission, and what is still unfinished.

Figure 06 · Checks7 checks
CheckBehaviourWhere
Checked before sendingRequired fields are present and the email format is validFlow 1 All Fields Valid?
If a check failsAn inline error shows, step 6 stays open and no data is sentFlow 1 Show Inline Error
Booking detailsThe visitor’s name and email are added to the booking link as query parametersFlow 2 Build Calendly URL
Optional webhookPosted inside a try/catch, and only when an endpoint is configuredFlow 2 POST to n8n (if configured)
Alert to meA Telegram message through n8n. In progressFlow 2 Telegram Alert Fires
Dashboard accessThe dashboard is password-gatedFlow 3 summary
Stage changeOne update to the lead’s row, then the board and charts refreshFlow 3 PATCH Supabase Row
Flow 1

Form Flow

ACQUISITION

6-step progressive scoping form · visitor to qualified, booked lead in under 3 minutes with full context captured.

Figure 07 · Form Flow15 steps

Swipe sideways to see the whole flowchart

Form Flow flowchartYESNO
TriggerVisitor Arriveswanderingtech.com loads in browser
UI renderPortfolio LoadsVercel CDN · particle canvas · animated hero
UI render"Book a Call" ClickedshowPage("page-book") SPA router fires
Form stepStep 1 · About YouName · Company · Role type (single select)
Form stepStep 2 · Pain Points12-item multi-select grid · trigger · frequency
Form stepStep 3 · Current StackTools in use · desired output destination
Form stepStep 4 · AI & GoalsAI needs type · success definition text
Form stepStep 5 · Scope & BudgetTimeline · budget range · prior attempts
Form stepStep 6 · Contact & SubmitEmail · preferred call time · extra context
All Fields Valid?
Error stateShow Inline ErrorRed message · field stays open for edit
End nodeUser Corrects + RetriesStep 6 stays active · no data sent
Supabase insertPOST to SupabaseAll 20+ fields inserted to leads table
Calendly embedLoad Calendly Embediframe injected · email + name pre-filled
End nodeLead BookedCRM row live · Calendly scheduling open
Read this flow as a list
  1. Visitor Arrives. wanderingtech.com loads in browser
  2. Portfolio Loads. Vercel CDN · particle canvas · animated hero
  3. "Book a Call" Clicked. showPage("page-book") SPA router fires
  4. Step 1 · About You. Name · Company · Role type (single select)
  5. Step 2 · Pain Points. 12-item multi-select grid · trigger · frequency
  6. Step 3 · Current Stack. Tools in use · desired output destination
  7. Step 4 · AI & Goals. AI needs type · success definition text
  8. Step 5 · Scope & Budget. Timeline · budget range · prior attempts
  9. Step 6 · Contact & Submit. Email · preferred call time · extra context
  10. All Fields Valid?. Email format + required field presence check
  11. POST to Supabase. All 20+ fields inserted to leads table
  12. Show Inline Error. Red message · field stays open for edit
  13. Load Calendly Embed. iframe injected · email + name pre-filled
  14. User Corrects + Retries. Step 6 stays active · no data sent
  15. Lead Booked. CRM row live · Calendly scheduling open
Flow 2

Data Pipeline

BACKEND

Validation → n8n webhook (optional) → Supabase INSERT → Calendly pre-fill. End-to-end under 1 second.

Figure 08 · Data Pipeline13 steps

Swipe sideways to see the whole flowchart

Data Pipeline flowchartYESNO
TriggersubmitForm() CalledSubmit & Book Call → pressed by visitor
ValidationClient-side ValidationvalidateStep('submit') · email + name checks
All Fields Valid?
Error stateShow Error MessageInline error text · submitForm() exits
End nodeUser Corrects + RetriesNo data sent · form stays on Step 6
ValidationCompile 20+ Fields to JSONFull form state serialized to data object
n8n webhookPOST to n8n (if configured)try/catch · CONFIG.N8N_WEBHOOK endpoint
NotificationTelegram Alert Firesn8n → bot notifies Jam of new lead in real-time
Supabase insertINSERT to Supabasesupabase.from('leads').insert([data])
UI renderShow Done StateStep 7 active · success checkmark renders
Calendly embedBuild Calendly URLAppend ?email=&name= query parameters
Calendly embedInject Calendly iframeInto #calendly-embed div · booking page open
End nodeLead Captured & Booking OpenSupabase row live · Calendly ready to schedule
Read this flow as a list
  1. submitForm() Called. Submit & Book Call → pressed by visitor
  2. Client-side Validation. validateStep('submit') · email + name checks
  3. All Fields Valid?. Required fields + email format check
  4. Compile 20+ Fields to JSON. Full form state serialized to data object
  5. Show Error Message. Inline error text · submitForm() exits
  6. POST to n8n (if configured). try/catch · CONFIG.N8N_WEBHOOK endpoint
  7. User Corrects + Retries. No data sent · form stays on Step 6
  8. Telegram Alert Fires. n8n → bot notifies Jam of new lead in real-time
  9. INSERT to Supabase. supabase.from('leads').insert([data])
  10. Show Done State. Step 7 active · success checkmark renders
  11. Build Calendly URL. Append ?email=&name= query parameters
  12. Inject Calendly iframe. Into #calendly-embed div · booking page open
  13. Lead Captured & Booking Open. Supabase row live · Calendly ready to schedule
Flow 3

CRM Dashboard

MANAGEMENT

Password-gated Kanban with real-time Supabase sync, 5 pipeline stages, full brief modals, and 4 analytics charts.

Figure 09 · CRM Dashboard13 steps

Swipe sideways to see the whole flowchart

CRM Dashboard flowchartYESNO
TriggerNew Lead InsertedSupabase leads table receives a new row
Supabase readRealtime Subscription Firessupabase.channel('leads') INSERT event
Supabase readFetch All LeadsSELECT * FROM leads ORDER BY created_at DESC
UI renderRender Kanban Board5 cols: New · Contacted · Proposal · Won · Lost
UI renderRender Lead CardsEach lead: name · budget · timeline preview
UI renderPlace in "New" ColumnDefault stage on first insert
Card Interaction?
Kanban boardDrag to Pipeline StageColumn drop event fires on drag end
Supabase updatePATCH Supabase RowUPDATE leads SET stage=? WHERE id=?
End nodeStage UpdatedKanban refreshes · analytics recalculate
Lead modalOpen Lead ModalFull brief modal renders over Kanban
Lead modalShow 20+ Fields + NotesAll data · editable notes · Calendly link
End nodeLead ReviewedNotes saved · next action taken · modal closed
Read this flow as a list
  1. New Lead Inserted. Supabase leads table receives a new row
  2. Realtime Subscription Fires. supabase.channel('leads') INSERT event
  3. Fetch All Leads. SELECT * FROM leads ORDER BY created_at DESC
  4. Render Kanban Board. 5 cols: New · Contacted · Proposal · Won · Lost
  5. Render Lead Cards. Each lead: name · budget · timeline preview
  6. Place in "New" Column. Default stage on first insert
  7. Card Interaction?. Drag (stage change) vs. Click (view brief)
  8. Drag to Pipeline Stage. Column drop event fires on drag end
  9. Open Lead Modal. Full brief modal renders over Kanban
  10. PATCH Supabase Row. UPDATE leads SET stage=? WHERE id=?
  11. Show 20+ Fields + Notes. All data · editable notes · Calendly link
  12. Stage Updated. Kanban refreshes · analytics recalculate
  13. Lead Reviewed. Notes saved · next action taken · modal closed

Want something like this?

Tell me about the process you want off your plate. The brief takes about three minutes, and the project is priced before I start.

Start a Brief

Open the animated, interactive version of this diagram →

Shown at a high level. Real lead records and anything confidential are left out.