Plate 02 · the agent donation flow Where each platform is today.
A donation is four steps. Verify the org, build the gift, take the
payment, confirm it landed. An agent does the ones you expose in code and
hands the rest back to the donor. Here’s how far it gets on the four
platforms we read closest. Nobody clears all four. Two get to three.
Checkout in code The Giving Block
The one platform that will open a checkout for a third party. It’s crypto, stock and DAF, so not how most nonprofits take money.
- 01 Verify the org in code
- 02 Build the gift session
- 03 Take the payment browser
- 04 Confirm it landed webhook + api
One POST returns a real session. Send an ID with it and it comes back on the webhook, so you can match the gift to the ask. Ask about a transaction and you get its status.
What would finish it: an idempotency key, and signed webhooks.
Lookup and prefill Every.org
Three of the four steps run in code, and looking up a nonprofit doesn’t even need a key.
- 01 Verify the org no key
- 02 Build the gift in code
- 03 Take the payment browser
- 04 Confirm it landed webhook
The lookup tells you whether anyone from the org has claimed the profile. Donate-link parameters are documented and exact. A webhook fires when a gift lands.
What would finish it: a checkout session, and a way to ask what happened to a gift.
Prefill and signed webhooks Fundraise Up
The best prefill contract of the eleven, and signed webhooks. It only works for the org that holds the key.
- 01 Verify the org own org only
- 02 Build the gift in code
- 03 Take the payment browser
- 04 Confirm it landed signed webhook
The URL API takes an amount, a currency, a recurrence, a designation by stable ID and a success URL, and it can lock the amount. POST /v1/donations really charges a Stripe payment method.
Building that payment method from card data puts you in PCI SAQ D (their docs say so, and they’re right), so it’s not the agent path. What would finish it: a hosted checkout session and an idempotency key.
Prefill via URL Givebutter
Prefill works through the URL. The API records gifts; it doesn’t take them.
- 01 Verify the org browser
- 02 Build the gift undocumented
- 03 Take the payment browser
- 04 Confirm it landed none yet
POST /v1/transactions logs a gift that already happened and has no payment field. The prefill parameters aren’t documented yet, but they work. Anything over 999 gets ignored.
Givebutter runs on Stripe, and Stripe has had checkout sessions for years. What would finish it: expose one, with an idempotency key.
Figure 02 · From public docs, live checkouts and sandboxes, 4 to 8
September 2026. We haven’t talked to any of these companies yet. If
we misread your docs, open an issue and
we’ll fix the page.
Step three is a browser step on all eleven, and that’s the right
call, not a gap. Fundraise Up’s docs put a name on why: build a
payment method from raw card data and you’re in PCI SAQ D. Let
Stripe Elements take the card and you’re in SAQ A. The other
platforms that charge don’t spell it out, but every one of them
gates on a token minted in a browser.
Translation: nobody should let an agent hold a card, and we’re not
asking anyone to. The donor pays in their own browser, same as today.
The agent’s whole job is to get them to the right page with the
right amount already filled in, then find out whether it worked.
That’s it.