Skip to content

Twenty requests, one row. Replies and bookings into a CRM exactly once.

n8n workflows that move LinkedIn, email and Calendly events into the CRM without losing or doubling any of them, and a CRM switch with no downtime.

Delivered09/2026

Client
A Nordic B2B SaaS (name withheld)
Role
Built the automations, with Tim N.
Period
08/2026 → 09/2026
Proof
8 claims
With
Tim N.
Stack
n8n · Node.js · Python · CRM API · Slack
  1. 1ProblemReplies were missed, sent to Slack twice, or never reached the CRM.
  2. 2BuildAn atomic claim per event, CRM written before Slack, and a 24-hour shadow run.
  3. 3Result0 errors in the shadow run and 2,075 duplicate companies merged.
20 → 1P1
Concurrent requests to rows written
0P2
Errors in the 24-hour shadow run
2,075P4
Duplicate companies merged

Problem

A Nordic B2B SaaS ran outreach on LinkedIn and email and booked calls through Calendly. Replies were missed, reached Slack twice, or never made it into the CRM, and the team was moving to a new CRM at the same time.

Build

Every event gets a key, and an atomic claim on an n8n Data Table lets only the first copy through, so 20 concurrent requests write 1 row P1. The CRM is written before Slack, and only replies that need action reach a person.

I rebuilt the workflows that wrote to the old CRM and ran the new ones in shadow mode for 24 hours, sending nothing, before the switch P2.

Route

Step 1 of 8

Replies from LinkedIn and email outreach and Calendly bookings arrive as webhooks, sometimes more than once.

  1. Normal run01DoneReplies from LinkedIn and email outreach and Calendly bookings arrive as webhooks, sometimes more than once.
  2. 02DoneEach event gets a key. An atomic claim on a Data Table lets only the first copy through: 20 concurrent requests write 1 row.
  3. 03DoneRetries and duplicates stop here instead of reaching Slack twice.
  4. 04DoneReplies are classified into six labels, in English and Finnish. Rules decide first.
  5. 05DoneThe CRM is written first, so nothing that reached Slack is missing from the CRM.
  6. 06DoneOnly replies that need action go to Slack and a person. Declines are stored in the CRM and stop there.
  7. Something breaks07FailedOne workflow reported success while Slack received nothing. Its filter required a campaign field that real reply events do not carry.
  8. Recovery08DoneI fixed the condition and replayed exactly the 3 events that were lost. The tests now run on real payloads, not sample ones.

Result

The switch went through with 0 errors in the shadow run P2. I backfilled 72 missed events P3, merged 2,075 duplicate companies P4, and 199 of 199 workflow tests pass P5.

Along the way I found why €1,704.80 of LinkedIn Ads had brought 0 leads: the lead forms had been rejected and a tracking tag was missing, and the campaign was stopped P6.

What went wrong

One workflow reported success while Slack received nothing. Its filter required a campaign field that real reply events don't carry. I fixed the condition and replayed exactly the 3 events that were lost P7. Since then the tests run on real payloads, not sample ones.

Limits

The client is not named. Opt-outs can never be overwritten by a sync, which left some merges for a person to decide.

My part

Tim N. leads the client relationship. I wrote 239 of the project's 241 commits P8: the claim pattern, the cutover, the backfill and the tests.

My commits in the project repository239 / 241 · 99%

Proof of delivery · NLV-26-CRM

#ClaimEvidenceAs ofConfidence
P120 concurrent requests for the same event write exactly 1 row.
  • CRM cutover log and evidence folder (On request)
16 Oct 2026I hold the artifact
P2The new CRM ran in shadow mode for 24 hours with 0 errors before the switch.
  • CRM cutover log and evidence folder (On request)
16 Oct 2026I hold the artifact
P3Backfilled 72 missed events with 0 errors.
  • CRM cutover log and evidence folder (On request)
16 Oct 2026I hold the artifact
P4Merged 2,075 duplicate companies.
  • CRM cutover log and evidence folder (On request)
16 Oct 2026I hold the artifact
P5199 of 199 workflow tests pass.
  • Workflow test run, 199 of 199 (On request)
22 Sept 2026I hold the artifact
P6Found why €1,704.80 of LinkedIn Ads brought 0 leads (rejected lead forms and a missing tag), and the campaign was stopped.
  • CRM cutover log and evidence folder (On request)
16 Oct 2026I hold the artifact
P7A filter that real reply payloads failed had dropped events silently; I fixed it and replayed exactly the 3 that were lost.
  • CRM cutover log and evidence folder (On request)
16 Oct 2026I hold the artifact
P8239 of the project's 241 commits are mine.
  • Commit counts per repository (On request)
21 Oct 2026I hold the artifact