Loading tutorials…
Loading tutorials…
Freshsales talks to dozens of marketing tools — Freshmarketer (native), Mailchimp, HubSpot, Google Ads, Meta Ads, web forms, Zapier. Connect them wrong and you flood the CRM with junk, lose UTM attribution, and break Freddy AI scoring. Here is the discipline that keeps the data clean.
Who this is forRevOps leads, marketing operations managers, and founders connecting Freshsales to inbound lead sources for the first time. If you have ever asked 'where did this lead come from?' and gotten no answer from Freshsales, this tutorial is for you.
What you'll need
Step 1
Before connecting anything, decide what Lead Source values are allowed. Every integration must map to this taxonomy.
Open Admin Settings → CRM Customization → Modules → Contacts → Fields → Lead Source. This is a Dropdown field.
Define 6-10 canonical values: Web Form, Paid Search (Google Ads), Paid Social (Meta/LinkedIn), Organic Search, Referral, Outbound (cold), Event/Webinar, Partner, Import (legacy), Other.
Resist the urge to make Lead Source 'free text' — every integration will write its own variant ('google_ads,' 'Google Ads,' 'GoogleAds,' 'paid-search-google') and your reports will be useless.
Make Lead Source REQUIRED on contact create: Admin Settings → CRM Customization → Modules → Contacts → Fields → Lead Source → toggle Required.
Add UTM fields as separate Contact fields (custom text fields): UTM Source, UTM Medium, UTM Campaign, UTM Content, UTM Term. These store the raw UTM data; Lead Source stores the categorized value.
Step 2
Freshmarketer is the native marketing automation companion. Native sync = zero attribution loss.
Admin Settings → Marketplace → search "Freshmarketer" → Install. If you have a Freshworks Suite subscription, the integration is auto-enabled.
After install: Admin Settings → Apps → Freshmarketer → Settings → confirm field mapping. Marketing engagement scores, email opens/clicks, web visits all flow into the Contact record as Activities.
Enable two-way sync: changes to Lifecycle Stage in Freshmarketer push to Freshsales and vice versa. CRITICAL: decide which tool owns each field BEFORE enabling two-way sync, or you create ping-pong updates that confuse Freddy AI.
Default ownership pattern: Freshmarketer owns Marketing fields (Last Email Engagement, Web Activity Score, Subscription Status); Freshsales owns Sales fields (Lifecycle Stage Sales transitions, Deal data, Owner).
Test by creating a test contact in Freshmarketer, triggering an email engagement, and confirming the activity appears on the Contact record in Freshsales within 5 minutes.
Step 3
Your highest-volume integration. Get this wrong and you lose attribution on 100% of inbound leads.
Option A — Freshsales Native Web Forms: Admin Settings → CRM Customization → Web Forms → Create Form → embed code in your site. Auto-creates contacts with UTM data if your landing page passes UTMs.
Option B — Freshmarketer Landing Pages: build landing pages in Freshmarketer with native Freshsales sync. Best for marketing-heavy teams.
Option C — Third-party form (Webflow, WordPress Gravity Forms, Typeform): use Zapier or the Freshsales API. Pass UTM data via hidden form fields.
For each form, add hidden fields: utm_source, utm_medium, utm_campaign, utm_content, utm_term. Use JavaScript to populate them from the page URL query string at form load.
Map hidden fields to the UTM custom fields you created on Contacts. Also set Lead Source based on UTM Source: if utm_source=google + utm_medium=cpc → Lead Source = "Paid Search (Google Ads)."
Test with a UTM-tagged URL: https://yoursite.com/demo?utm_source=test&utm_medium=test&utm_campaign=test → submit form → confirm Contact in Freshsales has the UTM values stamped.
Step 4
For paid ad ROI calculations, push closed-won deals back to the ad platforms as offline conversions.
Google Ads: Admin Settings → Marketplace → search "Google Ads" → Install. Configure the connection with your Google Ads account. Sync direction: Freshsales → Google Ads (one-way push of deal-won events).
In Freshsales, build a workflow: trigger = "Deal stage = Closed Won" + action = "Send to Google Ads as Offline Conversion" with deal amount + GCLID (Google Click ID stored on contact from landing page).
GCLID capture: on landing pages, capture the gclid query parameter at first visit, store in cookie, pass to form hidden field on conversion. Stamp on Contact record.
Meta Ads: similar setup via Conversions API. Marketplace → Meta Ads Conversions API → Install → configure pixel + access token. Workflow fires on deal-won, pushes deal amount + fbclid (Facebook Click ID).
Result: Google Ads and Meta Ads attribute closed revenue back to specific ad campaigns. ROAS calculations now include actual closed deals, not just MQLs.
Step 5
If you already use Mailchimp, ActiveCampaign, or HubSpot Marketing instead of Freshmarketer, sync contacts + engagement carefully.
Mailchimp: Marketplace → Mailchimp → Install. Choose sync direction: typically Freshsales is the source of truth for contacts; Mailchimp is the source of truth for email engagement and unsubscribes.
HubSpot Marketing → Freshsales: use the Freshsales Migration Tool (Admin Settings → Migrate from another CRM → HubSpot) for one-time imports, or Zapier for ongoing sync. Two CRMs running in parallel is a maintenance nightmare — pick one as system of record.
ActiveCampaign, Klaviyo, etc.: most have native or Zapier-mediated connections. Always configure dedup match on Email.
Field mapping principle: minimal fields synced, source-of-truth per field. Do NOT sync every field both ways — pick which tool owns which field.
For unsubscribes: marketing tool owns this. When a contact unsubscribes in Mailchimp, sync that status to Freshsales as a checkbox/field. Sequences should auto-skip unsubscribed contacts (Sequence Settings → Exit Conditions → 'Unsubscribed = true').
Step 6
Zapier is the catch-all for tools without native Freshsales integrations. Powerful but easy to overuse.
Marketplace → Zapier → install. Connect your Zapier account via OAuth.
Build Zaps for: form-tool-to-Freshsales (Typeform, Jotform, Calendly), event-platform-to-Freshsales (Eventbrite, Hopin), payment-to-Freshsales (Stripe → create deal on subscription), Slack-to-Freshsales (slash command to create deal).
For each Zap: configure dedup match. Most Freshsales actions in Zapier have a 'Find or Create' option — always use it instead of 'Create' to prevent duplicates.
Track Zap execution via Zapier dashboard. Set up email alerts for Zap failures — silent failures are the worst kind.
Audit Zaps quarterly. Disable unused ones. Each running Zap is a potential data source you own forever.
Step 7
After connecting everything, walk a test lead through the full funnel and verify attribution is preserved at every stage.
Create a test journey: open an incognito window → click a UTM-tagged ad/email link → land on your site → submit a form → wait for sync → check the resulting Contact in Freshsales.
Verify: Lead Source is correctly mapped from UTM. UTM Source, Medium, Campaign fields are populated. Activity history shows the form submission.
Now have a rep "qualify" the contact (Lifecycle Stage → MQL → SQL) and create a deal. Verify timestamps stamp at each stage transition.
Mark deal Closed Won. Verify Google Ads + Meta Ads offline conversion fired (check the platforms' Conversions reports within 24-48 hours).
Total time investment: 30 minutes. This end-to-end test catches 80% of attribution problems before they become production issues.
Common mistakes
Letting each integration write its own Lead Source values
What goes wrong: Integration A writes 'google_ads,' integration B writes 'Google Ads,' integration C writes 'paid-search.' Same source, three values. Lead Source reports are unusable. Marketing cannot answer 'what % of leads come from paid search?' Cost: 20-40 hrs/quarter cleaning report data manually, ~$1-2K specialist time.
How to avoid: Document canonical Lead Source values. For each integration, map to one of those values (do not let the integration write its own). Use a workflow to standardize values on contact create if needed.
Not persisting UTM data through the session
What goes wrong: User clicks a Google Ad, lands on /pricing, then browses to /features, then /contact, then submits a form. By form-submit time, the URL no longer has UTM parameters. Lead Source is unknown. 40-60% of paid leads attribute as 'Direct/Unknown.' Cost: paid ad ROI calculations are wrong by half; budget allocated to the wrong channels.
How to avoid: Implement UTM persistence: on first visit, capture UTMs, store in cookie / localStorage. On form submit, populate hidden form fields from storage. Use Google Tag Manager UTM persistence template or a small JS snippet.
Enabling two-way sync without defining field ownership
What goes wrong: Freshsales workflow updates Lifecycle Stage to SQL. Freshmarketer disagrees and updates it back to MQL. Freshsales updates it back to SQL. Ping-pong. Freddy AI gets confused training data. Reports flip-flop. Cost: 1-2 weeks of broken reporting + a specialist debug session ($200-400).
How to avoid: For every two-way sync, define which tool owns which field. Document in a Notion / Google Doc. Implement at the integration config layer (not just by social agreement).
Using "Create Contact" in Zapier instead of "Find or Create"
What goes wrong: Form integration creates a new Freshsales contact every time the same email submits — even on the 5th repeat submission. Within a month you have 1,000+ duplicate contacts. Sales reps email the same person 4 times. Brand damage. Cost: $300-600 dedup cleanup + sales team frustration.
How to avoid: Audit every Zap. Replace "Create Contact" with "Find or Create Contact" matching on Email. Zapier handles dedup automatically when configured correctly.
Connecting every integration on day one
What goes wrong: You install 8 integrations in week 1. Three are duplicates of each other. Each is silently writing fields. Conflict resolution becomes impossible. By month 2 you have 20 custom fields nobody created intentionally. Freddy AI scores garbage. Cost: $400-800 to unwind, weeks of rep confusion.
How to avoid: Install one integration per week. Test end-to-end before adding the next. Document field ownership for each. Disconnect trials immediately.
No alerting on integration failures
What goes wrong: Your Mailchimp sync starts failing because an API key expired. Zapier silently errors. Nobody notices. Two weeks later, marketing emails go to contacts who unsubscribed in Mailchimp but are still active in Freshsales sequences. CAN-SPAM complaint. Domain reputation hit. Cost: $5-15K in domain reputation recovery + potential legal exposure.
How to avoid: For every integration, set up failure alerts. Native Freshsales integrations: enable error notifications in Apps settings. Zapier: enable Zap failure email alerts. Custom API integrations: build health-check workflows.
Recap
Done — what's next
How to set up Freshsales contacts and accounts without making a mess
Read the next tutorial
Hand it off
Integrations are where most Freshsales portals quietly break. The connection is easy; the field mapping, dedup, attribution, and ongoing monitoring are the real work. A specialist who has wired 50+ Freshsales stacks knows where the typical breaks are and how to monitor proactively. EverestX Freshsales specialists run $400-1,200/mo at $14-16/hr.
See specialist rates
If you are already paying for Mailchimp/HubSpot and the team knows them, stick with what works. The Freshsales ↔ Mailchimp/HubSpot integrations are decent. Freshmarketer is the easier choice if you are starting from scratch or if you want zero-config sync with Freshsales. Switching costs are real — 40-80 hours of migration work. Do not switch just because Freshmarketer is 'native.'
Three-layer setup: (1) UTM capture on all paid/organic links with persistence through session, (2) Lead Source stamped on Contact at create based on UTM, (3) Deal-to-Contact association preserved through funnel. Build a Custom Report: 'Closed Won deals by Contact.Lead Source — last 90 days.' This gives you closed-won revenue per acquisition channel. For paid ROI: push offline conversions back to Google Ads / Meta Ads so their reports include closed revenue.
Freshsales Web Forms = simple embeddable forms that create contacts directly in Freshsales. Good for 'contact us' pages, demo requests. Freshmarketer Landing Pages = full marketing landing pages with templates, A/B testing, lead scoring. Good for campaign-specific pages with tracking. Use both: Freshsales forms for site forms, Freshmarketer for campaign landers.
Technically yes via Zapier or Operations Hub Data Sync — but practically, running two CRMs in parallel is a maintenance nightmare and data integrity inevitably degrades. Pick one as the system of record. If you are migrating, run parallel for 30-60 days max during cutover. See our [HubSpot CRM setup tutorial](/tutorials/crm-sales/hubspot-crm/set-up-hubspot-crm-from-scratch) for migration patterns.
Use the Freshsales Marketplace integration for Shopify (native) or Zapier for WooCommerce. Map: Customer → Contact (matched on email), Order → Deal (one deal per order, or one deal per subscription depending on motion), Order Items → Deal Line Items. For subscription businesses: also push churn events from Stripe/Recurly to Freshsales as Lifecycle Stage change. See our [Shopify tutorials](/tutorials/ecommerce/shopify) for parallel guidance.
Freshsales
Contacts and Accounts are the two modules every Freshsales motion runs on. Get the relationship between them right and your reports are clean for years. Get it wrong and you spend Saturdays untangling duplicate accounts and orphaned contacts. Here is the discipline.
Freshsales
Workflows are the Freshsales feature that scales sales ops from 'manual' to 'systematic.' They are also the feature most teams over-automate — creating loops, duplicate tasks, and stage flicker that destroys data trust. Here is the discipline that keeps automation a force-multiplier.
Freshsales
Freshsales data quality problems are quiet killers. They do not break the CRM — they just make every report wrong, every Freddy score garbage, and every campaign target the wrong people. Here is how to diagnose what is broken and fix it without making it worse.
Freshsales
DIY Freshsales is a great idea — until it isn't. This is the honest framework for when the cost of self-managing exceeds the cost of hiring help, and how to tell which side you are on.