Most product-led B2B SaaS companies use two critical tools:
Customer.io for behavioural messaging and lifecycle campaigns
HubSpot for CRM, sales pipeline, and customer relationships
Both are excellent at what they do. But when they don't talk to each other, you get:
- Marketing doesn't know which leads are in the sales pipeline
- Sales can't see product engagement or campaign history
- Attribution is broken (can't track campaigns to revenue)
- Users get duplicate messages from both systems
- Teams operate from different "versions of truth"
The solution: Proper integration.
We're both a Customer.io Certified Partner and a HubSpot Platinum Partner (top 2% globally). We've integrated these systems for dozens of PLG companies.
Here's how to do it right.
|
TL;DR:
|
Why This Integration Matters
The PLG Challenge
Product-led companies have a unique go-to-market motion:
Early stage: Product usage drives everything
- Users sign up and try the product
- Behavioural campaigns drive activation
- Self-serve conversion to paid
Growth stage: Sales gets involved
- High-intent users become sales opportunities
- Product-qualified leads (PQLs) need a human touch
- Account expansion requires coordination
The challenge: Marketing and sales need to coordinate without stepping on each other.
Customer.io alone can't do this. It's brilliant for behavioural messaging, but wasn't built for CRM.
HubSpot alone can't do this. It's excellent for the sales pipeline, but behavioural automation is clunky.
Together, properly integrated, they create a unified GTM architecture.
What Proper Integration Looks Like
Unified Customer View
Sales sees:
- Which lifecycle campaigns the prospect engages with
- Email open/click history from Customer.io
- Product activation status and usage data
- Last campaign interaction date
- Engagement score from lifecycle campaigns
Marketing sees:
- Which leads are in the sales pipeline (suppress campaigns)
- Deal stage and sales owner
- Last sales activity date
- Lifecycle stage changes
- Company/account information
Result: Both teams operate from the same customer data, no blind spots.
Seamless Handoffs
Product → Marketing:
User activates → Customer.io engagement campaigns
Marketing → Sales:
High engagement + usage signals → Create HubSpot deal, assign to rep
Sales → Marketing:
Deal enters pipeline → Pause automated campaigns
Deal goes cold → Trigger re-engagement content
No manual exports. No duplicate outreach. Just coordinated GTM.
Working Attribution
Track the whole journey:
- User signs up (product event)
- Receives activation campaign (Customer.io)
- Opens and clicks emails (engagement tracked)
- Activates product (synced to HubSpot)
- Becomes PQL (deal created)
- Sales engages (HubSpot activities)
- Converts to paid (closed-won)
Attribution report shows:
- Which Customer.io campaigns influenced the deal
- Which emails drove product engagement
- ROI of lifecycle marketing
- Marketing's contribution to revenue
Finally, you can prove lifecycle marketing ROI.
Integration Architecture
High-Level Data Flow
Your product generates behaviour data and sends events and attributes to either a Customer Data Platform (like Segment - optional) or directly to both Customer.io and HubSpot.
The Customer Data Platform (if used) collects events once and routes to multiple tools.
Customer.io and HubSpot have a bi-directional data sync between them.
Customer.io handles behavioural messaging, campaigns, events, and segments.
HubSpot handles CRM and sales, including contacts, companies, and deals.
Three data flows to configure:
- Product → both systems: User events and attributes
- Customer.io → HubSpot: Campaign engagement, conversions
- HubSpot → Customer.io: Deal stages, lifecycle stages, sales activity
Integration Method Options
Option 1: Native Customer.io ↔ HubSpot Integration
How it works:
- Built into Customer.io
- OAuth connection to HubSpot
- Configure in Customer.io settings
- Bi-directional sync
Setup:
- Go to Customer.io → Integrations → HubSpot
- Click "Connect HubSpot"
- Authorise via OAuth
- Select events to send to HubSpot
- Map Customer.io attributes → HubSpot properties
- Map HubSpot properties → Customer.io attributes
- Test with sample user
Pros:
- Easiest to set up (no code)
- Maintained by Customer.io
- Free (included in subscriptions)
- Good for standard use cases
Cons:
- Limited customization
- Can't transform data during sync
- Basic field mapping only
Best for: Simple integrations, straightforward data flows
Option 2: Via Segment (Customer Data Platform)
How it works:
- Segment sits between product and destinations
- The product sends events to Segment once
- Segment routes to both Customer.io and HubSpot
- You control the data flow
Architecture:
Product → Segment → Customer.io
→ HubSpot
→ Analytics
→ Data Warehouse
Plus native integration for CRM-specific data between Customer.io ↔ HubSpot
Pros:
- Maximum flexibility
- Single tracking implementation in the product
- Easy to add more tools later
- Can transform data before routing
- Event replay if something breaks
Cons:
- Additional cost (approximately £120-350/month)
- Another vendor to manage
- More complex initial setup
Best for: Series A+ companies, 4+ tools in stack, need flexibility
Option 3: Custom API Integration
How it works:
- Direct API calls to both platforms
- Complete control over data flow
- Build exactly what you need
Pros:
- Complete control
- No middleman costs
- Optimised for your exact needs
- Can handle complex transformation logic
Cons:
- Most development work
- You maintain it forever
- Must handle rate limits, errors, and retries
- Longer implementation time
Best for: Companies with strong dev resources, unique requirements
Recommended: Hybrid Approach
For most PLG companies:
Product → Segment → Customer.io (product events)
→ HubSpot (basic contact data)
Customer.io ↔ HubSpot (native integration for CRM sync)
Custom APIs for special cases only
Why this works:
- Segment handles product events (flexible, maintainable)
- Native integration handles CRM-specific sync (reliable)
- Custom code only for unique edge cases
- Best of all three approaches
Critical Data Flows
Flow 1: Product → Both Systems
What to sync:
User Identity:
- User ID
- First name
- Last name
- Created timestamp
Key Attributes:
- Plan type (free, trial, paid, enterprise)
- Activated (boolean)
- Activation date
- Last login
- Monthly recurring revenue
- Team size
- Company name
Core Events:
Signup:
- Event: signed_up
- Properties: signup_source, utm_campaign
Activation:
- Event: activated
- Properties: activation_milestone, days_to_activation
Upgrade:
- Event: upgraded
- Properties: from_plan, to_plan, mrr
Sync frequency: Real-time (under 1 minute)
Flow 2: Customer.io → HubSpot
What to sync:
Campaign Engagement Events:
Every time someone opens or clicks a Customer.io email, create a timeline event in HubSpot.
Email Opened:
- Email address
- Event name: Marketing Email Opened
- Occurred timestamp
- Properties: campaign_name, campaign_id, email_subject
Email Clicked:
- Email address
- Event name: Marketing Email Clicked
- Occurred timestamp
- Properties: campaign_name, link_url, link_text
Result: Sales reps see complete campaign engagement in the contact timeline.
Campaign Conversion Events:
When a lifecycle campaign drives conversion, record it:
- Email address
- Event name: Campaign Conversion
- Occurred timestamp
- Properties: campaign_name, conversion_action, attributed_email
Result: Attribution tracking that actually works.
Engagement Properties:
Update contact properties with aggregate data:
- last_email_open_date
- email_engagement_score (0-100)
- campaigns_engaged (count)
- lifecycle_campaign_stage
Sync frequency: Real-time for events, hourly for aggregate properties
Flow 3: HubSpot → Customer.io
What to sync:
CRM Stage Changes:
When a deal stage or lifecycle stage changes, sync to Customer.io:
- hubspot_lifecycle_stage (lead, mql, sql, opportunity, customer)
- hubspot_deal_stage (your deal stages)
- hubspot_deal_value (deal amount)
- hubspot_owner_email (sales rep)
- hubspot_last_activity
Why this matters:
Suppression logic in Customer.io:
IF hubspot_lifecycle_stage = "opportunity"
AND hubspot_last_activity < 7 days ago
THEN suppress from automated campaigns
Result: Marketing doesn't spam prospects that sales is actively working.
Company/Account Data:
Enrich Customer.io with firmographic data:
- company_name
- company_size
- company_industry
- company_annual_revenue
Result: Better segmentation and personalisation in lifecycle campaigns.
Sync frequency: Real-time for deal/lifecycle changes, daily for company data
Field Mapping Strategy
Create Custom HubSpot Properties
Before integration, create these contact properties in HubSpot:
Product Data Properties:
product_activated
- Type: Single checkbox (boolean)
- Group: Product Information
product_plan
- Type: Dropdown select
- Options: free, trial, professional, enterprise
- Group: Product Information
last_product_activity
- Type: Date picker
- Group: Product Information
mrr
- Type: Number
- Group: Product Information
usage_score
- Type: Number
- Description: 0-100 score based on product usage
- Group: Product Information
Campaign Engagement Properties:
last_email_open_date
- Type: Date picker
- Group: Email Marketing
email_engagement_score
- Type: Number (0-100)
- Group: Email Marketing
campaigns_engaged
- Type: Number
- Group: Email Marketing
lifecycle_campaign_stage
- Type: Dropdown
- Options: onboarding, activated, engaged, at_risk
- Group: Email Marketing
Field Mapping Table
Product → Both Systems:
- plan_type (Customer.io) → product_plan (HubSpot)
- activated (Customer.io) → product_activated (HubSpot)
- last_login (Customer.io) → last_product_activity (HubSpot)
- mrr (Customer.io) → mrr (HubSpot)
Customer.io → HubSpot:
- email_opened event → last_email_open_date property
- calculated score → email_engagement_score property
HubSpot → Customer.io:
- lifecyclestage → hubspot_lifecycle_stage
- dealstage → hubspot_deal_stage
- hubspot_owner_id → hubspot_owner_email
Key principle: Prefix HubSpot data in Customer.io with "hubspot_" to show a clear source.
Campaign Coordination Patterns
Pattern 1: PQL Handoff
Scenario: User shows buying intent, hand off to sales
Implementation:
Step 1: User triggers PQL criteria in the product
- activated = true
- usage_score > 70
- hit_plan_limit = true
Step 2: Event sent to both systems
- Event name: product_qualified_lead
Step 3: Customer.io receives the event
- Tag user as "PQL"
- Pause nurture campaigns
- Send "Sales will reach out" email
Step 4: HubSpot receives the event
- Create a timeline event
- Update lifecycle stage → "Sales Qualified Lead"
- Create deal
- Assign to sales rep
- Create task: "PQL - High Intent"
Step 5: Sales rep receives
- Email alert
- HubSpot task
- Full context (product usage + campaign engagement)
Result: Seamless handoff with context preserved.
Pattern 2: Trial Coordination
Throughout the trial, both systems coordinate:
Days 0-7 (Marketing-owned):
Customer.io: Activation campaign
HubSpot: Contact lifecycle = "Trial"
IF high_usage AND high_engagement:
- Flag as PQL in HubSpot
- Continue Customer.io campaigns
IF low_usage:
- Customer.io sends help offers
- HubSpot logs low engagement
Days 7-14 (Transition period):
IF PQL_signals:
- HubSpot creates a deal
- Sales begins outreach
- Customer.io suppresses campaigns
IF normal_usage:
- Customer.io continues education
- HubSpot monitors for PQL signals
Day 14+ (Trial ending):
IF deal_exists:
- Sales owns the conversation
- NO Customer.io campaigns
- HubSpot workflows only
IF no_deal:
- Customer.io upgrade campaign
- HubSpot monitors for PQL
Result: Marketing and sales coordinate, no duplicate outreach.
Pattern 3: Stalled Deal Re-engagement
Scenario: Sales deal goes cold, marketing helps re-engage
Implementation:
IF hubspot_deal_stage = "negotiation"
AND hubspot_last_activity > 14 days ago
THEN trigger Customer.io campaign:
- Email 1: Relevant case study
- Email 2: ROI calculator
- Email 3: Decision-maker content
Track engagement, sync back to HubSpot
IF engagement_detected:
- Create a HubSpot task for the sales rep
- Note: "Prospect engaged with case study"
Result: Marketing assists sales with dormant opportunities.
Attribution Setup
Track Campaign → Revenue
Implementation:
Step 1: Tag conversions in Customer.io
When the user upgrades:
- Event: upgraded
- Properties:
- attributed_campaign: "Activation Sequence"
- attributed_email: "Day 3 - Feature Spotlight"
- attribution_model: "last_touch"
- conversion_value: 99
Step 2: Sync to the HubSpot timeline
Create timeline event:
- Email address
- Event name: Campaign Conversion
- Occurred timestamp
- Properties:
- campaign_name: "Activation Sequence"
- email_name: "Day 3 - Feature Spotlight"
- conversion_value: 99
Step 3: Create a HubSpot custom report
Report: Campaign Attribution
- Object: Deals
- Filter: Has timeline event "Campaign Conversion"
- Group by: campaign_name
- Metrics:
- Count of deals
- Sum of deal amount
- Average deal size
- Win rate
Result: Clear view of which Customer.io campaigns drive revenue.
Testing Checklist
Before going live, test these scenarios:
Product → Customer.io:
- Create a test user, verify the user appears in Customer.io within 1 min
- Update user attributes, verify sync
- Trigger test events, verify the events appear in the activity log
- Check that the data types are correct
Product → HubSpot:
- Create test user, verify contact created
- Check all properties populated correctly
- Trigger key events, verify timeline events appear
- Check company creation (if applicable)
Customer.io → HubSpot:
- Send a test campaign to the test user
- Open email, verify opens on timeline
- Click the link, verify clicks on the timeline
- Check the engagement properties update
HubSpot → Customer.io:
- Update deal stage, verify syncs to Customer.io
- Update lifecycle stage, verify syncs
- Check timing (should be under 15 minutes)
Coordination Logic:
- Create a deal, verify campaigns, suppress
- Close deal, verify customer campaigns trigger
- Test PQL handoff end-to-end
Don't skip testing. Broken integrations cause duplicate messages and lost revenue.
Common Mistakes
Mistake 1: Not Prefixing HubSpot Data
Bad approach:
Customer.io attribute: lifecycle_stage
Problem: Conflicts with Customer.io's own logic
Good approach:
Customer.io attribute: hubspot_lifecycle_stage
Result: Clear data source, no conflicts
Mistake 2: Syncing Everything
Bad approach:
Sync all 200 HubSpot properties to Customer.io
Problem: Data overload, slow sync, costs money
Good approach:
Sync only 10-15 properties you actually use:
- hubspot_lifecycle_stage
- hubspot_deal_stage
- hubspot_owner_email
- company_name
- company_size
Result: Clean data, fast sync, lower costs
Mistake 3: No Suppression Logic
Bad approach:
All campaigns are sent regardless of the HubSpot status
Problem: Marketing spams prospects that sales is working
Good approach:
Suppress campaigns if:
- hubspot_lifecycle_stage = "opportunity"
- hubspot_last_activity < 7 days
Result: Coordinated outreach, better experience
Mistake 4: Forgetting Attribution
Bad approach:
Run campaigns but never track which ones drive revenue
Problem: Can't prove ROI, don't know what works
Good approach:
Tag all conversions with campaign attribution. Sync to the HubSpot timeline. Build attribution reports.
Result: Prove marketing ROI, optimise effectively
Implementation Timeline
Week 1: Planning
- Map data flows (what syncs where)
- Create a field mapping document
- Define suppression rules
- Design attribution model
Week 2: HubSpot Setup
- Create custom properties
- Set up workflows for sync triggers
- Configure timeline event templates
- Build attribution reports
Week 3: Integration Configuration
- Set up the chosen integration method
- Configure field mappings
- Set up bi-directional sync
- Implement suppression logic
Week 4: Testing
- Test all data flows
- Verify suppression works
- Check attribution tracking
- Test coordination scenarios
Week 5: Launch
- Enable for 10% of users
- Monitor for 48 hours
- Fix any issues
- Full rollout
Total: 4-5 weeks for proper integration
When to Get Help
DIY if:
- You have developer resources
- Your use case is straightforward
- You have 6-8 weeks to dedicate
- The budget is limited
Hire an expert if:
- You don't have technical resources
- You need complex coordination logic
- You want it done in 4 weeks (vs. 2-3 months DIY)
- You need strategic guidance, not just technical setup
What professional integration includes:
- Data architecture design
- Field mapping strategy
- Bi-directional sync setup
- Campaign coordination logic
- Attribution implementation
- Testing and QA
- Team training
Investment: £6,000-£12,000 for complete integration
Timeline: 4-6 weeks
ROI: If proper integration increases marketing efficiency by 20%, payback in 1-2 months
Free Resource
We've created a complete technical guide:
HubSpot + Customer.io Integration Architecture Guide
16-page technical guide covering:
- Complete architecture diagrams
- Field mapping templates
- Code examples for each integration method
- Campaign coordination patterns
- Attribution setup
- Testing checklists
- Troubleshooting guide
Next Steps
If you're planning this integration:
- Download the Integration Architecture Guide
Complete technical reference with code examples - Map your data flows
Document what data needs to go where - Choose your integration method
Native, Segment, or custom API - Plan your coordination logic
How will marketing and sales coordinate? - Set up attribution tracking
Design before implementing
If you want expert help:
Book a free 30-minute consultation
We'll review your current setup and design the right integration architecture for your company.
We're uniquely positioned for this integration:
- Customer.io Certified Partner
- HubSpot Platinum Partner (top 2%)
- Only agency with both certifications
- 50+ integrated implementations
Get in touch:
📧 enquiries@arisegtm.com
📞 020 3637 4426