We picked n8n as the orchestration layer because the client wanted to read the workflows themselves after we left. n8n's visual graph is honest about what it is — a directed series of HTTP calls, transformations, and branches — and it doesn't hide a proprietary runtime underneath. Trade-off acknowledged out loud: n8n is slower to write than raw code for a single engineer, and faster to maintain for a non-engineer owner. The client is the second case.
The intake side is a fan-in. Inbound webhooks from the website form, an email poller for the three aliases, and the official channels for the two social platforms all land in the same n8n entry point. We normalise the payload into a single schema — source, channel, raw_body, contact, received_at — and write it to a database before doing anything else. If the model step or the downstream CRM fails, nothing is lost; we replay from storage.
The analysis step is a single call to an LLM with a structured-output schema. The prompt is short and deliberately conservative: classify intent, extract contact fields, estimate urgency on a three-level scale, flag anything that looks like spam or a job application. We measured the model on two hundred historical messages before going live and tuned the prompt until classifications matched the operator's judgment on the cases that mattered. Edge cases that the model gets wrong route to a human review queue rather than a confident wrong answer.
The notification dispatcher is rule-based on top of the classification. High-urgency sales leads page the account owner on a chat channel they already check. Support queries notify the support shared inbox and a team channel. Anything classified as spam or off-topic is logged and dropped. The rules live in a small JSON file the client can edit; we didn't hide them in a database table because reading them is more important than writing them.
The final step pushes the structured lead into the CRM via its API, with the original raw message attached as a note for context. The CRM is the source of truth from that point. n8n keeps a copy of every run for thirty days for debugging, then prunes.
We added a small dashboard — one page, server-rendered, no framework — showing the last twenty-four hours of intake, the classification breakdown, and any items in the human review queue. The operator opens it once in the morning instead of refreshing a spreadsheet all day.