CRM – leads into your CRM, revenue back into X3
Your website sends leads to X3 only (server leads.create or the browser
x3.lead()). X3 pushes them to every connected CRM in the background and reads the
outcome back: a meeting sets the lead to Termin, a won deal to Kunde with the deal value. From
that X3 computes the real ROAS per campaign, ad set and ad.
The CRM stays your system of record for contact data and the sales stage. X3 owns attribution and journeys and writes only its own fields plus the standard identity fields on create.
Connect
Einstellungen › CRM › „CRM verbinden“. Choose the CRM, read what X3 writes and reads, then sign in on the hosted connect page (OAuth for HubSpot, the API key for Pipedrive). X3 never sees passwords, tokens or API keys – they stay with the connection provider (Composio). After the callback X3 reads the account (portal, company domain), shows „Verbunden als …“ and starts the first sync as a visible run.
| CRM | Status | Person object | Won rule | Details |
|---|---|---|---|---|
| HubSpot | available | contact | hs_is_closed_won – the sum of every associated won deal | HubSpot |
| Pipedrive | available | person | deal status won | Pipedrive |
| Salesforce, Zoho CRM, Attio, Close | „Bald verfügbar“ | – | – | same interface, follows |
A CRM without an auth config on the deployment shows „Bald verfügbar“ and cannot be started. Each CRM account can be connected once per project („Dieses HubSpot-Konto ist schon verbunden“); reconnecting an expired connection keeps every link and waiting push.
What X3 writes
| Field | Default | Content |
|---|---|---|
| Email, phone, first/last name, company | on create; afterwards only empty fields | identity |
x3_lead_url | own field | deep link to the lead in X3 (login required, no contact data in the URL) |
x3_source | own field | channel and platform, e.g. „Google Ads · Suche“ |
x3_campaign | own field | campaign › ad set › ad names from the ad sync, never internal ids |
x3_fit | own field | grade from the questionnaire (a hint) |
x3_lead_id | own field | anchor to find the record again after merges |
Channel of the first touch (x3_channel) | HubSpot: standard field „Original Source“; others off | converted into the CRM's options (see the CRM's page) |
gclid, fbclid | HubSpot: standard fields „Google ad click id“ / „Facebook click id“; others off | click ids for CRM-native offline conversions |
| UTMs, LinkedIn click id, landing page, first touch, form, status | off | switch on per field or map to an existing field |
Per field you choose own field (X3 creates it in a group „X3 Growth Intelligence“), existing field (a field of yours or a CRM standard field), only in the note or off. The table shows per row whether the value lands in a CRM standard field, an X3 field or one of your fields. When the CRM refuses new fields (property limit, no schema permission) the values go into the note and a task asks you to map them.
Which fields fit
X3 checks every mapping against the CRM's field types before it saves: free text goes into text fields
only, a point in time into date fields. A selection list (HubSpot „Original Source“, Pipedrive option
fields), a number or a yes/no field takes an X3 value only where X3 converts it – for the standard fields
listed on the CRM's page. Read-only fields cannot be chosen. Own field always writes the field X3
created (x3_…), never a CRM standard field. Standard fields are first-touch values: X3 fills them on
create and later only while they are empty – a value the CRM or a person set is never overwritten.
When the CRM refuses a value
If the CRM still refuses a single field value (a changed option list, a field deleted in the CRM), X3 repeats the same transfer once without that field: the lead is created or linked, the value goes into the note, the lead shows „angelegt · 1 Feld abgelehnt“ and the task „CRM lehnt Feld ab“ names the field and the CRM's reason until you change the mapping. One bad field never keeps a lead out of the CRM.
Every inquiry adds one note (form, grade, source › campaign, contact, answers, message, a one-line journey, UTMs, the X3 link and a reference marker that makes retries safe). A repeat inquiry of the same person adds a further note – never a second contact. No IP address, device or session ids leave X3.
Dedupe before create
X3 searches by email first, then by phone (E.164) with a name check:
| Found | Decision |
|---|---|
| nothing | create |
| one by email | link |
| one by phone, names fit and no other email | link |
| one by phone, name or email differs | „Prüfen“ |
| several by email | link the one carrying this x3_lead_id, else „Prüfen“ |
| several by phone | „Prüfen“ |
„Prüfen“ means: nothing is created until a person decides – link a candidate, create a new record or do
not transfer (lead view, Sync › CRM, or MCP crm_review_resolve).
Spam, tests and the hold window
The push never runs inside the form request. After the lead is stored X3 checks it:
- Test leads (test marker, test traffic) are never pushed.
- Clear spam – honeypot, form sent in under 2 seconds, disposable address, an invalid phone without email, your block list – is not pushed and the lead becomes „Disqualifiziert · Spam / Fake“ (undoable). „Doch ins CRM übernehmen“ in the lead view pushes it anyway.
- Suspicious leads (several links in the message, no name, no visit, very fast fill) are held for the hold window (Einstellungen › CRM, default 10 minutes) and then pushed unless somebody marked them as spam. „Freigeben“ pushes them at once.
- Everything else goes at once (target under a minute).
A lead disqualified as spam after it reached the CRM is only marked there with a note („X3: Spam“) – X3 never deletes CRM records.
Routing
Several CRMs at once are fine. Which CRM gets a lead:
crmof the call:false= none, a list of aliases or CRM names (["sales"],["hubspot"]); the server API may also name connection ids, the browser never.- The first matching routing rule (Einstellungen › CRM › Regeln): form, page glob (
/software/*), channel (orpaid/unpaid), answer. - Otherwise every connected CRM with pushing on.
The test panel explains the decision in one sentence, e.g. „Formular quiz auf /software → HubSpot (Regel ‚Quiz → HubSpot‘)“.
Return path
Every 15 minutes, right after connecting, on „Jetzt abgleichen“ and after a manual link X3 reads the deals and meetings of linked records only – it never imports foreign CRM contacts.
- A meeting that is not canceled or a no-show sets Termin.
- A won deal sets Kunde with the value = sum of the won deals (in the project currency).
- The CRM only upgrades: a lost or deleted deal never downgrades; the value is recomputed and a task „Umsatz gesunken“ asks you to check. A won deal beats a manual „Verloren“ (with a note, undoable); a meeting does not. A value you entered by hand is never replaced – both are shown.
Closing reports to ad platforms
Einstellungen › CRM › „Abschlüsse melden“: aus (default), nur in X3 festhalten, or an Werbeplattformen melden (value = deal sum at win time, once per lead – later deals update the value in X3 but are never reported again, see project mode). Wins older than 7 days and wins found by the first match of existing leads are never reported.
Existing leads
„Bestehende Leads abgleichen“ matches the X3 leads of the last 90 days with the CRM – link only by default, nothing is created unless you switch on „fehlende anlegen“. Their deals and meetings are read right away, so revenue and the real ROAS show up immediately.
Privacy
Contact data leaves X3 only towards the CRMs you connected, with the minimal field set above. Projects that do not store contact data in plain text still push: the data of the inquiry is kept encrypted until the push is done (at most 7 days). Readers without contact-data rights see CRM states and masked candidates only. Deleting a lead in X3 removes its links; the CRM record stays (you are its controller). The connection provider processes CRM tokens and contact data in transit and is listed as a sub-processor of the operator.
API and MCP
REST: /v1/projects/{project}/crm-connections, /crm/status, /crm/push-jobs, /crm/reviews,
/crm-routing-rules, /crm/settings, /leads/{id}/crm, PATCH /leads/{id} (scopes crm:read,
crm:write; search and candidates also need leads:read). MCP: the crm_* tools and leads_update
(tool list). crm_connection_update pauses or resumes a connection or switches its push or pull
off (PATCH /v1/projects/{project}/crm-connections/{id} with paused and settings), e.g. when new leads should go into
the X3 Sales Engine instead (it lists itself as the first CRM under „Verbundene CRMs“); nothing is deleted.
crm:write sends contact data of leads to a third party: members only get it with the contact-data
permission, and an AI assistant only with the personal-data checkbox on the consent page. Connecting a
CRM, the field mapping, matching existing leads and pushing several leads also need leads:read;
reporting closings to the ad platforms needs conversions:write and leads:status. Self-serve accounts
confirm their e-mail address before they connect a CRM. If the plan no longer includes the CRM, new
leads stay in X3 only and deals are no longer synced; the status page and disconnecting stay available.