Website leads into Google Sheets and Telegram: a ready n8n template
A website form emails the lead to a shared inbox, where it sinks. Here is a free n8n template that files the lead in a sheet and pings your chat, and the one detail that usually breaks builds like this.
Almost every site has a form, and almost every form is wired the same way: the lead goes out as an email to a shared inbox. What follows is something an owner notices late. The email lands under promotions. One person sees it, and that person is away. A month later nobody can say how many leads came in during March.
This is an evening’s work and needs no developer. Below is a walk through the template I published freely, and why it is built the way it is.
What the template does
Four steps that fire when the form is submitted.
The form posts to an address n8n gives you. The fields are then normalised. The lead is appended to a Google Sheet as a row: date, name, contact, message, source. And a message with the same details arrives in Telegram.
The sheet gives you a history you can count. Telegram gives you a notice the whole team sees, rather than one inbox.
The detail that breaks builds like this
If you assemble this yourself, the first version will almost certainly break on field names.
Site builders name their fields differently. One sends name, another Name, another full_name. The contact arrives as email, Email, phone or telegram. A build written against one form quietly stops working when the form changes or a second one appears on another page. Quietly, because the webhook still answers with success while an empty row lands in the sheet.
So the template has a cleaning step of its own. It takes the first non-empty value from a list of likely names:
const pick = (...keys) => keys.map(k => b[k]).find(v => typeof v === 'string' && v.trim()) ?? '';
name: pick('name', 'Name', 'full_name'),
contact: pick('email', 'Email', 'phone', 'Phone', 'telegram'),
message: pick('message', 'Message', 'comment', 'text'),
source: pick('utm_source', 'source') || 'website',
Ten lines, and they are what makes the build survive a change of form. If your builder sends its own name for a field, you add it to the same list and leave everything else alone.
The second thing worth noticing is the source. If your pages carry UTM tags, the template files them in the same row. A month on you have an answer to which channel brings leads, and it needed no separate analytics.
Setting it up
Three steps, and only the first one asks you to open your site’s settings.
Import the file into n8n through Workflows and Import from File. Copy the address from the webhook node into your form’s settings. Connect a Google Sheet with the columns date, name, contact, message, source, and a Telegram bot with your chat id.
The template is here: website-lead-to-sheets-telegram.json. It is free, so take it and change it.
Changing it for your case
A Google Sheet is a good first step, but it is not a CRM. When the volume grows, the same template switches over: the sheet node is replaced by your CRM’s node and the rest stays.
If there are many leads and some of them are junk, a scoring step goes between the cleaning and the writing: a model reads the message and tags the lead. Then Telegram carries the ones worth answering first, rather than all of them.
If you want this fitted to your CRM, or scoring added, write to me and we will work it out on your own flow.