BigQuery / Snowflake / Looker Export
The data warehouse export plugin streams a daily delta of your fleet data into the warehouse you already use. It's the standard pick for analytics teams, finance teams, and anyone who's outgrown the built-in dashboard.
What gets exported
Every export run includes new and updated rows from the past 24 hours in these tables:
| Table | Description |
|---|---|
rides | All ride records — start, end, distance, pricing, tax, refunds |
ride_events | Pause, resume, photo, zone-entered, zone-exited events |
customers | Rider accounts (PII-masked unless your install has read:customers.pii) |
vehicles | Fleet inventory, status history |
vehicle_telemetry | Hourly aggregates of GPS, battery, lock events |
zones | Zone definitions and rule changes |
payouts | Partner payouts with line-item breakdown |
plugin_invoices | Plugin charges by install |
Each row carries a _exported_at timestamp and _op field (insert, update, delete) so your warehouse can apply changes correctly without full re-loads.
Supported destinations
- Google BigQuery — direct streaming inserts or batch loads from GCS
- Snowflake — Snowpipe streaming or batch loads from S3
- Amazon Redshift — COPY from S3
- Looker Studio — read from BigQuery
- Generic S3 / GCS — Parquet files for self-service ingestion
A single install can target one destination. To export to multiple warehouses, install the plugin once per destination — each counts as a separate $199/month subscription.
Setup
You'll need warehouse credentials with write access to a dataset / schema. Levy creates the tables on its first run.
Install the plugin
Dashboard → Marketplace → search "BigQuery" → Install.
Grant permissions
The export plugin requests read:rides, read:rides.financial, read:customers, read:payouts, read:zones. Financial scope is required to export pricing breakdowns. Decide whether to include read:customers.pii based on whether your warehouse needs rider names/emails.
Pick a destination
Select BigQuery, Snowflake, Redshift, or S3/GCS.
Provide credentials
- BigQuery: GCP service account JSON, project ID, dataset name
- Snowflake: account URL, user, password (or key pair), warehouse, database, schema
- Redshift: cluster endpoint, database, user, password, S3 bucket for staging
- S3 / GCS: bucket name, prefix, IAM credentials
Configure schedule
Pick the export time (default 02:00 UTC). Daily is the only frequency in v1; hourly is planned.
Confirm and install
$199/month. First export runs within an hour of install, including a full backfill of your historical data.
First-run backfill
The first export includes all of your historical data, not just the last 24 hours. For a fleet with 50,000 rides and 5,000 customers, the backfill typically completes in 30-60 minutes. You can watch progress in Settings → Plugins → BigQuery → Status.
After the backfill, daily incremental exports run at the configured time and complete in a few minutes for most fleets.
Schema stability
The export schema follows semver:
- Patch changes (new optional columns, performance tweaks) deploy silently. Your queries are unaffected.
- Minor changes (new tables) deploy silently. Your existing queries are unaffected.
- Major changes (renamed columns, dropped tables) are announced 90 days in advance via a banner on the installed plugins page and an email to subaccount admins. You can stay on the old schema for up to 6 months while migrating queries.
Levy guarantees zero breaking changes within a minor release line.
Sample queries
Once your data lands in the warehouse, common questions:
-- Daily revenue by subaccount
SELECT
DATE(end_time) AS ride_date,
SUM(total_cents) / 100.0 AS gross_revenue_usd
FROM rides
WHERE end_time >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
GROUP BY ride_date
ORDER BY ride_date DESC;
-- Vehicles with declining utilization
SELECT
v.vehicle_number,
COUNT(r.id) AS rides_last_7d,
COUNT(r.id) FILTER (WHERE r.end_time >= CURRENT_DATE() - INTERVAL '14 day' AND r.end_time < CURRENT_DATE() - INTERVAL '7 day') AS rides_prior_7d
FROM vehicles v
LEFT JOIN rides r ON r.vehicle_id = v.id
GROUP BY v.vehicle_number
HAVING rides_last_7d < rides_prior_7d * 0.5;
-- Customer LTV cohort
SELECT
DATE_TRUNC('month', c.created_at) AS cohort_month,
COUNT(DISTINCT c.id) AS cohort_size,
SUM(r.total_cents) / 100.0 AS cohort_revenue_usd
FROM customers c
LEFT JOIN rides r ON r.customer_id = c.id
GROUP BY cohort_month
ORDER BY cohort_month DESC;
Pricing
$199/month per destination, billed monthly via Stripe. Levy collects the standard 20% platform fee (this is a first-party plugin, so the fee accrues to Levy directly). No usage-based component — unlimited rows exported.
Free trial: first 30 days are free. You can cancel anytime during the trial with no charge.
Compliance notes
- All exports use TLS 1.2+ in transit.
- Credentials are stored encrypted at rest in Supabase Vault.
- PII export is gated behind the
read:customers.piipermission — without it, names, emails, and phones are masked with stable hashes (so you can still join across exports without seeing actual values). - Levy retains export job logs for 90 days for debugging.
- GDPR right-to-erasure: when a rider deletes their account, Levy emits a delete row in the next export so your warehouse can apply the deletion downstream.
Troubleshooting
| Symptom | Fix |
|---|---|
| Export job failing with "permission denied" | Verify warehouse credentials have INSERT, UPDATE, CREATE TABLE on the target schema |
| Backfill stuck | Check Settings → Plugins → gear → Audit log. Common cause: warehouse quota exceeded. |
| Rows missing | Confirm your install has the right permission scopes for the data type |
| Schema migration broke a query | Schema changes are announced 90 days in advance. Check the banner on Settings → Plugins or recent emails. |
What's next
- Configuring a plugin — rotate credentials, change schedule
- Plugin billing — invoicing details