What is AnalyticsTrend
Privacy-first product analytics for websites, browser extensions, and mobile, desktop and server apps. It answers what people actually do in your product, the paths they take and how many of them come back, without collecting anything about who they are. A website installs the web SDK or one script tag, a browser extension installs the extension SDK, and an iOS, Android, desktop, server or game app sends the same events over HTTP, with no SDK: see Install in an app. They all report into the same dashboard, so a product and the site that sells it can sit in one account.
Why not a general analytics tool
Two reasons, and the first one only applies to extensions. A conventional analytics snippet loads more JavaScript from the vendor's servers at runtime, which is remote code execution. Chrome's Manifest V3 disallows it outright, and Mozilla's add-on reviewers reject it manually. An extension shipping one is not merely slower to approve; it is rejected, and the reason is often reported in terms that do not name the cause.
This SDK is a package you bundle. Nothing is fetched at runtime.
The second reason applies to both. General analytics tools identify people — with a cookie, a device fingerprint, or both — which is what puts a cookie banner on a website and what makes an extension's privacy disclosure something reviewers read twice. Nothing here identifies anyone, and there are no cookies. The random identifier below is still kept on the device, though, and in some places, the EU among them, that can need consent on its own; see Analytics without cookies.
What it collects
- A random identifier generated on first run and kept in your extension's or site's own storage. It is not derived from anything about the device or the person, and it is scoped to you alone, so it cannot be joined to any other extension or site.
- The event names you choose to send, with whatever properties you attach.
- A country, resolved from the request's IP address, after which the address is discarded rather than stored. In 21 countries it also records the region: a state, province or territory from a fixed list. Never a town. The only cities that appear are the few that are states or provinces in their own right, such as Washington, D.C., Berlin or Mexico City. The countries are Argentina, Australia, Austria, Belgium, Brazil, Canada, Denmark, France, Germany, India, Ireland, Italy, Japan, Mexico, the Netherlands, Norway, Poland, Spain, Sweden, the United Kingdom and the United States. Everywhere else, only the country.
- The browser family, operating system family and device type, such as Firefox on Android on a phone, read from the request's User-Agent, which is then discarded. A native app, whose User-Agent names none of them, declares its operating system family and device type itself, from the same lists. Never a version: each extra detail would make one browser easier to pick out.
- The language the browser asks pages in, as a primary language such as Portuguese, read from the request's Accept-Language header, which is then discarded. Never the region part (the BR of pt-BR) or the rest of the preference list.
- The version of your extension, site or app, when one is sent: an extension sends its manifest's version. It is your own release number, never anything about the device or the person.
From an app, the name of each screen it shows, as the app names it, when it sends a screen_view: never anything about the person.
Traffic from search-engine crawlers and headless browsers is dropped before it is stored, so it never counts as a visitor. On websites, a browser that sends Global Privacy Control is not counted at all, unless you turn that off. Extensions honour it too, where the browser lets an extension see the signal.
On websites, from @analyticstrend/web 0.2.0, the SDK also records where a visit came from and which pages it moved between, so that traffic sources and page flow work without your writing any code:
- The referring site's hostname —
thatblog.com, never a full URL. Browsers only send the hostname across origins anyway. - The campaign parameters on the landing URL:
utm_source,utm_medium,utm_campaign,utm_content,utm_term, andreforsource. - The name of an advertising click parameter (
gclid,msclkid,fbclid) when one is present — never its value, which is a per-click token that says nothing useful about the source. - The current page's path, and on a page view the previous page's path.
- From 0.6.0, how long a page was visible: a number of milliseconds, sent when the page is hidden or closed, or when a single-page app moves to another page. It carries no identity beyond the random identifier every event has, and is what visit duration and bounce rate are counted from. Never from an extension.
Only those parameter names are read. The rest of the query string is never looked at, which matters because query strings routinely carry email addresses and one-time tokens. If you would rather have none of it, init({ autoCapture: false }) turns the whole of it off; see the web SDK reference.
From 0.5.0, a site can also turn on link events, each off until it does: the hostname of another site a visitor follows a link to, never the page's address; the name of a file they download; and that they tapped an email or phone link, never the address or number. See link events.
From 0.7.0, a site can also turn on form submissions, off until it does: a form_submit event each time a form is sent, with $form, the form's own id or name. Never a field, what was typed or where the form is sent. See form submissions.
Goals and funnels count what is already collected and collect nothing more. A funnel shows totals per step only, and withholds any step fewer than 5 visitors reached.
Every report table downloads as CSV. An Admin can also download the raw events of the last 90 days, with each visitor's identifier replaced by a token that matches within that file only.
An AI assistant can read the reports through MCP, with a personal access token an Admin allows and that expires within 6 months: it gets the totals the screens show, never raw events or an identifier. See connect an AI assistant.
No cookies. No fingerprinting. No IP addresses kept. Nothing about who people are unless you put it in an event property yourself, which the naming guide asks you not to do.
What this site measures
analyticstrend.com counts its own visits with AnalyticsTrend, under the same rules as any customer's site: no cookies on visitors, nothing that identifies anyone, and page paths with every id and token replaced by its name. On top of page views it sends these events, none of which carries an account, a project, an email address or anything typed:
signed_up: an account was created.signup_failed: the signup form was turned back, with a broad reason only: invalid details, an address already in use, the daily limit, the field meant for bots, or an error on our side.signed_in: someone signed in.sign_in_failed: a sign-in was turned back. It never says whether the address has an account.password_reset_requested: the forgot-password form was sent.password_reset_completed: a password was changed through a reset link.email_confirmed: a login's email address was confirmed.project_created: a project was made, with its kind, website or extension.install_code_copied: the install command, code or write key was copied, with the project's kind.first_event_received: a project's first event arrived while its overview was open.cta_clicked: a sign-up or demo button was clicked, with where it was.disclosure_copied: the store disclosure helper's manifest, draft or link was copied.outbound_link_clicked: a link to another site was followed, naming the site only if it is one of a short list.docs_code_copied: a code block in these docs was copied.article_finished: the end of an article was reached.
Signing up, signing in or creating a project sets a cookie, at_just, that says which of them just happened. It lasts one minute and is removed as soon as the next page has read it.
Working as a team
An account holds your projects and the people who can see them, each with a Read, Write or Admin role, and one login can belong to several accounts. Verify your company's email domain and the account becomes an organization, with anyone outside the domain labelled External. See your account, members and roles and organizations.
What it costs
A free trial, with no card: free until paid plans open, then three months for each new account. Plans start at US$9, C$12 or €9 a month; see Plans and usage.
Where the data lives
Canada, on infrastructure we run.