Skip to content

feat(rails): add ACH_SAME_DAY payment rail - #931

Open
jacklatourette wants to merge 3 commits into
mainfrom
AT-6555-add-ach-same-day-payment-rail
Open

jacklatourette wants to merge 3 commits into
mainfrom
AT-6555-add-ach-same-day-payment-rail

Conversation

@jacklatourette

@jacklatourette jacklatourette commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

What

Adds ACH_SAME_DAY to the PaymentRail enum alongside the existing ACH, and to the
paymentRails array on UsdAccountInfo.

Why

Grid exposes one ACH rail today. Every ACH payout it originates already settles same
day, because the sponsor bank's default service level is same-day and nothing in the
request path ever asks for a different one. A platform therefore cannot choose
standard ACH, and the two speeds cannot be priced apart.

Splitting the rail gives platforms an explicit choice, and gives each speed its own
RailFeeConfig.

The paymentRails array is the part that matters at runtime

The top-level enum alone is not enough. The generated client validates an account's
paymentRails against the array on UsdAccountInfo, so advertising the rail on a USD
account without that entry makes GET /customers/external-accounts/{id} return 500
— verified against a live account.

UsdAccountInfo is composed by PaymentUsdAccountInfo and UsdExternalAccountInfo, so
the single entry covers all three generated models.

What this means for integrators

  • ACH_SAME_DAY requests same-business-day settlement and is priced separately. It is
    capped at $1,000,000 per entry by the NACHA same-day limit, rising to $10,000,000
    on 2027-09-17. A payout above the cap is rejected, not slowed — send it over ACH
    instead. Refusing lets the customer choose the slower rail rather than being quietly
    given something they did not ask for, and stating the figure lets them check the
    amount before they are refused.
  • The prose docs said the opposite. send-payment.mdx, snippets/sending/accounts.mdx
    and the changelog all still described the downgrade — the changelog explicitly said an
    over-cap payout "is not rejected". All three now match the spec.
  • ACH will settle on the standard next-business-day schedule. Until an announced
    date it continues to settle same-business-day on production platforms, and already
    settles next-business-day on sandbox platforms. The descriptions say so explicitly
    rather than claiming next-day everywhere, because that would be wrong for every
    production customer until the cutover.
  • RailFeeConfig accepts ACH_SAME_DAY. The two are separate rails, so price each one
    with its own config.

The change is additive to both enums. No existing field changes shape.

Docs

The pages that enumerate rails now list it: the US row of the country support table, the
paymentRail tip on both sending pages, and the rail-fee limits on the fees page. The
changelog gets a September 2026 entry.

Sequencing

Backend support lands separately in webdev under AT-6555, which regenerates its vendored
client from this branch. Until that ships, a request naming ACH_SAME_DAY is declined by
the backend, so hold this if you would rather the docs never advertise a rail the API
does not yet accept.

Verification

  • Rebased onto current main (was 45 behind). One conflict, in the changelog, where both
    sides added September entries; both kept.
  • make build rebundles cleanly; openapi.yaml and mintlify/openapi.yaml are in sync.
  • make lint-openapi exits 0: 866 problems, 0 errors (174 warnings, 692 infos, all
    pre-existing and unrelated — the 2 redocly warnings are paths-kebab-case).
  • make lint-markdown cannot run locally: package.json has no lint:markdown script.
    CI's "Lint Code & Documentation" job covers it.

🤖 Generated with Claude Code

https://claude.ai/code/session_01RUF3krYG9C9hShf4iS5Sug

@vercel

vercel Bot commented Sep 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
grid-statements-demo Error Error Sep 22, 2026 11:52pm UTC
3 Skipped Deployments
Project Deployment Actions Updated
grid-cards-demo Ignored Ignored Preview Sep 22, 2026 11:52pm UTC
grid-flow-builder Ignored Ignored Preview Sep 22, 2026 11:52pm UTC
grid-wallet-demo Ignored Ignored Preview Sep 22, 2026 11:52pm UTC

Request Review

@mintlify

mintlify Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated
Grid 🟢 Ready View Preview Sep 22, 2026, 11:52 PM

Copy link
Copy Markdown
Contributor Author

This stack of pull requests is managed by Graphite. Learn more about stacking.

@github-actions

github-actions Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

✱ Stainless preview builds for grid

This PR will update the grid SDKs with the following commit messages.

cli

chore(internal): regenerate SDK with no functional changes

go

feat(api): add ACH_SAME_DAY payment rail across transactions/transfers/config

kotlin

feat(api): add ACH_SAME_DAY payment rail enum value across config and transaction models

openapi

feat(api): add ACH_SAME_DAY payment rail option

php

feat(api): add ACH_SAME_DAY to payment rail enums

python

feat(api): add ACH_SAME_DAY rail type to transfers and config

ruby

feat(api): add ACH_SAME_DAY payment rail option

typescript

feat(api): add ACH_SAME_DAY rail to config/accounts/transactions/transfers

Edit this comment to update them. They will appear in their respective SDK's changelogs.

grid-typescript studio · code · diff

Your SDK build had at least one "error" diagnostic, but this did not represent a regression.
generate ❗build ⏭️lint ⏭️test ⏭️

grid-cli studio · code · diff

Your SDK build had at least one "error" diagnostic, but this did not represent a regression.
generate ❗build ⏭️lint ⏭️test ⏭️

grid-openapi studio · code · diff

Your SDK build had at least one "error" diagnostic, but this did not represent a regression.
generate ❗

grid-kotlin studio · code · diff

Your SDK build had at least one "error" diagnostic, but this did not represent a regression.
generate ❗build ⏭️ (prev: build ✅) → lint ⏭️ (prev: lint ✅) → test ⏭️ (prev: test ❗)

grid-ruby studio · code · diff

Your SDK build had at least one "error" diagnostic, but this did not represent a regression.
generate ❗build ⏭️lint ⏭️test ⏭️

grid-go studio · code · diff

Your SDK build had at least one "error" diagnostic, but this did not represent a regression.
generate ❗build ⏭️lint ⏭️test ⏭️

go get github.com/stainless-sdks/grid-go@76ee63e9b3faf0809cd2965fc6692a414ffb8bf5
grid-python studio · code · diff

Your SDK build had at least one "error" diagnostic, but this did not represent a regression.
generate ❗build ⏭️lint ⏭️test ⏭️

grid-php studio · code · diff

Your SDK build had at least one "error" diagnostic, but this did not represent a regression.
generate ❗lint ⏭️test ⏭️


This comment is auto-generated by GitHub Actions and is automatically kept up to date as you push.
If you push custom code to the preview branch, re-run this workflow to update the comment.
Last updated: 2026-09-22 23:55:33 UTC

@greptile-apps

greptile-apps Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 5/5

The PR appears safe to merge, with the source and generated contract views aligned and no actionable contract defect identified.

Summary

  • Keeps the modular schema and both generated OpenAPI bundles aligned.
  • Allows separate fee configurations for standard and same-day ACH.
  • Documents the distinction between next-business-day ACH and requested same-business-day settlement.

Reviews (1) · Last reviewed commit: "feat(rails): add ACH_SAME_DAY payment ra..."

@jacklatourette
jacklatourette force-pushed the AT-6555-add-ach-same-day-payment-rail branch from 38e2c6c to 71fa3d2 Compare September 10, 2026 17:57
@github-actions github-actions Bot added the breaking-change Introduces a breaking change to the OpenAPI spec label Sep 10, 2026
@jacklatourette
jacklatourette force-pushed the AT-6555-add-ach-same-day-payment-rail branch from 71fa3d2 to 8e4ddb9 Compare September 15, 2026 23:12
@github-actions github-actions Bot removed the breaking-change Introduces a breaking change to the OpenAPI spec label Sep 15, 2026
@jacklatourette
jacklatourette force-pushed the AT-6555-add-ach-same-day-payment-rail branch from 8e4ddb9 to 4741fd0 Compare September 17, 2026 20:34
@jacklatourette
jacklatourette force-pushed the AT-6555-add-ach-same-day-payment-rail branch from 4741fd0 to 90faaf4 Compare September 17, 2026 22:17
@jacklatourette
jacklatourette force-pushed the AT-6555-add-ach-same-day-payment-rail branch from 5a3b0cf to d4f0f2f Compare September 18, 2026 21:14
@jacklatourette
jacklatourette force-pushed the AT-6555-add-ach-same-day-payment-rail branch from d4f0f2f to 6ce9f23 Compare September 21, 2026 23:29
@jacklatourette
jacklatourette force-pushed the AT-6555-add-ach-same-day-payment-rail branch from 6ce9f23 to 1a5b6e2 Compare September 22, 2026 00:29
jacklatourette and others added 3 commits September 22, 2026 16:51
Grid exposes one ACH rail today, so a platform cannot choose between
standard and same-day settlement and the two cannot be priced apart.

Add ACH_SAME_DAY alongside ACH in PaymentRail, and to the paymentRails
array on UsdAccountInfo. The array is the one that matters at runtime:
the generated client validates paymentRails against it, so advertising
the rail on a USD account without this entry makes
GET /customers/external-accounts/{id} return 500. UsdAccountInfo is
composed by PaymentUsdAccountInfo and UsdExternalAccountInfo, so the
single entry covers all three generated models.

Describe the rails as they will actually behave on release. ACH keeps
settling same-business-day on production platforms until an announced
date, and already settles next-business-day on sandbox, so the
description says so rather than claiming next-day everywhere. An
over-cap same-day request settles on the standard schedule and is
priced accordingly; it is not rejected.

RailFeeConfig accepts the new rail, and its description now says the
two are separate rails that each need their own fee config.

The docs pages that enumerate rails list the new one: the US row of the
country support table, the paymentRail tip on the sending pages, the
rail-fee limits on the fees page, and a changelog entry.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RUF3krYG9C9hShf4iS5Sug
The description said an over-limit payout 'settles on the standard schedule
and is priced accordingly'. Grid now refuses it instead, so a customer who
named the fast rail chooses the slower one themselves rather than being
moved to it silently.

Plain ACH is never refused by this limit.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RUF3krYG9C9hShf4iS5Sug
… is refused

The prose still described the downgrade the spec had already dropped, and the
changelog said an over-cap payout "is not rejected" — the inverse of what the
API does. None of it named the limit, so an integrator could only discover it
by being refused.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@jacklatourette
jacklatourette force-pushed the AT-6555-add-ach-same-day-payment-rail branch from 4e7e563 to b55ce40 Compare September 22, 2026 23:52

This branch had an error being deployed

1 failed (outdated) and 1 active deployments
staging - mintlify b55ce40c Deployed Sep 22, 2026 by mintlify[bot]
Preview – grid-statements-demo 6ce9f23b Deployed Sep 21, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants