Skip to content

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; a required_fields entry 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, null stays null.
  • 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 the required_fields check: 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).