Subprocessors & Data Retention
What this page is. A single, fast-reference list of every third party GEO Tracker AI sends personal data to, why, what categories of data they receive, and how long we keep data ourselves. It is a code-verified companion to the fuller Privacy Policy (Section 5, Subprocessors and Third-Party Recipients; Section 7, Data Retention) and the Data Processing Addendum (Section 6, Sub-processors; Annex 1). Where wording differs, the Privacy Policy is the governing document — we keep this page in sync as the underlying system changes. We are not SOC 2 or ISO 27001 certified, and nothing on this page should be read as a compliance certification; it is a description of what we actually built, checked against the code that runs in production.
1. Subprocessors
These are the providers we route personal data through to operate the Service, derived directly from the integrations wired into the codebase (not a marketing list). Each acts as our processor (or, for the internal Slack notification below, as a recipient we control directly) under its own terms and DPA where applicable. Processing locations are stated per each vendor's own public documentation — we have not independently audited their infrastructure, and say so explicitly wherever we could not verify it further.
| Subprocessor | Purpose | Data categories | Processing location |
|---|---|---|---|
| Supabase, Inc. | Authentication, primary PostgreSQL database (row-level-security protected), session storage | Account/identity data, hashed passwords, and effectively every product record we store (domains, queries, scan results, billing metadata) — Supabase is our system of record. | EU (Frankfurt), per Supabase's public documentation — not independently verified beyond that. |
| Vercel Inc. | Application hosting, CDN, serverless/edge functions, build infrastructure, Cron; Vercel Analytics and Speed Insights (consent-gated, see Section 4) | Request metadata (IP address, User-Agent) as an ordinary function of serving HTTP traffic; we do not separately persist raw request IPs in our own database (see Section 3). | USA / global edge network, per Vercel's public documentation. |
| Stripe Payments Europe, Limited | Payment processing, billing, subscription management, fraud prevention | Billing/subscription metadata, invoice data, last-four card digits and card brand. We never receive or store full card numbers or CVV — that stays with Stripe under PCI-DSS. | EU + USA, per Stripe's public documentation. |
| OpenAI, L.L.C. | Helper LLM calls used throughout the product — mention and claim classification, competitor extraction, query generation, content-angle enrichment, onboarding domain understanding, content briefs, and the Brand Hallucination Check's claim extractor/comparator. Also the coded fallback path for the ChatGPT scan engine, though that engine runs primarily through DataForSEO's scraper today (see below). | Prompt/query text we construct, scraped page text used as LLM input, and model outputs (classifications, generated queries, extracted claims). No account credentials or payment data. | USA, per OpenAI's public documentation. |
| Perplexity AI, Inc. | Running Perplexity Sonar scans — the paid-tier engine and the sole engine behind the public EN Free GEO Snapshot grader. | Query text we send, and the response text/citations Perplexity returns. | USA, per Perplexity's public documentation. |
| DataForSEO | ChatGPT and Gemini LLM-scraper engines, Google AI Mode, Google AI Overview, People-Also-Ask/keyword-volume lookups, and the query battery behind the CZ, SK, and DE grader tools. | Query text plus the market/language code we ask it to run against (e.g. DataForSEO's numeric location code and a two-letter language code). No account identifiers or personal data of the site visitor are included in these calls. | EU / USA, per DataForSEO's public documentation — not independently verified further. |
| Resend | Transactional e-mail, weekly report e-mails, Business alert e-mails, and grader/Snapshot/Hallucination-Check result e-mails (EN, CZ, SK, DE). | Recipient e-mail address and the content of the e-mail sent (which may include your GEO Score, scan summaries, or grader results). | EU / USA, per Resend's public documentation. |
| PostHog (EU Cloud) | Product analytics — autocaptured pageviews and clicks, session recording, heatmaps, and a set of explicitly named funnel events (signup, onboarding steps, scan completion, grader runs, upgrade clicks). Traffic is proxied same-origin through /ingest so the calls are first-party. | Pageview/click/session-replay data for every visitor; once you sign up, your Supabase user ID and e-mail address are attached to your PostHog profile via identify(), which stitches your prior anonymous activity to your account. Verified gap: unlike Vercel Analytics/Speed Insights, PostHog is currently initialized unconditionally on every page load and is not gated by the analytics toggle in our cookie-consent banner. Session-recording input masking follows PostHog's own defaults; we have not layered additional custom masking in code. | EU (posthog-js is configured against eu.i.posthog.com), per PostHog's public documentation. |
| Upstash, Inc. (Redis + QStash) | Cross-instance response caching (competitor extraction, tier limits, DataForSEO task/scan mapping) and the durable job queue that fans out scan, DFS, and question-battery work across our serverless functions. | Cache values are derived product data (e.g. extracted competitor lists) keyed by a hash of the input, not raw personal data. Queue job payloads carry internal identifiers (user ID, domain ID, scan/run/query IDs) and, for scan jobs, the query text being run — no e-mail address or payment data passes through this layer. | Region per our Upstash project configuration, per Upstash's public documentation — not independently verified further. |
| Cloudflare, Inc. | Turnstile bot verification on the public grader tools (EN Snapshot, Hallucination Check, CZ/SK/DE graders). | A challenge/verification token; no page content or form input is shared with Cloudflare for this purpose. | USA / global edge, per Cloudflare's public documentation. |
| Slack Technologies, LLC — customer-configured | Business-tier alert mirrors, posted only when a customer configures their own Incoming Webhook in Settings → Alerts. | The alert content itself (e.g. a GEO Score drop or a new competitor) — nothing is sent unless and until you configure a webhook. We validate the URL is HTTPS and hosted on hooks.slack.com before ever posting to it (anti-SSRF). | USA, per Slack's public documentation. |
| Slack Technologies, LLC — internal ops | Not user-configured. When we (the operator) have an internal notification webhook configured, three account-lifecycle events — signup completed, trial started, payment added — are posted to our own internal Slack workspace so we can respond quickly in the first hours of a new relationship. | Your e-mail address, optionally your full name, your internal user ID, and — for trial/payment events — your plan tier and, for payments, the charged amount. | USA, per Slack's public documentation. |
We do not sell personal data and do not run cross-context behavioral advertising. See the Privacy Policy for the lawful bases we rely on for each of these transfers and our approach to international data transfers (EU SCCs / UK IDTA / EU-U.S. Data Privacy Framework where applicable).
2. Data Retention
These periods are read directly off our database schema and account-deletion code, not restated from a policy template:
- Active account data. Domains, tracked queries, scan results, GEO Scores, and every other product record are kept for the lifetime of your account.
- Grader (lead-magnet) runs — EN Free GEO Snapshot, Brand Hallucination Check, and the CZ, SK, and DE mini-audits. Every one of these tables sets an
expires_atseven (7) days after the run. Past that timestamp the public result page stops resolving. We did not find a cleanup cron that deletes the underlying database row after expiry — the row itself may persist longer for abuse-prevention and cost-monitoring purposes, the same allowance the Privacy Policy already makes for the EN Snapshot (up to 24 months for fraud-prevention / cost-analysis records). We have not yet extended that explicit language in the Privacy Policy to the CZ/SK/DE and Hallucination Check tables, even though they follow an identical pattern in code. - Billing and cost-ledger records.
usage_events(per-call cost ledger) andbilling_audit_events(Stripe event audit trail) are not tied to your account by a foreign key and are not removed by account deletion (below). They are retained for accounting purposes, consistent with the up-to-ten-year retention period Czech tax/accounting law requires and that the Privacy Policy already discloses. - Account deletion (Settings → Delete Account). See Section 5 below for exactly what this removes and what it deliberately does not.
3. IP Address Handling
Everywhere we persist an IP address in our own database — the public grader tools (EN/CZ/SK/DE and the Hallucination Check) and admin login rate-limiting — we hash it with SHA-256 plus a per-deployment salt before writing it to any table. The raw IP address is never the value we store. This is a code fact, not a policy statement: the hashing happens before the database write in every code path we found that touches a visitor IP.
This covers what our application persists. It does not cover infrastructure-level request logs our hosting/CDN provider (Vercel) may retain as an ordinary part of serving HTTP traffic — see Vercel's own documentation for their log retention.
4. Analytics Cookies and Consent
Our cookie-consent banner gates Vercel Analytics and Vercel Speed Insights behind the "analytics" toggle — they do not load until you accept. As noted in Section 1, PostHog is not currently wired into that same consent gate and initializes on every page load regardless of your cookie choice. We are surfacing this plainly rather than describing a consent flow that doesn't exist in the code today.
5. Account Deletion — What Actually Gets Removed
Settings → Delete Account is self-serve and runs immediately (not on a delayed batch job). In order, it:
- cancels your Stripe subscription, if any;
- deletes
scan_results,scans,queries,geo_scores,email_reports,scan_limits,domains,subscriptions, andprofilesrows tied to your account; - signs your active session out; then
- deletes your Supabase
auth.usersrecord. Every other user- or domain-scoped table in our schema (citation intelligence, crawlability audits, competitor tracking, dashboard actions, alert history, GSC integration data, MCP API tokens, OAuth grants, and more) is declared with a foreign key back toauth.users(id)ordomains(id)withON DELETE CASCADE, so this final step removes them automatically.
What this does not delete: usage_events and billing_audit_events — see Section 2 for why. Everything else in the schema is either explicitly deleted above or cascades from the auth-user deletion.
6. Your Rights and How to Exercise Them
If you are in the EU/EEA, UK, or Switzerland, you have the rights to access, rectify, erase, restrict, and object to processing, receive your data in a portable format, and withdraw consent — the full list, lawful bases, and equivalent rights under U.S. state law, LGPD, PIPEDA, and other regimes are in Privacy Policy §12–14. Pro and Business users can also self-serve a CSV/JSON export of their own data from the dashboard.
To exercise any right, request a copy of an executed DPA, or ask about anything on this page, write to legal@geotrackerai.com. For product/account support, use support@geotrackerai.com — the same two addresses used across our Privacy Policy and DPA. We aim to respond within thirty (30) days.
7. Keeping This Page Accurate
This page is regenerated by re-checking the code paths above, not copy-edited from memory. If we add or remove a subprocessor, change a retention window, or close the PostHog consent gap noted in Section 4, we will update this page in the same change that ships the underlying code.
© 2026 Ing. Petra Vlčková (operating GEO Tracker AI). All rights reserved.