~/openarch/work/pipeline-// case study

A B2B sales CRM. One shared deal pipeline over quote building, order conversion and WhatsApp follow-ups - replacing five spreadsheets and an ad-hoc messaging habit.

Veltrade Distributors·B2B sales · industrial parts·2026·in production
openarch.in/work/pipeline
Pipeline interface
//the brief

What we built.

Veltrade tracked leads across five spreadsheets and chased them over WhatsApp with no shared view. We built one pipeline: deals move through a Kanban board, quotes generate as PDFs, follow-ups schedule themselves, and management finally sees deal value by stage.

// One pipeline, not five spreadsheets.

domainsales CRM
shapeinternal web app
statusin production
surface6 core screens
stack
reactnode · expresspostgresredistwilio whatsapp
//what we shipped
01

Deal board

A Kanban from New through Won / Lost, drag-and-drop stage changes, and deal value visible on every card.

02

Contact detail

A full activity timeline - calls, WhatsApp, quotes sent, notes - with every linked deal for that contact and company.

03

Quote builder

A line-item builder pulling from a product catalog, one-click send over WhatsApp or email, PDF generated automatically.

04

Order conversion

Accepted quotes convert to orders in one click, with order status tracked separately from the deal.

05

WhatsApp thread

An inline conversation per deal over the Business API, with templated follow-ups and merge fields.

06

Reports

Pipeline value by stage, win rate by rep, and average time-to-close - management's first real view of the funnel.

//data model
schema.sql5 tables
table deals
lead_id, title, value, stage, expected_close
table quotes
deal_id, quote_number, total, status, sent_at
table quote_lines
quote_id, product_name, qty, unit_price
table orders
quote_id, order_number, status, confirmed_at
table follow_ups
deal_id, due_at, channel, status, completed_at
// deal stage machine
  1. 01new
  2. 02qualified
  3. 03quote_sent
  4. 04negotiation
  5. 05won / lost
//business logic
schedule.tsFollow-up scheduling
function scheduleFollowUp(stage) {
const days = { QUOTE_SENT: 2, NEGOTIATION: 1, QUALIFIED: 4 }
return addDays(new Date(), days[stage] ?? 5)
}
convert.tsQuote → order
function convertQuoteToOrder(quote) {
if (quote.status !== 'ACCEPTED')
throw new Error('Quote must be accepted first')
return createOrder({ quote_id: quote.id, status: 'CONFIRMED' })
}
//on the roadmap

Honest edges.

  • →Duplicate-contact detection when leads arrive from multiple sources
  • →Per-client quote PDF templates in place of hardcoded branding
  • →Faster rollout path around Meta's WhatsApp template approval turnaround
//result
5 → 1
spreadsheets into one pipeline
↓
quote-to-response time
1st
view of deal value by stage

Veltrade's sales team consolidated five spreadsheets and a WhatsApp-only follow-up habit into one pipeline - cutting average quote-to-response time and giving management their first real view of deal value by stage.