{"actions":{"bootstrapAndRun":{"effect":"installs rote if missing, inspects, prepares, and asks before running","href":"https://play.modiqo.ai/install?play=jaylabs/settlement-delay@0.3.34","method":"GET","rel":"https://rote.dev/rels/bootstrap-and-run","requiresConsent":true,"responseMediaType":"text/x-shellscript"},"inspect":{"command":"rote play inspect https://play.modiqo.ai/jaylabs/settlement-delay@0.3.34","effect":"read-only"},"installCliOnly":{"effect":"installs the rote CLI, nothing else","href":"https://play.modiqo.ai/install","method":"GET","rel":"https://rote.dev/rels/install-cli","requiresConsent":true,"responseMediaType":"text/x-shellscript"},"run":{"command":"rote play run https://play.modiqo.ai/jaylabs/settlement-delay@0.3.34","effect":"executes the play locally after consent","headless":{"approvalAssertion":"--yes","approvalRequiredBeforeInvocation":true,"commandTemplate":"rote play run https://play.modiqo.ai/jaylabs/settlement-delay@0.3.34 <name=value...> --yes","stdinPolicy":"never pipe input to automate the interactive Ready selector"},"requiresConsent":true}},"description":"Why is my Stripe payout late? This explains settlement delay for every late payout, pairing each Stripe payout with the Plaid bank credit that landed and the Xero ledger row that recorded it, then naming what held the money up. It never predicts a settlement date; it explains delays that already happened. Late payout reconciliation for finance ops. It walks the waiting days one at a time and gives each day to exactly one reason: weekends, Indian second and fourth Saturday branch closures, national and regional bank holidays, dispute holds, reserves, batch cutoffs, bank posting lag, bookkeeping lag, instant payouts, still in transit, unreconciled, failed, and unexplained for whatever no source accounts for. Attributed days sum to the delay by construction. Each reason carries the payout id, bank transaction id, dispute id or calendar date behind it and a confidence you can argue with, and each payout is measured on the calendar of its own currency. WHAT STANDS IN FOR WHAT: the bank leg reads Plaid rather than","distribution":{"digest":"sha256:89aae28e0e2a0c5309b7856b8918f6cc7385966a164c25f5e662e9f4e462de6f","mediaType":"application/vnd.modiqo.rote-flow","size":160851,"verifiedBy":"rote verifies the downloaded archive against this digest before it runs"},"effects":{"credentialsProvidedBy":"runner","credentialsRemainLocal":true,"declaredWrites":[],"publisherReceivesCredentials":false},"id":"https://play.modiqo.ai/jaylabs/settlement-delay@0.3.34","inputPolicy":{"optionalWithDefault":"show_default_and_accept_override","optionalWithoutDefault":"omit_unless_supplied","required":"ask","secrets":"collect_locally_outside_conversation"},"links":{"docs":"https://rote.dev","page":"https://play.modiqo.ai/jaylabs/settlement-delay@0.3.34","protocol":"https://play.modiqo.ai/.well-known/rote","self":"https://play.modiqo.ai/jaylabs/settlement-delay@0.3.34.json"},"name":"settlement-delay","owner":{"kind":"org","slug":"jaylabs"},"parameters":[{"default":"demo","description":"demo reads the bundled sample data, makes no network call and needs no credential, so a stranger can run this cold. live reads your own systems, one leg at a time, from environment variables: STRIPE_BEARER_TOKEN (or STRIPE_API_KEY or STRIPE_SECRET_KEY) for the processor leg, PLAID_CLIENT_ID and PLAID_SECRET for the bank leg, XERO_ACCESS_TOKEN and XERO_TENANT_ID for the ledger leg. resources/LIVE-KEYS.md has the setup and the optional variables. The calendar leg needs no credential. Any leg whose variables are unset falls back to sample data for that leg alone and says so on every line it touches.","example":"demo","input":{"allowCustom":false,"choices":[{"label":"demo","value":"demo"},{"label":"live","value":"live"}],"label":"Mode"},"name":"mode","required":false,"type":"string","validValues":["demo","live"]},{"default":"IN","description":"Which bank-holiday calendar and weekend rule to reason with. IN uses India's six national bank holidays plus a regional tier and the RBI second and fourth Saturday closure rule, US the federal holidays the Federal Reserve observes, GB the England and Wales list. Each bundled file names its source and the date it was compiled. Use holidays_file or calendar_ics_url for regional closures.","example":"IN","input":{"allowCustom":false,"choices":[{"label":"IN","value":"IN"},{"label":"US","value":"US"},{"label":"GB","value":"GB"}],"label":"Country"},"name":"country","required":false,"type":"string","validValues":["IN","US","GB"]},{"default":"30","description":"How far back to explain, in days. Clamped to 1..180. Only read in live mode, because the bundled sample data carries its own fixed window of the real 2026 calendar.","example":"30","input":{"allowCustom":true,"choices":[],"label":"Lookback days"},"name":"lookback_days","required":false,"type":"string"},{"default":"3","description":"How many days after the expected arrival date a credit may land before this play calls the payout late. Clamped to 0..30. It decides what counts as late, not what counts as matched. A credit is still paired with its payout for two more weeks past this window, because a payout that landed eight days late is the thing worth explaining rather than reporting as missing money.","example":"3","input":{"allowCustom":true,"choices":[],"label":"Settle window days"},"name":"settle_window_days","required":false,"type":"string"},{"default":"0","description":"How far a bank credit may differ from a payout, in the currency's minor unit, and still count as the same money. Clamped to 0..100000. The default of 0 demands an exact match, which is what a correct payout looks like.","example":"0","input":{"allowCustom":true,"choices":[],"label":"Amount tolerance cents"},"name":"amount_tolerance_cents","required":false,"type":"string"},{"description":"A public ICS calendar feed of extra closures, for example your bank's published holiday calendar. Read only in live mode, parsed with the standard library, and only its all-day events are used. Anything it adds is labelled with its own source on the line it explains.","example":"https://example.com/bank-holidays.ics","input":{"allowCustom":true,"choices":[],"label":"Calendar ics url"},"name":"calendar_ics_url","required":false,"type":"string"},{"description":"Path in the run workspace to your own holiday list as JSON, either an object with a holidays array or a bare array, each entry carrying a date and a name. Use it for the state and regional closures no national calendar can cover.","example":"my-holidays.json","input":{"allowCustom":true,"choices":[],"label":"Holidays file"},"name":"holidays_file","required":false,"type":"string"},{"default":"findings","description":"findings lists only the payouts that were late or that never matched. all adds a line for every payout in the window, including the ones that behaved, which is what you want when someone asks you to prove the clean ones were clean.","example":"findings","input":{"allowCustom":false,"choices":[{"label":"findings","value":"findings"},{"label":"all","value":"all"}],"label":"Report"},"name":"report","required":false,"type":"string","validValues":["findings","all"]},{"description":"Where the demo data lives. Empty means the sample set bundled inside this play. Anything else is a directory in the run workspace, or an absolute path, holding either this play's own sample files or raw API captures one file per endpoint. Use it to run the play against your own recorded data, or against a test dataset, without editing the package.","example":"my-samples","input":{"allowCustom":true,"choices":[],"label":"Samples dir"},"name":"samples_dir","required":false,"type":"string"},{"default":"false","description":"Which legs must really be live, or nothing runs. false lets any leg fall back to sample data, clearly labelled, so a run always produces a receipt. true demands all three of stripe, bank and ledger. A comma separated list demands only the legs you name, which is what you want when one system is not connected. strict_live=stripe,bank stops the run if Stripe or the bank cannot be read live, while the ledger may still fall back with a warning. A named leg with no usable credential stops the run before any leg reads anything, and a live read that fails stops that leg with its HTTP status and the page it failed on. Accepts true, false, 1, 0, yes, no, on, off, or the leg names. The SETTLEMENT_STRICT_LIVE environment variable does the same thing, and a value given here always wins over it.","example":"stripe,bank","input":{"allowCustom":true,"choices":[],"label":"Strict live"},"name":"strict_live","required":false,"type":"string"}],"preparation":[{"action":{"command":"rote play inspect https://play.modiqo.ai/jaylabs/settlement-delay@0.3.34 --json","effect":"read-only"},"step":1,"type":"inspect_local_readiness"},{"references":["/parameters"],"step":2,"type":"collect_parameters"},{"references":["/parameters","/requirements","/effects"],"step":3,"type":"review"},{"consentBoundary":"the user approves the exact play and parameter values","references":["/parameters","/requirements","/effects"],"step":4,"type":"obtain_run_consent"},{"action":{"command":"rote play run https://play.modiqo.ai/jaylabs/settlement-delay@0.3.34","headlessCommandTemplate":"rote play run https://play.modiqo.ai/jaylabs/settlement-delay@0.3.34 <name=value...> --yes"},"preservesAcquisitionBoundaries":["adapter_selection","oauth_dcr","google_discovery","static_token_setup","runtime_security_checks"],"requiresConsent":true,"step":5,"type":"run"}],"producedBy":{"roteVersion":"0.79.0"},"publishedAt":"2026-09-04T01:04:09.832191+00:00","reference":"jaylabs/settlement-delay@0.3.34","requirements":{"adapters":[],"browser":{"dependencies":[],"runtime":false,"signIn":false},"localTools":["python3","rote"],"roteCli":{"minimumVersion":"0.62.0"},"sessions":false},"resolution":"pinned","schema":"rote.play.v1","stats":{"downloads":2,"installs":0},"steps":{"count":7,"names":["attribute","load_calendar","preflight","pull_bank","pull_ledger","pull_stripe","report"]},"title":"settlement-delay","type":"play","version":"0.3.34","visibility":"public"}