Business case · Beverage manufacturing · In daily use

Saffron Leads

A manufacturer was running its sales pipeline on memory and forwarded WhatsApp messages. Now nothing goes cold in silence.

I own this company's whole inbound funnel: the websites, the SEO that fills them, the capture automation, and the tool the team runs deals through. Total infrastructure bill: zero rupees.

RolePM and builder, full funnel
UsersA small team, daily
Cost to build and runZero
A small team does not need Salesforce. It needs this.
Scroll
490+ leads under managementZero rupees of infrastructureTwo daily usersSix stage pipelineEnergy drinks: 48 percent of demand 490+ leads under managementZero rupees of infrastructureTwo daily usersSix stage pipelineEnergy drinks: 48 percent of demand
01 · The problem

Leads managed by memory.

Saffron Beverages manufactures drinks under other companies' brands. The websites worked and the enquiries arrived, but the operational layer did not exist: every enquiry landed in an inbox and got copy pasted into WhatsApp to whoever seemed relevant. No record of who was contacted, when, or what price was quoted. Follow ups ran on memory, and leads went cold silently, so nobody could see it happening.

Three questions nobody could answer quickly:

Which leads came in today?
Who have we contacted?
What did we tell them?

The scope I set: not a Salesforce implementation, not another subscription. An internal tool built for a small, non technical team and this company's real pipeline, at zero infrastructure cost.

Email, then WhatsAppmanual copy paste to whoever seemed relevant, with follow ups running on memory
One place, every dealdate grouped leads, pipeline status, ageing alerts, and quoted prices recorded next to the lead
02 · How the data moves

A buyer searches. Five steps later, a deal has a status.

No human retypes anything anywhere in this chain. The first three steps existed before the CRM, which is exactly why I built on top of them: zero migration risk, zero disruption to a business that was already running.

01

Three websites, SEO led

Two manufacturing brands plus a popping boba ingredient brand. I built the main site and ran the keyword work that brings buyers in.

Wix · SEO
02

The enquiry form

Captures structured product interest plus a free text brief, so the sales conversation starts already knowing what they want and roughly how much.

Wix Forms
03

Straight into the sheet

An automation pushes every submission into a dedicated tab of one Google Sheet. The spreadsheet is the database, deliberately.

Wix Automations · Sheets
04

The cleaning pipeline

Fuzzy header matching, a parser for three product formats, junk filtering, duplicate suppression, country code detection, and a salvage layer. No lead gets wasted.

Apps Script · mine
05

The pipeline the team runs

New, Contacted, Samples Sent, Quoted, Converted, Not Interested. Status changes auto stamp the date back into the sheet.

Saffron Leads · mine
Why it survives me

If the app ever breaks, the sheet is still readable and editable, and the business keeps operating. That resilience was the point.

Where the judgment sits

Steps 4 and 5 are the product. The rest is plumbing I already owned, which is why v1 shipped in a single working session.

The migration trigger

Documented, not hand waved: a real team, or roughly ten times the lead volume, moves this to a hosted database with proper auth.

03 · What shipped

Built for a team that was never going to read a manual.

saffron leads · internal
The Saffron Leads dashboard with customer details redacted

Every lead, grouped by when it arrived.

Today, Yesterday, then by date. One glance answers where a deal is. New leads show an ageing indicator that turns red after three days, so a forgotten enquiry becomes impossible to ignore. The sidebar counts do double duty as the company's demand report.

Names, companies and messages redacted. Structure is real.
google sheets · system of record
The Google Sheet that backs the CRM, with lead data redacted

The database is a spreadsheet, on purpose.

The data already lived here, so there was no migration and no risk. It stays human readable, so if my app disappears tomorrow the business carries on inside this sheet. No hosting bill, and Google handles the login.

Same data, one layer down
The insight the business did not have before

Energy drinks are nearly half of all demand.

Once every enquiry was categorised, the demand distribution became visible for the first time. Energy drinks account for 235 of the first 492 enquiries, roughly 48 percent. That single fact revamped the SEO strategy: keyword focus now follows proven enquiry volume instead of guesses, and the product mix in the pipeline doubles as free market research. The CRM stopped being an operations tool and started being a demand instrument.

Energy Drinks235
Flavoured Beverages205
Protein Beverages100
Mogu Mogu Style52
Boba Beverages47
04 · The calls

Five decisions, each with the road not taken.

This is the part of the work that does not screenshot well: what got chosen, what got rejected, and the tradeoff each call accepted.

01

A spreadsheet is the database.

Rejected: a hosted database with a proper backend

The data already lived there, so the source of truth needed no migration. It stays human readable, so the business survives the app breaking. And it hands over hosting and authentication for free. The tradeoff is accepted openly: reads take three to five seconds, and it caps out in the tens of thousands of rows. At this team's size and lead volume, those limits are irrelevant.

02

Identity by fingerprint, never by row number.

Rejected: writing status to row seven, the obvious way

Spreadsheet rows are positions, and positions move as leads arrive and sorting changes. Writing by position means a status eventually lands on the wrong customer, which in a sales tool is a revenue bug. Every save recomputes a composite fingerprint from timestamp, email, phone and name, and writes only to exact matches. Position becomes irrelevant.

03

Split the two boba businesses by buyer intent.

Rejected: grouping by which website the lead came from

One word, two completely different conversations: brands who want boba drinks manufactured, and cafes who want to buy popping boba as an ingredient. Different pricing, different follow up cadence. They became separate categories, and leads from both sites were unified by intent. Buyer intent is the right grouping axis, not lead source.

04

Starring is a flag, not a seventh status.

Rejected: adding Starred to the pipeline

When bookmarking was requested, the easy path was another status. I pushed back: a status answers "where is this deal," a star answers "do I care right now," and mixing them corrupts both. A starred lead keeps its stage and its date order, and gains a gold border plus its own filter. Orthogonal concerns stay orthogonal.

05

Notes save on a button, not automatically.

Rejected: auto save, the modern default

This field holds quoted prices. A dropped connection during an auto save can destroy a price note silently, and nobody would know until the customer quoted it back. Explicit save is the right call when the field holds money.

05 · Deliberately not built

Everything I refused to put on the screen.

Each of these was tempting, and each failed the same test: it added complexity without helping the team's daily workflow. A tool the user finds complex is a tool the user stops opening.

Kanban boards

Impressive in a demo. On a phone, in a factory office, a dated list beats a board every time.

Analytics dashboards and conversion charts

The sidebar counts already answer the only questions being asked. Charts would have been decoration with a maintenance cost.

Activity logs and multi note histories

A small team that talks daily does not need an audit trail. They need to know what price we quoted.

WhatsApp integration

The most requested idea, and the most expensive. The workflow problem was never the messaging; it was that nothing was recorded.

Deliberately deferred: per user attribution if the team grows, a hosted database beyond roughly ten times this volume, smarter export detection that reads the message rather than the phone prefix, and conversion analytics once there is enough Converted data to mean anything. Each waits for evidence, not enthusiasm.

06 · How it was built

One working session to v1. The judgment was the slow part.

The method

Scoped against three jobs.

See new leads instantly, know where each deal stands, and record what we told them. Every feature request was measured against those three, and most did not survive. Same day iterations came from screenshots and real user feedback.

The build

The fewest moving parts.

Google Apps Script serves the app from inside the spreadsheet, so there is no server, no API keys, and no login to build. The frontend is one readable file of about six hundred lines, responsive from desktop table to phone cards.

The discipline

Sixty checks, and a release rule.

An automated suite grew to 60 checks run against real production headers, catching genuine bugs before the user did. When four parallel deployments started serving different app generations, the fix was one deployment, versioned every time. Release management in miniature.

07 · The numbers
0leads under management from three websites, and climbing
0of demand is energy drinks, the insight that redirected the SEO strategy
0infrastructure cost. No hosting, no subscriptions, no database bill.
0export enquiries surfaced automatically by country code, a one click view of international demand
0automated checks against real production data before each release
0working session to v1, with same day iterations driven by real user feedback

"The constraint was never technology. It was judgment about what this team actually needs."

The closing lesson · Saffron Leads
Next case study

MovieMatch

Two people, one couch, thirty minutes of scrolling and no decision. So I built the fix, shipped it to real users with real payments, and refused to ever charge monthly for it.

Read it