BD4
From a single form to a five-path router, and everything that broke, debated, and shipped along the way.
Screens
20 across 5 flows
Versions
4 FRD iterations
Principles
3 shipped
“The Add screen isn’t a form. It’s a router, and a search engine.”
BD4 handles the relationship work that gets pushed aside, telling you who to reach, when to act, and what to say.
The right person to contact, and why now.
Outreach in your voice, grounded in real context.
Consistent follow-through so relationships stay warm.
But every action depends on one thing: a network to work with.
No contacts → nothing to prioritize, nothing to draft, nothing to sustain.
The recommendation engine, warmth scoring, and action flow all depend on a populated network. Without contacts, the product cannot prove itself, and professionals leave before it can.
Intelligence needs a substrate. No contacts means no signals to rank, no warmth to score, and nothing to recommend.
“So the real question wasn’t how do we add a contact. It was how do we get a network fast enough to earn trust?”
A formal study, direct access to beta participants who gave candid feedback at the exact moments the product failed them.
Existing contacts were the harder problem
Books of business live in three places, incomplete. The system has to tolerate mess, not reject it.
Incomplete data was the norm
“My contacts are in my old CRM, a LinkedIn export, and a spreadsheet.” Bulk became first-class.
The small field silently failed
Enrichment mislabeled a contact and couldn’t flag it. The system needs to know when it is confidently wrong.
Privacy was an afterthought
Users ask what BD4 does with their data before it becomes a trust feature.
BD4’s founding philosophy was intelligence in the moment: meet someone, add them, get a recommendation. The first Add screen was smart and right, for one kind of user.
Search & Add
“A professional meets someone, searches their name, and BD4 catches the rest.”
One contact, in the moment · worked for 1 of 5 scenarios
| Metric | V1 Result |
| Time-to-network threshold | 3–5 days · many never reached |
| Reaching an active networking session | ~15% |
One at a time can’t populate a network fast enough to earn trust. Most users left session 1 with a to-do and an empty engine.
“My book of business is in a spreadsheet I’ve kept for years.”
“Everyone I know is already in my email.”
“I grab their LinkedIn and decide later.”
“I’ve known him 20 years, he’s barely online.”
Search-and-add assumed the network already existed. For most professionals it already did, just scattered across email, spreadsheets, LinkedIn, and memory. The Add screen had to meet all of them.
Each version didn’t just add a path, it changed what we believed the Add screen’s job was.
Search a name. Add one contact. The network starts here.
Bulk and dedupe became first-class. The network already exists.
Five entry paths. One shared destination. Only what happens next.
On-the-go intelligence was never wrong, it was one door. Add PCS became the room they all open into.
The original design assumed professionals add contacts one at a time, right after a meeting.
Fast single-add, zero friction, a memory or a business card.
Paste and go. BD4 finds everything from the URL alone.
45–200 rows from a conference. One at a time isn’t viable.
Years of contacts, incomplete. Tolerate mess.
A name and a relationship, and little else.
Only one scenario starts from zero. The other four already have their people, scattered, incomplete, and waiting to be migrated.
Every entry path feeds the same matching pipeline and lands in the same draft queue. No per-path silos.
All five paths land in the same search-queue-draft sequence, same card types, same data floor, same reopen behavior.
→ 1
No silos. No path-specific edge cases downstream.
Add, match, mine, enrich, and the running total that makes progress feel real.
Every entry path, natural language, LinkedIn URL, QR scan, bulk upload, feeds the same matching pipeline and lands in the same draft queue.
7 screens. Landing, natural-language add, drafts list.
6 screens. Finding, seven match states, confirmation.
4 screens. Show info, collect context, classify.
3 screens. Confirm, enrich, added or saved.
No per-path silos. One pipeline, one queue, one set of rules.
Five entry paths converge into one matching, enrichment and confirmation system.
“Tell BD4 who you’re building a relationship with”, the default is a sentence, not a form. “Alex Chen, CEO from Stripe,” and BD4 pulls together the rest.
Scan QR, LinkedIn URL, Bulk Upload, Contact Import all sit right below, for four other scenarios one swipe more than a tap from the same screen.
Uploads enrich in the background. 150 of 100 done enriching, 90 added, 20 to be reviewed, while single-adds land as draft cards, all in one place.
Desktop and mobile use the identical entry logic, the router isn’t a screen, it’s the system behind all of them.
Every confidence level and edge case needed its own screen, copy, and path. Designing the happy path first would leave the seven scenarios broken in production. Scroll to move through them.
94% match. Auto-fill and move on, the happy path resolved instantly.
Found several people. Disambiguate, the user picks the right one.
Only 34% sure. Show the guess, flag it, and offer save-as-draft or incorrect-match.
Already in your community. Merge or create, the user decides.
Sources unreachable. BD4 fills what it caught, the user adds the rest and retries.
Nothing came back. Details are saved, fall back to manual entry, never a wall.
The search broke. The card is saved as a draft so no input is ever lost.
Each version changed what we believed the screen’s job was, and how much we trusted the system versus the professional.
BD4 found from public sources, PCS, Crunchbase. Name, role, company. Trust the data.
Add the relationship layer the system can’t see, how you met, why they matter. Human-led. The user knows more.
Enrich and classify in one motion, defaulting the unknowable so nothing blocks the add. Balanced. Ship the network fast.
Should Type, Fit, Warmth, and Stage be mandatory before bulk upload? Or is Unknown a valid default? A real disagreement, and this was on the wrong side of it.
Make classification mandatory. A wrong recommendation, an “into message” to a 10-year client, is more damaging than no recommendation at all.
I pushed back on Unknown as a permanent state.
Type defaults to Prospect. Fit, Warmth, Stage default to Unknown. The engine handles Unknown via partial-confidence, reduced confidence, not silence.
Blocking the add was the bigger risk. Some recommendation beat none.
A permanent “Unknown” that keeps users moving beats a mandatory field that stops them. Reduce confidence gracefully, don’t block the network from forming.
Name + Role + Company, or it’s incomplete. The same threshold applies to all five paths.
Complete or incomplete. Every path renders the same two cards.
Enrichment never overwrites a field the user changed.
The paths diverge. The draft doesn’t.
| Path | Produces |
| Natural language | Complete, or incomplete + flagged |
| LinkedIn URL | Complete, auto-enriched |
| QR scan | Incomplete, enrich later |
| Bulk upload | One draft per row; nulls → incomplete |
| Manual entry | Complete if floor met |
Five inputs. One queue, two card types, one set of rules.
Each version didn’t just add a feature, it changed what we believed the product’s job was.
V1
One form, one finish. Assumes everyone adds one contact at a time.
V2
Five situations, five paths. The reframe that reorganized everything.
V3
Enrichment splits into what the system knows and what only the human does.
V4
Bulk becomes first-class, activation across all five paths.
The FRD’s job isn’t to describe a feature, it’s to transfer understanding so completely a developer can resolve any edge case without escalating.
Screen 04 isn’t “match screen,” it’s “Match, Confirmation, low-confidence variant.” Bits and edits are separate specs. Naming them apart gave low confidence a flag and high confidence auto-fill behavior.
Reopen a draft after enrichment ran overnight, if the user added a field, enrichment never overwrites it. Without that rule, fresh data silently erases an intentional correction, the worst kind of bug, because it looks like the system working.
The bulk-upload result copy: “X profiles couldn’t be enriched, saved as draft.” They broke something over a subtle inline “review their scoring.” The specified the exact string, and so did every other case.
A CSV row has a name but no email. Not documented means the developer guesses, skip it, or reject the whole file. The FRD says accept the row, save it as an incomplete draft, and queue it for enrichment. A data-quality problem becomes a designed state, not an error.
“Done” for the match flow isn’t “it finds the contact,” it is: if each with its own copy and auto-motivating timeout. Defining the states with a dry timeout got itself instead of surfacing as a frozen screen in production.
A complete Add-PCS system, measured by whether professionals reach value faster.
Every entry, every match outcome.
Five paths, one pipeline.
Every confidence outcome handled.
CSV to mining pipeline.
One queue, two card types.
Unknown-defaults, edits-win, one queue.
| 70% | Activation, reach the first active networking session |
| ≤ 8 min | Network threshold, reach 10 useful contacts |
| 60% / 80% | Active network, first session to first week |
| ≤ 60 sec | First contact added, single-add paths |
| ≥ 85% | Task completion, drafts resolved |
Shipping the system matters. Proving it reduces time-to-value matters more.
The router reframe was a strategic decision, not a design one. Naming the real job, before it came under pressure, gave the team something to hold to.
Three decisions, unknown-defaults, mandatory review, draft persistence, each looked like a detail. Each was actually a product principle.
The FRD went through four versions over twelve weeks. Every engineering answer could’ve been a Slack thread, was answered in the doc instead.
Strategy named the architecture. Design made every state survivable. Documentation shipped it.