CASE FILE 06/13CLASS: SAMPLE BUILDDATA: REALISTIC, NOT CLIENTTYPE: Workflow automation

Sample build: realistic data, built to show how I'd handle this work. Not client work.

Sample buildWorkflow automation

Booking form to CRM, invoice and Slack in one workflow (n8n)

12 of 14 test bookings carried from form to CRM, invoice and Slack, 2 rejected with a reason

Sample build · realistic data, built to show how I'd handle this work · not client work · every figure is computed from the files in the appendix

  • 14test submissions
  • 12processed end to end
  • 2rejected with a reason
  • 4,089.80invoiced in the test run

01Summary

  1. A booking form feeds one n8n workflow (14 nodes) that validates, prices, finds or creates the CRM contact and raises the invoice.
  2. In the test run 12 of 14 bookings went through end to end and 2 were rejected with a reason.
  3. 4,089.80 was invoiced across 7 contacts, with a Slack message for each booking.

In the test run 12 of 14 bookings went through end to end and 2 were rejected with a reason.

Key point, computed from the sample files

02The scenario

In this scenario every booking is handled three times by hand: once in the inbox, once in the CRM and once in the invoicing tool. Pricing mistakes and missed messages are the usual result.

Exhibit 1: Current-state process map: 5 manual steps across 3 roles
Current-state swimlaneCustomerOfficeCRM /invoicingSubmits form1Reads email2Types contact3Types invoice4Tells the team5

Source: sample files

03Issues in the data

Exhibit 2: Issues in the scenario, counted from the sample data
14test bookings that would each be typed three times
2submissions with bad data that would reach the CRM
7repeat customers who would get duplicate contacts
12invoices priced by hand

Source: sample files

04How I approached it

  • A webhook that receives the booking form and a code step that validates and prices it from a rate card.
  • Find-or-create logic for the CRM contact, so returning customers are not duplicated.
  • Invoice creation and a Slack message with the key details; a review alert for rejected submissions.
  • An n8n export with 14 nodes, tested against local stand-ins for the CRM, invoicing and Slack.
Exhibit 3: Target design for the scenario
Future-state architectureFORMWebhookN8NValidate + priceFind or create contactCreate invoiceNOTIFYSlack messageReview alert onfailureRECORDSCRMInvoicesRun log

Source: my design and the sample files

05How this applies to your business

  1. Assess and designMap the current process, size the gaps from your own data, agree the design and a written scope.
  2. Build and testBuild in your own tools with the checks built in, then run real cases end to end.
  3. Document and hand overSOPs, a walkthrough and a handover, so your team runs it without me.
Exhibit 4: Responsibilities (R responsible, A accountable, C consulted, I informed)
ActivityBusiness ownerSpecialist (me)Your team
Agree the rate cardACR
Build and test the workflowARI
Handle review alertsICR
Change pricesACR

Source: sample plan

06Controls and checks

Exhibit 5: Control framework: 4 checks, status read from the files
CheckWhat it catchesStatus
Valid bookings processed end to endSteps that fail silently12 of 14
Invalid email rejectedContacts that cannot be invoicedPASS
Unknown service rejectedInvoices priced off the rate cardPASS
Repeat customers reuse their contactDuplicate CRM contactsPASS

Source: sample files (Checks / Controls tab, test output or run log)

07What the files show

Exhibit 6: What the sample files show
  • 14test submissions
  • 12processed end to end
  • 2rejected with a reason
  • 4,089.80invoiced in the test run

Source: sample files, measured by script. Sample data, not a client result.

  • 12 accepted submissions created 12 unique invoices for 7 contacts (returning customers matched).
  • 2 submissions were rejected with a clear reason (bad email, service not on the rate card).
  • The run log in the download shows every request and response.

08Risks and how the build handles them

Exhibit 7: Risks and mitigations
RiskMitigation built in
Bad data creates junk recordsValidation step rejects with a reason before any write
Duplicate contactsReturning customers are matched to their existing contact before one is created
Workflow stops unnoticedFailures post a review alert; every run is logged

Source: sample design

09Appendix: files

A. Screenshots of the deliverable

Workflow diagram: form webhook, validate and price, find or create CRM contact, create invoice, Slack message, review alert

Exhibit 8: Workflow diagram: form webhook, validate and price, find or create CRM contact, create invoice, Slack message, review alert

Source: sample files

Invoice record created by the workflow, rendered from the invoice data

Exhibit 9: Invoice record created by the workflow, rendered from the invoice data

Source: sample files

Slack message posted for a new booking with contact, invoice number and total

Exhibit 10: Slack message posted for a new booking with contact, invoice number and total

Source: sample files

Exhibit 11: Code excerpt: 01_validate.js, from line 16
const errors = [];
const email = String(b.email || '').trim().toLowerCase();
if (!/^[^@\s]+@[^@\s]+\.[a-z]{2,}$/.test(email)) errors.push('A valid email address is required');
const titleCase = s => String(s || '').trim().toLowerCase().replace(/\b[a-z]/g, c => c.toUpperCase());
const name = titleCase(b.name);
if (!name) errors.push('Name is required');

Source: 01_validate.js

B. Downloadable files

FileWhat it isSize
booking-crm-invoice-slack.n8n.jsonn8n workflow export (import into n8n)16.7 KB
01_validate.jsCode node source2.7 KB
02_build_invoice.jsCode node source998 B
03_slack_message.jsCode node source1.1 KB
run-log.txtRun log: 14 test submissions and each response1.3 KB
test-submissions.jsonTest submissions used for the run5.4 KB

Sample build: realistic data, built to show how I'd handle this work. Names are placeholders and no client data is used.

Have a similar problem in your business?

Hire me on Upwork (opens in a new tab)