PullPulse
Legal

What we store, for how long, and who else sees it.

PullPulse holds review metadata: who opened what, who is waiting on it, and what it touched. It does not hold your source code. This page lists each category of data, the window it is kept for, and every other company that processes it.

Last updated 8 September 2026.

What we store

categorywhat it is
Slack workspace and user idsWorkspace id and name, the id of whoever installed the app, and the Slack user ids of members who linked a GitHub login, with their timezone and any snooze they set.
Sealed credentialsThe Slack bot token and, if you configure one, your model provider API key. Both are stored encrypted, and MCP tokens are stored only as a one-way hash, so the token itself is never on disk.
GitHub installation and repository metadataThe installation and the account it belongs to, and for each repository you select: its name, default branch, whether it is private, your .pullpulse.yml and the CODEOWNERS file we read to work out who knows the code.
Commit authorsThe GitHub login, account id and date of the newest commit per person per watched repository, read from the default branch once a day to count committers against the plan.
Pull request titles and metadataTitle, description, URL, author and whether that author is an agent, state, reviewers, check results, line and file counts, the computed effort tier and attention flags, diagrams, and the model-written brief where one was generated. PR history remains available after merge or closure without automatic expiry, subject to workspace access and explicit data deletion.
Slack message bookkeepingWhich channel and which message belongs to which pull request, so PullPulse can update a message instead of reposting it. Message text is not stored; it is rendered from the metadata above.
Notification historyWho was mentioned or reminded, and when. This is what the per-person noise cap is computed from, and what stops a reminder from repeating itself.
Failed webhook deliveriesA GitHub webhook that could not be processed, held in a queue so it can be retried after a fix instead of lost. Webhooks that were processed are not stored.
Billing recordsYour plan and status, the identifiers Stripe gives us for your customer and subscription, period end dates, and a monthly count of model calls. Card details never reach PullPulse.
Product analytics and acquisitionPage paths, campaign labels and referrer hostnames, a random browser identifier, workspace, user and channel ids, lifecycle events, and invoice and refund amounts by currency. We use these to understand usage and which sources lead to paid workspaces. We do not send message text, repository names, credentials or full query strings to analytics.
Feedback and search indexThumbs up or down on AI output with the Slack user who gave it, and a search index over pull request titles and descriptions used to find similar past changes.
Browser sign-inYour Slack workspace and user ids, and a secure session cookie for signing in to the website. Sessions expire after 12 hours and are revoked when you sign out. Expired records are removed on the hourly cleanup or the next sign-in. We do not store the Slack user access token from sign-in.
Short-lived cacheAccess tokens, user lookups and single-use sign-in nonces, each expiring within minutes.

Diff content is never persisted and never logged. It exists in memory while a pull request is being scored, and in the prompt sent to the model provider for the features that need one. Nothing writes it to storage or to a log line.

Card details never reach us. Checkout and the billing portal are hosted by Stripe; we store customer and subscription identifiers, plus invoice and refund amounts for billing analytics.

Website analytics

When analytics is enabled, a signed first-party cookie remembers a random browser identifier for up to 90 days. Page requests honor Do Not Track and Global Privacy Control. A small first-party script records page views and link clicks; the website works when it is blocked. We keep a bounded event journal for 30 days. Browser records expire after 90 days of inactivity; acquisition attached to a workspace and invoice and refund records remain with its billing history. Vemetric receives the bounded event metadata described above. We forward a bounded browser user-agent for device statistics and referrer origins, but never your IP address, full query strings, form values or message text.

How long we keep it

Who else processes it

How it is protected

Deletion

Uninstalling the app from Slack revokes the stored credentials immediately and stops all processing for that workspace. The rows survive the uninstall so that reinstalling restores your routing, identities and history rather than starting from nothing, and so that uninstalling and reinstalling cannot mint a fresh trial.

Ask us to delete the workspace and we delete it, completely rather than best-effort; failed webhook deliveries expire from their queue within 14 days.

Contact

For access, correction or deletion requests: support@pullpulse.dev.