

How to Parse Email Signatures and Update HubSpot Contacts with N8n
Extract phone numbers, job titles, and company names from Gmail signatures and automatically update corresponding HubSpot contact properties.
Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.
HubSpot Gmail extension exists as a native integration, but it requires manual setup per user and doesn't create contacts automatically. This guide uses an automation platform for full control. View native option →
Best for
Teams processing high volumes of sales emails who need flexible signature data extraction with custom regex patterns.
Not ideal for
Small teams with under 50 emails monthly or users who need plug-and-play solutions without any coding.
Sync type
pollingUse case type
syncReal-World Example
A 25-person B2B software sales team uses this to automatically update HubSpot contacts with phone numbers and job titles from prospect email signatures. Before automation, SDRs manually copied signature data into CRM records, missing 40% of updates during busy periods and spending 15 minutes daily on data entry.
What Will This Cost?
Drag the slider to your expected monthly volume.
Each platform counts differently — Zapier: 1 task per trigger. Make: 1 operation per module per record. n8n: 1 execution per run.





Prices shown for annual billing. Based on published pricing as of April 2026.
Estimated ROI
1000
min saved/mo
$583
labor value/mo
Free
no platform cost
Based on ~2 min manual effort per operation at $35/hr fully loaded labor cost.
Implementation
Import this workflow directly into n8n
Copy the pre-built n8n blueprint and paste it straight into n8n. All modules, filters, and field mappings are already configured — you just need to connect your accounts.
Before You Start
Make sure you have everything ready.
Optional
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Email Address | email | |
3 optional fields▸ show
| Phone Number | phone |
| Job Title | jobtitle |
| Company Name | company |
Step-by-Step Setup
Workflows > New > Gmail > Message Received
Connect Gmail to N8n
Set up Gmail as your trigger to monitor incoming emails. N8n will watch for new messages and extract signature data from each one.
- 1Click the purple + button to add a new workflow
- 2Search for 'Gmail' in the apps list
- 3Select 'Gmail Trigger' and choose 'Message Received'
- 4Click 'Create credential' and authenticate with your Google account
- 5Set the label filter to 'INBOX' to monitor all incoming emails
Gmail Node > Test step
Test Gmail Connection
Pull a sample email to verify the connection works and see the email structure. This shows you exactly what signature data N8n can access.
- 1Click 'Test step' on the Gmail node
- 2Select a recent email from the dropdown list
- 3Click 'Use this data' to confirm the selection
- 4Expand the 'body' section to view email content
Workflow > + > Code > Code Node
Add Regex Extract Node
Create a function node to extract phone numbers from email signatures using regular expressions. This handles the core parsing logic.
- 1Click the + button after Gmail node
- 2Search for 'Code' and select 'Code Node'
- 3Rename the node to 'Extract Phone'
- 4Paste this regex pattern: /(?:\+?1[-. ]?)?\(?[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}/g
- 5Add JavaScript: const phone = $json.body.match(/(?:\+?1[-. ]?)?\(?[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}/g); return {phone: phone ? phone[0] : null};
Workflow > + > Code > Code Node
Extract Job Titles
Add another Code node to parse job titles from signatures. Most signatures follow predictable patterns after names.
- 1Add another Code node after the phone extraction
- 2Rename it to 'Extract Title'
- 3Use this regex: /(?:^|\n)([A-Z][^\n]*(?:Manager|Director|VP|President|CEO|CTO|Engineer|Analyst|Specialist|Coordinator))/im
- 4Add JavaScript: const title = $json.body.match(/(?:^|\n)([A-Z][^\n]*(?:Manager|Director|VP|President|CEO|CTO|Engineer|Analyst|Specialist|Coordinator))/im); return {title: title ? title[1].trim() : null};
- 5Connect this node to receive data from the Extract Phone node
Workflow > + > Code > Code Node
Extract Company Names
Create a third extraction node for company names. Companies often appear on separate lines or after specific keywords in signatures.
- 1Add a third Code node connected to Extract Title
- 2Rename it to 'Extract Company'
- 3Use this pattern: /(?:at |@)([A-Z][^\n,]+(?:Inc|LLC|Corp|Ltd|Company))/i
- 4Add JavaScript: const company = $json.body.match(/(?:at |@)([A-Z][^\n,]+(?:Inc|LLC|Corp|Ltd|Company))/i); return {company: company ? company[1].trim() : null};
- 5Test the extraction with sample signature text
Workflow > + > HubSpot > Contact > Update
Connect HubSpot
Add HubSpot as the destination for your extracted signature data. This node will search for existing contacts and update their properties.
- 1Click + after the company extraction node
- 2Search for 'HubSpot' in the apps menu
- 3Select 'HubSpot' and choose 'Contact' resource
- 4Set operation to 'Update' from the dropdown
- 5Click 'Create credential' and enter your HubSpot API key
HubSpot Node > Contact ID > By Email
Configure Contact Search
Set up contact identification to find the right HubSpot record to update. Use the sender's email address as the unique identifier.
- 1In the HubSpot node, set 'Contact ID' to 'By Email'
- 2Map the email field to {{$node["Gmail Trigger"].json["from"]}}
- 3Click 'Add Field' to start mapping signature data
- 4Select 'Phone' from the dropdown list
- 5Map phone to {{$node["Extract Phone"].json["phone"]}}
HubSpot Node > Add Field > Properties
Map Remaining Fields
Complete the field mapping by connecting job title and company data to HubSpot contact properties. This updates all extracted signature information.
- 1Click 'Add Field' and select 'Job Title' from the property list
- 2Map job title to {{$node["Extract Title"].json["title"]}}
- 3Click 'Add Field' again and select 'Company'
- 4Map company to {{$node["Extract Company"].json["company"]}}
- 5Set 'Update if exists' to true
HubSpot Node > Settings > Continue on Fail
Add Error Handling
Configure the workflow to handle missing data gracefully. Not every email signature contains all three data points.
- 1Click the settings gear icon on the HubSpot node
- 2Select 'Continue on Fail' from the error handling dropdown
- 3Add an IF node before HubSpot to check for extracted data
- 4Set condition: {{$json.phone}} OR {{$json.title}} OR {{$json.company}}
- 5Connect the 'true' path to HubSpot and 'false' to a No Operation node
Workflow > Execute Workflow
Test Complete Workflow
Run the entire workflow with real email data to verify signature parsing and HubSpot updates work correctly.
- 1Click 'Execute Workflow' in the top toolbar
- 2Select an email with a signature from the Gmail test data
- 3Watch each node execute and turn green
- 4Check the HubSpot node output to confirm contact updates
- 5Verify the changes in your HubSpot contact record
Workflow > Active > Settings
Schedule Workflow Activation
Turn on the workflow to process emails automatically. Set appropriate polling intervals to balance speed with API usage.
- 1Click the toggle switch in the top right to 'Active'
- 2Click the settings gear next to the toggle
- 3Set polling interval to 5 minutes for regular processing
- 4Configure timezone to match your business hours
- 5Save the workflow with a descriptive name
Drop this into an n8n Code node.
JavaScript — Code Node// Enhanced phone extraction with international support▸ Show code
// Enhanced phone extraction with international support
const phoneRegex = /(?:\+?[1-9]\d{0,3}[-. ]?)?(?:\([0-9]{1,4}\)|[0-9]{1,4})[-. ]?[0-9]{1,4}[-. ]?[0-9]{1,9}/g;
const phones = $json.body.match(phoneRegex);... expand to see full code
// Enhanced phone extraction with international support
const phoneRegex = /(?:\+?[1-9]\d{0,3}[-. ]?)?(?:\([0-9]{1,4}\)|[0-9]{1,4})[-. ]?[0-9]{1,4}[-. ]?[0-9]{1,9}/g;
const phones = $json.body.match(phoneRegex);
const cleanPhone = phones ? phones[0].replace(/[^0-9+]/g, '') : null;
return {phone: cleanPhone};Scaling Beyond 500+ emails/day+ Records
If your volume exceeds 500+ emails/day records, apply these adjustments.
Batch Processing
Switch from real-time polling to scheduled batch runs every 30 minutes. This reduces API calls and handles Gmail pagination better when processing large email volumes.
Selective Processing
Add Gmail label filters to only process emails from external domains. Internal company emails rarely have useful signature data and waste processing operations.
Caching Layer
Store processed email IDs in a Google Sheet or database to prevent duplicate processing. Gmail doesn't track read status for API access.
Going live
Production Checklist
Before you turn this on for real, confirm each item.
Troubleshooting
Common errors and how to fix them.
Frequently Asked Questions
Common questions about this workflow.
Analysis
Use N8n for this if you're processing 100+ emails daily with signatures and need custom extraction logic. The regex flexibility beats Zapier's basic text parsing, and you can modify patterns without rebuilding workflows. Skip N8n if you only handle 20-30 emails monthly - Zapier's simplicity wins for low volume.
This workflow uses 4 operations per email: Gmail fetch, 3 extraction steps, and HubSpot update. At 200 emails/month, that's 1,000 operations monthly. N8n's starter plan at $20/month covers 5,000 operations easily. Make charges $9/month for 1,000 operations but limits regex complexity. Zapier needs the $20 plan for custom code, making N8n cost-neutral with better parsing control.
Zapier's formatter handles basic signature parsing without code, which non-technical users prefer. Make's visual regex builder helps debug pattern matching faster than N8n's code nodes. But N8n wins on signature parsing because most email signatures need complex regex - job titles vary wildly, company formats differ, and international phone numbers break simple patterns. The JavaScript flexibility handles edge cases that kill other platforms.
HubSpot's contact matching gets flaky when Gmail includes display names in the 'from' field - you'll need email cleaning logic that other tutorials skip. Gmail's API pagination hits at 250 emails, so high-volume workflows need batch processing. Phone number extraction fails on VoIP numbers and international formats unless you expand the regex patterns. Most signature parsing breaks on mobile-formatted emails where line breaks disappear.
Ideas for what to build next
- →Add Mobile Number Detection — Enhance phone extraction to differentiate between office and mobile numbers, storing each in separate HubSpot properties for better sales targeting.
- →Signature Confidence Scoring — Build logic to score extraction confidence based on signature formatting and flag low-confidence updates for manual review.
- →LinkedIn Profile Extraction — Extend parsing to capture LinkedIn URLs from signatures and automatically enrich HubSpot contacts with social media data.
Related guides
How to Share Notion Meeting Notes to Slack with Pipedream
~15 min setup
How to Share Notion Meeting Notes to Slack with Power Automate
~15 min setup
How to Share Notion Meeting Notes to Slack with n8n
~20 min setup
How to Send Notion Meeting Notes to Slack with Zapier
~8 min setup
How to Share Notion Meeting Notes to Slack with Make
~12 min setup
How to Create Notion Tasks from Slack with Pipedream
~15 min setup