Privacy Policy

Last updated April 30, 2026

Pennypoke is two surfaces sharing a brand: a Telegram bot that parses expense messages into your Google Sheet, and a splitter web app at pennypoke-app.pages.dev for shared expenses with friends. This page explains exactly what data touches our server on each surface, what we keep, and what we never see.

The short version. The bot is stateless: your receipts and messages exist only in memory for the few seconds we read them, and your extracted expenses live in your Google Sheet, not on our server. The splitter is account-based: it holds your email, a hashed session token, and the group/expense rows you and your group members create together. We never store IPs, user agents, geolocation, device fingerprints, analytics events, or an audit log. There is a self-serve JSON export of every byte we hold on you, and account deletion is reversible for 30 days then permanent.

01 What we process

When you send a text message to the bot or upload a receipt photo, our service:

  1. Parses the text (or sends the image to Anthropic's Claude Vision API) to extract amount, merchant, date, category, items.
  2. Sends the extracted data to your Google Sheet via the Google Sheets API.
  3. Frees the memory holding the message or image once the request completes.

We do not store your messages, receipts, or extracted data. The server is a Cloudflare Worker, a stateless compute environment with no disk, no filesystem, no persistent storage. Your input exists in memory for the few seconds it takes to process, then the process ends. This is architecturally enforced, not just a policy promise.

02 What we store on the Telegram bot side

For users of the Telegram bot, we store the minimum needed to operate the service:

That's it. No expense data, no receipt images, no financial information.

02a What we store on the splitter web app side

The splitter is account-based, so it does store the rows you and the people you split with create together. Specifically:

What we explicitly do NOT store on the splitter: IP addresses, user agents, geolocation, device fingerprints, analytics events, or an audit log of any kind. There is no "last login" or "last seen" field anywhere in the splitter database.

03 Sub-processors

Your data passes through these services during processing:

ServicePurposeWhat they receivePolicy
Anthropic (Claude Vision) Receipt photo OCR Receipt image (transient) Anthropic policy, API data not used for training
Google (Sheets API) Writing rows to your Sheet Extracted data Google policy
Telegram Bot messaging Your messages to the bot Telegram policy
Polar Software Inc. Checkout, billing, VAT, invoicing, refunds (Merchant of Record) Email, name, billing address, IP, card data (Polar is the legal seller) Polar policy. US controller with EU SCCs and EU-US Data Privacy Framework certification.
Stripe (sub-processor of Polar) Card processing, used internally by Polar Card details. We never see them and have no contractual relationship with Stripe. Stripe policy
Cloudflare Hosting (Workers, Pages, D1, KV) Request metadata, hashed account ID Cloudflare policy. EU SCCs in place for data outside the EEA.
Brevo (Sendinblue) Transactional email (splitter magic-link sign-in, group invitations). Polar receipts go through Polar's own email pipeline, not ours. Recipient email address, message body Brevo policy. EU-hosted (Paris), GDPR-compliant by default; no transatlantic transfer for our use case.

International transfers to Polar (USA), Cloudflare, and Google rely on EU Standard Contractual Clauses plus the EU-US Data Privacy Framework where applicable. Where Polar acts as Merchant of Record they are a separate controller for buyer data; the operator listed below is a co-controller for the purchase metadata that flows back to Pennypoke (email, plan, order ID).

04 What we do not do

04a Recipient categories

The splitter is operated by a single named person (see Data Controller below). That person, in their role as system administrator, can technically read account rows and group rows in the database when responding to support requests, abuse reports, or legal demands. There is an admin allowlist of email addresses that gates an internal admin panel; only operators on that allowlist can see other users' accounts. We log nothing automatically; the only access trail is the operator's own memory and the server logs that Cloudflare retains for 7 days for operational purposes.

Members of a group you create or join can see your display name (chosen by you for that group), the expenses you mark yourself as having paid or owing on, and the settlements you record. Group members cannot see your email address through the app UI.

05 Your rights

Under GDPR, CCPA, and similar laws you have the right to:

To exercise any right, email [email protected].

05a Data controller

The data controller for Pennypoke is Povilas Konopackas, individual activity in the Republic of Lithuania, EU. Contact: [email protected]. This is also the address for any GDPR request, complaint, or right exercise. For purchases, Polar Software Inc. (3500 South DuPont Highway, Dover, DE 19901, USA) acts as Merchant of Record and is a separate controller for billing data; reach Polar at polar.sh/legal/privacy.

06 Data retention

07 Security

All data in transit is encrypted via TLS. Data at rest in D1 and KV is encrypted by Cloudflare. OAuth tokens for the bot are additionally encrypted before storage. Splitter session and magic-link tokens are stored as SHA-256 hashes; passwords (when set) use PBKDF2-HMAC-SHA256 with 600,000 iterations. Mutating endpoints require a valid Origin / Referer header from the splitter web app's known origin (CSRF). We follow OWASP guidelines for the web application.

08 Children

This service is not directed at children under 16. We do not knowingly process data from children.

09 Changes

If we change this policy in a way that affects your rights, we will notify you via the email on your Google account or a banner on the site, at least 30 days before the change takes effect.

10 Contact

For privacy questions, email [email protected].