The Vendor Lock-In You Don't Talk About
Every SaaS analytics platform makes the same implicit deal: give us your clickstream data, and we'll give you dashboards. It sounds reasonable until you realize what you've actually agreed to.
When you use Google Analytics, Mixpanel, Amplitude, or Heap, you are:
- Sending your raw behavioral data to a third party. Every click, scroll, page view, and conversion event flows to their servers. They store it. They process it. They own the infrastructure.
- Accepting their data model. You see the data in the dimensions and metrics they define. Want to combine signals in a way their UI doesn't support? Build a custom report -- if their API allows it.
- Paying for access to your own data. Export limits, API rate limits, data retention limits. Your data, their rules.
- Training their models with your data. GA4's data-sharing settings allow Google to use your data to improve its products and ads. Your behavioral data makes their ad platform better -- for their other customers, including your competitors.
If you're not paying for the product, you are the product. If you are paying for the product and they're still using your data, you're both the customer and the product.
What Data Ownership Actually Means
Data ownership isn't a philosophical concept. It has concrete, technical requirements:
| Requirement | SaaS Analytics (GA4, Mixpanel) | ClickStream |
|---|---|---|
| Data stored on your infrastructure | No -- their cloud | Yes -- managed infrastructure with open-format exports (CSV self-serve on Growth+, Parquet on request on Scale+) |
| Raw event access | Limited (BigQuery export for GA4, with quotas) | Yes -- raw-event Parquet export on request (Scale+); CSV self-serve (Growth+) |
| Data retention you control | No -- 14 months max for GA4 free (as of 2026) | Open-format exports let you retain history in your own warehouse for as long as you choose |
| Export without vendor permission | API rate limits, export quotas | CSV self-serve on Growth+; standard-format Parquet on request on Scale+ |
| Encrypted exports | No | Yes -- per-tenant export encryption (AES-256-GCM) |
| Can switch vendors without losing history | Difficult -- proprietary formats | Yes -- open formats (CSV, Parquet) |
| PII in analytics storage | Varies | Hashed identifiers only; contact fields AES-256-GCM encrypted with audited access |
ClickStream processes your data at the edge and stores events in Cloudflare Analytics Engine, with raw-event Parquet exports staged in R2. Raw-event Parquet export is available on Scale+ on request today (self-serve download is coming); CSV exports are self-serve on Growth+. Exports are encrypted per tenant with a key derived from your own tenant key, and you can read exported Parquet files with any tool that supports the format -- which is every modern data tool.
The Parquet Advantage
Why Parquet? Because it's the de facto standard for analytical data, and choosing it is a deliberate anti-lock-in decision.
What Parquet Gives You
- Columnar storage: Queries that touch 3 columns out of 50 only read those 3 columns. Orders of magnitude faster than row-based formats for analytical queries.
- Compression: Parquet files are often an order of magnitude smaller than equivalent CSV or JSON. A month of behavioral data for a mid-traffic site might be 500MB in Parquet vs. 5GB in JSON.
- Schema evolution: Add new fields without breaking existing queries. Old files still work when you add new behavioral scores.
- Universal compatibility: DuckDB, Apache Spark, Pandas, Polars, BigQuery, Snowflake, Databricks, Athena, Presto -- everything reads Parquet.
's Parquet Schema
Every exported event includes the behavioral context:
-- Illustrative export schema (abridged)
visitor_id STRING -- First-party cookie ID
session_id STRING -- Session identifier
timestamp TIMESTAMP -- Event time (UTC)
event_type STRING -- page_view, click, scroll, form, custom
page_url STRING -- Full URL
referrer STRING -- Previous page or external referrer
device_type STRING -- desktop, mobile, tablet
browser STRING -- Chrome, Safari, Firefox, etc.
-- Behavioral scores (abridged)
intent_score INT
engagement_score INT
frustration_score INT
purchase_timing INT
churn_risk INT
content_affinity INT
session_momentum INT
loyalty_trajectory INT
conversion_readiness INT
session_quality INT
attention_seconds INT
navigation_entropy FLOAT
form_friction INT
abandonment INT
emotional_state STRING
decision_stage STRING
bot_probability INT
-- Attribution
utm_source STRING
utm_medium STRING
utm_campaign STRING
click_id STRING -- gclid|fbclid|msclkid|ttclid
click_id_type STRING -- Platform identifier
-- Metadata
exported_at TIMESTAMP -- Export batch timestamp
This schema gives you everything: raw events, behavioral scores, and attribution data. All in a format that any data tool can read without vendor-specific connectors or proprietary SDKs.
Cost Comparison: SaaS Analytics vs. Owned Pipeline
The total cost of ownership (TCO) comparison is striking, especially at scale:
| Cost Category | GA4 (with BigQuery) | Mixpanel Growth | ClickStream |
|---|---|---|---|
| Base platform (100K monthly visitors ≈ Growth tier, 500K pageviews) | $0 (free tier) | $834/mo | $199/mo |
| Data export/warehouse | $200-500/mo (BigQuery) | $0 (included, limited) | $0 (CSV export included on Growth+; Parquet on request on Scale+) |
| Data retention beyond 14 months | BigQuery cost ($200-1000/mo) | Not available on Growth | Open-format exports to your own storage (~$15/TB/mo object storage) |
| Identity resolution | Not included | Limited (email only) | Included on paid tiers (identity graph with five signal layers, incl. quota'd resolutions) |
| Behavioral scoring | Not included | Basic (3-4 metrics) | Included (26 models) |
| Data ownership | Google owns it | Mixpanel hosts it | You own it |
| Total (100K monthly visitors, 1 year) | $2,400-18,000 | $10,008+ | $2,388/yr |
Competitor pricing and tier features as of mid-2026 -- check each vendor's pricing page for current rates.
At 1M monthly visitors, the gap widens further. SaaS analytics pricing scales with volume. Cloudflare lists R2 storage at $0.015/GB/month -- a rate that applies to your own storage after export. Once exported to your own storage, a year of behavioral data for 1M users costs roughly $50/month to keep -- on your infrastructure, on your terms.
The AI/ML Angle: Your Data, Your Models
This is where data ownership becomes a competitive advantage, not just a cost optimization.
When you export your behavioral data -- CSV self-serve on Growth+, or raw Parquet on request on Scale+ -- you can:
Train Custom Models
Use your historical behavioral data to train models specific to your business. A generic "purchase intent" model works. A model trained on your customers' purchase patterns works dramatically better. You know your domain. Generic vendor models don't.
# Example: Train a custom conversion model on your ClickStream data
import polars as pl
from sklearn.ensemble import GradientBoostingClassifier
# Read your exported ClickStream Parquet files
df = pl.read_parquet("s3://your-warehouse/clickstream/2026-01/*.parquet")
# Your behavioral scores become features
features = df.select([
"intent_score", "engagement_score", "frustration_score",
"purchase_timing", "session_momentum", "session_quality",
"attention_seconds", "conversion_readiness"
]).to_pandas()
labels = df.select("converted").to_pandas()
model = GradientBoostingClassifier(n_estimators=200)
model.fit(features, labels)
# Your model, trained on your data, predicting your conversions
print(f"Feature importance: {dict(zip(features.columns, model.feature_importances_))}")
Build Predictive Pipelines
Feed behavioral scores into your own ML pipelines for next-best-action recommendations, dynamic pricing, churn intervention timing, or content personalization. You can't do this with data locked in a vendor's dashboard.
Create Custom Audiences
Use behavioral clustering on your own data to create audience segments that no vendor's built-in segmentation can match. Combine behavioral scores with your CRM data, purchase history, and support interactions for a complete customer profile.
Run Competitive Analysis
Your behavioral data is proprietary. No competitor has it. Models trained on your specific customer behaviors give you insights that generic analytics can never provide. This is an actual competitive moat -- but only if you own the data.
The companies that will win the next decade of digital business are the ones that own their behavioral data and build proprietary models on top of it. You can't build a moat on rented land.
The Migration Path
Moving from SaaS analytics to an owned pipeline doesn't have to be a big-bang migration. Here's a pragmatic approach:
Phase 1: Parallel Collection (Week 1)
Add the ClickStream script tag alongside your existing analytics. Both systems collect data simultaneously. You lose nothing and start building your owned data lake from day one.
Phase 2: Validation (Weeks 2-4)
Compare ClickStream's behavioral data against your existing analytics. Verify visitor counts, conversion tracking, and attribution data match (they should, with ClickStream often showing higher returning-visitor recognition due to first-party cookies).
Phase 3: Model Building (Weeks 4-8)
Start training custom models on your exported data. Build dashboards using DuckDB or your preferred analytics tool. Create automated pipelines for your most important metrics.
Phase 4: Cutover (Week 8+)
Once your owned pipeline is producing better insights than your SaaS analytics (it will), remove the old tracking code. Your historical data is exportable -- CSV self-serve on Growth+, raw Parquet on request on Scale+ -- for use in any tool. No vendor transition required.
Data Sovereignty and Compliance
Owning your analytics pipeline also simplifies compliance:
- GDPR Article 17 (Right to Erasure): When a user requests deletion, you delete from your storage. No waiting for a vendor's support ticket queue. No wondering if they actually deleted it.
- GDPR Article 20 (Data Portability): Export the user's data from your Parquet files in any format. It's your data, in a standard format, on your infrastructure.
- CCPA/CPRA: Full visibility into what data you hold about each consumer. No vendor black box.
- Data Residency Requirements: EU-only or US-only data residency is available on Enterprise contracts. And because exports use open formats, you can move your data to your own regional infrastructure.
With ClickStream, analytics storage holds hashed identifiers only -- PII is scrubbed at the edge before events are stored. Raw contact fields are AES-256-GCM encrypted with audited, password-gated access, and raw-event exports are encrypted per tenant with a key derived from your own tenant key.
The Bottom Line
The analytics industry has normalized a model where you pay a vendor to collect your data, store it on their infrastructure, and charge you to access it. They use your data to improve their products. They limit your access through API quotas and export restrictions. And when you want to leave, your historical data either stays behind or comes out in a proprietary format that's expensive to migrate.
There's a better model:
- Collect data using first-party infrastructure -- your domain, your cookies, your edge workers
- Process at the edge -- the full 26-model scoring pass benchmarks at p95 under 3 ms per event (CI-enforced), with no origin round-trips
- Export your data in open formats -- CSV self-serve on Growth+, raw Parquet on request on Scale+, for use in your own tools and warehouses
- Build your models -- train on your data, create proprietary intelligence
- Control your compliance -- per-tenant export encryption, erasure-aware exports, and retention policies you control in your own warehouse
Your analytics data is one of the most valuable assets your company produces. Stop renting access to it. Own it.