Placeholders & delivery reference¶
The lookup tables behind every integration page: which {{ … }} variables
exist and where, how they render, and what the status and error fields in
fetch reports and delivery logs mean.
Placeholders¶
A placeholder is {{ name }} (whitespace inside the braces is fine). Names
are validated when the source or binding is saved, so a typo or a
variable that does not exist in that scope is a 422 with the name in the
message — never a surprise at run time.
Envelope fields — outbound bindings only¶
Values come from the event that triggered the delivery. Used without a
namespace: {{ session_id }}.
| Placeholder | Value | Empty on |
|---|---|---|
event_type |
e.g. session.checked |
— |
session_id |
Session UUID | — |
organization_id |
Organization UUID | — |
project_id |
Project UUID | — |
data_provider_id |
Data provider UUID | Sessions without a provider |
data_contract_id |
Data contract UUID | — |
period |
The delivery period, e.g. 2026-08 |
— |
status |
Current pipeline stage, e.g. checked |
— |
verdict |
passed / warnings / failed — outcome of the automated checks |
Events before any check outcome (created, uploaded, parsed, transformed) |
phase |
technical (session.parsed, session.failed at parse), context (session.failed at context_fetch / context_validation), content (session.transformed, session.checked, session.failed at transform / validation_gating / validate / check) |
Every other event |
parse_error_count |
Parse issues with severity error across all files (a file that failed to parse at all counts as one) |
Every event except session.parsed and session.failed at parse |
parse_warning_count |
Parse issues with severity warning |
Every event except session.parsed and session.failed at parse |
health |
Dashboard state: created, in_progress, blocked, attention, ready, completed |
— |
run_id |
Pipeline run UUID | Every event that is not a pipeline-run event: session.parsed, session.transformed, session.checked and session.failed carry it |
occurred_at |
ISO 8601 timestamp of the event | — |
stage |
Failed stage: context_validation, context_fetch, parse, transform, validation_gating, validate, check |
Every event except session.failed |
reason |
Short failure code (context_invalid, context_fetch_failed, context_fetch_timeout, parse_error, blocking_violations, …) |
Every event except session.failed |
message |
Human-readable failure explanation, e.g. which context source failed and why; null when the stage left findings instead |
Every event except session.failed |
Export details (data.export.*) are not addressable from a mapping.
context.* — bindings and context sources¶
{{ context.<name> }} for every scalar declared in the project's
context schema (tables under _tables are not addressable). The value is
whatever the session context holds at delivery or fetch time.
- In a binding, a declared scalar the session never set renders as
null— an optional field stays empty; arequired_fieldsentry fails with the field named. A name the schema does not declare is rejected at save time. - In a context source, the referenced scalar must already be in the session context when the fetch starts — supplied by the caller at session creation. Values produced by other sources of the same fetch are not available as placeholders.
session.* — bindings and context sources¶
Three whitelisted session attributes, rendered as strings:
| Placeholder | Value |
|---|---|
session.id |
Session UUID |
session.period |
Period string |
session.data_provider_id |
Data provider UUID or null |
Rendering rules¶
- A string that is exactly one placeholder is replaced by the raw value
— numbers stay numbers,
nullstaysnull. - A placeholder embedded in a longer string (
FIBU {{ period }}) is rendered as text. - Where the target is SQL (PostgreSQL sources), placeholders are bound as parameters; where it is JSON (BuiltAPI, Salesforce), they are substituted into the JSON structure. They are never substituted into URLs or identifiers.
value_maps(bindings) run after rendering and before therequired_fieldscheck: a"*"fallback can fill a required field.
Context fetch report¶
Stored on the session as context_fetch_report; shown on the session page
and returned by the re-fetch endpoint.
status |
Meaning |
|---|---|
pending |
The fetch is queued or running. The pipeline waits. |
completed |
Every source succeeded; context merged and re-validated. |
failed |
At least one source failed. The pipeline is blocked until a re-run succeeds. |
Per source: name, status (ok / error), rows, error_kind,
message, overwrote_caller_value.
Context fetch errors¶
error_kind |
Raised when |
|---|---|
connection_error |
The system is unreachable, times out, or answers 5xx; PostgreSQL connect timeout. |
auth_error |
Token, password, or credentials rejected; no credentials stored. |
query_error |
The query is malformed or violates a limit (bad entity id, non-SELECT SQL, too many rows, statement timeout, scalar with more than one column, missing workspace_id). |
empty_result |
A required target got no rows / no value. |
Delivery log¶
Outbound-binding deliveries share the table with webhook deliveries
(GET /api/webhook-deliveries?connection_id=…); binding deliveries carry
connection_id, project_id, and binding_name instead of endpoint_id.
status |
Meaning |
|---|---|
pending |
Waiting for the next attempt; next_retry_at says when. |
in_progress |
An attempt is running. |
succeeded |
The record was created; last_response_excerpt holds the upstream record id. |
failed |
Dead-lettered: attempts exhausted, or a permanent error. |
last_error carries <kind>: <message>:
| Kind | Retried? | Typical message |
|---|---|---|
connection_error |
yes, with backoff | Salesforce returned 503, Token endpoint unreachable: ConnectTimeout |
delivery_rejected |
no | Salesforce rejected the record (HTTP 400), Required mapping field(s) resolved to an empty value: …, Query placeholder 'run_id' has no value in this session |
auth_error |
no | Token endpoint rejected the credentials (HTTP 400), Salesforce rejected a freshly issued token (HTTP 401) |
Failures before the adapter runs are stored without a kind prefix:
last_error |
Meaning |
|---|---|
connection_missing |
The connection was deleted or belongs to another organization. |
connection_inactive |
The connection is deactivated. |
binding_missing |
The binding was removed from the project (or renamed). |
binding_inactive |
The binding is deactivated — by hand or by auto-disable. |
adapter_missing / adapter_not_outbound |
The connection type has no outbound adapter (should not happen with a validated binding). |
credential_decrypt_failed |
The stored secret could not be decrypted — rotate the credentials. |
Retry schedule¶
Shared with webhook endpoints: base delay 30 s, exponential backoff capped at 1 h, per-attempt jitter, 6 attempts, then dead-letter. After 10 consecutive dead-letters a binding is auto-disabled; a success resets the counter. Adapter calls time out after 15 s (Salesforce, BuiltAPI).