Custom Events
Track signups, purchases, video plays, or any other interaction using the Pulse JavaScript API.
Custom events let you measure specific actions beyond pageviews. Call window.pulse.track() from anywhere in your JavaScript.
Basic usage
// Event name only
window.pulse.track('signup')
// Event name with properties
window.pulse.track('signup', { plan: 'pro', source: 'landing' })Event names are trimmed and lowercased before storage. 'Sign Up' and 'signup' are treated as the same event.
Properties
Properties let you segment events in the Goals panel. Any event can carry up to 30 properties. Each key is limited to 200 characters and each value to 2000 characters.
window.pulse.track('purchase', {
product: 'annual_plan',
currency: 'USD',
amount: '99'
})Property values are stored as strings. If you pass a number or boolean, it will be coerced to a string before storage. Use consistent key names across calls for clean segmentation in the dashboard.
Viewing event data
Custom events appear in the Goals panel. Click any event to drill down into its property breakdown. Properties are displayed as filterable dimensions — for example, you can see signups broken down by plan.
Rate limits
| Limit | Value |
|---|---|
| Events per session per minute | 60 |
| Events per site per minute | 1,000 |
Calls that exceed these limits are silently dropped on the client. If you are bulk-tracking server-side interactions, use the server-side API instead.
Built-in auto-events
The following event names are reserved — they are fired automatically by the tracking script and frustration extension. You cannot fire them manually (calls will be ignored):
| Event | Fired by |
|---|---|
outbound_link | Core script (with url property) |
file_download | Core script (with url property) |
404 | Core script (with page path) |
rage_click | Frustration extension |
dead_click | Frustration extension |
Calling before the script loads
If you need to queue events that fire before the script has initialised, use the pulseQueue array:
window.pulseQueue = window.pulseQueue || [];
window.pulseQueue.push(['track', 'early_event', { context: 'above-fold' }]);The script drains the queue on load. Events in the queue do not count toward rate limits until processed.
Do not include personally identifiable information (email addresses, names, user IDs that map to real identities) in event properties. Pulse is designed to be free of personal data — storing PII in events undermines your GDPR/CCPA compliance posture.