Help Center / Licensing
09 · Licensing
Measr phones home in precisely one place, and this page documents it down to the field level: what the license key is, when the check runs, the three values it transmits, what it can never touch, and why nothing you have installed ever stops working. This project is built on trust, so the check is built to be verified, not taken on faith.
Measr is self-hosted and source-available. Your analytics data lives in your own Supabase project, and Creative Data Engineers never receives, stores, or can access it. There are no accounts, no feature gates, and no lock-in: if you stop paying, everything you installed keeps working, forever. That model only works if subscriptions actually fund the work, and the fair exchange is simple: one license, one website.
The license check is the lightweight mechanism that keeps that exchange visible. It is not DRM. You have the full source code and could remove the check in a minute; we know that, and we ship it anyway. It exists so that honest use stays the easy default and a small, independent product stays funded and maintained. We trust you with the entire codebase. This is the small thing we ask in return.
At checkout you receive a permanent license key: msr_live_ followed by 32 random characters. It never expires and is never rotated. Renewals happen entirely on the Stripe side, so the key you got on day one stays valid for as long as your subscription does, and comes back to life if you ever resubscribe. In your install it is stored in a small .measr-license file in your website project (gitignored) and nowhere else.
The check runs in exactly two situations, both started by you, never by a visitor:
Each check is a single HTTPS request to measr.app's license endpoint containing exactly three values:
| Field | Example | Why it is sent |
|---|---|---|
licenseKey | msr_live_ab12… | Identifies the subscription. |
domain | example.com | The website the license covers. |
version | 1.5.0 | Your installed Measr version, so the response can tell you whether an update exists. |
That is the complete list. No analytics data, no visitor data, no page views, nothing from your database, and no personal data of yours beyond what Stripe already holds from your purchase. Like every HTTPS request, the connection carries your IP address; the endpoint uses it transiently for abuse protection and stores it only as a salted daily hash, never raw.
Your visitors are never involved. The tracking SDK that runs in visitors' browsers sends data only to your own Supabase project. It contains no license code and never contacts a Measr-owned server. You can verify this yourself: the license check appears nowhere in sdk/measr.js.
The endpoint answers with your subscription status, and the status gates exactly one thing: updates.
| Status | What happens |
|---|---|
| active | Updates proceed. |
| grace | A payment failed recently. Updates still proceed, with a reminder to check your payment method. |
| lapsed | The subscription ended, so updates pause. Your installed Measr keeps working exactly as-is, indefinitely: tracking, dashboard, and data are untouched. Resubscribing reactivates the same key, because validity lives on our side, not in the key. |
And the rule we consider load-bearing, the fail-open rule: if the license endpoint is unreachable or returns an error, updates proceed anyway. An outage on our side must never block a paying customer, and no license state can ever break your running analytics.
We do not ask for your domain at checkout. The first domain that checks in becomes the licensed domain. If checks later arrive from a different domain, nothing is blocked: the extra domain is recorded on our side and we may reach out, because one license covers one website. Moving your site to a new domain? Tell us at support@measr.app and we update the record.
The license endpoint accepts up to 120 requests per minute per IP address. That is abuse protection for the endpoint, not a usage quota: normal use is one check at setup and one per update run, and your visitors and your dashboard never talk to this endpoint at all. If a check is ever rate limited, the update assistant simply proceeds without it, the same fail-open rule as an outage. Operating at a scale where the limit could matter, like an agency running many installs or CI pipelines sharing one outbound IP? Email support@measr.app and we raise it for your key.
Every claim on this page is verifiable in the repository you already have access to as a customer:
supabase/functions/measr-stripe-webhook/index.tssupabase/functions/measr-license/index.ts.claude/skills/database/migrations/058_licenses.sqlThe repository also ships docs/LICENSING.md, the engineering-level version of this page. Questions about any of it: support@measr.app. We would genuinely rather explain it than have you wonder.