From Spreadsheet to Automated CRM: An n8n Build Walkthrough
Stop manually copying leads into your CRM — this n8n walkthrough shows you how to wire Google Sheets to HubSpot in under an hour, free.
The average sales rep spends 17% of their week on manual data entry, according to a 2024 Salesforce State of Sales report. That's nearly one full day — gone. If you're a solo operator or a small team running leads through a Google Sheet, that number probably feels familiar and painful.
Here's the fix: a simple n8n workflow that watches your spreadsheet, detects new rows, and creates contacts in HubSpot automatically. No Zapier tax. No code. Takes about 45 minutes to build.
Why n8n Instead of Zapier or Make?
Fair question. Zapier is polished. Make is powerful. But n8n has one edge neither can match at this price point: it's self-hostable and free on the community plan. The cloud version starts at $20/month, but if you spin it up on a $6/month Railway or Render instance, you own the infra and pay nothing per task execution.
For a workflow that fires dozens of times a day, that matters. Zapier's Starter plan caps at 750 tasks/month for $19.99. Make's Core plan gives you 10,000 operations for $9 but charges per operation on complex flows. n8n self-hosted gives you unlimited executions. Done.
| Tool | Starting Price | Task Limits | Self-Host Option |
|---|---|---|---|
| Zapier | $19.99/mo | 750 tasks/mo | No |
| Make | $9/mo | 10,000 ops/mo | No |
| n8n Cloud | $20/mo | 2,500 executions/mo | Yes (free) |
What You're Building
The workflow logic is straightforward:
- Trigger: A Schedule node polls your Google Sheet every 15 minutes.
- Read rows: The Google Sheets node fetches all rows and passes them downstream.
- Filter new leads: An IF node checks whether a "Synced" column equals "Yes" — if it does, skip the row.
- Create contact: The HubSpot node creates a new contact using the row's name, email, and phone fields.
- Mark as synced: A second Google Sheets node writes "Yes" into that row's Synced column so it never gets duplicated.
Five nodes. That's it. No webhooks, no code blocks, no drama.
Building It Step by Step
Open n8n and create a new workflow. Drop in a Schedule Trigger node — set it to every 15 minutes. Connect it to a Google Sheets node set to "Read Rows." Authenticate with your Google account via OAuth, then select your spreadsheet and the correct sheet tab.
Now add an IF node. Set the condition: field Synced is not equal to Yes. The "true" branch catches unsynced rows. The "false" branch does nothing — just let it hang.
Connect the true branch to a HubSpot node. Set the operation to "Create Contact." Map your sheet columns to HubSpot fields: Email → email, First Name → firstname, Phone → phone. HubSpot's free CRM handles up to 1 million contacts, so you won't hit a ceiling anytime soon.
Finally, chain a second Google Sheets node set to "Update Row." Map the row number (available as a metadata field from the first Sheets node) and write "Yes" into the Synced column.
Save. Activate. You're live.
Where People Get Stuck
Two common failure points:
Google Sheets authentication errors. If you see a 403, your Google OAuth scope is too narrow. Delete the credential in n8n, reconnect, and make sure you check the "Google Sheets" scope explicitly during the OAuth flow. Took me 20 minutes to figure this out the first time.
HubSpot duplicate contacts. HubSpot deduplicates on email by default — so if the same email already exists, the create call fails silently. Swap the HubSpot node's operation to "Upsert Contact" instead of "Create Contact" and the problem disappears entirely.
FAQ
Does this work with Airtable instead of Google Sheets?
Yes. n8n has a native Airtable node. The logic is identical — just swap the Google Sheets nodes for Airtable nodes and point them at your base and table.
What if I want to notify my team when a new contact syncs?
Drop a Slack or Discord node after the HubSpot node. Set it to post the contact's name and email to a #leads channel. Takes two minutes to add.
Can n8n handle hundreds of new rows at once?
Yes, but rate limits apply. HubSpot's free API allows 100 requests per 10 seconds. For large batches, add a Wait node set to 100ms between iterations to stay under the limit.
Is the self-hosted version hard to maintain?
Not if you use Railway or Render for deployment. Both offer one-click n8n templates. Updates are a single CLI command or a button click depending on your setup.
Bottom Line
This five-node workflow eliminates a repetitive daily task and costs you nothing if self-hosted. It's the kind of automation that pays for its build time in the first week. Once you see it running, you'll start spotting five more places in your business to apply the same pattern.
Browse more workflow builds and tool breakdowns at AI Profit Automation.