Privacy & Data Security
Your data, handled with care.
EduVerse connects to Instagram, Facebook Pages, and Threads through the official Meta Graph API. This page explains what we access, how tokens are protected, and how you stay in control.
Last updated: August 31, 2026 · Contact: hello@eduverse.app
TL;DR — the 30-second version
- We collect user data you provide (account, workspace, chat messages & images, posts, media) and data from Meta when you connect.
- We use AI — every chat message and a live analytics snapshot is sent to Google Gemini (gemini-3.8-flash) to generate answers. No training on your data without consent.
- We share data with third parties only when needed: Supabase (database/auth/storage), Meta (Graph API), Google (Gemini), Vercel (hosting), and Upstash Redis (rate limiting, if configured).
- OAuth happens on Meta's screen — EduVerse never sees your Meta password.
- Access tokens are encrypted with AES-256-GCM and scoped to your workspace via Supabase RLS.
- You can disconnect or revoke anytime from Settings or from Meta → Business integrations.
- We never sell data. See full details below.
- Try the sandbox demo to preview without OAuth.
Data we collect — what user data we collect
We collect user data in three categories. We only collect what is needed to run EduVerse and we never sell it.
1. Information you provide directly
- Account: email, display name, avatar URL, role, bio — from sign-up and your profile.
- Workspace content: workspace name/slug, posts and captions you draft, scheduled posts, media files you upload to the
post-mediabucket, reviews you submit. - Chat & memory: every message and optional image you send to Dashboard > Chat, stored as
chat_conversations/chat_messages, plus memory entries you save. - Support: messages you send to hello@eduverse.app and phone inquiries to +1-555-012-3456.
2. Information collected automatically
- Usage & device: IP address (for rate limiting via
x-forwarded-for), browser, requested routes, and timestamps — used only for security and rate limits (chat: 60/min,reviews: 5/min). - Cookies & storage: Supabase auth cookies (
sb-auth-token), OAuth state cookies (HttpOnly, SameSite=Lax, 600–1,800s), and local app preferences. No third-party advertising cookies. - Analytics cache: aggregated Graph insights copied into
analytics_cachefor one day to avoid re-querying Meta on every page load.
3. Information from Meta when you connect
Only after you approve on Meta's consent screen: Facebook Pages you administer, linked Instagram Business accounts, Threads profile, and post/page insights (reach, engagement, impressions, saves) and media you authorize for publishing. Passwords and private messages are never requested.
Legal basis (GDPR): performance of contract (provide EduVerse), legitimate interest (security, prevent abuse), and consent (Meta connection, AI chat). You can request access/export or deletion at hello@eduverse.app.
What we access & why
When you connect Facebook and linked Instagram accounts, connect Instagram directly, or connect Threads, you are sent to Meta's consent screen. Meta shows exactly which permissions EduVerse is requesting — you must approve before any token is issued.
Facebook + Instagram (one flow)
public_profile pages_show_list pages_read_engagement read_insights pages_read_user_content pages_manage_posts instagram_basic instagram_content_publish instagram_manage_insightsUsed to: list your Facebook Pages, link Instagram Business accounts attached to those Pages, read post insights (reach, engagement, saves) and user-generated Page content such as comments, and — only if you click Publish — create scheduled or immediate posts on your behalf.
Instagram Login (direct)
instagram_business_basic instagram_business_content_publish instagram_business_manage_insightsUsed to: connect a professional Instagram Business or Creator account directly, read its profile, media and insights, and publish posts you approve. A Facebook Page is not required.
Threads
threads_basic threads_content_publish threads_manage_insightsUsed to: show your Threads profile, read Threads insights, and publish threads you approve.
We do not request passwords, private messages, or permissions beyond those listed. If Meta adds a permission, it appears explicitly on the consent screen before it is granted.
Sandbox alternative: Not ready to connect? Use Explore the sample demo — a read-only mock dashboard with simulated data. No OAuth, no tokens stored.
How tokens are protected
After you approve on Meta, Meta redirects back with a short-lived code. EduVerse exchanges that code server-side for a long-lived (30-day) User Access Token, then immediately enumerates your Pages and linked Instagram Business accounts. Only the resulting page-scoped tokens are retained.
- Encryption at rest — AES-256-GCM with a random 12-byte IV and auth tag. Stored as
iv.tag.ciphertext(base64url). Key material is derived viaSHA-256(ENCRYPTION_KEY)and never leaves the server. - Transport — tokens travel only in
Authorization: Bearer …headers over HTTPS. They are never placed in URLs or logged (see CSP & logging practices below). - Scope isolation — every row in
social_accountsis gated by Supabase Row-Level Security (RLS) viais_workspace_member(workspace_id). One workspace cannot read another's tokens. - CSRF & state — OAuth state is stored in an HttpOnly, SameSite=Lax cookie (1,800s for Facebook/Instagram, 600s for Threads) and verified on callback. Mismatched state is rejected.
Security posture: Nonce-based CSP in production (script-src 'nonce-…' 'strict-dynamic'), HSTS 30 days, X-Frame-Options DENY, COOP/CORP, and a minimal Permissions-Policy. Media URLs for publishing are validated to be public HTTPS (localhost/private IPs are rejected).
How we use AI — we use AI to power chat
We use AI (artificial intelligence) to provide the EduVerse Assistant in Dashboard > Chat and related content suggestions. Our provider is Google via the @google/genai SDK, model gemini-3.8-flash (configurable via GEMINI_MODEL).
- What is sent: your last up to 20 chat messages (text + optional base64 images, each truncated to 4 MB), plus a live workspace context snapshot: connected Meta account names/handles, follower counts, aggregated metrics, and recent post summaries from
fetchMetaAnalytics(). System instructions fromlib/ai/eduverse-prompt.tsare also included. - What is not sent: raw Meta access tokens, your password, or other workspaces' data. Tokens never leave our server except to call the Meta Graph API directly.
- Purpose & retention: solely to generate the assistant's reply for your request. Google's API processes the prompt transiently under its API terms; we do not allow training on your prompts without your explicit consent. Your chat history is stored in Supabase (
chat_messages) so you can revisit conversations — delete via Settings or by emailing hello@eduverse.app. - Human review & accuracy: AI output may be inaccurate or hallucinated. Do not rely on it for definitive analytics — the dashboard's live Meta metrics are the source of truth. We never claim a post was published or analyzed unless the Graph API returned that result.
- How to opt out: simply do not use Dashboard > Chat. All other features (analytics, scheduling, publishing) work without calling the AI provider. Contact hello@eduverse.app to request deletion of stored chat history.
Provider docs: Google Gemini API Terms · Model and key are server-side only (GEMINI_API_KEY never exposed to the browser).
Third parties we share data with
We share data with third parties only as listed below and only to provide EduVerse. We do not sell your data or share it for advertising.
| Third party | Purpose | Data sent |
|---|---|---|
| Supabase (Supabase, Inc.) | Database, authentication, and file storage (Postgres + Auth + Storage bucket post-media) | All account, workspace, chat, posts, analytics_cache rows, encrypted tokens, and uploaded media. Hosted per NEXT_PUBLIC_SUPABASE_URL. |
| Meta Platforms, Inc. (Graph API) | Fetch insights and publish on your behalf when you approve | Page-scoped access tokens, page/profile IDs, caption/media URLs, and publish requests to graph.facebook.com / v26.0. |
| Google LLC (Google Gemini) | AI chat completion | Chat messages, optional images (inlineData), and live analytics snapshot (see AI section). Via @google/genai. |
| Vercel Inc. | Hosting and edge delivery of the Next.js app | HTTP requests, IP, headers, and rendered pages (as hosting processor). |
| Upstash, Inc. (optional) | Distributed rate limiting, if configured | Rate-limit counters (eduverse:rl:*) with IPs/keys hashed — only when UPSTASH_REDIS_REST_URL is set; otherwise in-memory fallback. |
All processors are bound by their terms and, where required, a DPA. Subprocessors may change; material changes will be noted in the version history below and, for active users, via email or in-app notice.
What we store & where
- social_accounts — workspace_id, platform, external_id, display_name / username, avatar_url, encrypted_token (nullable on disconnect), token_expires_at, status, parent_account_id (links Instagram → Page).
- analytics_cache — today's aggregated Graph insights per
(social_account_id, metric_date), cached for one day and refreshable via?refresh=1. Only successful, non-error snapshots are cached. - scheduled_posts / publishing_attempts — captions, media URLs, and publish status (idempotent by key
user:platform:externalId:ISO:caption). Retried at most 4 times with jittered backoff. - profiles / workspaces / workspace_members — your display name, role, and bio.
All tables are protected by RLS. Data is stored in Supabase Postgres; uploaded media for publishing goes to the post-media Storage bucket (private by default, owner-scoped read/write: foldername(name)[1] = auth.uid(); media is shared with Meta only via time-limited signed URLs, not public bucket listing).
Retention & expiry
- Page tokens expire after 30 days. EduVerse flags them as “Token expiring soon” 7 days before expiry and “Expired” after.
- Analytics cache is per-day; yesterday's rows remain readable until superseded but are never used to fabricate metrics.
- Scheduled posts remain until published/cancelled, then archived with attempts for audit.
Revocation & deletion
You are in control at every layer:
Inside EduVerse
Settings → Connected accounts → Disconnect wipes the encrypted token for that account. Dashboard → Settings → Delete account clears local workspace state and attempts a server-side deletion.
On Meta
Facebook → Settings → Business integrations (or Instagram → Apps and websites) → Remove EduVerse. This revokes the grant; the next Graph call fails and EduVerse marks the account expired/disconnected.
For full erasure (GDPR Art. 17), disconnect first, then email hello@eduverse.app with your workspace email. We delete workspace rows, storage objects, and revoke any lingering tokens. Backups age out within 30 days.
What we do not do
- We do not sell or rent your data, and we do not share it with third parties beyond the five listed in Third parties we share data with (Supabase, Meta, Google Gemini, Vercel, Upstash).
- We do not post without your explicit Publish / Schedule action.
- We do not log raw tokens or place them in URLs, analytics, or error reports.
- We do not invent metrics when Meta returns none — the dashboard shows an explicit empty state.
- We do not train AI models on your content without explicit consent.
Contact & rights
Questions, access/export requests, or deletion: hello@eduverse.app · +1-555-012-3456
Address: 548 Market Street, Suite 41220, San Francisco, CA 94104, US.
This notice supplements our Terms. Meta's own Data Policy and Platform Terms also apply when you authorize access.
Version history
- August 31, 2026 — Fixed storage deletion (purge post-media on account delete), made post-media bucket private (signed URLs), and clarified testimonials are verified-only with no synthetic placeholders.
- August 31, 2026 — Added explicit Data we collect, How we use AI (Google Gemini), and Third parties we share data with (Supabase, Meta, Google, Vercel, Upstash) disclosures to address audit findings.
- August 13, 2026 — Added sandbox demo clarification and explicit encryption/RLS wording.
Previous versions available on request at hello@eduverse.app.