Skip to content

What we access and store from Meta

We request least-privilege Meta permissions, store comments and their author display names in an append-only ledger, encrypt access tokens at rest, and delete data on disconnect or on a verified Meta data-deletion request. We cannot post to your Page, touch your ad accounts, or read anything outside the specific comment and message permissions listed below.

This page is written for a procurement or security reviewer. Every claim maps to the product’s actual behavior. Where a fact is not yet confirmed, it is marked with an explicit TODO rather than softened.

  • We connect to Meta through OAuth. You approve a fixed set of permissions (“scopes”).
  • We store comment text and the comment author’s display name and avatar URL, plus the raw provider payload, in an append-only ledger called interactions.
  • Access tokens are encrypted at rest (AES-256-GCM).
  • We do not request any advertising permissions, and we cannot create, edit, or delete your Page posts.
  • Disconnecting an account, or a verified Meta data-deletion request, deletes the stored comment data.

There are two ways to connect a Meta account, and they request different permissions.

Facebook Login (Facebook Pages + linked Instagram)

Section titled “Facebook Login (Facebook Pages + linked Instagram)”
Permission (scope)Why we request itWhat it grants
emailIdentify the connected accountRead the connected account’s email
pages_show_listLet you pick which Page to monitorList your Facebook Pages
pages_read_engagementRead the comments to moderateRead Page posts and comments
pages_read_user_contentSee comments left by other peopleRead comments authored by other users
pages_manage_engagementRun the Flag / Allow / Reply actionsReply to, hide, and unhide comments
pages_manage_metadataReal-time comment deliverySubscribe the Page to webhooks
pages_messagingRead and reply to DMs on the PageRead/reply Messenger conversations
instagram_basicRead the linked Instagram accountRead the IG account linked to the Page
instagram_manage_commentsModerate Instagram commentsRead and hide/reply IG comments
instagram_manage_messagesRead and reply to Instagram DMsRead/reply IG direct messages

We deliberately do not request pages_manage_posts (which would let us create or edit Page posts) or any advertising scope (ads_read, ads_management, pages_manage_ads). This least-privilege set is pinned by an automated test against our Meta App Review submission, so it cannot drift silently.

If you connect a standalone Instagram Business or Creator account instead of going through a Facebook Page, we request only:

Permission (scope)Why we request itWhat it grants
instagram_business_basicRead the account and its mediaRead profile and media
instagram_business_manage_commentsModerate commentsRead and hide/reply comments

Standalone Instagram Login does not request a DM permission. Direct-message reading and replying on Instagram is only available when the Instagram account is connected through a Facebook Page (the instagram_manage_messages scope above).

Based on the scopes above:

  • It cannot post, edit, or delete your Page posts. We do not request pages_manage_posts. We can reply to comments and send DMs, but we cannot publish or change posts on your timeline.
  • It cannot read or manage your ad accounts or ad spend. We request no advertising scopes at all.
  • It cannot delete comments on Facebook or Instagram. The Delete action is unsupported on Meta — on a Facebook or Instagram comment it is a no-op and nothing is removed on-platform. (Deleting is only supported on other platforms.)

When a comment (or DM) is ingested, it is written to an append-only interactions ledger. We store, rather than discard, the following:

Data elementStored?Notes
Comment textStoredThe full comment body
Author display nameStoredThe commenter’s public display name
Author avatar URLStoredLink to the commenter’s public avatar
Platform comment IDStoredMeta’s identifier for the comment
Posted-at timestampStoredWhen the comment was posted
Media attachmentsStoredAttachment metadata (JSON)
Computed sentiment + confidenceStoredDerived by us from the comment text
Source typeStoredorganic or ad
Raw provider payloadStoredThe verbatim Meta webhook/API envelope, retained for audit and replay

Be precise about this with reviewers: the ledger is append-only and retains the full Meta payload in a raw_payload field, which can include author identifiers beyond the display name. We do not have a documented “process-and-discard” path where comment or author data is used transiently and then thrown away — ingested data is stored.

  • Active (non-deleted) comments are retained until the account or Page is deleted. No time-based purge of live interaction data was found in the product.
  • Deleted data is purged 30 days after deletion. When a row is soft-deleted (deleted_at set), a cleanup job hard-deletes it once it is older than the retention window — 30 days by default. This applies to interactions, audit logs, Workflows, webhooks, Pages, and accounts.

There are three ways stored data is removed.

A hard disconnect deletes, in a single transaction, all interactions for that account’s Pages, the Page records, and the account itself. A soft disconnect instead marks the account deleted and disables its Workflows; the cleanup job then purges it after the 30-day retention window.

Meta requires a data-deletion callback. When Meta sends a signed deletion request, we verify its signature and then perform a synchronous hard delete in one transaction: audit logs, interactions (including system lifecycle rows), Pages, and accounts are deleted, and associated Workflows are deactivated. We record a completed data-deletion request with a 32-character confirmation code and send a best-effort confirmation email. You can check status at the /data-deletion/status/{code} page.

If a token expires or an account becomes invalid, ingestion for that Page pauses — it does not silently drop comments. The poll cursor is not advanced while paused, so on reconnect the backlog is re-fetched and processed, bounded by whatever Meta’s API still returns. Comments that fall outside Meta’s retrievable window before you reconnect can be permanently missed. For the full behavior, see the connection pages below.