Summary
Reliable Reporting currently takes one process-wide ProducerOfferings.currency (default "USD") and copies it into every ReportingSourceSliceRequestV1. A multi-account producer cannot truthfully run accounts, media buys, or immutable report definitions in different currencies through one producer.
Currency is part of reporting correctness: the source contract validates it, monetary control-total units must agree with the pinned report definition, and consumers have a specific currency_mismatch status. It therefore must be resolved and frozen at the same durable scope as the obligation/revision, not supplied as mutable process configuration.
Desired SDK contract
Provide an SDK-owned resolution seam and durable representation. For example:
CurrencyResolver = Callable[
[ReportingConfiguration, ReportingObligationRecord],
Awaitable[str] | str,
]
ReportingProducer(..., currency_resolver=...)
The exact API can instead derive currency from an immutable report-definition binding. The important invariants are:
- resolve from trusted account/configuration/report-definition state;
- freeze the ISO 4217 code before source work starts;
- persist enough information that retries, restatements, status checks, and audits cannot change currency later;
- reject or deterministically partition mixed-currency scopes rather than aggregating incompatible money.
The existing fixed currency= option can remain as a convenient single-currency resolver/default, but it should not be the only supported shape.
Acceptance criteria
Adopter impact
Embedded Sales Agent supports tenant/account currencies and GAM-backed buys. Hardcoding USD would produce incorrect evidence and potentially incorrect billing reconciliation for non-USD clients, so it blocks a trustworthy rollout.
Summary
Reliable Reporting currently takes one process-wide
ProducerOfferings.currency(default"USD") and copies it into everyReportingSourceSliceRequestV1. A multi-account producer cannot truthfully run accounts, media buys, or immutable report definitions in different currencies through one producer.Currency is part of reporting correctness: the source contract validates it, monetary control-total units must agree with the pinned report definition, and consumers have a specific
currency_mismatchstatus. It therefore must be resolved and frozen at the same durable scope as the obligation/revision, not supplied as mutable process configuration.Desired SDK contract
Provide an SDK-owned resolution seam and durable representation. For example:
The exact API can instead derive currency from an immutable report-definition binding. The important invariants are:
The existing fixed
currency=option can remain as a convenient single-currency resolver/default, but it should not be the only supported shape.Acceptance criteria
currency_mismatchchecks remain end-to-end testable.Adopter impact
Embedded Sales Agent supports tenant/account currencies and GAM-backed buys. Hardcoding USD would produce incorrect evidence and potentially incorrect billing reconciliation for non-USD clients, so it blocks a trustworthy rollout.