TL;DR, Quick Answer
6 min readCustom dimensions close the gap between raw metrics and meaningful insight by attaching context like subscription tiers, content categories, and user roles to every visit and action in your analytics.
This guide explains the topic Custom analytics implementation with practical context. Pageviews only say that /docs received traffic; a custom analytics implementation says whether that traffic wanted API reference, migration steps or billing help, and which plan the reader was on.
Custom dimensions turn generic analytics into useful analytics. Pageviews tell you that /docs received traffic. A custom dimension can tell you whether that traffic was for API docs, migration docs, beginner guides, or enterprise setup pages.
The trick is to add business context without turning analytics into surveillance. Good custom dimensions are coarse, predictable, and tied to decisions. Bad custom dimensions are personal, free-form, and impossible to govern.
- /docs received traffic
- No signal on intent
- No way to compare plan tiers
- Traffic split by content_type: API reference, migration steps, billing help
- Visits tagged by plan_tier
- Answers questions default analytics cannot
What Custom Dimensions Are
A custom dimension is an extra attribute attached to an analytics event, pageview, or visit. Instead of reporting only default fields such as path, referrer, browser, and country, you can report by fields that match your product or content model.
Examples:
plan_tier: free, pro, business, enterprisecontent_type: blog, docs, comparison, changelogpage_category: pricing, onboarding, support, integrationaccount_age: new, active, maturerole: owner, admin, memberexperiment_variant: a, b
These are powerful because they answer questions default analytics cannot answer: Do enterprise visitors read security pages before booking a demo? Do free-plan users reach activation docs? Which content categories drive trial signups?

Choose Dimensions From Decisions
Do not start by asking "what can we track?" Start with decisions:
- Which marketing channels bring qualified traffic?
- Which docs reduce support tickets?
- Which product areas drive activation?
- Which plan segment converts from trial to paid?
- Which campaigns attract visitors who actually use the product?
Then define the smallest dimensions needed.
| Decision | Useful dimension | Avoid |
|---|---|---|
| Compare content strategy | content_type, topic | author email, reader ID |
| Improve onboarding | setup_stage | exact user checklist state |
| Segment B2B traffic | company_size_bucket | company name without need |
| Analyze pricing | plan_tier | individual contract value |
| Run experiments | experiment_variant | persistent cross-site ID |
Privacy Rules for Custom Dimensions
Custom dimensions are where analytics teams accidentally collect personal data. GDPR defines personal data broadly, and the CCPA covers information that can reasonably link to a consumer or household. A dimension does not need to be a name to create risk.
Avoid sending:
- email addresses
- names
- phone numbers
- account IDs
- raw user IDs
- wallet addresses
- IP addresses
- exact location
- invoice IDs
- support ticket text
- form field values
Prefer buckets and labels. Use company_size: 11-50 instead of an exact employee count. Use account_age: 30-90d instead of signup timestamp. Use country: DE instead of city-level location unless city is genuinely needed and lawful.
CNIL's audience measurement guidance is a useful benchmark: analytics data should not be combined with unrelated datasets or reused for targeting if you want to stay in low-risk territory.
Implementation Pattern
Define an event schema before shipping:
type AnalyticsContext = {
content_type?: 'blog' | 'docs' | 'pricing' | 'support';
plan_tier?: 'free' | 'pro' | 'business' | 'enterprise';
role?: 'owner' | 'admin' | 'member';
experiment_variant?: 'a' | 'b';
};Then attach dimensions consistently:
Flowsery
Start Your 14-Day Free Trial
Real-time dashboard
Goal tracking
Cookie-free tracking
analytics.track('signup_started', {
plan_tier: 'pro',
page_category: 'pricing',
experiment_variant: 'b',
});Keep values enumerable where possible. Free text is hard to validate, hard to translate, hard to aggregate, and easy to misuse.
Governance Checklist
Before adding a dimension, write down:
- Owner: who requested it and who maintains it.
- Question: what decision it supports.
- Allowed values: exact list or bucket logic.
- Privacy review: why it is not personal or why processing is lawful.
- Retention: how long it remains useful.
- Dashboard: where it will actually be used.
If nobody can name the dashboard or decision, do not add the dimension.
Common Use Cases
Content performance: Tag articles by topic, funnel stage, and content type. This shows whether privacy compliance guides, product tutorials, or comparison pages drive better conversions.
Product activation: Tag events by setup stage. For a SaaS product, workspace_created, integration_connected, and first_report_viewed often matter more than every click.
B2B qualification: Use coarse firmographic buckets from your own CRM only when appropriate. For example, compare self-serve, mid-market, and enterprise traffic without sending company names to analytics.
Experiments: Attach experiment name and variant to exposure and conversion events. Remove the dimension after the experiment ends if it has no ongoing value.

Reporting Tips
Do not slice every metric by every dimension. That creates tiny segments and false conclusions. Pick a primary dimension for each report:
- acquisition by
utm_source - conversion by
page_category - activation by
plan_tier - retention by
account_age - docs engagement by
content_type
Watch for high-cardinality values. If a dimension has thousands of unique values, it may be too granular, too personal, or too messy.
Implementation Sign-Off Checklist
Use this article as the step-by-step implementation guide. Before shipping custom dimensions, confirm:
- Each dimension has an owner, decision, allowed values, and retention expectation.
- Values are enumerable or bucketed where possible.
- No email, name, phone number, account ID, full IP address, token, invoice ID, or free-text form value is sent.
- High-cardinality fields are intentional and reviewed.
- Dashboards actually use the dimension.
- QA confirms the payload matches the event dictionary.
Custom dimensions are powerful because they add context. They become risky when they quietly add identity.
The Bottom Line
Custom dimensions are best when they add context, not identity. Use them to understand groups, pages, campaigns, and product stages. Keep them small, governed, and privacy-aware, and your analytics will become more useful without becoming more invasive.
A naming and value standard
Write a short standard before implementation. Dimension names should be lowercase, readable, and stable, such as page_category, plan_tier, content_type, or signup_source. Values should come from an allowlist whenever possible: pricing, docs, blog, starter, business, enterprise. Avoid values that expose a person, company, exact revenue, email domain, or free-text input.
Also decide how missing values appear. Use unknown or leave the property unset consistently; do not mix blanks, nulls, and custom labels across events. Messy dimension values create reporting errors and privacy review headaches. A clean standard makes custom dimensions easier to query, translate, document, and delete later.
Flowsery
Start Your 14-Day Free Trial
Real-time dashboard
Goal tracking
Cookie-free tracking
Frequently Asked Questions
What is a custom dimension in analytics?
A custom dimension is an extra attribute attached to an event, pageview, or visit, on top of default fields like path, referrer, browser, and country. It lets you report against your own product or content model, such as plan_tier or content_type. That context turns a generic pageview count into something you can act on.
How is a custom dimension different from a default analytics field?
Default fields come baked into the analytics tool: path, referrer, browser, country. Custom dimensions are ones you define yourself, matched to your product, like role, page_category, or experiment_variant. They answer questions the defaults were never built to answer.
How many custom dimensions should a site track?
Keep the count small and governed rather than tracking everything available. Each one needs an owner, a decision it supports, and a dashboard where it actually gets used. If nobody can name the dashboard or the decision, skip it.
Can a custom dimension carry a raw user ID?
Raw user IDs, account IDs, and similar identifiers belong on the avoid list because they turn a dimension into personal data. Use buckets and labels instead, like company_size: 11-50 rather than an exact count. The goal is context, not identity.
What's the difference between account_age and a signup timestamp?
A signup timestamp is exact and traceable back to one person. account_age bucketed as something like 30-90d gives the same analytical value, whether a user is new or established, without the precision that creates privacy risk. Buckets over exact values is the general rule for custom dimensions.
Who should own a custom dimension?
Every dimension needs a named owner, the person who requested it and maintains it going forward. That sits alongside the decision it supports, its allowed values, a privacy review, and a retention plan in the governance checklist. Without an owner a dimension drifts and nobody notices when it breaks.
Should a custom dimension be removed after an experiment ends?
Yes. Experiment name and variant are attached to exposure and conversion events while the test runs, but once it's over the dimension has no ongoing value. Removing it keeps the schema clean and avoids accumulating dimensions nobody checks anymore.
What is high cardinality and why does it matter for custom dimensions?
High cardinality means a dimension has thousands of unique values instead of a manageable set. That's a sign it's too granular, too personal, or too messy to be useful in a report. Watch for it and treat it as a signal to bucket the values or reconsider the dimension.
Is free text an acceptable value for a custom dimension?
Free text is hard to validate, hard to translate, hard to aggregate, and easy to misuse, so enumerable values are preferred wherever possible. An allowlist like pricing, docs, blog, starter, business, enterprise keeps a dimension queryable and easier to review for privacy. Support ticket text and other free-form fields are explicitly on the list of things to avoid sending.
How does CNIL's audience measurement guidance apply to custom dimensions?
CNIL's guidance treats analytics data as low-risk only when it isn't combined with unrelated datasets or reused for targeting. That's a useful benchmark for custom dimensions specifically, since it's easy to add a field that quietly turns analytics into something closer to profiling. Sticking to context that supports a decision, not identity, keeps a dimension inside that low-risk territory.
Was This Article Helpful?
Let us know what you think!
See us more often in Google
One click marks Flowsery as a preferred source, so our articles sit higher in your Top Stories, AI Mode, and AI Overviews.
Before you go...
Flowsery
Revenue-first analytics for your website
Track every visitor, source, and conversion in real time. Simple, powerful, and cookie-free.
Real-time dashboard
Goal tracking
Cookie-free tracking
Related Articles


A Practical Guide to Web Analytics Terms
Custom dimensions attach business context to analytics events. What they are good for, what they quietly break, and the naming rules that keep schemas clean.
A Practical Guide to Ab Testing Tracking
This AB testing tracking guide shows how to compare variants with tags, measure conversions, and run lightweight experiments in privacy-focused analytics.


Key Insights - Best WordPress Plugin for Analytics
The best WordPress plugin for analytics depends on where the data should live: Google's Site Kit, self-hosted Matomo, cookieless Koko, or Jetpack Stats.

