Theme
Open the portal

Freshsales

Your customers' contact details keep themselves current in Freshsales, from what they chose to share. Freshsales is the one CRM here that connects with an API key instead of a sign-in — its API accepts nothing else — and it has one other quirk worth reading before you start: extra fields have to be created by hand.

Read CRM integrations first for the shared model: one-way consented sync, auto-mapping, what we never do.

Before you start

You need two things, both from your own Freshsales account:

Step 1 — choose whose key you use

There is nothing to install inside Freshsales and nothing to register there. The sync runs as the Freshsales user whose API key you paste, which is worth one moment's thought before you copy one:

Why there is no "Sign in with Freshsales" button. Freshworks does publish an OAuth flow for external apps, and it does issue a token — but the Freshsales CRM API refuses that token, and refuses it again when it is presented as a key. So an API key is not a shortcut we took: it is the only credential this API accepts. Your key is stored encrypted here and is never shown again.

Step 2 — connect

  1. In the allus portal, open Configuration → Integrations and click Connect next to Freshsales. The portal creates the service, its data client and its webhook for you — there is nothing to paste — and hands you to this integration's own setup page.
  2. Connect Freshsales — paste your account address and your API key, and press Connect.
A connection that cannot work is refused rather than half-made. Before storing anything, allme uses the key you pasted to read your contact fields. If Freshsales does not accept it for that account you are told so, and nothing is stored — check both values and press Connect again.

If Freshsales simply does not answer — an outage, or too many requests at once — you are told that instead, because nothing about your details was actually checked. There is nothing to change: wait a few minutes and press Connect again.

The Freshsales setup page showing the account address and API key fields filled in, with the Connect button.
The Freshsales setup page showing the account address and API key fields filled in, with the Connect button.

What lands in Freshsales

What the customer sharesWhere it goes on the contact
First nameFirst name
Last nameLast name
EmailThe contact's email address
PhoneMobile number
AddressThe address block — street, city, state, zipcode, country
Anything else your service asks forA custom field you create — see below
A withdrawn fieldThe field is emptied, and a note records what was withdrawn and when — except first name, last name and email, see Limits
An ended connectionA note on the contact. The record itself is never deleted or blanked

allme also fills the contact's External ID with the customer's allme share code. That is how a record is found again on every later update, so leave it to allme — if you already use External ID for another system, that other system and allme will overwrite each other.

Documents and contract flows on the timeline

When you send a customer a document, or run a contract flow with them, the contact’s Freshsales notes show what happened — automatically, with no setup.

Freshsales has no separate activity object the app needs, so all of this rides the same notes a field withdrawal or a disconnect already writes to — including the duplicate-note limit below.

Extra fields are created by you

The Freshsales API cannot create a field, so anything your service asks for beyond name, email, phone and address needs a field you add by hand. allme never invents one and never puts the value somewhere else — it waits.
  1. Open your sync status page. Any field still waiting is listed as needs an admin, with the exact label to use beside it — something like Account reference (allme:account_ref).
  2. In Freshsales, add a text field to the contact with exactly that label, punctuation included. The label is what allme looks the field up by, so a shortened or prettier one will not be found — and it has to be a text field, because a customer's answer is their own free value and a number, dropdown or date field would reject it.
  3. Leave it there. The next sync finds the field and starts filling it on its own — there is nothing to press, and the values shared meanwhile are not lost: they land the moment the field exists.

A field of the wrong type is treated exactly like one that is not there yet: the row keeps saying needs an admin, the values stay held, and allme picks the field up as soon as a text field carries that label.

How an existing contact is matched

When a customer connects, allme looks for a contact they already have in your Freshsales, in this order:

  1. allme's own External ID — a contact allme wrote before is always found again this way, which is what keeps later updates on the same record.
  2. Their email address, matched exactly.
Freshsales cannot be searched by phone number, so allme does not match on one. Its contact search accepts a name, an email address or a custom field — not a phone field — and asking it for one returns an error rather than an empty result. Guessing with its fuzzy search instead is exactly how one person's details end up on another's record, so allme does not: a customer who shares only a phone number gets a new contact rather than being matched to an existing one. A duplicate you can merge in Freshsales is the recoverable outcome; a wrong match is not.

More than one contact matching means a new contact, not a guess. If two of your contacts share the customer's email address, allme does not choose between them and has no second signal to fall back on — it creates a new contact.

A customer sharing more than five email addresses gets a new contact too. Freshsales searches one address per request, so a service asking for a long list of email fields would spend a large part of your hourly allowance on a single customer. Past five, allme does not search at all — searching only some of them and matching on those would be a guess across the addresses it never looked at, which is the wrong match this whole order exists to avoid.

Limits worth knowing

Next

CRM integrations overview · How the connection model works · Configuring what your service asks for