Skip to content

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

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

jacklatourette wants to merge 2 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. Above
    the NACHA per-entry same-day limit it settles on the standard schedule and is priced
    accordingly — it is not rejected.
  • 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 18, 2026 10:05pm UTC
3 Skipped Deployments
Project Deployment Actions Updated
grid-cards-demo Ignored Ignored Preview Sep 18, 2026 10:05pm UTC
grid-flow-builder Ignored Ignored Preview Sep 18, 2026 10:05pm UTC
grid-wallet-demo Ignored Ignored Preview Sep 18, 2026 10:05pm 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 18, 2026, 9:15 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-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@620db1e14c206148f6ee18ce6f6dbd254d5d8ec2
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 ⏭️

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 ⏭️


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-18 21:18:34 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 and others added 2 commits September 18, 2026 14:14
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
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.

1 participant