Studio · editor · rail

← landing → diagram

CustomerInboundACH two-leg

Name
CustomerInboundACH
Source role
ExternalCounterparty
Destination role
CustomerDDA
Origin
Source origin (override)
ExternalForcePosted
Destination origin (override)
InternalInitiated
Expected net (standalone firing)
0
Aggregating
false
Cadence
Metadata keys
external_reference, originator_id, customer_id
Posted requirements
external_reference, customer_id
Max pending age
1 day, 0:00:00
Max unbundled age
Bundles activity
Metadata value examples
Typical amount range (min, max)
50.00, 5000.00
Typical firings per period (min, max)
Description
Inbound ACH credit originated by an external party (employer payroll, vendor payment, peer transfer). External party drives the rail (force-posts via the ACH network); SNB records the offsetting credit on the receiving customer's DDA. Bank trace number (`external_reference`) is required to reconcile the Fed-statement view.

CustomerOutboundACH two-leg

Name
CustomerOutboundACH
Source role
CustomerDDA
Destination role
ExternalCounterparty
Origin
InternalInitiated
Source origin (override)
Destination origin (override)
Expected net (standalone firing)
0
Aggregating
false
Cadence
Metadata keys
external_reference, customer_id, beneficiary_id
Posted requirements
customer_id
Max pending age
1 day, 0:00:00
Max unbundled age
Bundles activity
Metadata value examples
Typical amount range (min, max)
50.00, 10000.00
Typical firings per period (min, max)
Description
Outbound ACH debit initiated by SNB on behalf of a customer (bill pay, vendor payment, recurring transfer). Both legs are internally initiated until the Fed force-posts the matching settlement to `CashDueFRB`. ETL must capture `customer_id` before posting.

CustomerInboundWire two-leg

Name
CustomerInboundWire
Source role
ExternalCounterparty
Destination role
CustomerDDA
Origin
Source origin (override)
ExternalForcePosted
Destination origin (override)
InternalInitiated
Expected net (standalone firing)
0
Aggregating
false
Cadence
Metadata keys
fedwire_imad, originator_id, customer_id
Posted requirements
fedwire_imad, customer_id
Max pending age
4:00:00
Max unbundled age
Bundles activity
Metadata value examples
Typical amount range (min, max)
Typical firings per period (min, max)
Description
Inbound wire credit. Fedwire is real-time so the same-day reconciliation window is tight (`PT4H`). The `fedwire_imad` is the Federal Reserve's input message accountability data — mandatory for wire reconciliation and audit.

CustomerOutboundWire two-leg

Name
CustomerOutboundWire
Source role
CustomerDDA
Destination role
ExternalCounterparty
Origin
InternalInitiated
Source origin (override)
Destination origin (override)
Expected net (standalone firing)
0
Aggregating
false
Cadence
Metadata keys
fedwire_omad, customer_id, beneficiary_id
Posted requirements
fedwire_omad, customer_id
Max pending age
4:00:00
Max unbundled age
Bundles activity
Metadata value examples
Typical amount range (min, max)
Typical firings per period (min, max)
Description
Outbound wire initiated by SNB. The `fedwire_omad` is captured after Fedwire acknowledges the outbound message; until then the leg is Pending. The wire-suspense GL holds the balance mid-flight.

CustomerCashDeposit two-leg

Name
CustomerCashDeposit
Source role
ExternalCounterparty
Destination role
CustomerDDA
Origin
Source origin (override)
ExternalForcePosted
Destination origin (override)
InternalInitiated
Expected net (standalone firing)
0
Aggregating
false
Cadence
Metadata keys
branch_id, teller_id, customer_id
Posted requirements
customer_id
Max pending age
Max unbundled age
Bundles activity
Metadata value examples
branch_id: - br-bigfoot-001 - br-sasquatch-002 - br-yeti-003 teller_id: - t-jane-001 - t-bob-002 - t-mary-003
Typical amount range (min, max)
Typical firings per period (min, max)
Description
Physical cash deposit at an SNB branch. The "external" source is the depositor walking in with cash — SNB models this as external because the cash isn't on SNB's books until it lands on the customer DDA. Branch + teller IDs are operational audit context.

CustomerCashWithdrawal two-leg

Name
CustomerCashWithdrawal
Source role
CustomerDDA
Destination role
ExternalCounterparty
Origin
InternalInitiated
Source origin (override)
Destination origin (override)
Expected net (standalone firing)
0
Aggregating
false
Cadence
Metadata keys
branch_id, teller_id, customer_id
Posted requirements
customer_id
Max pending age
Max unbundled age
Bundles activity
Metadata value examples
Typical amount range (min, max)
Typical firings per period (min, max)
Description
Physical cash withdrawal at an SNB branch. Customer DDA debits; cash leaves SNB's vault. Same operational audit context as the deposit rail.

InternalTransferDebit single-leg

Name
InternalTransferDebit
Leg role
CustomerDDA
Leg direction
Debit
Origin
InternalInitiated
Aggregating
false
Cadence
Metadata keys
internal_transfer_id, source_customer_id, destination_customer_id, transfer_purpose
Posted requirements
Max pending age
Max unbundled age
Bundles activity
Metadata value examples
transfer_purpose: - rent - payroll - vendor_payment
Typical amount range (min, max)
20.00, 50000.00
Typical firings per period (min, max)
Description
Debit leg of an on-us transfer cycle. Posts against the source customer's DDA. Joins the shared `InternalTransferCycle` Transfer via the `internal_transfer_id` TransferKey (declared first in `metadata_keys` because it's auto-derived as a PostedRequirement from the template's `transfer_key`).

InternalTransferCredit single-leg

Name
InternalTransferCredit
Leg role
CustomerDDA
Leg direction
Credit
Origin
InternalInitiated
Aggregating
false
Cadence
Metadata keys
internal_transfer_id, source_customer_id, destination_customer_id, transfer_purpose
Posted requirements
Max pending age
Max unbundled age
Bundles activity
Metadata value examples
Typical amount range (min, max)
20.00, 50000.00
Typical firings per period (min, max)
Description
Credit leg of an on-us transfer cycle. Posts against the destination customer's DDA. Joins the shared `InternalTransferCycle` Transfer via the `internal_transfer_id` TransferKey; the matching debit and suspense-close legs share its ID.

InternalTransferSuspenseClose single-leg

Name
InternalTransferSuspenseClose
Leg role
InternalTransferSuspense
Leg direction
Variable
Origin
InternalInitiated
Aggregating
false
Cadence
Metadata keys
internal_transfer_id
Posted requirements
Max pending age
Max unbundled age
Bundles activity
Metadata value examples
Typical amount range (min, max)
Typical firings per period (min, max)
Description
Closing leg of an on-us transfer cycle on the suspense GL. `Variable` direction — both amount and direction are computed at posting time so that the bundle's net equals the template's ExpectedNet of 0. MUST be the last leg posted on its Transfer (sibling legs MUST be Posted first); a same-day `business_day_end+1d` Completion gives operators a window to repair before Conservation flags a stuck cycle.

CustomerFeeAccrual single-leg

Name
CustomerFeeAccrual
Leg role
CustomerDDA, InternalSuspenseRecon
Leg direction
Debit
Origin
InternalInitiated
Aggregating
false
Cadence
Metadata keys
customer_id, fee_type, accrual_period
Posted requirements
customer_id, fee_type
Max pending age
Max unbundled age
31 days, 0:00:00
Bundles activity
Metadata value examples
accrual_period: - 2026-04 - 2026-05 - 2026-06 fee_type: - monthly_maintenance - overdraft - stop_pay
Typical amount range (min, max)
0.25, 25.00
Typical firings per period (min, max)
Description
Daily fee accrual posting (monthly maintenance, overdraft, stop-pay, etc.). Bundled by the monthly settlement aggregating rail; un-bundled rows older than 31 days surface as exceptions (the bundler missed them — investigate ETL or the settlement job). The union leg_role lets the rail land on either a customer DDA or the recon suspense GL for held accounts.

ZBASweep two-leg

Name
ZBASweep
Source role
ZBASubAccount
Destination role
ConcentrationMaster
Origin
InternalInitiated
Source origin (override)
Destination origin (override)
Expected net (standalone firing)
0
Aggregating
false
Cadence
Metadata keys
sweep_date, location_id
Posted requirements
Max pending age
Max unbundled age
Bundles activity
Metadata value examples
Typical amount range (min, max)
Typical firings per period (min, max)
Description
Nightly zero-balance-account sweep. Each operating ZBA sub-account transfers its EOD balance to the cash-concentration master, leaving the sub-account at zero. One `ZBASweep` firing per (sub-account, business-day) — a missing sweep means a sub-account didn't zero out and either the customer's reporting or SNB's funding is wrong.

ConcentrationToFRBSweep two-leg

Name
ConcentrationToFRBSweep
Source role
ConcentrationMaster
Destination role
ExternalCounterparty
Origin
Source origin (override)
InternalInitiated
Destination origin (override)
ExternalForcePosted
Expected net (standalone firing)
0
Aggregating
false
Cadence
Metadata keys
sweep_date, fedwire_omad
Posted requirements
fedwire_omad
Max pending age
4:00:00
Max unbundled age
Bundles activity
Metadata value examples
Typical amount range (min, max)
Typical firings per period (min, max)
Description
Daily aggregate transfer from the cash-concentration master to the Federal Reserve. Consolidates the day's ZBA-swept balances into a single Fedwire — drastically reducing the per-sub-account Fed traffic. Fedwire ack provides the OMAD that closes the leg.

ACHOriginationDailySweep two-leg

Name
ACHOriginationDailySweep
Source role
ACHOrigSettlement
Destination role
CashDueFRB
Origin
InternalInitiated
Source origin (override)
Destination origin (override)
Expected net (standalone firing)
0
Aggregating
true
Cadence
daily-eod
Metadata keys
sweep_date, settlement_batch_id
Posted requirements
Max pending age
Max unbundled age
Bundles activity
CustomerOutboundACH
Metadata value examples
Typical amount range (min, max)
Typical firings per period (min, max)
Description
End-of-business-day sweep that consolidates the day's outbound ACH activity from the origination GL to the Fed-due GL. Reduces per-customer Fed traffic to one consolidated entry. The `BundleSelector` `[CustomerOutboundACH]` matches every Posted + unbundled leg of that rail.

CustomerFeeMonthlySettlement single-leg

Name
CustomerFeeMonthlySettlement
Leg role
ExternalCounterparty
Leg direction
Debit
Origin
InternalInitiated
Aggregating
true
Cadence
monthly-eom
Metadata keys
settlement_period, contracted_processor_id
Posted requirements
Max pending age
Max unbundled age
Bundles activity
CustomerFeeAccrual
Metadata value examples
Typical amount range (min, max)
Typical firings per period (min, max)
Description
Month-end single-leg sweep settling the month's accrued fees out to the contracted billing processor. Single-leg per SPEC's "permitted" example — by design the drift it surfaces exits the system into the External counterparty (the processor's books are where the receivable lands). Cadence `monthly-eom` mirrors the contracted processor billing cycle.

CustomerInboundACHReturnNSF two-leg

Name
CustomerInboundACHReturnNSF
Source role
CustomerDDA
Destination role
ExternalCounterparty
Origin
InternalInitiated
Source origin (override)
Destination origin (override)
Expected net (standalone firing)
0
Aggregating
false
Cadence
Metadata keys
original_external_reference, return_reason_code, customer_id
Posted requirements
original_external_reference, return_reason_code
Max pending age
Max unbundled age
Bundles activity
Metadata value examples
return_reason_code: - R01
Typical amount range (min, max)
Typical firings per period (min, max)
Description
ACH return path for NACHA reason code R01 (insufficient funds). Reverses the inbound ACH credit by debiting the customer DDA and re-crediting the originator's external counterparty. Fires only when SNB couldn't honor the inbound credit — typically same-day or next-business-day after the original posting.

CustomerInboundACHReturnStopPay two-leg

Name
CustomerInboundACHReturnStopPay
Source role
CustomerDDA
Destination role
ExternalCounterparty
Origin
InternalInitiated
Source origin (override)
Destination origin (override)
Expected net (standalone firing)
0
Aggregating
false
Cadence
Metadata keys
original_external_reference, return_reason_code, customer_id
Posted requirements
original_external_reference, return_reason_code
Max pending age
Max unbundled age
Bundles activity
Metadata value examples
return_reason_code: - R08
Typical amount range (min, max)
Typical firings per period (min, max)
Description
ACH return path for NACHA reason code R08 (stop payment by receiver). Same posting shape as the NSF return; the difference is provenance — the customer affirmatively stopped the payment vs SNB returning for inability to settle.

MerchantCardSale two-leg

Name
MerchantCardSale
Source role
ExternalCardNetwork
Destination role
MerchantPayableClearing
Origin
Source origin (override)
ExternalForcePosted
Destination origin (override)
InternalInitiated
Expected net (standalone firing)
Aggregating
false
Cadence
Metadata keys
merchant_id, settlement_period, card_network_ref, card_brand
Posted requirements
merchant_id, settlement_period, card_network_ref
Max pending age
1 day, 0:00:00
Max unbundled age
2 days, 0:00:00
Bundles activity
Metadata value examples
card_brand: - Visa - Mastercard - Amex
Typical amount range (min, max)
5.00, 500.00
Typical firings per period (min, max)
Description
One merchant card-sale posting. Card network force-posts the external (debit) leg via daily settlement file; SNB records the matching credit on the MerchantPayableClearing GL. The `transfer_key` of (merchant_id, settlement_period) joins this firing into the shared `MerchantSettlementCycle` Transfer — many sales for one (merchant, period) share one Transfer.id. Note: NO `expected_net` on this rail because it's a leg of the `MerchantSettlementCycle` template (S2: template legs MUST NOT carry expected_net).

MerchantPayoutACH two-leg

Name
MerchantPayoutACH
Source role
MerchantPayableClearing
Destination role
MerchantDDA
Origin
InternalInitiated
Source origin (override)
Destination origin (override)
Expected net (standalone firing)
0
Aggregating
false
Cadence
Metadata keys
merchant_id, settlement_period, payout_batch_id
Posted requirements
merchant_id, settlement_period
Max pending age
1 day, 0:00:00
Max unbundled age
Bundles activity
Metadata value examples
Typical amount range (min, max)
Typical firings per period (min, max)
Description
ACH payout vehicle for merchants who hold an SNB DDA. Debits the MerchantPayableClearing GL and credits the merchant's DDA directly (internal flow — no Fed leg). One of the three XOR payout vehicles; per chain semantics, exactly one fires per settled cycle. Lower friction than wire — SNB's preferred path for SNB-banking merchants.

MerchantPayoutWire two-leg

Name
MerchantPayoutWire
Source role
MerchantPayableClearing
Destination role
ExternalCounterparty
Origin
Source origin (override)
InternalInitiated
Destination origin (override)
ExternalForcePosted
Expected net (standalone firing)
0
Aggregating
false
Cadence
Metadata keys
merchant_id, settlement_period, fedwire_omad, beneficiary_bank
Posted requirements
merchant_id, settlement_period, fedwire_omad
Max pending age
4:00:00
Max unbundled age
Bundles activity
Metadata value examples
Typical amount range (min, max)
Typical firings per period (min, max)
Description
Wire payout vehicle for merchants banking elsewhere. Debits the MerchantPayableClearing GL and credits the merchant's external counterparty bank via Fedwire. Per-leg origin: SNB initiates the outbound leg (InternalInitiated); Fed force-posts the external-counterparty leg when Fedwire confirms.

MerchantPayoutCheck two-leg

Name
MerchantPayoutCheck
Source role
MerchantPayableClearing
Destination role
ExternalCounterparty
Origin
Source origin (override)
InternalInitiated
Destination origin (override)
ExternalForcePosted
Expected net (standalone firing)
0
Aggregating
false
Cadence
Metadata keys
merchant_id, settlement_period, check_number, payee_address
Posted requirements
merchant_id, settlement_period, check_number
Max pending age
7 days, 0:00:00
Max unbundled age
Bundles activity
Metadata value examples
Typical amount range (min, max)
Typical firings per period (min, max)
Description
Paper-check payout vehicle (legacy merchants who don't yet accept ACH or wire). SNB cuts the check; the external leg doesn't post until the merchant deposits and the check clears back through the banking system. `max_pending_age` of 7 days reflects the tolerance for check-clearing latency before surfacing as stuck.

ExternalCardSettlement single-leg

Name
ExternalCardSettlement
Leg role
ExternalCardNetwork
Leg direction
Credit
Origin
ExternalForcePosted
Aggregating
true
Cadence
daily-eod
Metadata keys
settlement_period, card_brand
Posted requirements
Max pending age
Max unbundled age
Bundles activity
MerchantCardSale
Metadata value examples
card_brand: - Visa - Mastercard - Amex settlement_period: - 2026-04 - 2026-05 - 2026-06
Typical amount range (min, max)
Typical firings per period (min, max)
Description
Daily aggregating rail that bundles the day's MerchantCardSale activity for reporting back to the card network. Single-leg per the SPEC's "single-leg sweep that lands in External" pattern — bundles all sales in the day's window and reports the net to the card network's reconciliation file. Force-posted origin: the card network's settlement file is the authoritative record.

SettlementAutoSettle single-leg

Name
SettlementAutoSettle
Leg role
MerchantPayableClearing
Leg direction
Variable
Origin
InternalInitiated
Aggregating
false
Cadence
Metadata keys
merchant_id, settlement_period
Posted requirements
Max pending age
4:00:00
Max unbundled age
Bundles activity
Metadata value examples
Typical amount range (min, max)
Typical firings per period (min, max)
Description
AB.3.6 settlement-timing variant — auto-settle (T+0). High-volume merchants enrolled in intraday clearing close their cycle within 4 hours of business_day_end. Tight max_pending_age surfaces ETL delays on the L1 stuck_pending matview within the same day.

SettlementStandardSettle single-leg

Name
SettlementStandardSettle
Leg role
MerchantPayableClearing
Leg direction
Variable
Origin
InternalInitiated
Aggregating
false
Cadence
Metadata keys
merchant_id, settlement_period
Posted requirements
Max pending age
1 day, 0:00:00
Max unbundled age
Bundles activity
Metadata value examples
Typical amount range (min, max)
Typical firings per period (min, max)
Description
AB.3.6 settlement-timing variant — standard-settle (T+1). The common case for most merchants — cycle closes the business day after the card-sale period ends.

SettlementSlowSettle single-leg

Name
SettlementSlowSettle
Leg role
MerchantPayableClearing
Leg direction
Variable
Origin
InternalInitiated
Aggregating
false
Cadence
Metadata keys
merchant_id, settlement_period
Posted requirements
Max pending age
7 days, 0:00:00
Max unbundled age
Bundles activity
Metadata value examples
Typical amount range (min, max)
Typical firings per period (min, max)
Description
AB.3.6 settlement-timing variant — slow-settle (weekly batch). Low-volume merchants opt into a weekly batch close; 7-day max_pending_age tolerance reflects the cadence.

NoFraudReview single-leg

Name
NoFraudReview
Leg role
InternalSuspenseRecon
Leg direction
Variable
Origin
InternalInitiated
Aggregating
false
Cadence
Metadata keys
merchant_id, settlement_period
Posted requirements
Max pending age
0:15:00
Max unbundled age
Bundles activity
Metadata value examples
Typical amount range (min, max)
Typical firings per period (min, max)
Description
AB.3.6 fraud-review variant — no review (auto-approved). Trusted high-volume merchants with clean fraud histories skip manual review; the cycle clears immediately on close. PT15M max_pending_age is operational latency only.

StandardFraudReview single-leg

Name
StandardFraudReview
Leg role
InternalSuspenseRecon
Leg direction
Variable
Origin
InternalInitiated
Aggregating
false
Cadence
Metadata keys
merchant_id, settlement_period
Posted requirements
Max pending age
4:00:00
Max unbundled age
Bundles activity
Metadata value examples
Typical amount range (min, max)
Typical firings per period (min, max)
Description
AB.3.6 fraud-review variant — analyst review. New or medium-volume merchants pass through standard fraud-team review before the cycle closes (4-hour SLA).

EnhancedFraudReview single-leg

Name
EnhancedFraudReview
Leg role
InternalSuspenseRecon
Leg direction
Variable
Origin
InternalInitiated
Aggregating
false
Cadence
Metadata keys
merchant_id, settlement_period
Posted requirements
Max pending age
3 days, 0:00:00
Max unbundled age
Bundles activity
Metadata value examples
Typical amount range (min, max)
Typical firings per period (min, max)
Description
AB.3.6 fraud-review variant — escalated review. Flagged merchants or unusual-pattern cycles route through enhanced review (3-day SLA). Surfaces as stuck_pending when the compliance team lags beyond the cap.

MerchantDailySettleAggregator two-leg

Name
MerchantDailySettleAggregator
Source role
MerchantPayableClearing
Destination role
WireSettlementSuspense
Origin
InternalInitiated
Source origin (override)
Destination origin (override)
Expected net (standalone firing)
0
Aggregating
false
Cadence
Metadata keys
merchant_id, payout_batch_id
Posted requirements
Max pending age
Max unbundled age
Bundles activity
Metadata value examples
Typical amount range (min, max)
Typical firings per period (min, max)
Description
AB.4.6 fan-in parent rail. Each daily merchant settlement legs out a balance from `MerchantPayableClearing` into `WireSettlementSuspense` tagged with the batch id it'll contribute to. The week's 5 daily firings then aggregate into one `MerchantWeeklyPayoutBatch` Transfer per merchant via the AB.4 fan-in chain below.

MerchantWeeklyBatchClose single-leg

Name
MerchantWeeklyBatchClose
Leg role
WireSettlementSuspense
Leg direction
Credit
Origin
InternalInitiated
Aggregating
false
Cadence
Metadata keys
merchant_id, payout_batch_id
Posted requirements
Max pending age
Max unbundled age
Bundles activity
Metadata value examples
Typical amount range (min, max)
Typical firings per period (min, max)
Description
AB.4.6 fan-in child closure leg. Posts ONCE per weekly MerchantWeeklyPayoutBatch firing to credit WireSettlementSuspense for the aggregated payout. Reconciles via MerchantWeeklyPayoutBatch.leg_rails (S3 — every single-leg non-aggregating rail must appear in some template's leg_rails).