CRM bridge

When a session gets a name, the recording lands as a note on that person in your CRM - on the contact who already exists, not on a new one.

1. What this does, in one sentence

The moment a session is identified, we look the person up in your CRM by the identifier you sent us, and attach a note with a link to the recording.

That is all. No new contacts, no new deals, no pipeline changes. A CRM that grows a duplicate every time someone visits your pricing page is worse than no integration.

If we cannot find the person, nothing happens. Creating them would mean writing a record into your CRM from a browser session - and browser sessions are not a source of truth about who your customers are.

2. The match key: how we find the person

This is the part worth ten minutes of your attention, because it is where a CRM integration usually goes quietly wrong.

We know the visitor by whatever your site told us - MousePlayer.setUserId(), a distinct ID read back from your analytics tool, or a server-side identify call. Your CRM knows them by something too. Those two things have to be the same thing.

We searchYou can change it
HubSpotthe contact's email addressno - the search endpoint is built around it
Pipedrivepersons by term, email firstno
Salesforcea field you name, default Emailyes

Why Salesforce is the one that asks

Salesforce installations rarely key on email. Yours might key on Customer_Number__c, or on an external ID from your billing system. If we searched by email anyway, we would find nothing and report success - the worst kind of failure, because the integration looks alive.

So the form asks: which field on Contact holds the value we are sending you? Put the API name in, including the __c if it is a custom field.

The field name is checked against a strict pattern before it reaches a query. A CRM field name is letters, digits and underscores - anything else is refused rather than escaped, because escaping is a thing you can get subtly wrong and refusing is not.

3. When it fires, and when it deliberately does not

At identification: when your site calls MousePlayer.setUserId(), when our analytics bridge reads a distinct ID back from PostHog, Mixpanel or Amplitude, or when your server calls the identify endpoint.

Once per session, not once per page

A person who logs in and then browses eleven pages is one note, not eleven. Your CRM timeline is a place people read.

Not without an identifier

An anonymous session has nothing to match on. We do not guess by IP address, and we do not attach the recording to whoever happens to share that address.

Not if the person is unknown to your CRM

Counted as done, not as failed - a prospect who is not in your CRM yet is the normal case, and retrying tomorrow would not change it.

4. What the note looks like, and where the token lives

One note on the contact's timeline: a line saying a session was recorded, and the link. Your salesperson clicks it and watches what the person actually did before they wrote in.

The credential

Stored AES-256-GCM encrypted. Never shown again after you save it - the field shows asterisks, and saving the form with asterisks in it leaves the stored value alone. It is also deliberately kept out of the internal queue that carries the task: the queue is shared state, and shared state is the wrong place for a key.

Salesforce needs three things, the others two

Salesforce authenticates through a Connected App with a refresh token, so it asks for the consumer key, the secret and the refresh token, plus your instance URL. HubSpot and Pipedrive take a single API token. In all three cases the app is yours - MousePlayer does not run a marketplace app you have to trust.

5. Zoho CRM and Freshsales

Two more CRMs, and they sit at opposite ends of the setup effort.

Zoho CRMFreshsales
You providedata centre, client ID, client secret, refresh tokenAPI key and your Freshworks domain
We searcha field you name, default Emaila field you name, default email
The note landson the contact, as a Note recordon the contact, as a note

Zoho lives in one of six data centres

An account is in com, eu, in, com.au, jp or com.cn, and nothing in the key tells you which. Pick the wrong one and Zoho answers INVALID_TOKEN - which reads like a bad key and sends you looking in the wrong place. The field is a dropdown for exactly that reason.

The Self Client, once

Create a Self Client in the Zoho API console, generate a grant token for ZohoCRM.modules.ALL and ZohoSearch.securesearch.READ, and exchange it once for a refresh token. That refresh token does not expire; the hourly access tokens are fetched from it and never stored.

Zoho answers 200 when it means no

Both its token exchange and its record writes can return HTTP 200 with an error or a per-record status in the body. We read the body - a bridge that trusted the status code would report success for a note that was never created.

All trademarks named here belong to their respective owners. MousePlayer has no business relationship with these providers.