Keep secrets out of events
Never send:- Passwords or password-reset values
- Session cookies or authorization headers
- Access tokens, refresh tokens, or private API keys
- Payment card or bank-account details
- Private message bodies or document contents
- Full keystrokes or unredacted form submissions
- Raw error objects, request objects, or stack traces
Send only the customer data you need
Add aclient field only when the event needs it and the visitor’s consent state permits it.
Reduce errors to safe codes
Map internal failures to a small, reviewed vocabulary.error, error.message, request bodies, or user-generated content to the event.
Honor consent and deletion choices
- Start optional customer-data tracking only after you know the required consent state.
- Stop sending optional fields when consent changes.
- Keep your event catalog and privacy notice consistent.
- Apply your retention and deletion process to every identifier you send.
- Review new custom properties before releasing them.
Use browser identity only as context
getBilyTrackingId() returns a browser identifier. It does not prove account identity.
Never use it for authorization. Use a verified server session for protected actions.
Apply your content security policy
init({ nonce }) can copy your server-generated nonce to the script element. A nonce is a browser policy control, not an event property.
Never send it through track().
Review every tracking release
Before shipping a tracking change:- Inspect the exact event payload in a development environment.
- Remove fields that are not required for the stated analysis.
- Confirm no secret can enter through object spreading.
- Test signed-out, signed-in, and consent-denied states.
- Search the built browser assets for private tokens and credentials.
Client data guide
Choose supported customer fields and respect identity boundaries.
Privacy governance
Put ownership, classification, credential, and production controls in place.