---
title: "Linkbreakers + Freshsales: QR code leads as contacts and deals"
description: "Connect Freshsales (Freshworks CRM) with its API key and domain, and every person who scans your QR codes and gives their email becomes a Freshsales contact, with tags, their form answers in custom fields, a contact list where your plan has them, and optionally a deal in the pipeline stage you choose. Setup, what is synced, and the Assistant and MCP tools."
canonical: "https://linkbreakers.com/help/article/linkbreakers-freshsales-integration-qr-generated-leads-for-sales-teams"
last-updated: 2026-11-09
---

# Linkbreakers + Freshsales: QR code leads as contacts and deals

> Connect Freshsales (Freshworks CRM) with its API key and domain, and every person who scans your QR codes and gives their email becomes a Freshsales contact, with tags, their form answers in custom fields, a contact list where your plan has them, and optionally a deal in the pipeline stage you choose. Setup, what is synced, and the Assistant and MCP tools.

:::try-ai-prompt {"prompt":"Connect Freshsales with my API key and my domain acme.myfreshworks.com, tag synced contacts with qr-{link}, and create a deal in the first stage of my default pipeline for each one","description":"Connect Freshsales with the Assistant.","target":"assistant"}:::

## Short answer

Linkbreakers connects to Freshsales (Freshworks CRM) directly. In the dashboard, open **Integrations**, pick **Freshsales**, paste your Freshsales API key and your Freshsales domain, and select **Connect**. From then on, every person who goes through one of your links or QR codes and whose email Linkbreakers knows, for example after a lead form, is created or updated as a Freshsales contact, with their name, mobile number, form answers and tags. You can also add them to a contact list, and have Linkbreakers create a deal for each one in the pipeline and stage you choose.

No Zapier, Make or webhook is needed. The integration is available on every plan.

## Quick summary

- Connect once per workspace with the API key and domain from **Profile settings > API settings**
- Contacts are created or updated, matched on email
- First name, last name and mobile number are filled in
- Form answers go to contact custom fields with the same name
- Tags added to each contact, with `{link}` for the link's name
- Optionally a contact list, on Freshsales plans that have contact lists
- Optionally a deal in a pipeline stage, one open deal per contact
- Visitors known only by phone are not synced: Freshsales matches contacts on email
- Also set up from the Assistant, the MCP server or the REST API

## How it works

A contact is synced when a visitor goes through a step of a link's workflow and Linkbreakers knows their email. That is usually right after a [lead form](/help/article/how-to-add-a-lead-capture-form-to-a-qr-code), but it can also come from the chat bot or any step that saves visitor data. Linkbreakers sends the contact to Freshsales from its servers, once per step, at the moments the connection covers (all of them by default).

Freshsales creates the contact, or updates the one with that email. Tags are added to the ones the contact already has, never replacing them.

## Connect Freshsales

1. In Freshsales, open your profile > **Settings > API settings**. Copy the **API key** and the domain shown as the bundle alias, such as `acme.myfreshworks.com`.
2. In Linkbreakers, open **Integrations** in the dashboard and pick **Freshsales**.
3. Paste the key in **Freshsales API key** and the domain in **Freshsales domain**, then select **Connect**. Linkbreakers checks them against Freshsales before storing them. Older accounts on `freshsales.io` work too.
4. Under **Add contacts to a contact list**, choose a list, or **No contact list: contacts only**. Contact lists are a Freshsales plan feature: on a plan without them, the choice is empty and contacts are synced without a list.
5. Set the options and the delivery setting below, then save.

The key is encrypted when it is stored and never shown again; the page shows the domain it belongs to.

## What gets synced

| Linkbreakers | Freshsales |
|---|---|
| Email | Contact email (the match) |
| Phone | Mobile number |
| First name, last name | First name, last name |
| Form answers and other visitor data | Contact custom fields, matched by name |
| Tags you set | Added to the contact's tags |
| The contact list you chose | The contact's lists |
| Deal (optional) | A deal in the chosen pipeline stage, linked to the contact |

Freshsales names custom fields with a `cf_` code, so Linkbreakers matches them by label: a field labeled "Cafe name" takes the answer whose key is `cafe_name`. Create them in Freshsales under **Admin settings > Contact fields**, named like your form fields, or map an answer to a field on the Freshsales page. Text, number, date and checkbox fields are written; dropdowns, radio buttons and multi-selects are left out. **Test connection** lists the field keys Linkbreakers can write to.

## Options

**Tags.** Tags added to each contact, separated by commas, up to 10. `{link}` becomes the name of the link the person came through, so `qr-{link}` tells you which QR code brought each contact.

**Deals.** Choose **The contact and a deal**, then the pipeline and stage. The deal is named `{link}: {name}` unless you set another title, has an amount of 0 (Freshsales requires one; your team fills it in), and goes to the contact's account when the contact has one. Freshsales leads are a separate module of classic Freshsales only, so Linkbreakers offers deals, not leads.

A visitor is synced at each step of a flow, but your sales team wants one deal per person. So no deal is created while the contact has an open deal. Once it is won or lost, a new visit creates a new one.

**Marketing consent.** Linkbreakers does not set the Freshsales subscription status: an update cannot tell a new contact from one who unsubscribed, and the status covers several subscription types the visitor never chose between. You can still choose a consent answer and tick **Add to the contact list only those who consented**, so the list holds only the people who agreed to hear from you.

## Which visitors and which links

The Freshsales page has the same three settings as the other Linkbreakers integrations:

- **Where**: every link, or only some links, directories and tags
- **When**: the moments of a visit (Entry, Interaction, Routing, Exit), or specific steps
- **What is sent**: all visitor data, only some, or just the visit. Email and phone are always sent

Only visits by people are synced. Bots, link previews and AI agents never become contacts. Visits past your plan's tracked visits allowance are not synced.

## What is not synced

- Visitors without an email, including those known only by their phone: Freshsales only matches contacts on unique fields, and a phone is not one. They are skipped, not counted as failures
- Answers with no matching custom field, or for dropdown, radio and multi-select fields
- The subscription status
- Anything back from Freshsales

## Set it up from the Assistant, MCP or the API

**Assistant**: in the dashboard, ask "Connect Freshsales with my API key and domain, and create a deal for each new contact".

**MCP server**: an agent connected to the [Linkbreakers MCP server](/help/article/mcp-server-setup) has `contact_integration_connect` (the domain goes in `account`), `contact_integration_lists`, `contact_integration_pipelines`, `contact_integration_fields`, `contact_integration_update`, `contact_integration_test`, `contact_integration_get`, `contact_integrations_list` and `contact_integration_disconnect`, with the tool `CONTACT_TOOL_FRESHSALES`.

**REST API**, with a token that has the `integrations:write` scope:

```bash
curl -X POST https://api.linkbreakers.com/v1/integrations/contacts/CONTACT_TOOL_FRESHSALES/connect \
  -H "Authorization: Bearer $LINKBREAKERS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"apiKey": "your-freshsales-api-key", "account": "acme.myfreshworks.com"}'

curl -X PATCH https://api.linkbreakers.com/v1/integrations/contacts/CONTACT_TOOL_FRESHSALES \
  -H "Authorization: Bearer $LINKBREAKERS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"options": {"tags": ["qr-{link}"], "recordKind": "CONTACT_RECORD_KIND_DEAL", "pipelineId": "1", "stageId": "1"}}'
```

## When to use webhooks instead

The native connection writes contacts, tags, lists and deals. To start Freshsales sequences, assign owners, or create accounts, use Freshsales workflows on new contacts or deals, or send [Linkbreakers webhooks](/help/article/how-do-webhooks-work-in-linkbreakers) to Zapier, Make or n8n.

## Limits and caveats

- **Email required.** Phone-only visitors are skipped
- **One Freshsales account and one contact list per workspace**
- **Contact lists depend on your Freshsales plan**
- **One open deal per contact**, by design; deals start at an amount of 0
- **No retries.** A contact Freshsales refuses is reported as the last error on the page, not sent again

## Frequently asked questions

### Where do I find my Freshsales domain?

On the same **API settings** page as the API key, shown as the bundle alias, such as `acme.myfreshworks.com`.

### Why can I not choose a contact list?

Your Freshsales plan has no contact lists, so Freshsales answers with none. Contacts are still synced, with their tags.

### Will a visitor who goes through several steps create several deals?

No. While the contact has an open deal, no new one is created.

### Can Linkbreakers create Freshsales leads?

No. Leads exist only in classic Freshsales, so Linkbreakers creates contacts and, if you choose, deals.

### What happens when I disconnect Freshsales?

Visitors stop being synced and the stored key is deleted. Contacts and deals already in Freshsales stay there.

## Sources

- Linkbreakers Freshsales integration page, API and MCP tools, checked in the product on 2026-11-09.
- Freshsales API documentation: https://developers.freshworks.com/crm/api/

## Last reviewed

2026-11-09 by Laurent Schaffner.
