Pricing
Straightforward pricing, priced by delivery volume.
One metric — completed deliveries per month — instead of a pricing model that punishes you for having a wide table.
FAQ
Common questions
What counts as a delivery?
One completed export run — a dataset delivered to one destination, on one occasion (scheduled or manual). A run with 50,000 rows and a run with 50 rows both count as exactly one delivery; row count never affects your quota.
Do you store my customers' data?
No. DataEgress streams rows from your fetchPage endpoint directly to the destination as they're read — nothing is persisted in a DataEgress-owned database. We store run metadata (row counts, checksums, timestamps, manifests), not the row data itself.
Can I use my customer's own S3 bucket?
Yes — that's the primary use case. You register the destination bucket and credentials once per customer, and every scheduled export delivers straight into storage they control.
What happens if an export fails?
The run is marked failed with the stage it failed at and how many rows were processed before that point. Retries reuse deterministic destination keys, so a retry overwrites the same file rather than creating a duplicate.
Do you support Parquet?
Yes, alongside CSV. Parquet output is typed and compressed, and loads directly into tools like DuckDB or Spark without a conversion step.
Do you support incremental exports?
DataEgress does not perform change-data-capture. Your fetchPage function controls what's included in each run — most teams pass a cursor or timestamp filter to their own query to select only new or changed rows, keeping row selection logic under application control.
Do you need database access?
No. DataEgress never connects to your database. You expose a fetchPage HTTP endpoint with the SDK, and DataEgress calls it for each page of rows — the same access model as any other webhook.
Not sure which plan fits?
Tell us what you’re trying to deliver and we’ll help you figure out the right tier.