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
Campaign
From a spreadsheet to a CRM where a duplicate is never created: system flowIncoming 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.List uploadedCSVRows parsedn8nMatched on emailMonday GraphQLLead createdMonday.comExisting lead updatedMonday.comCompany resolvedMonday GraphQLContact found or createdMonday GraphQLLinked in orderMonday GraphQLCampaign checkedInstantlyCampaign createdInstantlyStatus checked firstInstantlyLead enrolledInstantly

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.

Every conditional branch and every always-on step in the From a spreadsheet to a CRM where a duplicate is never created system: the condition or trigger that fires it, the step it leads to, and, where there is one, a note on why that branch exists
ConditionThenWhy
matched before any record is written, never afterMatched on email
Incoming lead is NewLead created
Incoming lead is Already on fileExisting lead updatedno second copy is created
Incoming lead is NewCompany resolved
Incoming lead is Already on fileCompany resolved
Campaign is NewCampaign created
Campaign is Already existsStatus checked firststatus confirmed before any update
Campaign is NewLead enrolled
Campaign is Already existsLead enrolled

The stack.

Every layer of the From a spreadsheet to a CRM where a duplicate is never created stack and the tools used at each layer
LayerTools
CRM boardsMonday.com
OutreachInstantly
Orchestrationn8n
API layerMonday GraphQL
IngestCSV 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

  1. We reply within 4 hours, from a real person, not an auto-responder.
  2. A short scoping call to understand the goal, constraints, and timeline.
  3. A fixed-scope discovery sprint: a working prototype and a written estimate.
Office
Austin, TX, United States
Hours
Mon–Fri · Async + scheduled calls

Fields marked are required. By sending you agree to our Privacy Policy.