Mapping that is declared, not scripted.
Fields are mapped explicitly, with types. Derivations come from a typed function library. Records that break a rule are quarantined with a reason, never silently dropped.
customer.first_name
directfirst_namestrREQ
customer.last_name
directlast_namestr
customer.email
lower() → trim()email_addressstrREQ
customer.phone
e164(region:"IN")phone_numberstr
customer.created_date
to_timestamp(utc)created_attsREQ
customer.account_id
—external_idstrREQ
How it works
Mechanisms, not promises.
01
Typed on both sides
Every source and destination field carries a type tag. A mismatch raises a warning and offers the coercion that fixes it, applied on click.
02
Suggestions are confirmed, never applied
Auto-map proposes matches by exact and normalised name. They are shown as suggestions you accept — nothing is mapped silently on your behalf.
03
Transform chains
Each mapping can carry a chain of typed functions — string, number, date, boolean, object and lookup — shown inline in monospace and previewed against a real sampled record.
04
Rules with a severity
A rule either rejects (quarantine the record) or warns (pass it and log). Reasons are structured codes, not strings, so they can be counted and alerted on.
05
Required fields are enforced
An unmapped required destination field is an error that blocks deploy — which is exactly the failure that silently produces empty columns in hand-written integrations.
06
No arbitrary code
Transformation is deterministic and sandboxed. There is no user-supplied code execution in the engine, so a transform cannot make a network call or read the file system.
In the API
The same thing, from a terminal.
{ "mappings": [ { "source": "customer.email", "chain": ["lower()", "trim()"], "destination": "email_address", "type": "string", "required": true }, { "source": "customer.created_date", "chain": ["to_timestamp(utc)"], "destination": "created_at", "type": "timestamp", "required": true } ], "rules": [ { "name": "email_required", "field": "email_address", "condition": "is_not_null", "severity": "reject", "message": "email required" } ]}An excerpt of a flow definition. Definitions are exportable and importable as JSON.
- Function categories
- String, number, date and time, boolean, object and array, lookup against a connection.
- Constants and derivations
- A destination can be filled by a constant or a function such as now(), not only by a source field.
- Preview
- One sampled record shown as source JSON beside destination JSON, updating as mappings change.
- Quarantine
- Failed records keep their payload reference and reason code, and can be re-run on their own.