@logopulse/sdk 1.2.2 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +412 -93
- package/dist/index.d.ts +13 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
# @logopulse/sdk
|
|
2
2
|
|
|
3
|
-
**
|
|
3
|
+
**Track customer health analytics for any B2B SaaS platform.**
|
|
4
4
|
|
|
5
|
-
Track the pulse of every customer -
|
|
5
|
+
Track the pulse of every customer - flexible entity tracking, configurable stage progression, and automatic feature adoption analytics.
|
|
6
6
|
|
|
7
7
|
## Installation
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
10
|
npm install @logopulse/sdk
|
|
11
|
-
# or
|
|
12
|
-
yarn add @logopulse/sdk
|
|
13
11
|
```
|
|
14
12
|
|
|
15
13
|
## Quick Start
|
|
@@ -18,165 +16,486 @@ yarn add @logopulse/sdk
|
|
|
18
16
|
import { createLogoPulse } from '@logopulse/sdk';
|
|
19
17
|
|
|
20
18
|
// Initialize once (singleton)
|
|
21
|
-
const
|
|
22
|
-
apiUrl: 'https://api.logopulse.io/production',
|
|
19
|
+
const logoPulse = createLogoPulse({
|
|
23
20
|
apiKey: 'your-api-key-here',
|
|
24
|
-
orgId: 'your-
|
|
25
|
-
timeout: 5000, // Optional (default:
|
|
21
|
+
orgId: 'your-org-id',
|
|
22
|
+
timeout: 5000, // Optional: request timeout in ms (default: 5000)
|
|
26
23
|
});
|
|
27
24
|
|
|
28
|
-
// Track
|
|
29
|
-
await
|
|
30
|
-
await
|
|
31
|
-
await
|
|
32
|
-
await analytics.track('user.login', accountId, { email: 'user@company.com' });
|
|
25
|
+
// Track custom entities - unlimited entity types, no configuration required!
|
|
26
|
+
await logoPulse.track('batch.created', accountId, { batchId: 'batch-123' });
|
|
27
|
+
await logoPulse.track('order.processed', accountId, { orderId: 'order-456', amount: 250.50 });
|
|
28
|
+
await logoPulse.track('report.generated', accountId, { reportType: 'analytics' });
|
|
33
29
|
|
|
34
|
-
// Track
|
|
35
|
-
await
|
|
36
|
-
await
|
|
37
|
-
await
|
|
30
|
+
// Track customer lifecycle with pre-built methods
|
|
31
|
+
await logoPulse.createCustomer({ accountId, companyName: 'Acme Corp', ownerEmail: 'owner@acme.com' });
|
|
32
|
+
await logoPulse.userLogin(accountId, { email: 'user@acme.com' });
|
|
33
|
+
await logoPulse.subscriptionStarted(accountId, { plan: 'pro', amount: 99.00 });
|
|
38
34
|
```
|
|
39
35
|
|
|
40
|
-
##
|
|
36
|
+
## Core Concepts
|
|
37
|
+
|
|
38
|
+
### Entities vs Actions
|
|
39
|
+
|
|
40
|
+
**Entities** (unlimited - define your own):
|
|
41
|
+
- Any countable business object your customers create
|
|
42
|
+
- Examples: `batch`, `order`, `product`, `report`, `document`, `shipment`, `invoice`, `warehouse`
|
|
43
|
+
- LogoPulse automatically tracks count, timestamps, and revenue for each entity type
|
|
44
|
+
- **No configuration required** - just start tracking!
|
|
45
|
+
|
|
46
|
+
**Actions** (limited - predefined set):
|
|
47
|
+
- Standard verbs that describe what happened to an entity
|
|
48
|
+
- See [Standard Actions](#standard-actions) below
|
|
49
|
+
- Consistent actions ensure proper tracking across all entity types
|
|
50
|
+
|
|
51
|
+
**Event Format:** `entity.action` (e.g., `batch.created`, `order.processed`)
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## API Reference
|
|
41
56
|
|
|
42
57
|
### Initialization
|
|
43
58
|
|
|
59
|
+
#### `createLogoPulse(config)`
|
|
60
|
+
|
|
61
|
+
Initialize the SDK with your credentials.
|
|
62
|
+
|
|
44
63
|
```typescript
|
|
45
64
|
import { createLogoPulse } from '@logopulse/sdk';
|
|
46
65
|
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
timeout: 5000, // Optional (default: 5000ms)
|
|
66
|
+
const logoPulse = createLogoPulse({
|
|
67
|
+
apiKey: 'your-api-key', // Required: Your LogoPulse API key
|
|
68
|
+
orgId: 'your-org-id', // Required: Your organization ID
|
|
69
|
+
timeout: 5000, // Optional: Request timeout in ms (default: 5000)
|
|
52
70
|
});
|
|
53
71
|
```
|
|
54
72
|
|
|
55
|
-
|
|
73
|
+
#### `getLogoPulse()`
|
|
74
|
+
|
|
75
|
+
Get the singleton instance (must call `createLogoPulse()` first).
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
import { getLogoPulse } from '@logopulse/sdk';
|
|
79
|
+
|
|
80
|
+
const logoPulse = getLogoPulse();
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Core Tracking
|
|
56
84
|
|
|
57
|
-
|
|
85
|
+
#### `track(eventType, accountId, data?, options?)`
|
|
86
|
+
|
|
87
|
+
Track any custom entity event using the `entity.action` format.
|
|
58
88
|
|
|
59
89
|
```typescript
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
* @param options - Additional metadata (optional)
|
|
66
|
-
*/
|
|
67
|
-
await analytics.track(
|
|
68
|
-
'batch.created',
|
|
69
|
-
'customer-account-123',
|
|
70
|
-
{
|
|
71
|
-
batchId: 'batch-abc-123',
|
|
90
|
+
await logoPulse.track(
|
|
91
|
+
'batch.created', // eventType: entity.action
|
|
92
|
+
'account-123', // accountId: customer account ID
|
|
93
|
+
{ // data: optional event data
|
|
94
|
+
batchId: 'batch-456',
|
|
72
95
|
productName: 'Widget',
|
|
73
96
|
quantity: 100,
|
|
74
|
-
|
|
97
|
+
amount: 1250.00 // Include amount to track revenue
|
|
75
98
|
},
|
|
76
|
-
{
|
|
77
|
-
userId: 'user-
|
|
78
|
-
traceId: 'trace-
|
|
79
|
-
source: '
|
|
99
|
+
{ // options: optional metadata
|
|
100
|
+
userId: 'user-789',
|
|
101
|
+
traceId: 'trace-abc',
|
|
102
|
+
source: 'api-service',
|
|
103
|
+
timestamp: '2026-01-05T12:00:00Z'
|
|
80
104
|
}
|
|
81
105
|
);
|
|
82
106
|
```
|
|
83
107
|
|
|
84
|
-
|
|
108
|
+
**When to use:** For tracking any custom entity specific to your business (unlimited entity types).
|
|
85
109
|
|
|
86
|
-
|
|
110
|
+
---
|
|
87
111
|
|
|
88
|
-
|
|
89
|
-
- `batch`, `order`, `payment`, `user`, `document`, `warehouse`, `shipment`
|
|
90
|
-
- `tip`, `payout`, `export`, `import`, `report`, `integration`
|
|
91
|
-
- **Any custom entity you want to track!**
|
|
112
|
+
### Customer Management
|
|
92
113
|
|
|
93
|
-
|
|
94
|
-
- `created`, `updated`, `deleted`, `processed`, `completed`
|
|
95
|
-
- `uploaded`, `generated`, `connected`, `disconnected`, `synced`
|
|
114
|
+
#### `createCustomer(account)`
|
|
96
115
|
|
|
97
|
-
|
|
116
|
+
Track new customer account creation (first-time signup).
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
await logoPulse.createCustomer({
|
|
120
|
+
accountId: 'account-123',
|
|
121
|
+
companyName: 'Acme Corp',
|
|
122
|
+
ownerEmail: 'owner@acme.com',
|
|
123
|
+
ownerFirstName: 'John',
|
|
124
|
+
ownerLastName: 'Doe',
|
|
125
|
+
phone: '+1-555-0100',
|
|
126
|
+
address: '123 Main St',
|
|
127
|
+
city: 'San Francisco',
|
|
128
|
+
state: 'CA',
|
|
129
|
+
country: 'USA',
|
|
130
|
+
postalCode: '94102',
|
|
131
|
+
});
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**When to use:** When a new business/company completes signup.
|
|
135
|
+
|
|
136
|
+
#### `updateCustomer(accountId, updates)`
|
|
137
|
+
|
|
138
|
+
Update customer account information.
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
await logoPulse.updateCustomer('account-123', {
|
|
142
|
+
companyName: 'Acme Corporation',
|
|
143
|
+
phone: '+1-555-0200',
|
|
144
|
+
});
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**When to use:** When account details change.
|
|
148
|
+
|
|
149
|
+
#### `addUser(user)`
|
|
150
|
+
|
|
151
|
+
Track when a user joins an existing account (additional seat).
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
await logoPulse.addUser({
|
|
155
|
+
accountId: 'account-123',
|
|
156
|
+
userId: 'user-456',
|
|
157
|
+
email: 'admin@acme.com',
|
|
158
|
+
firstName: 'Jane',
|
|
159
|
+
lastName: 'Smith',
|
|
160
|
+
role: 'admin',
|
|
161
|
+
});
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**When to use:** When user accepts invitation or is added to account.
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
### User Activity
|
|
169
|
+
|
|
170
|
+
#### `userLogin(accountId, data?)`
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
await logoPulse.userLogin('account-123', {
|
|
174
|
+
email: 'user@acme.com',
|
|
175
|
+
userId: 'user-456',
|
|
176
|
+
});
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**When to use:** On successful user authentication.
|
|
180
|
+
|
|
181
|
+
#### `userInvited(accountId, data)`
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
await logoPulse.userInvited('account-123', {
|
|
185
|
+
email: 'newuser@acme.com',
|
|
186
|
+
role: 'member',
|
|
187
|
+
});
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
#### `userAcceptedInvite(accountId, data)`
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
await logoPulse.userAcceptedInvite('account-123', {
|
|
194
|
+
userId: 'user-789',
|
|
195
|
+
email: 'newuser@acme.com',
|
|
196
|
+
role: 'member',
|
|
197
|
+
});
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
#### `userRemoved(accountId, data)`
|
|
201
|
+
|
|
202
|
+
```typescript
|
|
203
|
+
await logoPulse.userRemoved('account-123', {
|
|
204
|
+
userId: 'user-456',
|
|
205
|
+
});
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
### Integrations
|
|
211
|
+
|
|
212
|
+
#### `integrationConnected(accountId, data)`
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
await logoPulse.integrationConnected('account-123', {
|
|
216
|
+
integrationName: 'stripe',
|
|
217
|
+
});
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**When to use:** When customer connects Stripe, Shopify, etc.
|
|
221
|
+
|
|
222
|
+
#### `integrationDisconnected(accountId, data)`
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
await logoPulse.integrationDisconnected('account-123', {
|
|
226
|
+
integrationName: 'stripe',
|
|
227
|
+
});
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
### Subscription & Billing
|
|
233
|
+
|
|
234
|
+
#### `subscriptionStarted(accountId, data?)`
|
|
235
|
+
|
|
236
|
+
```typescript
|
|
237
|
+
await logoPulse.subscriptionStarted('account-123', {
|
|
238
|
+
plan: 'pro',
|
|
239
|
+
amount: 99.00,
|
|
240
|
+
interval: 'monthly',
|
|
241
|
+
});
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
**When to use:** When customer starts paying subscription.
|
|
245
|
+
|
|
246
|
+
#### `subscriptionUpgraded(accountId, data)`
|
|
98
247
|
|
|
99
248
|
```typescript
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
249
|
+
await logoPulse.subscriptionUpgraded('account-123', {
|
|
250
|
+
plan: 'enterprise',
|
|
251
|
+
amount: 299.00,
|
|
252
|
+
});
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
#### `subscriptionDowngraded(accountId, data)`
|
|
104
256
|
|
|
105
|
-
|
|
106
|
-
await
|
|
107
|
-
|
|
257
|
+
```typescript
|
|
258
|
+
await logoPulse.subscriptionDowngraded('account-123', {
|
|
259
|
+
plan: 'starter',
|
|
260
|
+
amount: 49.00,
|
|
261
|
+
});
|
|
262
|
+
```
|
|
108
263
|
|
|
109
|
-
|
|
110
|
-
await analytics.track('tip.received', accountId, { tipId, amount });
|
|
111
|
-
await analytics.track('payout.completed', accountId, { payoutId, driverId });
|
|
112
|
-
await analytics.track('delivery.completed', accountId, { deliveryId, duration });
|
|
264
|
+
#### `subscriptionRenewed(accountId, data?)`
|
|
113
265
|
|
|
114
|
-
|
|
115
|
-
await
|
|
116
|
-
|
|
266
|
+
```typescript
|
|
267
|
+
await logoPulse.subscriptionRenewed('account-123');
|
|
268
|
+
```
|
|
117
269
|
|
|
118
|
-
|
|
119
|
-
await analytics.track('user.signup', accountId, { email, name });
|
|
120
|
-
await analytics.track('user.login', accountId, { userId });
|
|
121
|
-
await analytics.track('subscription.activated', accountId, { plan, mrr });
|
|
122
|
-
await analytics.track('subscription.cancelled', accountId);
|
|
270
|
+
#### `subscriptionCancelled(accountId, data?)`
|
|
123
271
|
|
|
124
|
-
|
|
125
|
-
await
|
|
126
|
-
|
|
272
|
+
```typescript
|
|
273
|
+
await logoPulse.subscriptionCancelled('account-123', {
|
|
274
|
+
reason: 'switching to competitor',
|
|
275
|
+
});
|
|
127
276
|
```
|
|
128
277
|
|
|
129
|
-
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
### Trial Management
|
|
281
|
+
|
|
282
|
+
#### `trialStarted(accountId, data?)`
|
|
130
283
|
|
|
131
284
|
```typescript
|
|
132
|
-
|
|
285
|
+
await logoPulse.trialStarted('account-123', {
|
|
286
|
+
plan: 'pro-trial',
|
|
287
|
+
trialEndsAt: '2026-02-05T00:00:00Z',
|
|
288
|
+
});
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
#### `trialEnded(accountId, data?)`
|
|
292
|
+
|
|
293
|
+
```typescript
|
|
294
|
+
await logoPulse.trialEnded('account-123', {
|
|
295
|
+
converted: true,
|
|
296
|
+
});
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
#### `trialExpired(accountId)`
|
|
300
|
+
|
|
301
|
+
```typescript
|
|
302
|
+
await logoPulse.trialExpired('account-123');
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
### Feature Adoption
|
|
308
|
+
|
|
309
|
+
#### `trackFeature(accountId, featureName)`
|
|
310
|
+
|
|
311
|
+
Manually track feature adoption.
|
|
312
|
+
|
|
313
|
+
```typescript
|
|
314
|
+
await logoPulse.trackFeature('account-123', 'apiAccess');
|
|
315
|
+
await logoPulse.trackFeature('account-123', 'advancedReporting');
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
**When to use:** For features not automatically tracked via entity-to-feature mapping.
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
## Standard Actions
|
|
323
|
+
|
|
324
|
+
Use these standard actions with `track()` for consistent entity tracking.
|
|
325
|
+
|
|
326
|
+
**⚠️ IMPORTANT:** Only these actions are accepted by LogoPulse. Other actions will be rejected to ensure proper entity counting.
|
|
327
|
+
|
|
328
|
+
```typescript
|
|
329
|
+
import { StandardActions } from '@logopulse/sdk';
|
|
330
|
+
|
|
331
|
+
// Creation/Addition (increments count)
|
|
332
|
+
StandardActions.CREATED // 'created'
|
|
333
|
+
StandardActions.ADDED // 'added'
|
|
334
|
+
|
|
335
|
+
// Modification (no count change)
|
|
336
|
+
StandardActions.UPDATED // 'updated'
|
|
337
|
+
StandardActions.CHANGED // 'changed'
|
|
338
|
+
|
|
339
|
+
// Removal (decrements count)
|
|
340
|
+
StandardActions.DELETED // 'deleted'
|
|
341
|
+
StandardActions.REMOVED // 'removed'
|
|
342
|
+
StandardActions.CANCELLED // 'cancelled'
|
|
343
|
+
|
|
344
|
+
// Data Operations (increments count)
|
|
345
|
+
StandardActions.UPLOADED // 'uploaded'
|
|
346
|
+
StandardActions.DOWNLOADED // 'downloaded'
|
|
347
|
+
StandardActions.IMPORTED // 'imported'
|
|
348
|
+
StandardActions.EXPORTED // 'exported'
|
|
349
|
+
StandardActions.GENERATED // 'generated'
|
|
350
|
+
|
|
351
|
+
// Processing (increments count)
|
|
352
|
+
StandardActions.PROCESSED // 'processed'
|
|
353
|
+
StandardActions.FAILED // 'failed'
|
|
354
|
+
StandardActions.SYNCED // 'synced'
|
|
355
|
+
|
|
356
|
+
// Completion/Finalization (increments count)
|
|
357
|
+
StandardActions.COMPLETED // 'completed'
|
|
358
|
+
StandardActions.DELIVERED // 'delivered'
|
|
359
|
+
StandardActions.FULFILLED // 'fulfilled'
|
|
360
|
+
StandardActions.SHIPPED // 'shipped'
|
|
361
|
+
StandardActions.APPROVED // 'approved'
|
|
362
|
+
StandardActions.REJECTED // 'rejected'
|
|
363
|
+
StandardActions.CLOSED // 'closed'
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
**Examples:**
|
|
367
|
+
|
|
368
|
+
```typescript
|
|
369
|
+
// E-commerce SaaS
|
|
370
|
+
await logoPulse.track('order.created', accountId, { orderId, amount });
|
|
371
|
+
await logoPulse.track('order.fulfilled', accountId, { orderId });
|
|
372
|
+
await logoPulse.track('shipment.delivered', accountId, { shipmentId });
|
|
373
|
+
|
|
374
|
+
// Inventory SaaS
|
|
375
|
+
await logoPulse.track('product.created', accountId, { sku, name });
|
|
376
|
+
await logoPulse.track('product.updated', accountId, { sku, price });
|
|
377
|
+
await logoPulse.track('warehouse.added', accountId, { warehouseId });
|
|
378
|
+
|
|
379
|
+
// Reporting SaaS
|
|
380
|
+
await logoPulse.track('report.generated', accountId, { reportType });
|
|
381
|
+
await logoPulse.track('report.exported', accountId, { format: 'pdf' });
|
|
382
|
+
await logoPulse.track('dashboard.created', accountId, { dashboardId });
|
|
383
|
+
|
|
384
|
+
// Document Management SaaS
|
|
385
|
+
await logoPulse.track('document.uploaded', accountId, { fileSize });
|
|
386
|
+
await logoPulse.track('document.approved', accountId, { documentId });
|
|
387
|
+
await logoPulse.track('folder.created', accountId, { folderId });
|
|
388
|
+
|
|
389
|
+
// Support/Ticketing SaaS
|
|
390
|
+
await logoPulse.track('ticket.created', accountId, { ticketId });
|
|
391
|
+
await logoPulse.track('ticket.closed', accountId, { ticketId });
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
## Usage Examples
|
|
397
|
+
|
|
398
|
+
### Initialize in Your App
|
|
399
|
+
|
|
400
|
+
```typescript
|
|
401
|
+
// app.ts or index.ts
|
|
133
402
|
import { createLogoPulse } from '@logopulse/sdk';
|
|
134
403
|
|
|
135
404
|
createLogoPulse({
|
|
136
|
-
apiUrl: process.env.LOGOPULSE_API_URL,
|
|
137
405
|
apiKey: process.env.LOGOPULSE_API_KEY,
|
|
138
406
|
orgId: process.env.LOGOPULSE_ORG_ID,
|
|
139
407
|
});
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
### Use in Your Services
|
|
140
411
|
|
|
141
|
-
|
|
412
|
+
```typescript
|
|
142
413
|
import { getLogoPulse } from '@logopulse/sdk';
|
|
143
414
|
|
|
144
|
-
export class
|
|
145
|
-
async
|
|
146
|
-
const
|
|
415
|
+
export class OrderService {
|
|
416
|
+
async createOrder(accountId: string, data: CreateOrderData) {
|
|
417
|
+
const order = await db.orders.create(data);
|
|
147
418
|
|
|
148
|
-
// Track analytics (non-blocking, errors logged
|
|
419
|
+
// Track analytics (non-blocking, errors logged)
|
|
149
420
|
getLogoPulse()
|
|
150
|
-
.track('
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
quantity: batch.quantity
|
|
421
|
+
.track('order.created', accountId, {
|
|
422
|
+
orderId: order.id,
|
|
423
|
+
amount: order.total,
|
|
154
424
|
})
|
|
155
|
-
.catch(
|
|
425
|
+
.catch(console.error);
|
|
156
426
|
|
|
157
|
-
return
|
|
427
|
+
return order;
|
|
158
428
|
}
|
|
159
429
|
}
|
|
160
430
|
```
|
|
161
431
|
|
|
432
|
+
### Customer Onboarding Flow
|
|
433
|
+
|
|
434
|
+
```typescript
|
|
435
|
+
// 1. New company signs up
|
|
436
|
+
await logoPulse.createCustomer({
|
|
437
|
+
accountId: 'account-123',
|
|
438
|
+
companyName: 'Acme Corp',
|
|
439
|
+
ownerEmail: 'owner@acme.com',
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
// 2. Start trial
|
|
443
|
+
await logoPulse.trialStarted('account-123', {
|
|
444
|
+
trialEndsAt: '2026-02-05T00:00:00Z',
|
|
445
|
+
});
|
|
446
|
+
|
|
447
|
+
// 3. Connect integration
|
|
448
|
+
await logoPulse.integrationConnected('account-123', {
|
|
449
|
+
integrationName: 'stripe',
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
// 4. Create first entity
|
|
453
|
+
await logoPulse.track('product.created', 'account-123', {
|
|
454
|
+
productId: 'prod-789',
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
// 5. Convert to paid
|
|
458
|
+
await logoPulse.trialEnded('account-123', { converted: true });
|
|
459
|
+
await logoPulse.subscriptionStarted('account-123', {
|
|
460
|
+
plan: 'pro',
|
|
461
|
+
amount: 99.00,
|
|
462
|
+
});
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
---
|
|
466
|
+
|
|
162
467
|
## Error Handling
|
|
163
468
|
|
|
164
|
-
The SDK
|
|
469
|
+
The SDK logs errors but doesn't throw, so analytics failures won't break your app.
|
|
165
470
|
|
|
166
471
|
```typescript
|
|
167
|
-
//
|
|
168
|
-
await
|
|
472
|
+
// Errors are caught and logged internally
|
|
473
|
+
await logoPulse.track('order.created', accountId, data);
|
|
169
474
|
// Your code continues even if tracking fails
|
|
170
475
|
```
|
|
171
476
|
|
|
477
|
+
---
|
|
478
|
+
|
|
172
479
|
## Environment Variables
|
|
173
480
|
|
|
174
|
-
Set `SERVICE_NAME`
|
|
481
|
+
Set `SERVICE_NAME` to automatically tag events with their source:
|
|
175
482
|
|
|
176
483
|
```bash
|
|
177
|
-
export SERVICE_NAME=
|
|
484
|
+
export SERVICE_NAME=api-service
|
|
178
485
|
```
|
|
179
486
|
|
|
487
|
+
---
|
|
488
|
+
|
|
489
|
+
## TypeScript Support
|
|
490
|
+
|
|
491
|
+
Full TypeScript definitions included.
|
|
492
|
+
|
|
493
|
+
```typescript
|
|
494
|
+
import { LogoPulseConfig, CustomerAccount, User } from '@logopulse/sdk';
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
---
|
|
498
|
+
|
|
180
499
|
## License
|
|
181
500
|
|
|
182
501
|
MIT
|
package/dist/index.d.ts
CHANGED
|
@@ -48,6 +48,9 @@ export interface User {
|
|
|
48
48
|
/**
|
|
49
49
|
* Standard Action Verbs (OOTB)
|
|
50
50
|
* Use these for consistent entity event naming
|
|
51
|
+
*
|
|
52
|
+
* IMPORTANT: Only these actions are accepted by LogoPulse backend.
|
|
53
|
+
* Other actions will be rejected to ensure proper entity tracking.
|
|
51
54
|
*/
|
|
52
55
|
export declare const StandardActions: {
|
|
53
56
|
readonly CREATED: "created";
|
|
@@ -65,6 +68,13 @@ export declare const StandardActions: {
|
|
|
65
68
|
readonly PROCESSED: "processed";
|
|
66
69
|
readonly FAILED: "failed";
|
|
67
70
|
readonly SYNCED: "synced";
|
|
71
|
+
readonly COMPLETED: "completed";
|
|
72
|
+
readonly DELIVERED: "delivered";
|
|
73
|
+
readonly FULFILLED: "fulfilled";
|
|
74
|
+
readonly SHIPPED: "shipped";
|
|
75
|
+
readonly APPROVED: "approved";
|
|
76
|
+
readonly REJECTED: "rejected";
|
|
77
|
+
readonly CLOSED: "closed";
|
|
68
78
|
};
|
|
69
79
|
/**
|
|
70
80
|
* LogoPulse SDK
|
|
@@ -214,12 +224,10 @@ export declare class LogoPulse {
|
|
|
214
224
|
*/
|
|
215
225
|
trialExpired(accountId: string): Promise<void>;
|
|
216
226
|
/**
|
|
217
|
-
* Track
|
|
227
|
+
* Track feature adoption manually
|
|
228
|
+
* Use this for features that aren't automatically tracked via entity-to-feature mapping
|
|
218
229
|
*/
|
|
219
|
-
|
|
220
|
-
itemCount?: number;
|
|
221
|
-
source?: string;
|
|
222
|
-
}): Promise<void>;
|
|
230
|
+
trackFeature(accountId: string, featureName: string): Promise<void>;
|
|
223
231
|
}
|
|
224
232
|
export declare function createLogoPulse(config: LogoPulseConfig): LogoPulse;
|
|
225
233
|
export declare function getLogoPulse(): LogoPulse;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,IAAI;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -15,6 +15,9 @@ const LOGOPULSE_API_URL = 'https://8e0caintuk.execute-api.us-east-1.amazonaws.co
|
|
|
15
15
|
/**
|
|
16
16
|
* Standard Action Verbs (OOTB)
|
|
17
17
|
* Use these for consistent entity event naming
|
|
18
|
+
*
|
|
19
|
+
* IMPORTANT: Only these actions are accepted by LogoPulse backend.
|
|
20
|
+
* Other actions will be rejected to ensure proper entity tracking.
|
|
18
21
|
*/
|
|
19
22
|
exports.StandardActions = {
|
|
20
23
|
// Creation/Addition
|
|
@@ -37,6 +40,14 @@ exports.StandardActions = {
|
|
|
37
40
|
PROCESSED: 'processed',
|
|
38
41
|
FAILED: 'failed',
|
|
39
42
|
SYNCED: 'synced',
|
|
43
|
+
// Completion/Finalization
|
|
44
|
+
COMPLETED: 'completed',
|
|
45
|
+
DELIVERED: 'delivered',
|
|
46
|
+
FULFILLED: 'fulfilled',
|
|
47
|
+
SHIPPED: 'shipped',
|
|
48
|
+
APPROVED: 'approved',
|
|
49
|
+
REJECTED: 'rejected',
|
|
50
|
+
CLOSED: 'closed',
|
|
40
51
|
};
|
|
41
52
|
/**
|
|
42
53
|
* LogoPulse SDK
|
|
@@ -208,10 +219,11 @@ class LogoPulse {
|
|
|
208
219
|
await this.track('trial.expired', accountId, { converted: false });
|
|
209
220
|
}
|
|
210
221
|
/**
|
|
211
|
-
* Track
|
|
222
|
+
* Track feature adoption manually
|
|
223
|
+
* Use this for features that aren't automatically tracked via entity-to-feature mapping
|
|
212
224
|
*/
|
|
213
|
-
async
|
|
214
|
-
await this.track('
|
|
225
|
+
async trackFeature(accountId, featureName) {
|
|
226
|
+
await this.track('feature.tracked', accountId, { featureName });
|
|
215
227
|
}
|
|
216
228
|
}
|
|
217
229
|
exports.LogoPulse = LogoPulse;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|