This package allows you to track customer events from the server side.
npm install gleap-admin --saveImport the GleapAdmin package.
importGleapAdminfrom'gleap-admin';It is required to initialize the GleapAdmin SDK before sending events or other requests.
GleapAdmin.initialize(process.env.GLEAP_API_TOKEN);The secret API token can be found within your project settings -> Secret API token. Keep it in an environment variable; it must never ship to client apps.
GleapAdmin.trackEvent('user-id','event-name',{someEventData: "yeah!"});The userId should match the userId you are using to identify your users.
The event data (last param) is optional.
GleapAdmin.identify('user-id',{name: 'XOXO',email: 'asdf@asf.de',value: 499,// MRR: monthly recurring revenue, major unitsphone: '+4395959595',// Optional: associate the user with a company.company: {id: 'acme-inc',name: 'ACME inc.',},});The userId should match the userId you are using to identify your users.
All key-value pairs in the user properties part are optional. The optional
company object associates the user with a company — only company.id is
required and company.name never overwrites a name set via updateCompany.
Set authoritative company attributes (plan, value, SLA, address, custom data) from your backend. These are shown in the dashboard and used for company-level SLAs, and are never overwritten by data sent from your client apps.
// Create or update a company (companyId is your own immutable identifier).constcompany=awaitGleapAdmin.updateCompany('acme-inc',{name: 'ACME inc.',plan: 'Growth plan',value: 4990,// MRR: monthly recurring revenue, major unitssla: 3600,// Response-time SLA in seconds.domain: 'acme.com',address: {line1: '1 Infinite Loop',city: 'Cupertino',country: 'US'},customData: {tier: 'gold'},});// Read a company (returns null if it doesn't exist).constexisting=awaitGleapAdmin.getCompany('acme-inc');// Delete a company (its contacts and conversations are kept).constsuccess=awaitGleapAdmin.deleteCompany('acme-inc');Manage CRM pipeline entries from your backend: put a company or contact on a pipeline, move it through stages, set field values, or remove it — for example to mirror your signup or billing lifecycle onto an onboarding pipeline.
Entries are addressed by your own identifiers: the companyId you pass to
updateCompany for company pipelines, or the userId you pass to identify
for contact pipelines. Pipeline, stage and field ids come from getPipelines:
// [{ id, name, recordType, stages: [{ id, name, color }], fields: [{ fieldId, label, type }] }]constpipelines=awaitGleapAdmin.getPipelines();// Add a company to a pipeline. stageId defaults to the first stage; values// are keyed by fieldId. If the record is already on the pipeline, the// existing entry is returned unchanged (adding is idempotent).constentry=awaitGleapAdmin.addPipelineEntry("pipeline-id",{companyId: "acme-inc",stageId: "stage-id",values: {dealsize: 4990},});// Create-or-update (like updateCompany): adds the record, or moves it and// updates its values if it is already on the pipeline. Values are merged,// and null clears a field.awaitGleapAdmin.updatePipelineEntry("pipeline-id",{companyId: "acme-inc",stageId: "next-stage-id",});// Contact pipelines address entries by userId instead.awaitGleapAdmin.addPipelineEntry("pipeline-id",{userId: "user-1234"});// Read an entry (null if the record is not on the pipeline).constexisting=awaitGleapAdmin.getPipelineEntry("pipeline-id",{companyId: "acme-inc"});// Remove a record from a pipeline (the company/contact itself is kept).constsuccess=awaitGleapAdmin.removePipelineEntry("pipeline-id",{companyId: "acme-inc"});Adding a record and moving it to a new stage run the pipeline's automations,
exactly like the same action in the dashboard. Unknown stage ids and unknown
field keys are rejected with a 400 naming the valid ids.
Gleap uses the value field as a customer's MRR: monthly recurring
revenue, in your billing currency, in major units (for example 499 or
49.9, not cents). It powers revenue-based prioritization in Kai PM,
revenue context on tickets, and company segmentation.
You can set it on two levels:
- Company (recommended for B2B):
GleapAdmin.updateCompany('acme-inc', { value: 4990 }). Authoritative and shared by every contact of that company. - Contact:
GleapAdmin.identify('user-id', { value: 4990 })for individual users, or when you do not group contacts into companies.
Kai PM scores a company account with the maximum of the company value and
its members' contact values, counted once per company — so for team
accounts, setting the company value is enough.
The best place to update it is your billing webhook (subscription created, updated, canceled), so Gleap always mirrors your billing system:
Notes:
identifyandupdateCompanysend immediately — safe in short-lived webhook handlers.trackEventis buffered (flushed every 2.5 seconds), so only use it from long-running processes.identifyflattenscustomDatainto top-level contact attributes;updateCompanykeepscustomDatanested on the company. Put MRR invalue, not incustomData.- On cancellation, set
value: 0.
MIT