Privacy & data handling
What Annot8 stores, what it deliberately never collects, your consent obligations, and how to get data out or delete it.
This page describes how the product behaves. It is not legal advice, and it does not replace the privacy policy, the DPA, or the subprocessor list.
Two independent systems
Feedback and Analytics are separate, and it matters:
| Feedback | Analytics | |
|---|---|---|
| On by default | Yes, once installed | No |
| Consent and notices | Deliberate submission; applicable notices and permissions still required | Prior permission through the host consent signal |
| Collects | What the reviewer submits, plus page and device context | Pageviews, sessions, sources, devices, events |
| Identifier | The reviewer's name, or their account | A random per-browser id |
Core feedback collection does not require Analytics, and turning Analytics off takes nothing away from feedback.
A deliberate submission is not blanket consent for everything visible in a screenshot or recording. Site operators must determine the lawful basis and provide applicable notices and permissions, including for other people's data, workplace monitoring, children, and confidential communications. Do not submit PHI to Annot8's current service. Browser permission to use a microphone or share a screen does not establish that everyone recorded agreed to it.
Consent
Analytics only runs when both are true:
- An admin enabled Analytics in Project → Settings → Features.
- The page passed
data-analytics-consent="true"(or calledinitwithanalyticsConsent: true).
Don't hard-code that attribute for visitors in the EEA or the UK. Wire it to your consent-management platform. If your site is directed at children, take legal advice about the additional consent requirements before installing the widget at all.
Describing Annot8 in your own privacy and cookie notices is your responsibility as the site operator — you're the controller for the data your visitors submit.
Even with consent passed, the widget never starts Analytics in a browser that
sends a Global Privacy Control signal or
Do Not Track (DNT=1), or in headless and automated browsers. Blocked Analytics
does not create measurement identifiers and removes the optional identifiers
for that project.
To withdraw consent, re-initialise with analyticsConsent: false. Once the
project configuration loads, the widget removes the host-page Analytics keys.
Your consent handler should also clear them if the widget cannot load. These
keys are each suffixed with the project id: ca_visitor_id:<projectId>
(localStorage), and ca_session_id:<projectId>, ca_session_start:<projectId>,
and ca_session_activity:<projectId> (sessionStorage). Withdrawal stops
future collection; deleting previously delivered server records requires the
project deletion controls or a rights request.
Browser storage
Annot8 sets no cookies on your site. It uses localStorage and
sessionStorage:
| Where | Keys | Why |
|---|---|---|
| Your site | ca_visitor_id:<projectId>, ca_session_*:<projectId> | Analytics, only once enabled and consented |
| Your site | annot8-widget-position | Where the visitor dragged the launcher |
| The widget frame (served from Annot8) | a8_visitor_id:<projectId>, a8_visitor_contact:<projectId> | Reconnect a visitor to their live chat; their name and email, if given |
| The widget frame | annot8-theme-override, annot8-pins-hidden:<projectId>, annot8-emoji-recent | Display preferences |
| The portal | annot8:voter, annot8:portal-identity, annot8:portal-following | One vote per post, the name and email they entered, and what they follow |
Everything visitor-specific in the widget is scoped per project, so a name or email typed on one site is never offered to another. The full list, with durations, is in the Cookie & Storage Notice.
Emails to your visitors
Two features email visitors on your behalf, and only when the visitor gave an email address:
- Portal followers get status changes, official replies, and changelog updates for posts they follow.
- Live chat email follow-ups send a team reply the visitor hasn't read yet. They're on by default; switch them off in Live chat → Settings.
Every one of these emails has an unsubscribe link and one-click unsubscribe headers. Describe them in your privacy notice like any other email you send.
What's minimised or excluded by default
- URLs are stripped of query strings, hash fragments, and any embedded credentials before storage — those routinely carry tokens and personal data. Analytics also redacts email addresses and token-shaped path segments.
- No IP addresses in Analytics. Country is a two-letter code from the hosting edge; the IP address itself isn't stored for Analytics.
- Form fields are masked in screenshots: every
input,textarea,select, content-editable region,iframe,video, and anything marked[data-private]. - Your app's storage is not read. The storage snapshot is filtered to Annot8's own keys and records key names only.
- No keystroke capture and no session replay.
- No microphone during a screen recording. A voice note is always a separate, deliberate action.
Add your own redactions with data-annot8-redact, data-annot8-ignore, or
window.annot8RedactSelectors — see
Widget configuration.
Screen recording is a browser-level capture and cannot be redacted automatically. Test your exclusions on every browser and page state you support.
Visitor-facing AI is off unless you opt in
AI that talks to your visitors — live chat auto-replies and transcription of visitor-submitted media — is fail-closed. It requires the project's audience to be Business users aged 18+ and visitor AI to be enabled on the deployment. Team-facing AI is unaffected. See AI features.
Retention
| Data | Retained |
|---|---|
| Feedback threads | Visible for your plan's window — 14 days on Free, 90 on Pro, unlimited on Business and Enterprise |
| Analytics events and sessions | Deleted automatically after 13 months |
| Integration credentials | Until you disconnect the integration |
Plan history limits control visibility, not deletion — threads outside the window stop appearing and reappear if you upgrade. Deletion controls are separate. Analytics cleanup runs in bounded batches for records older than 13 months; 13 months is the cleanup threshold, not a guaranteed maximum deletion time. Backups, provider records, legal holds, and independent billing records require their own retention and deletion handling.
Getting your data out
| Want | Do |
|---|---|
| A project's threads | Export CSV from the project inbox |
| A continuous feed | An outbound webhook |
| Your personal data | Account & privacy → Download your data — a JSON export including temporary download links for your files |
Deleting data
| Delete | Where | Effect |
|---|---|---|
| A thread | The inbox | Removes that thread |
| All Analytics data | Analytics → Privacy & data | Erases every event, session, and aggregate for the project; funnel definitions stay |
| A project | Settings → Danger zone | Removes the project and its feedback, permanently |
| Your account | Account & privacy | Closes your account |
| A workspace | Account & privacy | Owner only |
Project and account deletion are not reversible.
Subprocessors
Annot8 relies on Clerk (authentication), Convex (database, functions, file storage), Vercel (hosting and AI Gateway), OpenAI (AI through Gateway), Resend (email), Sentry (error monitoring when configured), and Polar (merchant of record). Optional site analytics providers are disclosed separately from customer widget analytics. The current list, with locations and vendor terms, is at www.annot8.app/subprocessors.
Integrations you connect — Slack, Jira, a webhook endpoint — receive data under your instructions. Depending on the arrangement, they may be your processor or an independent controller. Document the destination contracts, permissions, notices and deletion handling. Choosing a destination does not remove Annot8's duties for its own subprocessors.
Requests and contacts
| For | |
|---|---|
| Privacy and data subject requests | privacy@annot8.app |
| Security reports | security@annot8.app |
| Contracts, DPAs, security review | sales@annot8.app |