B2B sales
From a spreadsheet to a CRM where a duplicate is never created
An 81-node workflow that matches every incoming lead against what already exists before it writes anything, and builds the relationships the platform does not provide natively.
Client: A B2B outreach operation
System flow and narrative
Incoming lead: New. Campaign: New. Path: List uploaded, then Rows parsed, then Matched on email, then Lead created, then Company resolved, then Contact found or created, then Linked in order, then Campaign checked, then Campaign created, then Lead enrolled.
From a spreadsheet to a CRM where a duplicate is never created: system flow
Edges: live is a thicker, full-opacity, travelling dashed line; not taken is a thinner, dimmed, solid line. Nodes: live is a thicker, full-opacity outline; not taken is a thinner, dimmed outline. Color is never the only signal.
01
What the 81 nodes are for
The workflow takes a B2B outreach operation from a spreadsheet upload to correctly structured, deduplicated CRM records with all relationships established programmatically, replacing manual campaign creation and record linking. Most of its size is not the happy path. It is the checking: what already exists, in what state, and in what order things have to be written so the result is coherent rather than merely present.
02
Match before write, not clean up after
On ingest, each lead is checked against existing records by email before any write happens. A new lead is created; one already on file takes the update path instead. This ordering is the whole difference between a CRM that stays clean and one that needs a deduplication pass every quarter, because once two records for the same person exist, deciding which one is authoritative is a judgement call nobody wants to make at volume.
03
Relationships the platform does not provide
The data model spans three related board types, and because those relationships are not native to the platform they are built through its GraphQL API with dynamically constructed queries. Company and contact records are found or created independently, then linked in a fixed order: parent company first, then the contact. Getting that sequence wrong is how a system ends up with orphaned records, which in an outreach pipeline means a lead attached to nothing and invisible to every report.
04
Enrolling without overwriting
Campaign creation branches on whether the campaign already exists. A new campaign is created directly. An existing one runs a status check before any action is taken on the update path, so an active campaign is never silently reconfigured by an import that assumed it was starting from scratch. Both paths converge on the same enrolment step, which is the point at which the lead becomes something the outreach tool will actually send to.
The branch logic, as a table.
| Condition | Then | Why |
|---|---|---|
| matched before any record is written, never after | Matched on email | |
| Incoming lead is New | Lead created | |
| Incoming lead is Already on file | Existing lead updated | no second copy is created |
| Incoming lead is New | Company resolved | |
| Incoming lead is Already on file | Company resolved | |
| Campaign is New | Campaign created | |
| Campaign is Already exists | Status checked first | status confirmed before any update |
| Campaign is New | Lead enrolled | |
| Campaign is Already exists | Lead enrolled |
The stack.
| Layer | Tools |
|---|---|
| CRM boards | Monday.com |
| Outreach | Instantly |
| Orchestration | n8n |
| API layer | Monday GraphQL |
| Ingest | CSV upload |
Safeguards.
- Every lead is checked against existing records by email before any write, so a duplicate is never created in the first place.
- Company and contact records are found or created independently, then linked in a fixed order, so referential integrity holds.
- The campaign path branches on existence and runs a status check before acting on an update, so an active campaign is never silently reconfigured.
- Relationships are built through dynamically constructed GraphQL queries, because the platform provides no native way to express them.
Before and after.
- Record creation
- Before: Campaigns created and records linked by handAfter: One workflow from list upload to structured, linked records
- Duplicates
- Before: A re-uploaded list created a second copy of everyone on itAfter: Each lead matched on email before any write
- Relationships
- Before: Links made manually, and often missedAfter: Company and contact found or created, then linked in a fixed order
- Campaign handling
- Before: Create, and hope it was not already thereAfter: Branches on existence, with a status check before any update
- Orphaned records
- Before: A failed link left a lead attached to nothingAfter: Ordered linking keeps referential integrity intact
This is one delivered system, published in full. See how we build AI automation
Want this on your own stack? See our n8n automation agency page.
Start a conversation
Tell us what you’re building.
Share the essentials and we’ll reply within 4 hours with a real next step, not an auto-responder.
What happens next
- We reply within 4 hours, from a real person, not an auto-responder.
- A short scoping call to understand the goal, constraints, and timeline.
- A fixed-scope discovery sprint: a working prototype and a written estimate.
- info@irenictech.com
- Office
- Austin, TX, United States
- Hours
- Mon–Fri · Async + scheduled calls
