Create Donation
Donations
Create Donation
Create a donation and initiate payment processing.
POST
Create Donation
Create Donation
Creates a donation record, calculates fees, and returns a Stripe PaymentIntent client secret for completing the payment on the frontend.The campaign must be in
ACTIVE status. The org must have completed Stripe Connect onboarding before donations can be processed.Request Body
The ID of the campaign to attribute this donation to.
Donation amount in cents. Minimum
100 ($1.00). For event campaigns with a fixed ticket price, this is the per-ticket amount multiplied by ticketCount.Three-letter ISO currency code. Currently only
"usd" is supported.Giving frequency. One of:
"one_time", "monthly", "quarterly", "annual".Payment method type. One of:
"card", "ach", "apple_pay", "google_pay".Whether the donor is covering processing and platform fees. When
true, the total charged to the donor is grossed up so the nonprofit receives the full amount.Donor contact information.
Optional tribute dedication. If provided,
type and name are required.A public message from the donor, shown on the campaign’s donor roll. Max 280 characters.
Whether the donor opts in to future email communications from the organization.
Responses to campaign-specific custom fields.
The ID of a pre-configured giving level to associate with this donation. Optional.
For event campaigns with a fixed ticket price, the number of tickets being purchased (1–20). The total amount is derived from
ticketCount × campaign.ticketPriceCents.UTM source parameter for attribution tracking (e.g.,
"email", "facebook"). Max 100 characters.UTM medium parameter (e.g.,
"newsletter", "cpc"). Max 100 characters.UTM campaign parameter (e.g.,
"year-end-2026"). Max 100 characters.The full URL of the referring page. Max 500 characters.
Response
The created donation record.
The Stripe PaymentIntent client secret. Pass this to Stripe Elements or the Stripe.js
confirmPayment() method on the frontend to complete payment collection.The calculated fee breakdown for this donation.
Example
Use the
clientSecret with Stripe Elements on the frontend to collect payment details and confirm the PaymentIntent. The donation status remains PENDING until Stripe confirms payment via webhook.Error Responses
| Status | Error | Description |
|---|---|---|
| 400 | Campaign not found | The campaignId does not exist. |
| 400 | Campaign is not active | The campaign must be in ACTIVE status. |
| 400 | Minimum donation is $X | The amount is below the campaign’s minimum. |
| 400 | Organization has not completed payment setup | Stripe Connect onboarding is incomplete. |
| 400 | Sorry, not enough tickets available | Event is sold out or insufficient capacity. |
| 400 | Validation failed | One or more fields failed schema validation. |