Projects Advanced Excel 3 min read

Turning Excel Into a CRM

Before any of the Python tools existed, the lead database lived in one Excel workbook: six sources, 160+ fields, formula-driven cleanup, and a live dashboard. This is that system.

  • status superseded
  • stack Excel formulas
  • figures illustrative
  • download sample workbook
  • 30,000+ lead records in one workbook
  • 160+ fields tracked per record
  • 6 sources merged into one structure

How it evolved

  1. Then One compilation workbook Monthly merges, formula cleanup, live dashboard
  2. Later The same patterns in Python Cleanup rules and identity fields rebuilt at scale
All figures on this page are illustrative. They show the shape of the workflow, not the size or makeup of any real contact database.

Before the CRM Conversion Engine existed, someone still had to compile and maintain the data it would later automate. That someone was me, and the tool was Excel.

Every month, lead records arrived from six different sources: two CRMs, two lead-data providers, a legacy database export, and purchased lists. Each had its own format, its own quirks, and no shared structure. The compilation workbook grew into a database of 30,000+ records across 160+ fields, and it had to stay accurate, deduplicated, and reportable without any outside tooling.

You can download a small sample of the workbook from this page. Its 450 rows are made up, but the sheet structure and the formulas described below are the real ones, so you can open it and see them work.

Database snapshot

MeasureValue
Total lead records30,860
Active leads18,979 (61.5%)
Inactive leads11,881 (38.5%)
Fields tracked per record160+
Data sources unified6
Countries represented9+

Cleaning company names with one formula

The core challenge was consistency. The same company showed up under slightly different names depending on the source: “Redwood Group Pte Ltd” in one export, “Redwood Group Pte. Ltd.” in another. Normalizing that by hand at this scale wasn’t realistic.

So I built a cleanup formula that strips legal suffixes automatically. It combines TRIM, LEFT, and an array-entered FIND against a keyword list of common suffixes (Pte, Ltd, Sdn Bhd, Inc, Limited, Tbk, PLC, and more), checks a name against every suffix in one pass, and trims it at the earliest match:

=TRIM(LEFT(C2,MIN(IFERROR(FIND(Keywords!$A$1:$A$40,C2),LEN(C2)+1))-1))

Adding a new suffix later just meant adding a row to the keyword list, not rewriting the formula.

Raw company nameCleaned output
Pacific Group Sdn BhdPacific Group
Redwood Group Pte LtdRedwood Group
Oakridge Networks LtdOakridge Networks
Cascade Logistics LtdCascade Logistics
Crescent Networks Pte LtdCrescent Networks
Orion Capital LtdOrion Capital

A dashboard that never goes stale

Reporting was the second problem. The numbers people asked for most were how many active and inactive leads existed per source and per year, and nobody should have to open the raw sheet to get them.

I built a dashboard sheet that uses SUMIFS across the whole database, cross-referencing a computed year field against every source and status combination. Every cell recalculates as records are added or a status changes, so the summary always matches the raw data.

SourceRecordsShare
Operations CRM14,65947.5%
Main CRM10,18433.0%
Lead provider A4,62915.0%
Legacy database export6482.1%
Lead provider B5861.9%
Purchased lists1540.5%
Total30,860100%

One real quirk this reflects: the raw source field sometimes stored the same source name in two different capitalizations, a manual-entry habit the dashboard and lookups had to tolerate rather than assume away.

Treating the database as a living system

Day to day, the workbook was paired with a task-tracking sheet that logged record counts by source and status. Drift or stalled updates showed up immediately instead of weeks later during a reporting cycle.

That habit of tracking the database like a living system, not a static file, is what eventually made the case for automating the whole pipeline. The patterns I leaned on most here, source-aware cleanup rules, a normalized identity field, and status-based aggregation, are the same ones the Python tools later rebuilt at a much larger scale.

What I learned

Good structure outlives the tool. The rules I designed in Excel carried straight over into Python. Only the scale changed.

Watch the data, not just the reports. Daily counts caught problems long before any monthly report would have.