Nanolytica Cloud Docs
Everything you need to set up privacy-first analytics for your websites, mobile apps, smart TVs, and IoT devices.
1. Quick start
Set up your first site in four steps:
- Create an account — enter your name, email and password, then verify the six-digit code sent to your email. No credit card required.
- Add a site — click "Add site" in the dashboard. Choose Website for web properties or Native App for mobile, TV, or IoT.
- Install the tracker — for websites, add the script tag. For native apps, integrate the collect API. Both are shown in the Setup tab.
- View your data — analytics start appearing within seconds. Real-time visitor count updates live via WebSocket.
Working with colleagues? Invite them to your team to share analytics with Read only or Full access.
2. Web tracking
Add this script tag to every page you want to track:
Replace YOUR-SITE-UUID with your site's UUID from the dashboard Setup tab.
What gets tracked
| Metric | Description |
|---|---|
| Page views | URL path of each page visited |
| Engagement time | Active time on page (pauses when the tab is hidden or unfocused) |
| Scroll depth | Maximum scroll percentage reached (0–100) |
| Referrer | Where the visitor came from (cleaned domain) |
| Screen size | Viewport dimensions (e.g. 1920x1080) |
| User agent | Parsed into browser, OS, and device type |
| UTM params | All 5 UTM parameters captured at document load and retained on its pageviews, updates and custom events |
SPA support
The script automatically detects single-page application navigations via the History API. Each virtual page change sends a new pageview. Duration tracking continues seamlessly across SPA transitions.
Script attributes
| Attribute | Required | Description |
|---|---|---|
| data-site-id | Yes | Your site's UUID |
| defer | Recommended | Load script without blocking page render |
3. Native API & SDKs
For mobile apps, smart TVs, IoT devices, and any platform with HTTP access, send JSON requests directly to the collect endpoint.
Client SDKs
Choose an SDK for screen views and custom events. Create a Native App site in Setup, copy its UUID, and configure the SDK with your Nanolytica instance's base URL. The SDK appends /api/collect; do not include that path in the endpoint. Set a generic app user agent such as MyApp/1.2.3 (Android 14), without account or device identifiers.
| SDK source | Requirements and setup |
|---|---|
| Swift / Apple platforms | iOS 14+, macOS 11+, tvOS 14+. Add the SDK repository in Swift Package Manager and select the Nanolytica library. Call start, then pageview or track. |
| Android / Kotlin | Android API 24+, Java 17. Include the source as a Gradle library module. Initialize with your application context; call pageview or install the optional ActivityAutoPageview helper. |
| React Native | React Native 0.72+. Build the source package with npm ci and npm run build, then install its local directory in your app. Call Nanolytica.init; the optional attachNavigation helper tracks route changes. |
| Go | Go 1.22+. Import github.com/Nanolytica/nanolytica-golang-sdk. Create a client with New, check its error, and defer Close to finish pending send attempts. |
| C / POSIX | C99, CMake, libcurl and pthreads. Build with CMake and link libnanolytica. Initialize a client, record pageviews or events, then flush and free it after callers stop. |
Follow each source repository's README for installation and examples. Use a reviewed commit when pinning a source dependency; package-registry publication is separate from source availability.
Delivery and app lifecycle
Queues are bounded and drop older pending events when full. Network errors and HTTP 408, 429 and 5xx responses use bounded retries; permanent validation failures are dropped. Flush waits for send attempts, not confirmation that analytics have reached the dashboard. Android flush returns false if it times out or delivery remains incomplete; Go Flush accepts a cancellation context.
Swift and Android can save pending events to app storage. React Native persistence requires an AsyncStorage-compatible adapter. Call persist when your app backgrounds. Mobile optOut clears pending and saved events and prevents further retries; requests already received cannot be recalled. Reinitializing clears the memory queue, and saved events are isolated by site and endpoint. Go and C applications control consent by deciding whether to initialize and send events. Restore your app’s consent choice before initializing or sending; the SDK opt-out flag itself is not persisted.
What these SDKs measure
SDK calls record screen/page views and named events with optional properties and numeric values. They do not automatically measure engagement, scroll depth or Web Vitals. Swift, Android, React Native and Go accept campaign fields on pageviews; event attribution fields and engagement samples require the direct API. The C wrapper currently exposes basic pageviews and events. See the request fields below for integrations needing additional dimensions.
Use coarse screen names and properties, without personal information. The SDKs do not add persistent visitor IDs. Geography and anonymous visitor estimates use the network address of the sender: requests relayed by a backend describe that backend's connection, not the original visitor. For browser traffic, use the browser tracker. Buffered legacy SDK events receive the server arrival time, so offline replay can shift activity into a later period and retries can duplicate observations.
HTTP API (direct)
Send a screen view from any HTTP client. Use your analytics origin and the site UUID from Setup:
Request fields
| Field | Type | Required | Description |
|---|---|---|---|
| site_id | string | Yes | UUID of your site |
| path | string | No | Screen or page path (e.g. /home, /settings). Max 2048 UTF-8 bytes. |
| referrer | string | No | Traffic source or referring URL. Max 2048 UTF-8 bytes. |
| user_agent | string | No | App identifier (e.g. MyApp/1.2.3). Parsed for app version. Max 512 UTF-8 bytes. |
| screen_size | string | No | Format: WIDTHxHEIGHT (e.g. 390x844) |
| duration_sec | int | No | Engagement time in seconds. 0 for initial pageview, updated later. Max 86400. |
| scroll_depth | int | No | Max scroll percentage (0–100) |
| utm_source | string | No | Campaign source. Takes priority over referrer. Max 256 UTF-8 bytes. |
| utm_medium | string | No | Campaign medium (e.g. email, cpc). Max 256 UTF-8 bytes. |
| utm_campaign | string | No | Campaign name. Max 256 UTF-8 bytes. |
| utm_content | string | No | Ad content identifier. Max 256 UTF-8 bytes. |
| utm_term | string | No | Paid keyword term. Max 256 UTF-8 bytes. |
Response codes
| Status | Meaning |
|---|---|
| 204 No Content | Request processed; also returned for ignored requests, including Do Not Track and unknown sites. It does not confirm a database write. |
| 400 Bad Request | Validation error (invalid UUID, field too long, etc.) |
| 429 Too Many Requests | Collector or per-site rate limit exceeded |
A 503 Service Unavailable response means the collector could not queue the record. Respect Retry-After before retrying. Delivery is best-effort; retries can create duplicates.
Duration updates
For a simple native integration, send the initial screen view with duration_sec: 0, then send one engagement record with the same path and the total active duration when the screen closes. Records without sample identifiers are counted independently; repeated cumulative updates can distort averages.
Site types
When creating a site, choose Website or Native App. For Native App, select Mobile, TV or IoT:
- Website — full dashboard with Sources, Scroll Depth, and all web metrics
- Mobile App — Pages becomes Screens, Browsers becomes App Versions
- TV App — same as mobile, optimized labels for smart TV apps
- IoT Device — same as mobile, for embedded devices and kiosks
Native app types hide web-only sections like Sources and Scroll Depth.
4. UTM campaign tracking
Nanolytica automatically captures all 5 standard UTM parameters from URL query strings:
| Parameter | Example | Purpose |
|---|---|---|
| utm_source | newsletter | Traffic source (merges with referrer) |
| utm_medium | Marketing medium (email, cpc, social, etc.) | |
| utm_campaign | spring_sale | Campaign name or promotion |
| utm_content | hero_cta | Differentiates ad variations or links |
| utm_term | analytics+tool | Paid search keyword |
Example tagged URL
How it works
- Document-level attribution — UTM parameters are captured once when the document loads and included on its pageviews, engagement updates and custom events. SPA route changes retain that attribution. A full document navigation captures parameters again; without parameters, the new document has no campaign attribution.
- Source merging —
utm_sourcetakes priority over the document referrer. If present, it replaces the organic referrer in the Sources section. - Aliases —
refandsourceare recognized as aliases forutm_source. - Plus decoding — Raw + and %20 decode to spaces; %2B decodes to a literal plus. For example, C%2B%2B is reported as C++.
Campaign values are limited to 256 UTF-8 bytes each. The browser omits oversized values and automatic properties so they cannot invalidate the whole event. Oversized page paths are grouped as /[oversized-path]. Native clients must respect the API limits.
Sources sub-tabs
The dashboard Sources section provides 5 sub-tabs:
- All — combined referrer + utm_source data
- Medium — breakdown by utm_medium
- Campaign — breakdown by utm_campaign
- Content — breakdown by utm_content
- Term — breakdown by utm_term
Filtering by UTM
Use the filter bar buttons for Medium and Campaign to filter your entire dashboard by a specific UTM dimension. This lets you see exactly which pages, devices, countries, and other metrics are associated with a particular campaign.
Native app UTM
For native apps, repeat the same campaign fields on the initial screen view, its engagement update and related custom events. Campaign filters apply to each record; omitting fields from an engagement update excludes it from that campaign’s duration report.
Send both of these payloads to /api/collect, replacing the site UUID:
Initial screen view:
{"site_id":"YOUR-SITE-UUID","path":"/pricing","duration_sec":0,"utm_source":"newsletter","utm_campaign":"spring_sale"}
Engagement update:
{"site_id":"YOUR-SITE-UUID","path":"/pricing","duration_sec":30,"utm_source":"newsletter","utm_campaign":"spring_sale"}5. Dashboard
The dashboard is your central view for all analytics data. It loads at /dashboard/ after signing in.
Overview
When you have multiple sites, the Overview tab shows all your sites at a glance with sparkline graphs and key metrics. Click any site to view its full dashboard.
Visitor stats
The main chart shows unique visitors, total visits, and page views over time. Select time periods from Today, Yesterday, Last 7/30/90/180/365 days, or a custom date range. The dashboard uses the selected timezone, initially detected from your browser.
Real-time visitors
A WebSocket connection pushes live visitor counts to the dashboard. The green counter updates automatically without polling or page refresh.
Dimension sections
Below the chart, the dashboard breaks down your traffic by:
- Pages — top pages by visitors (click to see per-page breakdown)
- Sources — referrers and UTM data with sub-tabs
- Countries — geo distribution with flag icons
- Browsers — Chrome, Firefox, Safari, etc. (or App Versions for native)
- OS — operating system breakdown
- Devices — desktop, mobile, tablet
- Screen Sizes — viewport dimensions
- Scroll Depth — how far visitors scroll on average
Country tracking
Countries are estimated from the visitor IP using a GeoIP database. The Locations section includes visits with a country match; private or unrecognized addresses may have no location. A missing country does not prevent the visit from being counted. Location data describes an approximate country, not a precise physical position.
Filtering
Click any dimension value (e.g. a country name, a browser) to filter the entire dashboard by that value. Multiple filters can be combined with AND or OR logic. Active filters appear in the filter bar and can be cleared individually. See Advanced filters for operator syntax.
Bot detection
Nanolytica detects bots and crawlers using 55+ patterns (Googlebot, Bingbot, social media crawlers, monitoring tools, etc.). Bot traffic is tracked separately and shown in the Bots tab. It does not pollute your real visitor data.
Combined views
Create a combined view in the site switcher, choose two or more sites, and give the view a name. Select that saved view to aggregate its web and native properties.
6. Behavioral insights
The Insights tab provides advanced behavioral analytics powered by the existing visits data. No additional tracking or configuration is needed.
Journey
Visualizes the most common page-to-page transitions. Shows top entry pages (where visitors land first), top exit pages (where they leave), and the most frequent navigation paths between pages. Useful for understanding how visitors flow through your site.
Funnels
Define multi-step conversion paths to track user progression and drop-off. For example:
Funnels use ClickHouse's windowFunnel engine for accurate sequential matching within a 24-hour window. Each step must be visited in order by the same visitor. Drop-off rates and conversion percentages are shown for each step.
Create and manage funnels from the Insights tab. Funnel definitions are stored per-site and persist across sessions.
Retention
A color-coded cohort grid showing what percentage of visitors return over time. Cohorts are grouped by the week or month of first visit. Each cell shows the return rate for that period.
High retention rates (darker colors) indicate strong engagement. Use this to measure the impact of content changes, campaigns, or product updates on visitor loyalty.
Sessions
Browse individual visitor sessions with page-by-page timelines. Each session shows:
- Pages visited in order with timestamps
- Time spent on each page
- Scroll depth per page
- Entry source and browser/device info
Sessions group activity by a salted visitor identifier and UTC day. Visitor identifiers are derived from IP address and user agent, so shared networks or changes in either can affect counts.
Performance
The Performance sub-tab shows Core Web Vitals data. See Core Web Vitals for full details.
7. Advanced filters
Every filterable dimension supports six comparison operators, expressed through a URL-safe prefix syntax that is fully backwards-compatible with plain exact-match filters.
| Operator | URL prefix | Example | Meaning |
|---|---|---|---|
| eq | (none) | Chrome | Exact match (default) |
| neq | ! | !Chrome | Not equal |
| contains | ~ | ~hrome | Substring match |
| not_contains | !~ | !~bot | Does not contain |
| starts_with | ^ | ^/blog | Prefix match |
| regex | /pattern/ | /^(Chrome|Firefox)$/ | RE2 regular expression |
Filterable dimensions
All operators work across these 12 dimensions: path, browser, os, device, referrer, screen_size, country, utm_source, utm_medium, utm_campaign, utm_content, utm_term.
AND / OR logic
By default all active filters are combined with AND logic (visitor must match every filter). Add ?match=any to the URL to switch to OR logic (visitor must match at least one filter).
URL examples
8. Core Web Vitals
The Performance sub-tab under Insights shows real-user Core Web Vitals collected automatically from supporting browsers. No configuration required.
Collected metrics
| Metric | Full name | Good | Needs work | Poor |
|---|---|---|---|---|
| LCP | Largest Contentful Paint | < 2.5 s | 2.5 – 4 s | > 4 s |
| INP | Interaction to Next Paint | < 200 ms | 200 – 500 ms | > 500 ms |
| CLS | Cumulative Layout Shift | < 0.1 | 0.1 – 0.25 | > 0.25 |
| FCP | First Contentful Paint | < 1.8 s | 1.8 – 3 s | > 3 s |
| TTFB | Time to First Byte | < 800 ms | 800 ms – 1.8 s | > 1.8 s |
Thresholds follow Google's official Core Web Vitals guidelines. Each metric card shows the p75 value (the 75th percentile) alongside the sample count for the selected period.
Per-page breakdown
Below the summary cards, a table lists average vitals for each document pathname that has data. SPA route changes keep performance metrics associated with the original document; they do not measure a fresh document load. A back/forward-cache restore starts a new measurement lifetime.
Browser support
Vitals are collected via the PerformanceObserver API. Unsupported browsers (e.g. Firefox for INP) simply send no data for that metric — the sample count will be zero and the card is hidden. Vitals are sent as separate cumulative updates when measurements change and when the page becomes hidden. Updates replace earlier samples in reports and do not add pageviews.
9. Events & goals
Track conversions beyond pageviews: fire custom events from any page, optionally attach props and a numeric value, then define goals to roll them up into completion rates and revenue.
Automatic outbound and download URLs contain origin and pathname only. Referrers contain origin only. Queries, fragments and credentials are removed. Cancelled clicks are excluded, including middle clicks; an accepted click does not confirm that a navigation or download completed. Avoid sensitive values in URL paths and in custom properties you supply explicitly.
Firing custom events
The loaded tracking snippet exposes window.Nanolytica.track(). It remains callable without collecting data under Do Not Track, localhost and automation exclusions:
Nanolytica.track('cta_click');Nanolytica.track('signup', { plan: 'pro', source: 'pricing-page' });Nanolytica.track('purchase', { plan: 'pro' }, { value: 49.99 });- Event name — max 64 UTF-8 bytes, matches
^[a-zA-Z0-9_-]+$ - Props — up to 10 key/value pairs; keys ≤ 64 UTF-8 bytes, values ≤ 256 UTF-8 bytes
- Value — optional number; summed per goal for revenue reporting
- Reserved prefix — names starting with
nanolytica_are reserved for the built-in auto-tracking below
Auto-tracking (outbound, downloads, 404)
Three click-and-page auto-events ship with the snippet. Opt in by adding data-* attributes to your script tag, or toggle them for each site under Setup → Auto-tracking:
<script defer src="https://nanolytica.org/nanolytica.js" data-site-id="YOUR-UUID" data-track-outbound data-track-downloads data-track-404></script>| Attribute | Event fired | Props |
|---|---|---|
| data-track-outbound | nanolytica_outbound | url, host |
| data-track-downloads | nanolytica_file_download | url, ext |
| data-track-404 | nanolytica_404 | path, referrer |
Download-matching wins over outbound-matching to avoid double counts. 404 fires when the page contains <meta name="nanolytica-404" content="1"> — add that to your 404 template and the event fires on page load.
Goals
Define goals from Insights → Goals. Two kinds:
- Pageview — matches visitors whose visits hit a path. Match operators:
eq,starts_with,contains,regex. - Event — matches visitors who fired a named event. Optional prop filters (
eq/neq/contains) narrow the match further.
Each goal shows completions, unique visitors, conversion rate (denominator = period-filtered unique visitors), and — for events carrying a value — revenue total in the site's configured currency. Goals respect the dashboard period selector, timezone, and active filters.
Revenue currency
Each site has a display currency (default USD) set under Setup → Revenue currency. Supported: USD, EUR, GBP, JPY, CAD, AUD, TRY, INR, BRL, CHF. There is no currency conversion — values are stored as-is and assumed to be in the site's currency.
Goals on public dashboards
When public mode is enabled for a site, the Goals sub-view is read-only and visible on the public URL. Delete and "New goal" buttons are hidden; completion counts, conversion rates, and revenue totals render the same as the authenticated view.
CSV export
The dashboard CSV export gains a # Goal Completions section listing each goal with its kind, completions, unique visitors, conversion rate, and revenue column header tagged with the site currency.
10. Public dashboards
Any site can be made publicly accessible via a shareable URL. Public dashboards show the same stats, charts, dimension breakdowns, and behavioral insights as the authenticated dashboard — without requiring login.
Enabling
Toggle the "Public" switch in the site settings within the dashboard. This generates a public URL:
What's included
- Visitor chart with period selection
- All dimension breakdowns (pages, sources, countries, browsers, etc.)
- Behavioral insights (journey, retention, sessions)
- CSV export
- Dimension filtering
Funnels are not available on public dashboards as they require site ownership to define.
11. CSV export
CSV exports use your selected interval, timezone and active filters. They include visitor totals, views per anonymous visitor, measurement coverage and traffic timing.
Understanding Visitors metrics
Views per visitor divides pageviews by anonymous visitor estimates; it is not pages per visit. Measured engagement uses positive page-engagement samples, not session duration. Average scroll depth is not a percentage of visits reaching a threshold.
Page, source and country percentages use all views in the filtered interval. Other means results outside the top list; Unknown means no value was recorded. Traffic sources prefer campaign source over referrer, and Direct means no referrer attribution. Realtime remains site-wide and is based on sample timestamps.
The dashboard uses the available screen width, with navigation on the left on desktop and a Menu button on smaller screens. Site actions and date controls remain available. The trend is the first analytics panel and spans the full width, followed by headline metrics and the other panels. Audience and technology cards use wider rows, with up to three cards per row.
Period comparison, Traffic timing, Weekday and hour activity, and Measurement coverage start open. You can collapse each independently; your choices remain during dashboard refreshes. The compact Traffic sources card uses All, Medium, Campaign, Content and Term tabs. Use the arrow keys to switch tabs; the selected tab survives refreshes.
Period comparison shows current and previous values, changes and exact intervals. Green upward and red downward changes indicate numerical direction, not whether traffic quality improved. A zero baseline has no growth percentage; unavailable engagement samples are identified. Traffic timing shows leading hours, weekdays and dates in your timezone, plus averages weighted by covered hours or days. Partial periods and daylight-saving changes affect coverage; a traffic peak does not prove a campaign or holiday effect.
Enable Compare previous period above the trend chart to show a dashed comparison line. Previous observations shift forward by the interval's elapsed duration into the current calendar buckets, so clock hours can differ across daylight-saving changes. Different units use separate axes. Missing measurements and future current buckets appear as gaps; recorded zeroes remain zero.
Weekday and hour activity has its own panel with a 7×24 table of average views per covered hour, total views and covered hours. Partial hours are weighted, repeated daylight-saving hours count twice, and future time is excluded. A dash means no covered time. The table scrolls on phones, works with a keyboard, and is included in CSV exports.
Measurement coverage shows country availability, page sample IDs and engagement updates among recorded observations. It does not estimate how much real-world traffic was missed, and page sample IDs do not identify people.
Included data
The CSV export contains sections for each dimension:
- Pages (path, visitors, avg. time, avg. scroll depth)
- Sources / Referrers (source, visitors)
- UTM Medium, Campaign, Content, Term (when data exists)
- Browsers, OS, Devices, Screen Sizes (name, visitors)
- Countries (country, visitors)
The file is named with your site name and the selected date range.
12. AI reports
The Reports tab summarizes a selected site and period with headline metrics, highlights and suggested next steps. The model runs entirely in your browser. Analytics are not sent to an external AI service for report generation.
How it works
- The dashboard fetches a compact JSON snapshot of the period's stats from
/dashboard/api/report-data. - Choose a Qwen3 model (Apache-2.0 license). WebLLM runs it on your GPU in a worker so the page remains responsive. Thinking mode is disabled for concise reports. The status badge shows WebGPU or WASM.
- Tokens stream into the page as the model writes. The result can be exported as a PDF.
First use
- Qwen3 4B — Quality: about 2.3 GB to download; roughly 3.4 GB of GPU memory with half-precision support.
- Qwen3 1.7B — Balanced: about 1 GB to download; roughly 2 GB of GPU memory.
- Qwen3 0.6B — Lightweight: about 400 MB to download; roughly 1.4 GB of GPU memory. Its CPU option uses a separate download of about 640 MB.
The menu suggests a model using WebGPU support, reported device memory and estimated storage quota. These checks happen locally. Browsers cannot reliably report free GPU memory, so the suggestion is an estimate and you can override it. Your manual choice is remembered. The estimates above are base model requirements; longer reports need additional memory. GPU memory requirements are higher without half-precision support.
Click Load model to download only your selection. An available-storage check runs first. Downloads are cached when possible, but cached models still need time to load. Clearing site data, private browsing or browser cache eviction can require another download. Chrome has no fixed 2 GB per-site limit; the applicable quota and physical free space depend on the device.
Without WebGPU, choose Qwen3 0.6B to run on the CPU through Wllama. If a GPU model fails to load, you can choose a smaller model or use the CPU button. CPU generation is slower; a fallback download only starts after you choose it.
Read the local AI walkthrough and try the public demo before loading a model for your own data.
Generating a report
- Select a single site and period. For custom dates, choose both dates and press Apply.
- Switch to the Reports tab and click Generate report.
- Watch the report stream with an Executive Summary, Key Metrics table, Key Insights and practical recommendations. Acquisition, content, conversion and audience sections appear when supported by the data. Sparse data produces a shorter report.
- Click Download PDF to export.
Reports include pageview shares, views per visitor and the busiest hours, weekdays and dates in your dashboard timezone. Timing ranks total pageviews in the selected interval; partial days and unequal weekday coverage can affect the results. A standout date is a reason to check your campaign or event calendar, not proof that a holiday or campaign caused the traffic.
Reports distinguish observations, interpretations and hypotheses, suggest privacy-safe investigations, and explain measurement gaps before a short Bottom Line. Without comparison data, the metrics table shows current values only. Separate aggregate breakdowns cannot establish journeys or attribute conversions to sources. Recommendations favor existing aggregates, anonymous events and coarse segments, never fingerprinting or identifying visitors.
After loading a model, use Ask about your analytics to ask questions about the selected site, period, timezone and filters. No report generation is required. Each question loads fresh aggregate data and includes a limited amount of recent conversation for follow-ups. Changing the selection or model clears the conversation; Clear chat starts over manually. Chat stays in the current page and is not included in the report PDF. Questions and answers run locally, and limited or omitted data is not evidence of zero activity.
The prompt distinguishes pageviews from visitors, preserves metric units and excludes unsupported comparisons with prior periods. Large breakdowns are shortened to fit the model. Download and generation times depend on your connection, memory, device and selected model. Generated summaries may contain errors; check their claims against the dashboard before sharing.
Privacy guarantees
- No third-party API. No OpenAI, no Anthropic, no hosted LLM. The model runs locally using WebGPU or the CPU fallback.
- No inference traffic. Analytics JSON comes from your dashboard. Model and runtime downloads contact external hosts; analytics is not sent to an inference service.
- Cached locally. Model files are cached by the active runtime in browser storage. Clearing site data removes the local cache.
Browser requirements
On iPhone and iPad, the smallest model is suggested and all three model choices remain available. WebGPU support depends on the browser; the smallest model also offers CPU mode. Memory pressure during loading or generation may reload the page, including in CPU mode. Browsers that do not report device memory also receive the smallest model suggestion. Available storage is not a measure of free working memory.
If an AI task is interrupted by a reload, reopening the same dashboard in the same tab returns to Reports with an explanation when session storage is available. The task is not restarted automatically. This recovery does not save generated text or chat.
After a caught error or interrupted task, open Last AI diagnostic in Reports and choose Copy diagnostic. It includes the model, runtime, task stage, browser version, context size and available capability readings. It excludes analytics, prompts, chat, account details and raw error text. Diagnostics stay in tab-local session storage and are not sent automatically. A reload or navigation can also interrupt a task, so an interrupted diagnostic is not proof of a crash or memory exhaustion.
Use a current browser with WebAssembly support and enough free memory for the model. WebGPU acceleration depends on the browser and device. The dashboard sets Cross-Origin-Opener-Policy: same-origin and Cross-Origin-Embedder-Policy: require-corp on authenticated pages so the browser permits SharedArrayBuffer for the WASM runtime — this is required for multi-threaded inference.
13. Privacy & data handling
Nanolytica reduces the data needed to measure traffic. The visitor tracker and the signed-in dashboard have different storage needs.
Read the privacy architecture covering the request-to-report flow, public sharing and deletion behavior.
Cookie-free visitor tracking
The visitor tracker does not set cookies or use localStorage or sessionStorage. The dashboard uses cookies for sign-in and security, and browser storage for preferences and downloaded AI models.
Visitor identifiers
Raw IP addresses are used for country lookup, then hashed with a per-site salt before analytics storage. A separate visitor identifier is derived from the IP address and user agent. The site salt does not rotate daily; daily session identifiers group activity by UTC date. These identifiers are pseudonymous and can link visits across days.
Do Not Track
The browser tracker skips collection when Do Not Track is enabled. The collector also discards requests carrying DNT: 1 and returns 204 No Content.
Keep sensitive values out of events
Do not include names, email addresses, account IDs or secrets in page paths, campaign tags, event names or custom properties. Automatically collected outbound and download URLs exclude query strings, fragments and credentials, but path values and explicitly supplied properties still need care.
Data retention
Analytics records have a 365-day retention period. ClickHouse removes expired records during background processing. Account data, application logs and backups have separate storage lifecycles.
Your deployment
Describe your analytics use in your privacy notice and review the data you send, access settings and retention practices. Cookie-free collection alone is not a guarantee that a deployment meets every privacy or consent requirement.
14. Teams & permissions
A team is a shared workspace for sites, goals, funnels, and combined views. Membership applies to every current and future site in that team. Access is set per team, not per site; use separate teams when different groups need access to different sites.
Your account starts with a default team. Existing accounts keep their sites, tracking configuration, and analytics when teams are introduced. You can create more teams under Settings → Team → Create a team.
Choose an access mode
| Access | What members can do |
|---|---|
| Read only | View analytics, reports, goals, funnels, and combined views; export data. Cannot change shared resources or manage members. |
| Full access | Everything in Read only, plus create, edit, and delete sites, goals, funnels, and combined views; change site settings; invite people and change or remove non-owner members. |
Each team also has one owner with Full access. Only the owner can transfer ownership or delete the team. The owner cannot be removed or demoted. Ownership is separate from the two access modes offered when inviting someone.
Members manage their own profile, password, and personal preferences regardless of their team access mode.
Invite someone by email
- Select the team in the dashboard, then open Settings → Team. You need Full access or ownership to send invitations.
- Enter the person's email address, choose Read only or Full access, and select Send invitation.
- The recipient opens the email link and signs in with the invited email address. New users can register and verify their email before returning to the invitation.
- The recipient selects Accept invitation to join. Opening the link alone does not add them to the team.
Invitations expire after seven days and require a matching verified email address. Under Pending invitations, choose Resend for a fresh link or Revoke to cancel. Resending invalidates the previous link. If you are signed in with a different email address, sign out and use the invited account.
Switch teams and manage access
Use the Team selector in the dashboard to switch workspaces. Your access can differ between teams, and separate browser tabs can use different teams.
Owners and Full-access members can change a non-owner's access mode under Members and select Save, or select Remove to end their access. Removing a member does not delete their personal account or the team's shared resources.
Leave, transfer ownership, or delete
Non-owner members can select Leave team in Team settings. A new invitation is needed to return. Owners must transfer ownership to another member before leaving; the former owner remains a Full-access member after the transfer.
The owner can open Ownership and team deletion to transfer ownership or delete the team. Deletion requires the team name and the owner's current password. It permanently removes the team, sites, goals, funnels, combined views, and invitations, and stops tracking for those sites. Members keep their personal accounts. Historical analytics remain in storage until the existing retention period expires.
Deleting your personal account does not delete shared team data. Before deleting your account, transfer ownership or explicitly delete every team you own.
Not seeing new visits?
Check that the script URL and site UUID match the Setup tab. The browser tracker skips localhost, automation and Do Not Track visits. Inspect the collect request for validation errors or rate limits. If visits appear but countries are empty, ask the deployment administrator to check the GeoIP database and trusted-proxy configuration.
Review the tracking setup →