Integration · Webhooks and data

Scheduled data exports to S3, R2 or Google Cloud Storage

RevenueDot writes scheduled exports of transactions, customers, subscriptions and events to your own Amazon S3, Cloudflare R2 or Google Cloud Storage bucket. Files are gzip CSV or Parquet, run daily or weekly, and hold only new and changed rows unless you pick a full export. The run history shows every file, row count and error.

What teams do with it

  • Load subscription data into your warehouse without writing an API poller.
  • Run revenue and retention queries in SQL on files you own, such as monthly revenue net of refunds.
  • Keep a full copy of transactions and events in your own bucket as a backup.
  • Move from RevenueCat and keep reports that use its transactions export column names.

What RevenueDot sends

  • Four tables: transactions, customers, subscriptions and events. Pick any of them per export, and limit them to production, sandbox or both.
  • transactions uses the column names of RevenueCat's transactions export where RevenueDot can fill them: store_transaction_id, product_identifier, start_time, end_time, price_in_usd, refunded_at, is_trial_conversion, is_sandbox and more, plus app_id.
  • File path: <prefix>/<YYYY-MM-DD>/<table>_<YYYYMMDDTHHMMSSZ>.csv.gz (or .csv, .parquet), split into _part2, _part3 and so on above 10,000 rows.
  • CSV is comma-separated with a header row, gzip by default, with UTC times as YYYY-MM-DD HH:MM:SS. Parquet uses Snappy and typed columns: timestamps, integers, decimals, booleans and JSON.
  • Incremental mode (the default) exports rows that changed since the last successful run of that table. The first run of a table is always complete. Everything, every time writes full tables.

Setup

How to connect Scheduled data exports to RevenueDot

  1. 01

    Create a bucket and credentials

    Amazon S3: an IAM user with s3:PutObject on arn:aws:s3:::<bucket>/* and s3:ListBucket on the bucket. Cloudflare R2: an API token with Object Read & Write. Google Cloud Storage: a service account with Storage Object Creator and Storage Legacy Bucket Reader.

  2. 02

    Create the export

    In RevenueDot, open Integrations → Scheduled Data Exports → New export and fill in the destination, bucket, prefix and credentials. For R2, add your Cloudflare account ID. For MinIO or other S3-compatible storage, choose Amazon S3 and fill in Endpoint.

  3. 03

    Pick tables, format and schedule

    Choose the tables, CSV or Parquet, daily (an hour in UTC) or weekly (a day of the week), and incremental or full. Click Create export.

  4. 04

    Check the bucket

    Click Check bucket. RevenueDot runs an S3 HeadBucket or a GCS bucket lookup and says what to fix on a 403 or 404.

  5. 05

    Run it once, then let it follow the schedule

    Click Run now for the first export. Later runs follow the schedule, and the run history shows each file, its rows and size, and any error.

The Scheduled data exports integration page in the RevenueDot dashboard, with its settings form
Captured from the RevenueDot dashboard with demo data.

What each table holds

TableWhat a row isKey columns
transactionsOne purchase, trial or renewalrc_original_app_user_id, store_transaction_id, product_identifier, start_time, end_time, price_in_usd, refunded_at, is_sandbox, updated_at
customersOne customerrc_original_app_user_id, aliases, first_seen_time, last_seen_time, platform, app_version, country, updated_at
subscriptionsThe current state of one subscriptionStore, product, dates, period type, cancellation, billing issue, refund, price, country, updated_at
eventsOne event webhooks receiveevent_id, type, event_time, recorded_at, environment, app_id, product, store, price, payload (the webhook body as JSON)

The four exported tables.

Which credentials each destination needs

DestinationCredentialsPermissions
Amazon S3Access key ID and secret access keys3:PutObject on the bucket's objects and s3:ListBucket on the bucket
Cloudflare R2Cloudflare account ID, R2 access key ID and secretR2 API token with Object Read & Write on the bucket
Google Cloud StorageService account JSON keyStorage Object Creator and Storage Legacy Bucket Reader
S3-compatible (MinIO and the like)Access key ID and secret, plus an endpointSame as Amazon S3

Create an export with the API

Every dashboard action is an API call under /v2/projects/{project_id}/integrations/exports. This one writes Parquet files of two tables to R2 every day at 03:00 UTC. The secret is sealed with AES-256-GCM and never returned.

POST a daily Parquet export to R2bash
curl -s -X POST "$REVENUEDOT_URL/v2/projects/$PROJECT_ID/integrations/exports" \
  -H "Authorization: Bearer $SECRET_KEY" -H "Content-Type: application/json" \
  -d '{"name":"Warehouse","destination":"r2","config":{"bucket":"revenue-exports","prefix":"revenuedot","account_id":"'"$CF_ACCOUNT_ID"'","access_key_id":"'"$R2_KEY_ID"'"},"credentials":{"secret_access_key":"'"$R2_SECRET"'"},"format":"parquet","schedule":"daily","hour_utc":3,"tables":["transactions","events"]}'

Query the files: monthly revenue net of refunds

A refunded transaction is exported again with price_in_usd set to 0 and refunded_at set. Keep the latest row per store_transaction_id by updated_at, then sum.

Monthly revenue from the transactions filessql
SELECT DATE_TRUNC('month', start_time) AS month, SUM(price_in_usd) AS revenue
FROM transactions
WHERE NOT is_sandbox
GROUP BY 1
ORDER BY 1;

Failures, retries and safe credentials

  • Retries: a run that hits a temporary error (a 5xx, a timeout or a token endpoint outage) retries after 10 and 30 minutes. Files are overwritten, so a retry never duplicates. A 4xx or a credential error fails the run.
  • Run history: each run shows its status, trigger, window, files, rows, bytes and any error. Run now queues a run at once.
  • Signed requests: S3 and R2 requests are signed with AWS Signature Version 4, and GCS uses a service-account token, both in WebCrypto. Parquet works on RevenueDot Cloud and self-hosted servers.
  • Sealed credentials: the secret access key or service account JSON is encrypted with AES-256-GCM and never returned. The API shows only whether it is configured and its last four characters.

FAQ

Scheduled data exports and RevenueDot

How do I export my subscription data to Amazon S3?

Create a bucket and an IAM user with s3:PutObject and s3:ListBucket. In RevenueDot open Integrations → Scheduled Data Exports → New export, enter the bucket and keys, pick tables, format and schedule, click Check bucket and then Run now.

Can I export to Cloudflare R2 or Google Cloud Storage instead?

Yes. RevenueDot writes to Amazon S3, Cloudflare R2 and Google Cloud Storage, and to S3-compatible storage such as MinIO through an endpoint. R2 takes an access key pair plus your Cloudflare account ID. GCS takes a service account JSON key.

Should I export CSV or Parquet?

Use Parquet if your warehouse reads it, because its columns are typed: timestamps, integers, decimals, booleans and JSON. Use CSV if you load files by hand. CSV is gzip by default, with a header row and UTC times.

Does an incremental export include refunds and changes?

Yes. Each run exports rows that changed since the last successful run, including a transaction refunded or reversed in that window. The refunded row has price_in_usd 0 and refunded_at set, so keep the latest row per store_transaction_id by updated_at.

Is there a RevenueCat scheduled data exports alternative?

Yes. RevenueDot's transactions table uses the column names of RevenueCat's scheduled data exports that it can fill (checked October 2026), so SQL written against them keeps working. RevenueDot is open source and free to self-host.

Sources: RevenueCat: scheduled data exports · Amazon S3 documentation · Cloudflare R2 documentation · Google Cloud Storage documentation. Scheduled data exports is a trademark of its owner, used to describe compatibility. RevenueDot is not affiliated with or endorsed by it.

Get started

Send Scheduled data exports every subscription event.

Start free on RevenueDot Cloud, free up to $10,000 a month in tracked revenue. Integrations are included on every plan.

Already have an account? Sign in · Prefer your own servers? Self-host free