White-label client automation: one template, config per client

An n8n intake workflow built to be reused across clients. The nodes never change. The client's name, AI vocabulary, escalation threshold, CRM, logging and alert destinations all come from a single config node, so onboarding the next client is an edit rather than a build.

RECORDED DEMO · FICTIONAL CLIENTS
1. Onboarding client B 00:03 Dental clinic config swapped for a real estate agency. New vocabulary, new threshold, new destinations, then the same pipeline handles a property enquiry.
2. Error handling 00:51 The AI step is pointed at a model that does not exist. Three retries, then the error output fires, an alert goes out and the caller still gets a clean response.
3. Full walkthrough 01:30 Where config lives, credentials referenced not hardcoded, routing on the AI's own classification, the test payload, and the audit row every run writes.

The entire onboarding, side by side

Client ADental clinic, escalation threshold 70

Client config for a dental clinic: intents, threshold and endpoints

Client BReal estate agency, escalation threshold 80

Client config for a real estate agency: different intents, threshold and endpoints

What actually changes

Config keyClient AClient B
client_nameBright Smile DentalHarbour Realty
industrydentalreal_estate
ai_system_promptnew_patient, existing_patient, emergency, supplier, spambuyer, seller, renter, appraisal, supplier, spam
high_value_score7080
crm_endpointclient A destinationclient B destination
log_endpointclient A audit logclient B audit log
alert_endpointclient A alertsclient B alerts
nodes changednonenone

Why it is built this way

Config is data, not codeEvery client-specific value lives in one node. Nothing about a client is spread through the workflow, so there is no hunt when something moves.
Two layers of error handlingCaught failures take the node's error output, retry three times, then alert with the client name, failing node and execution id. Total failures that kill the run are caught by a separate workflow-level trigger.
Credentials referenced, never hardcodedKeys live in n8n's credential store. Moving the template to the client's own account does not mean editing the workflow.
A caught error still reports successn8n counts a handled failure as a completed run, which is correct but misleading. That is why every run writes its own status to the audit log rather than relying on execution status.

Both clients in this demo are fictional, and the CRM, logging and alert endpoints are throwaway test URLs, so the whole pipeline runs end to end without touching a real account. The AI step runs on a low cost model; for a production build it points at the client's own key, which is one line in the same config node.