Skip to main content
Unif data is most valuable joined to data you already have — your orders, your margins, your creator payouts. This builds the pipeline that gets it there.

The shape of it

1

Resolve once, store the IDs

Backfill Unif IDs onto your existing rows. Do this once; everything after is keyed on IDs.
2

Export nightly with a job

One export job per entity and market, collected by webhook.
3

Load as an append-only fact table

Key on entity, period and currency. Never overwrite a historical row.

1. Backfill IDs

Resolve rather than enrich for a backfill — you only need identity at this stage, and resolution is cheaper.
Keep the unresolved rows visible. A growing not_found count means your source list is decaying, and that is worth knowing before it shows up as missing rows downstream.

2. Export nightly

An export job shards past the 1,000-row search depth and hands you a file.
The Idempotency-Key is doing real work here. If your scheduler retries the task — and eventually it will — the same key returns the original job instead of running and charging for a second export.
Prefer previous_month or an explicit date range over last_30d for warehouse loads. A preset means a different window on every run, so the same job run twice produces two incomparable files.

3. Collect on the webhook

The download_url is valid for 24 hours. Pull the file into your own storage rather than pointing a downstream job at it.

4. Model it as append-only

The schema mistake to avoid is a table with one row per shop that gets overwritten. Metrics are period-scoped, so an overwrite destroys the ability to compare.
Two tables, following the attributes-versus-metrics split. A shop’s name can be overwritten; its August revenue cannot.
Take period_start, period_end, granularity and currency from the response, not from your request. If period.adjusted was true, the window you measured is not the one you asked for — and keying on the requested dates corrupts the series silently.

Joining to your own data

Unif revenue counts orders placed, before returns and fees. Your own revenue is almost certainly net. They are different measures — use Unif for market context and relative share, not to reconcile your books. See the metrics reference.

Operating the pipeline

Watch completeness

Track the average meta.completeness per load. A sustained drop is an upstream change worth catching before dashboards look wrong.

Alert on job.failed

A silent pipeline and a healthy one look identical until someone asks why the numbers stopped.

Reconcile row counts

Compare job.result_count against rows landed. A gap means a load problem, not a data problem.

Keep credits in view

Export jobs are the largest line in most workspaces. GET /usage/events attributes cost by endpoint.