ID Dispensers
ID dispensers generate a unique, stable identifier for each row in a data product. You configure rules that build IDs from extracted field values with an optional prefix, fallback chains for when the primary field is empty, and resolution maps that normalize variant values before ID generation. Unlike random UUIDs, dispenser-generated IDs are derived from your actual data, making them human-readable and usable as primary keys in downstream databases.
ID rule configuration
| Parameter | Type | Description |
|---|---|---|
| Source field | field | The primary field to derive the ID from. When empty, generates a prefix-less sequential ID. |
| Fallback chain | field[] | Ordered list of alternative fields tried when the source field is empty on a row. |
| Resolution map | map | Key-value lookup that normalizes field values before ID generation (e.g., "ACME Corp" → "ACME"). |
How generation works
ID rules are persisted before generating IDs. Navigate to a data product detail page and use Apply ID Rules to generate or Regenerate IDs to refresh. The generation process evaluates each row against the configured rules: it reads the source field value, applies the resolution map if one exists, prepends the prefix, and writes the resulting ID. If the source field is empty, the dispenser walks the fallback chain in order until it finds a non-empty value. If all fields in the chain are empty, a prefix-less sequential ID is assigned so no row is left without an identifier.
- Open the data product detail page and locate the ID rules panel.
- Choose a high-cardinality source field (invoice number, contract reference).
- Add 1-2 fallback fields (e.g., document name, then upload date) so every row gets a value.
- Optionally define a resolution map to collapse variant spellings before ID generation.
- Click Apply ID Rules to generate, or Regenerate IDs later to refresh.
{
"source_field": "invoice_number",
"prefix": "INV",
"fallback_chain": ["document_name", "upload_date"],
"resolution_map": {
"ACME Corp": "ACME",
"ACME Corporation": "ACME",
"Acme": "ACME"
}
}
// A row with invoice_number "2026-042" receives the ID "INV-2026-042".
// A row with no invoice_number falls back to its document name.Choosing source fields and resolution maps
Choose source fields with high uniqueness: contract numbers, invoice IDs, and purchase order references work well because they are unique per document, while generic fields like "status" produce collisions. Resolution maps normalize field values before they become part of the ID: for example, collapsing "ACME Corp", "ACME Corporation", and "Acme" into a single canonical value "ACME" prevents duplicate IDs for rows that refer to the same real-world entity under different names.
The deterministic nature of generation means the same rules and the same data always produce the same IDs, regardless of when or how many times you regenerate. This is critical for maintaining referential integrity with downstream systems that store these IDs as foreign keys. Regeneration is also non-destructive: only the ID column is updated, and all other data product values remain unchanged.