Custom events
Anything you can attach a click handler to can be an event.
window.seean.track("signup");
window.seean.track("download", { file: "pricing.pdf" });
Events show up on the Overview (Events card), in the Events activity log, in funnels as steps, and in campaign reports when they match the enabled conversion goals (or all custom events when no goals are enabled). Properties are sent with the event, but the current activity-log table does not display them.
Naming
Use short, stable names: signup, cta_click, newsletter_signup. Renaming later splits your history.
Load before calling
Call track after the generated tracker script has executed. There is no built-in queue for calls made before loading. For plain HTML, place your application’s deferred script after the deferred Seean script; for a framework, follow its installation guide.
For a download button, attach the handler after that button exists:
document.querySelector("#download-pricing")?.addEventListener("click", () => {
window.seean?.track("download", { file: "pricing.pdf" });
});
This counts the click, not proof that a download finished. Optional chaining prevents an exception when the tracker is unavailable, but does not save or retry the event. An ignored visitor can have no-op tracker methods, so the presence of window.seean alone is not proof of collection.
For a form, call the tracker in your existing successful-submit path:
// After your server has confirmed the newsletter signup succeeded:
window.seean?.track("newsletter_signup", { form: "footer" });
Do not also send this success event from the submit-button click: validation or the request may fail, and wiring both would count successful submissions twice. Keep your form’s normal validation and error handling.
Declarative clicks and forms
Add data-seean-event="signup" to a button or link to send that event on click, including clicks on its nested elements. On a form, the attribute sends on submit instead of clicks on its fields. Dynamic elements work through delegated listeners. Automatic conversion presets skip marked elements to avoid double counting; do not also call seean.track() for the same action. Declarative attributes need no data-conversions opt-in. Names must be non-empty, at most 64 characters, and not pageview.
<button data-seean-event="download" data-seean-event-source="footer">Download</button>
<form data-seean-event="contact_submit">…</form>
Add data-seean-event-PROPERTY="value" to the same marked element to send a property. The example above sends { "source": "footer" }. Attribute values remain strings ("2" is not the number 2); HTML normalizes attribute names to lowercase. Only explicitly prefixed attributes on that element are read. Properties on ancestors or children, form field values and unrelated attributes are not collected. Changing an attribute before a later interaction uses its new value.
The existing property limits below apply. An invalid key, too many properties or oversized value causes the collector to reject the event; values are not silently truncated. Use the JavaScript API for typed number, boolean or null values.
A click or submit event does not confirm that your server completed the action. Use the success-handler method above when you need that confirmation.
Property limits
Event names accept up to 64 characters. Each event can include up to 20 properties; the serialized properties object must not exceed 4,096 characters. Property keys begin with a letter and contain only letters, numbers or underscores, up to 64 characters. Values can be a string of up to 512 characters, a finite number, a boolean or null. Nested objects and arrays are rejected.
Use non-sensitive labels such as a form location or product category. Never send passwords, email addresses, payment details or private tokens. Properties are not currently available as activity-log columns or dashboard property filters; sending a property does not create a new report control.
Verify an event
Perform the action once and open the selected website’s Events activity log in the current period. Check its name, pathname and count. Custom events use the same privacy signals, exclusions and collection quota as pageviews; a rejected or ignored request may leave no row. An event named pageview is counted as a view rather than a custom event.
If a row is missing, check script readiness, the request payload and installation troubleshooting. track() does not return an acknowledgment that storage succeeded, and the tracker does not provide a persistent retry queue.
404 pages
Add <meta name="seean:status" content="404"> to your not-found page and its automatic pageview carries status: 404, so it appears under Pages → 404s without a second event.
Calling track("pageview", { status: 404 }) instead adds a second pageview. See 404 tracking.
Something unclear? Contact support.