Data privacy and PII best practices
A three-phase framework for deciding what data to collect, identifying sensitive fields, and keeping your project's privacy posture healthy as it grows.
Overview
Privacy in analytics isn't one setting. It's a habit, applied every time someone adds an event.
Intempt gives you the controls: consent categories, data subject requests, role-based access, per-user privacy records. What enters the system is still your decision. This guide covers how to make that decision well.
Four principles hold the rest together:
| Principle | What it means in practice |
|---|---|
| Collect less | Track what supports a decision you actually make. A field nobody queries is pure liability. |
| Pseudonymize by default | Identify users by a stable internal ID, not an email address. If your internal ID is itself identifying, hash it with HMAC-SHA256 before sending. Pseudonymized data is still personal data. |
| Collect on purpose | Design tracking around the moments that matter, not around capturing everything a user does. |
| Share the responsibility | Intempt is your data processor. The tools are ours; the decision about what enters them is yours. |
How it works
Phase 1: Design and collection
Everything cheap happens here. A field you never send needs no governance, no classification, and no deletion request.
What counts as PII
Personally identifiable information is anything that identifies a person on its own, or does so when combined with something else. The obvious cases are names and email addresses. The less obvious ones cause more trouble.
| Category | Examples |
|---|---|
| Direct identifiers | Name, email address, phone number |
| Account identifiers | Internal user ID, account ID |
| Device and network identifiers | Device ID, advertising ID |
| Highly sensitive | Government ID numbers, payment card details, credentials |
Classifying risk before you track
Intempt collects data as events and as attributes on user and account profiles. The privacy risk lives almost entirely in the attributes you attach, not in the event itself.
| Risk | Examples | What to do |
|---|---|---|
| Low | Plan tier, device type, feature name, experiment variation | Track freely. These drive product decisions without identifying anyone. |
| Moderate | Email address, phone number, device ID | Track only with a business reason you can name. Set the attribute's Status to Hidden and restrict it with a custom role. |
| High | Government IDs, payment card details, passwords, API keys | Don't send it. There is no configuration that makes this safe. |
📘 Good to know
Intempt's position on highly sensitive data is that it shouldn't reach the platform at all. If a field in that row is genuinely required for a business process, that process belongs in your own systems, not in your analytics.
Do
- Use internal IDs. Identify users with a stable, non-identifying ID. See Why a single profileId matters.
- Keep a tracking plan. In Intempt the Events page is the plan: every event, its type, its sources, and how often it fires. See How to create an event tracking plan.
- Track value moments. Map events to activation, engagement, monetization, or retention rather than to every click.
- Describe every attribute. The Attributes page has Description and Example columns. An attribute nobody can explain is one nobody can govern.
Don't
- Don't send high-sensitivity fields. Not hashed, not encrypted, not "temporarily."
- Don't use email as an identifier. Email addresses change. Treat them as an attribute for contacting someone, never as the key that identifies them.
- Don't put PII in event names. An event called
signup_jane@acme.comis a permanent identifier in your schema, and it's unfixable after the fact. - Don't send unreviewed free text. Search boxes and form fields collect whatever users type, and users type their own names into search boxes.
Phase 2: Governance and access
Once data is in the project, the question changes from what you collect to who can see it.
Hide sensitive attributes
Every attribute on the Attributes page has a Status of Visible or Hidden. Hiding an attribute keeps it out of the default view without deleting the data or breaking anything that depends on it. Use it for anything in the Moderate row above.
See Managing attributes.
Separate environments
A project is a data silo. Every event, segment, and report belongs to exactly one project, and every query runs against one project at a time.
Use separate projects for production and testing, and never load real user identifiers into a test project. Note that the Free tier is limited to one project, so this needs Pro or above.
Grant the narrowest role that works
Intempt has two independent role systems: organization roles govern billing, members, and org settings; project roles govern the data inside one project. Where a preset doesn't fit, build a custom role scoped to either level and grant only the objects that role needs.
Start people at the minimum and add on request. It's much easier than taking access away later.
See Access management.
Review access on a schedule
The audit log records every action of consequence with actor, action, target, outcome, and severity. Retention runs from 7 days on Free to 730 days on Enterprise. Filter it by actor to see what one account did, or export to CSV for a security review.
Phase 3: Monitoring and maintenance
Tracking drifts. A field that was safe when it shipped starts carrying names when someone repurposes it.
Review on a cadence
Every quarter, check three things:
- New tracking. Which events and attributes were added since the last review, and did any of them introduce PII?
- Drift. Has an existing field started collecting something it didn't before? Free-text fields are the usual culprit.
- Dead weight. Which attributes are unused? Deprecate them. Every field you remove is one you never have to govern again.
If you find PII where it shouldn't be
- Stop the source. Fix the tracking call so nothing new arrives. This is the only step that stops the problem growing.
- Restrict what's there. Set the attribute's Status to Hidden and confirm which roles can still reach it.
- Filter it out of analysis. Events in Intempt are immutable. Create a Created event that applies a condition excluding the affected records, and use that in reports instead of the original.
- Tell the people who need to know. Legal and compliance decide whether this is reportable. That call isn't yours to make alone.
- Write down what changed so the same field doesn't come back next quarter.
Use cases
- A new event ships with a
user_emailproperty because it was convenient. Fix the tracking call, hide the attribute, and create a filtered event for reporting. - An analyst asks for access to a project containing customer phone numbers. Build a custom role that grants the objects they need and excludes that attribute.
- Your team is planning instrumentation for a new feature. Walk the PII checklist during the design review, before any code is written.
- A quarterly review shows 40 attributes, 12 of which no report has used in six months. Deprecate the 12.
- A search-query property starts showing up with people's names in it. Stop capturing the raw query, hide the attribute, and filter the affected events out of reporting.
- You're setting up a staging environment and need somewhere safe to test tracking. Create a second project and use synthetic identifiers only.
- Legal asks which attributes in the project count as personal data. Filter the Attributes page by Status and Description to produce the list.
- A user asks to be deleted. Submit an erasure request, then opt them out so new events stop arriving. See Managing DSR.
Where to go next
GDPR & CCPA Compliance Guide
How Intempt supports GDPR and CCPA compliance: reviewing and managing a customer's consent on their Privacy tab, and handling data subject requests under the OpenDSR framework.
PII checklist
A ten-section review checklist for tracking plans: minimization, identity safety, naming, access control, retention, and incident response, mapped to the Intempt controls that enforce each one.
