Digitise your company for zero euros - Chapter 6
Automation with n8n without your own servers
In the previous chapter we set up a CRM and learned how to manage tickets with Google Sheets. Now comes what everyone wants: tasks that run themselves. You stop writing the same welcome email twenty times. You stop manually reviewing a list of overdue payers. You stop manually sharing the same content across LinkedIn, X and a newsletter. That's what n8n does: automate workflows without writing code and without paying 30 € per month per user like Zapier.
The Zapier problem when you scale
Two years ago, Zapier worked fine. You paid 20-30 € a month and got 100 monthly automated tasks (called "zaps"). But when you run a business handling 50 leads a month, sending 3 payment reminders to overdue customers, and publishing across 4 channels at once, your zaps run out fast. You upgrade: 50 €, 100 €. Suddenly you're spending 1.200 € annually on orchestration software, before adding Gmail, Google Sheets, and the CRM from chapter 2.
n8n enters here. Automation without limits on monthly tasks (on n8n cloud the limit is execution capacity, not a counter), no charge for extra users, and the freedom to self-host for free when you want.
There's another option: Make (formerly Integromat). Also works. But n8n has clearer documentation for beginners, a more active Spanish-speaking community, and most importantly, the free self-hosted option that Zapier won't give you.
What is n8n? Code-free workflows, full control
n8n is an automation platform that works with nodes. Each node is an action: read an email, create a record in a sheet, send a message, wait for a condition. All connected in a "workflow".
Visual example (no code):
[Web form] → [Search in CRM] → [If not found] → [Create contact]
→ [If found] → [Notify team]
Each arrow is a node. Each node has visual configuration. You don't write JavaScript or SQL. You draw.
n8n Cloud vs Self-hosted
n8n Cloud
- Cost: From 25 € / month (Starter plan).
- Infrastructure: hosted on n8n servers.
- Setup: 5 minutes, just register.
- Limits: runs up to 10,000 workflows/month on Starter, more on higher plans.
- Advantage: no server maintenance, automatic SSL, backups handled.
n8n Self-hosted
- Cost: 0 € (open source tool).
- Infrastructure: your server (VPS, local server, Docker).
- Setup: 20-30 minutes (Docker or Node.js).
- Limits: whatever your server can handle.
- Advantage: full control, no monthly bill, data on your infrastructure.
- Downside: you maintain the server, SSL is manual, backups are yours to manage.
For this series (zero euros), I'm using n8n cloud on the Starter plan (25 €/month) because it's faster and the first use case justifies it. If you need more later, you can migrate to self-hosted.
Case 1: Lead signup from web form to CRM (with deduplication)
Scenario: a form on your website. Each submission creates a record in your CRM (Google Sheets with Looker Studio), saves the email to a Gmail contact, and alerts the sales team.
Step 1: Create the web form
Use Google Forms or a simple HTML form with a webhook. Let's go with Google Forms, it's easier. You create a form with these fields:
- Full name
- Company (optional)
- Message
Step 2: Connect form to n8n
- Go to
n8n.ioand click "Get Started" (free cloud plan or Starter). - Sign up with your email.
- Create a new workflow.
- Add a "Webhook" node (trigger).
- It generates a unique URL, something like
https://n8n.yourinstance.com/webhook/formulario
- It generates a unique URL, something like
- In Google Forms:
- Open Apps Script editor (gear icon at top right → "Script editor").
- Paste this code:
function onFormSubmit(e) { var response = e.response; var itemResponses = response.getItemResponses(); var payload = {}; itemResponses.forEach(function(item) { payload[item.getItem().getTitle()] = item.getResponse(); }); var options = { method: "post", payload: JSON.stringify(payload), contentType: "application/json" }; UrlFetchApp.fetch("YOUR_WEBHOOK_URL_HERE", options); }- Replace "YOUR_WEBHOOK_URL_HERE" with your n8n webhook URL.
- Save and authorise.
Step 3: Deduplication in n8n
Now inside the n8n workflow:
After the Webhook node, add a "Google Sheets" node (action: "Read rows").
- Connect your CRM Google Sheets.
- Search by the "Email" column.
- Load all existing rows.
Add a "Code" node (logic node) to compare:
const newEmail = $input.first().json.Email; const existingEmails = $input.last().json.map(row => row.Email); if (existingEmails.includes(newEmail)) { return { duplicate: true }; } else { return { duplicate: false }; }Use an "If" node (conditional):
- If
duplicate == false→ continue to create record. - If
duplicate == true→ skip to send "already on list" email.
- If
Step 4: Create the CRM record
"Google Sheets" node (action: "Append").
- Sheet: your CRM.
- Columns: Name, Email, Company, Date.
- Data comes from the original webhook.
Step 5: Notify the team
"Gmail" node (action: "Send").
- To: support@yourbusiness.com (or sales contact).
- Subject:
New lead: {{ $input.json.Name }} - Body: include name, email, company, message.
The complete workflow takes 2-3 minutes to set up. Once active, each new form submission automatically:
- Creates a row in the CRM.
- Sends an internal notification email.
- No duplicates.
Case 2: Automatic payment reminders for overdue clients (3 tiers)
Scenario: you have clients who should pay within 30 days. 7 days without payment, first reminder email. At 14 days, second one. At 30, third one (more formal). All automatic.
Input data
A Google Sheets table with:
- Client name
- Invoice date (or date payment is due)
- Payment status (pending, paid, overdue)
Workflow step by step
Trigger: run each day (use a "Cron" node to fire every early morning).
"Google Sheets" node: read all records from the sheet.
"Code" node: calculate the difference.
const today = new Date();
const invoiceDate = new Date($input.json.invoiceDate);
const daysDifference = Math.floor((today - invoiceDate) / (1000 * 60 * 60 * 24));
return {
daysOverdue: daysDifference,
email: $input.json.email,
name: $input.json.name
};
Branched "If" node:
- If
daysOverdue == 7→ send first reminder. - If
daysOverdue == 14→ send second reminder. - If
daysOverdue == 30→ send third reminder (formal tone).
- If
"Gmail" node (one per branch):
- First email (7 days): polite tone.
Hello {{ $input.json.name }}, Reminder: your invoice from {{ invoiceDate }} was due 7 days ago. Outstanding: [amount]. Click here to pay: [link]. Thanks, Billing team.- Second email (14 days): more direct.
- Third email (30 days): includes bank details and legal action notice.
"Google Sheets" node (at the end): log that the email was sent.
- Create a "Last reminder" column with the timestamp.
- Or mark status as "Reminder sent".
Typical mistakes here
- Not checking that status is "pending" before sending (emails going to clients who already paid).
- No logs (when was the last reminder sent?).
- Incorrect timestamps (timezone confusion).
Case 3: Publish a post simultaneously on LinkedIn, X and newsletter
Scenario: you have a Google Sheets table with posts. Each row is a post waiting to go live. Once marked as "ready", n8n publishes automatically to LinkedIn, X (formerly Twitter) and sends to your newsletter list.
Sheet structure
| Title | Content | Image | Channel | Status | Published | Date |
|---|---|---|---|---|---|---|
| "My tip" | "Today I discovered..." | [URL] | LinkedIn,X,Newsletter | Ready | NO | 2026-09-17 |
Workflow
Trigger: change in Google Sheets.
- Use the "Google Sheets" node with "Watch rows" mode.
- Fires when a row status changes to "Ready".
"Code" node: prepare content for each channel.
const content = $input.json.Content; const channels = $input.json.Channel.split(",").map(c => c.trim()); const posts = { linkedin: content + " #business #automation", x: content.substring(0, 280) + " #n8n", newsletter: content + "\n\nRead more at: [link]" }; return { posts, channels };"If" node for each channel:
- If "LinkedIn" in
channels→ send to LinkedIn. - If "X" in
channels→ send to X. - If "Newsletter" in
channels→ send to Mailchimp or your provider.
- If "LinkedIn" in
Publishing nodes:
LinkedIn: use n8n with the "LinkedIn" node (requires OAuth).
- Upload image.
- Publish content.
X: "Twitter" node (now requires X API v2).
- Attach image.
- Tweet.
Newsletter: "Mailchimp" or "SendGrid" node.
- Create a campaign or send email to your audience.
"Google Sheets" node: mark as published.
- Column "Published" = "YES".
- Column "Date" = current date.
Important checks
- Image exists (a "Code" node validates the URL).
- Content isn't empty.
- Error handling: if LinkedIn fails, log the error but don't stop X.
Real cost and scalability
n8n Cloud pricing
- Starter: 25 € / month. Includes 10,000 executions/month, 5 active workflows.
- Pro: 50 € / month. 100,000 executions/month, unlimited workflows.
- Team: 100 € / month. 1,000,000 executions/month, collaborative users.
One execution = one complete run of the workflow from start to finish.
If you have 50 leads/month (case 1) + 30 payment reminders (case 2) + 4 posts/month across 3 channels (case 3), you're at:
- Case 1: 50 executions.
- Case 2: 30 executions.
- Case 3: 4 * 3 = 12 executions.
- Total: roughly 100 executions/month. Starter plan is plenty.
Comparison: Zapier, 30 €/month, limits how many zaps (workflows) you can create. From the fourth zap onwards you're paying for higher plans. n8n, 25 €/month, unlimited workflows.
Self-hosted: zero cost (but maintenance)
If you install n8n on your own server (DigitalOcean droplet, 6 €/month, or at home on a Raspberry Pi):
- Initial cost: setup (30 minutes, no money).
- Monthly cost: server if it's cloud-based (DigitalOcean, Linode, etc.).
- Advantage: no limit on executions, private data, not relying on n8n SaaS.
- Downside: you configure SSL yourself, manual backups, troubleshooting connection issues.
For the "zero euros" series, n8n cloud Starter plan (25 €) is reasonable if it saves you 1.200 € of Zapier costs.
Mistakes everyone makes
1. Workflows with no error handling
A perfect workflow that breaks at one of twenty steps. If the Gmail node fails (expired credentials), everything stops. You don't publish to X, you don't record in Sheets.
Solution: add a "Catch" node at the end.
// If something breaks, send error email to admin
UrlFetchApp.fetch("your_admin_email", {
payload: JSON.stringify({ error: error.message, workflow: "Cross-channel publishing" })
});
2. No logs
A workflow runs for three months. Suddenly, payment reminders aren't arriving. Without logs, you're in the dark.
Solution: at the end of each branch, create a row in a "n8n Logs" sheet with:
- Timestamp.
- Workflow name.
- Action taken (email sent, record created).
- Result (success / error).
3. No duplicate checks
Case 1 without deduplication: every time someone resubmits the form (thinking it didn't send), you create a duplicate record. After two months you've got 200 duplicate leads.
Solution: always do a prior lookup by email (or unique identifier).
4. Expired credentials
You connect Google Sheets, Gmail, LinkedIn. Credentials expire. The workflow keeps trying to run but fails silently.
Solution: on n8n, set up "Retry on failure". Monitor logs. Refresh credentials every 3 months manually.
5. Timezone
You calculate "30 days from invoice" but n8n's server is in UTC and your business is in Madrid. The email sends 2 hours before you expect.
Solution: normalise everything to an explicit timezone. In n8n, use a "Code" node with the moment-timezone library.
When to use n8n Cloud, when Self-hosted, when something else?
| Situation | Recommendation | Why |
|---|---|---|
| Starting out, <100 executions/month | n8n Cloud Starter (25 €) | Quick setup, support, no maintenance. |
| Experienced, >1,000 executions/month | n8n Cloud Pro (50 €) | More executions, unlimited workflows. |
| Sensitive data, want control | n8n Self-hosted | Privacy, no recurring monthly cost. |
| Need very visual, simple UI | Zapier (30 € +) | Polished interface, but expensive. |
| Complex workflows, custom code | Make (formerly Integromat) | Like n8n, more integration options. |
| Want something extremely simple | Form + Gmail | Zero cost, but manual. |
Connections you need: credential setup
Every n8n node connecting to an external service needs authentication.
Google Sheets
- Go to your Google Cloud Console (console.cloud.google.com).
- Create a new project.
- Enable the Google Sheets API.
- Create a "Service Account".
- In n8n, open the "Google Sheets" node → "Credentials" → "Create new".
- Copy the JSON key from your Service Account and paste it into n8n.
- Share your Sheet with the Service Account email (something like
name@project.iam.gserviceaccount.com).
Gmail
Same as Sheets, but enable the Gmail API.
You need an app registered in LinkedIn Developer.
- Go to
linkedin.com/developers/apps. - Create a new app.
- Request access to "Sign In with LinkedIn" (requires approval).
- Copy Client ID and Client Secret.
- In n8n, paste them into the LinkedIn node.
X (Twitter)
Go to developer.twitter.com/en/portal.
- Create a project.
- Generate "API Key" and "API Secret".
- Generate "Access Token" and "Access Token Secret".
- In n8n, paste them into the Twitter node.
Each platform has its own rules. Total setup time: 30-45 minutes if it's your first time.
Next steps
With n8n running, you have:
- Automated lead intake.
- Payment reminders without manual work.
- Content published across 3 channels simultaneously.
The next real step (chapter 7) is electronic invoicing and Verifactu. Because automating everything is cool, but eventually someone has to invoice. And from 2025 in Spain, Verifactu requires sending invoices in real time to the tax authority. n8n can sit in the middle of that process.
Until then, set up n8n, experiment with something small (the lead form works in 10 minutes), then scale. Workflows can be edited without stopping anything, so there's no risk.
Checklist summary
- Create account on n8n.io (Starter plan).
- Set up Google Workspace credentials.
- Build first workflow (web form → CRM).
- Add email deduplication.
- Set up internal email notification.
- Test with 5 dummy leads.
- Second workflow (payment reminders).
- Third workflow (cross-channel publishing).
- Monitoring: review logs once a week.
- Document each workflow with comments.
Resources
- n8n official documentation
- n8n Community Forum
- n8n vs Zapier vs Make comparison (yes, Zapier has their own).
- Quick guide: webhooks in n8n
Next article
Chapter 7: Verifactu and electronic invoicing without an accountant (coming soon).
Want to accelerate your digital transformation? Book a session to review your current processes and create a personalised automation plan.

