IntegrationsCRMFreshsales

Freshsales (Freshworks CRM)

Creates or updates Freshsales (Freshworks CRM) contacts server-side through the Contacts Upsert API, matched on email.

Why route Freshsales through Datafly Signal

  • Profiles are updated from the server, not the browser. Events reach Freshsales even when a tracker blocker or a failed page unload would have dropped a client-side call, so the profile reflects what actually happened.
  • One consent decision governs every destination. Freshsales is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.

Prerequisites

Find your API key

In Freshsales, open Profile Settings > API Settings.

Note your bundle alias

The subdomain of your Freshsales URL, for example acme for acme.myfreshworks.com.

Configuration

FieldTypeRequiredDescription
bundle_aliastextYesThe subdomain of your Freshsales URL. If you log in at https://acme.myfreshworks.com, enter ‘acme’. Used to build the API host {bundle_alias}.myfreshworks.com.
api_keysecretYesYour Freshworks CRM API key. Find it under Profile Settings > API Settings in Freshsales. Sent as ‘Authorization: Token token=<api_key>’.

Signal setup

  1. Navigate to Integrations in the sidebar and open the Integration Library tab.
  2. Find Freshsales (Freshworks CRM), click Install and fill in the fields above.
  3. Pick the preset for your use, then review the mappings in the blueprint editor.

API endpoint

POST https://{bundle_alias}.myfreshworks.com/crm/sales/api/contacts/upsert
Authorization: Token token={api_key}

Example request:

{"unique_identifier": {"emails": "jane.doe@example.com"},
 "contact": {"first_name": "Jane", "last_name": "Doe", "mobile_number": "+447700900123", "job_title": "CTO",
   "city": "Bath", "state": "Somerset", "zipcode": "BA1 1AA", "country": "gb", "medium": "email", "keyword": "crm software"}}

The presets turn on the strict output contract: only the fields the blueprint maps are sent.

Event mapping

Default preset (default)

Upsert a Freshsales contact, matched on email, when a visitor identifies, signs up, submits a lead or demo request, or buys: first and last name, mobile (E.164), job title, city, state, postcode and country from the identify traits, and the campaign medium and term. The email is the upsert key and the sales team works from the record, so it is sent in plain text. Page views and logins are mapped but disabled: Freshsales allows 1000 API calls an hour per account. Events without an email are not sent.

Signal eventSent to the vendor asEnabled
identifycontacts/upsertyes
sign_upcontacts/upsertyes
generate_leadcontacts/upsertyes
demo_requestedcontacts/upsertyes
purchasecontacts/upsertyes
logincontacts/upsertno (mapped, disabled)
pagecontacts/upsertno (mapped, disabled)

Identity and personal data

The contact is matched on the email trait (trimmed, lower-cased) through unique_identifier, which is how the email reaches a new contact. First and last name, mobile (E.164), job title and address come from the identify traits (address.city and friends, or the flat city, state, postal_code, country traits). The email is sent in plain text because it is the upsert key. Events without an email are not sent.

Map the integration to the consent category your organisation uses for CRM or sales data. Signal does not write cookie consent into the CRM: no subscription status, do-not-disturb flag, list or tag is set from it, because a cookie banner choice is not a permission to email or call someone.

Known limitations

  • Freshsales allows 1000 API calls an hour per account, so page views and logins are mapped but disabled.
  • mobile_number is unique in Freshsales: a number already on another contact fails the upsert.

Troubleshooting

SymptomCause and fix
429Hourly API limit reached; deliveries are retried.
Error listing contact IDs to mergeDuplicate contacts share the email; merge them in Freshsales.