🔓 Unlock all 10,000+ workflows & prompts free Join Newsletter →
✅ Full access unlocked — explore all 10,000 AI workflow and prompt templates Browse Templates →
Home n8n Workflow
January 22, 2026

Google Sheets to HubSpot, cleaner ICP profiles

Lisa Granqvist Partner Workflow Automation Expert

You start with a simple list of domains in a spreadsheet. Then the mess begins: tabs everywhere, half-finished notes, “we’ll research this later,” and HubSpot records that never quite match how your team actually qualifies accounts.

Demand gen managers feel it when targeting gets fuzzy. Agency owners feel it when client lists need proof, fast. And sales ops gets stuck cleaning fields instead of improving the process. This ICP profile automation turns a Google Sheet of domains into consistent, decision-ready company profiles in HubSpot.

Below, you’ll see what the workflow does, what it replaces, and what changes once your “research” stops living in scattered tabs and starts living in your CRM.

How This Automation Works

See how this solves the problem:

n8n Workflow Template: Google Sheets to HubSpot, cleaner ICP profiles

The Challenge: Turning “a domain list” into real ICP decisions

Most teams don’t struggle to find prospects. They struggle to qualify them consistently. Someone pastes a domain into a Sheet, someone else opens the website, skims pricing, guesses an industry, and drops a few notes that only make sense to the person who wrote them. Two days later, you’re in HubSpot trying to segment “B2B SaaS with mid-market pricing,” and you realize half the records don’t even have employee count, location, or a clean description. It’s not just slow. It’s unreliable, and it quietly wrecks targeting.

The friction compounds. Here’s where it usually breaks down.

  • Every prospect requires a manual mini-research project, so lists stall out after the first dozen companies.
  • Notes end up unstructured, which makes segmentation feel like guesswork instead of filtering.
  • Different people interpret the same site differently, so “ICP fit” changes depending on who looked that day.
  • HubSpot records get created without the fields you actually need, which means more cleanup before outreach can even start.

The Fix: Enrich, analyze, and sync each domain into HubSpot

This workflow starts with a Google Sheet column called “Website Domain,” then turns each domain into a complete HubSpot company profile. It pulls website content via HTTP requests, strips out the junk (navigation, footers, repeated boilerplate), and sends the cleaned text into an AI agent powered by an OpenAI chat model. The AI extracts structured signals you actually care about: positioning, features, target personas, pricing model hints, and value propositions. Next, the workflow enriches the same company via Sona Enrich to capture firmographics and growth signals like employee count, revenue estimates, headquarters location, funding, and technographic clues. Finally, it creates the company in HubSpot, generates the custom properties you need, and patches the record with a properly mapped payload so the data lands where your team will use it.

The workflow kicks off from a manual trigger (or you can schedule it later). It reads your rows, processes domains in batches, then loops through each company to enrich, create, and update in HubSpot. You end up with standardized profiles that are built for filtering and scoring, not just “saving notes for later.”

What Changes: Before vs. After

Real-World Impact

Say you qualify 40 companies a week from a spreadsheet. Manually, you might spend about 20 minutes per company between scanning the site, guessing ICP fit, grabbing employee count, and then cleaning up HubSpot fields later. That’s roughly 13 hours of research work. With this workflow, you drop domains into Google Sheets, launch the run, and let the scraping + AI + Sona enrichment do the heavy lifting; your “work” becomes review and segmentation, which is often closer to 1–2 minutes per company.

Requirements

  • n8n instance (try n8n Cloud free)
  • Self-hosting option if you prefer (Hostinger works well)
  • Google Sheets to store domains in a “Website Domain” column.
  • HubSpot to create and update company records.
  • OpenAI API key (get it from your OpenAI account dashboard).
  • Sona Enrich API credentials (get access from Sona, then copy your API key).

Skill level: Intermediate. You’ll connect accounts, paste API keys, and map a few HubSpot properties, but you won’t be writing an app.

Need help implementing this? Talk to an automation expert (free 15-minute consultation).

The Workflow Flow

A run starts from n8n and pulls your domain list. The workflow uses Google Sheets to retrieve rows from your spreadsheet, expecting a “Website Domain” column so it knows what to process.

Website content gets collected and cleaned. HTTP requests fetch the company’s website pages, then the HTML is turned into readable text. A normalization step removes repetitive sections so the AI isn’t basing decisions on cookie banners and footer links.

AI turns messy text into structured ICP signals. An AI agent (OpenAI chat model) extracts consistent fields like industry, positioning, personas, value proposition, and pricing cues. Those results are aggregated into a standardized format so every company is comparable.

Firmographics are enriched and everything lands in HubSpot. Inside a batch loop, the workflow calls Sona Enrich for employee count, revenue estimates, location, funding, and technographics, then creates the company in HubSpot and patches in a mapped property payload.

You can easily modify which AI fields get generated and which HubSpot properties they map to based on your needs. See the full implementation guide below for customization options.

Step-by-Step Implementation Guide

Step 1: Configure the Manual Trigger

This workflow starts manually so you can validate data and outputs before running in production.

  1. Add the Manual Launch Trigger node as the workflow trigger.
  2. Leave all parameters at their defaults in Manual Launch Trigger.
  3. Confirm the connection from Manual Launch Trigger to Retrieve Company Sheet to match the execution flow.

Step 2: Connect Google Sheets

Pull the list of company domains from Google Sheets for downstream scraping and enrichment.

  1. Open Retrieve Company Sheet and set Document to [YOUR_ID].
  2. Set Sheet to gid=0 (Sheet1).
  3. Credential Required: Connect your googleSheetsOAuth2Api credentials in Retrieve Company Sheet.

Step 3: Set Up Website Fetching and Text Normalization

Fetch each website, extract readable content, and normalize the text before AI processing.

  1. In Fetch Website Pages, set URL to {{ ($json['Website Domain'].match(/^https?:\/\/) ? $json['Website Domain'] : 'https://' + $json['Website Domain']).toLowerCase() }}.
  2. Keep the batching settings in Fetch Website Pages to avoid rate limits (batch size 1, interval 2000ms).
  3. In Extract Page Text, set Operation to extractHtmlContent and keep the extraction selectors for main, body, article, .main-content, #content, p with skips for script, img, style, nav, footer, header.
  4. In Normalize Content Text, keep the provided JavaScript to clean noise, and confirm it references Retrieve Company Sheet for the website_domain mapping.
⚠️ Common Pitfall: If the Website Domain column in your sheet contains URLs without a protocol or TLD, the expression in Fetch Website Pages may resolve incorrectly. Ensure domains are valid or adjust the expression.

Step 4: Set Up AI Content Analysis

Analyze cleaned website content with an LLM, parse structured JSON, and aggregate outputs for downstream CRM updates.

  1. In AI Content Analysis, keep Prompt Type set to define and ensure the Text prompt includes {{ $json.main_content }} and {{ $json.website_domain }}.
  2. Connect OpenAI Chat Engine as the language model for AI Content Analysis.
  3. Credential Required: Connect your openAiApi credentials in OpenAI Chat Engine.
  4. Attach Structured JSON Parser to AI Content Analysis and keep the JSON schema example as provided.
  5. In Aggregate AI Outputs, keep Fields to Aggregate set to output for batching AI results.
Credential Note: Structured JSON Parser is an AI sub-node; add credentials on the parent OpenAI Chat Engine, not on the parser itself.

Step 5: Configure HubSpot Enrichment and CRM Sync

Create missing HubSpot fields, enrich company data from Sona, create companies, and patch enriched details back to HubSpot.

  1. In Generate HubSpot Fields, set URL to https://api.hubapi.com/[CONFIGURE_YOUR_API_KEY] and keep the JSON body that defines all custom properties.
  2. Credential Required: Connect your hubspotAppToken credentials in Generate HubSpot Fields, Create CRM Company, and Patch Company Details.
  3. In Assemble Loop Payload, set the output assignment to {{ $('Aggregate AI Outputs').first().json.output }}.
  4. In Split Records to Items, set Field to Split Out to output and connect it to Iterate Company Batch.
  5. In Sona Firmographic Enrich, keep the URL and query parameter website as configured; ensure the header x-api-key is set in the node.
  6. In Create CRM Company, keep the Name expression {{ $json.data.name || $('Iterate Company Batch').first().json.website_name }} and the additional fields as configured to map Sona data.
  7. In Build Property Payload, keep the JavaScript that maps Sona and AI fields to HubSpot properties.
  8. In Patch Company Details, set URL to https://api.hubapi.com/crm/v3/objects/companies/{{ $('Create CRM Company').first().json.companyId }} and JSON Body to {{ $json }}.
  9. Confirm Iterate Company Batch feeds Finish Step after each patch to complete the loop.
⚠️ Common Pitfall: Generate HubSpot Fields uses a placeholder URL. Replace [CONFIGURE_YOUR_API_KEY] or use a correct HubSpot endpoint for property creation.

Step 6: Test and Activate Your Workflow

Run a manual test to confirm enrichment, AI parsing, and HubSpot updates are working end-to-end.

  1. Click Execute Workflow starting from Manual Launch Trigger.
  2. Verify that Retrieve Company Sheet returns rows and Fetch Website Pages produces HTML content.
  3. Check AI Content Analysis output for valid JSON parsed by Structured JSON Parser, then confirm Aggregate AI Outputs aggregates the output field.
  4. Confirm HubSpot updates: Create CRM Company returns a companyId and Patch Company Details succeeds with enriched properties.
  5. When results look correct, toggle the workflow to Active for production use.
🔒

Unlock Full Step-by-Step Guide

Get the complete implementation guide + downloadable template

Watch Out For

  • HubSpot legacy app tokens can be created with the wrong scopes. If company creation or field generation fails, check your HubSpot app permissions (crm.schemas.companies.read/write and crm.objects.companies.write) first.
  • If you’re scraping sites that block bots or heavily rely on JavaScript, the HTTP Request node may return thin content. In that case, swap the scraping method or adjust the fetch target so the AI has enough real text to work with.
  • Default AI prompts are generic. Add your ICP definitions and “what good looks like” early, or you’ll spend your time second-guessing outputs instead of trusting the properties in HubSpot.

Common Questions

How quickly can I implement this ICP profile automation?

About an hour if your accounts and API keys are ready.

Can non-technical teams implement this ICP profile automation?

Yes, but you’ll want someone comfortable with HubSpot properties and API keys. No coding is required, though mapping fields takes a little care.

Is n8n free to use for this ICP profile automation workflow?

Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API usage and your Sona Enrich plan.

Where can I host n8n to run this automation?

Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.

How do I adapt this ICP profile automation solution to my specific challenges?

You can change what gets extracted by editing the prompt inside the AI Content Analysis node, then adjust how it lands in HubSpot in the Build Property Payload step. Common customizations include adding “ICP fit reason,” scoring rules, extra persona fields, or a stricter industry taxonomy. If you already have your own enrichment provider, you can also replace the Sona Firmographic Enrich HTTP request with another API call and keep the rest of the flow the same.

Why is my HubSpot connection failing in this workflow?

Usually it’s an expired or under-scoped token from the HubSpot legacy app setup. Regenerate the token, confirm the company object and schema scopes are enabled, then reselect the credential in the Create CRM Company node. If it fails only on updates, the Patch Company Details request may be referencing a property that doesn’t exist yet, so check that the Generate HubSpot Fields step actually ran successfully.

What’s the capacity of this ICP profile automation solution?

If you self-host, capacity mostly depends on your server and your API rate limits.

Is this ICP profile automation better than using Zapier or Make?

Often, yes, because this flow benefits from batching, looping, structured parsing, and multi-step CRM updates, which gets awkward and expensive in simpler tools. n8n also gives you more control over how scraped text is cleaned before it hits the model, and that quality difference shows up in your fields. Zapier or Make can still work if you only need “Sheet row → create HubSpot company” with a couple of fields. Once you want AI extraction, enrichment calls, property creation, and a patch/update cycle, n8n is usually the calmer choice. If you’re unsure, Talk to an automation expert and describe your volume and field requirements.

Once this is running, your spreadsheet stops being a research to-do list and becomes a clean input queue. HubSpot gets the context, your team gets the filters, and you get your week back.

Need Help Setting This Up?

Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.

Lisa Granqvist

Workflow Automation Expert

Expert in workflow automation and no-code tools.

×

Use template

Get instant access to this n8n workflow Json file

💬
Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Launch login modal Launch register modal