Send website orders
An organization’s online store can send each order to Auradonors the moment it’s paid. Auradonors records it as the store charged it: the donor found or added, the order with its gifts and products, the payment in the day’s batch, and any monthly gift set up at the organization’s payment processor. A WooCommerce store connects without any of this; this recipe is for any other store, or a site of your own.
The organization connects the store under Administration → Integrations → Website orders, choosing Another store. That page gives the address to send to and a connection key, shown once. Send the key as a bearer token. It isn’t an API key: it does nothing but send this store’s orders.
Check the key
Section titled “Check the key”Before sending anything, you can ask what a key is connected to. Nothing is read or changed:
curl https://api.auradonors.com/api/integrations/v1/{tenantSlug}/webstore/connection \ -H "Authorization: Bearer aura_…"{ "organizationName": "Kindlewood Ministries", "provider": "Other", "isSandbox": false, "replayMode": false}isSandbox is true for an organization’s practice copy of its records.
replayMode is true while the organization is rehearsing a move to Auradonors: its
orders are recorded, but no card is read and no monthly gift is set up at the
payment processor. A key Auradonors doesn’t know answers 401, and a connection
switched off answers 403.
Send an order
Section titled “Send an order”curl -X POST https://api.auradonors.com/api/integrations/v1/{tenantSlug}/webstore/orders \ -H "Authorization: Bearer aura_…" \ -H "Content-Type: application/json" \ -d '{ "orderId": "48213", "customerId": "1077", "placedAt": "2026-10-14T15:02:11Z", "customer": { "firstName": "Jane", "lastName": "Smith", "email": "[email protected]", "phone": "555-123-4567" }, "billingAddress": { "line1": "12 Oak Street", "city": "Tulsa", "state": "OK", "postalCode": "74103", "country": "US" }, "lines": [ { "sku": "BK-101", "name": "Walking in Grace", "quantity": 2, "subtotal": 30.00, "total": 27.00 }, { "isGift": true, "name": "Monthly gift", "designation": "Missions", "frequency": "Monthly", "quantity": 1, "subtotal": 25.00, "total": 25.00 } ], "shippingTotal": 5.00, "shippingMethod": "Flat rate", "taxTotal": 2.16, "feeTotal": 1.00, "couponCodes": ["FALL10"], "total": 60.16, "payment": { "method": "CreditCard", "transactionId": "60231480917", "authorizationCode": "A1B2C3", "last4": "1111", "cardBrand": "Visa", "processorCustomerId": "509551201", "processorPaymentMethodId": "512237610" }, "appealCode": "FA26WEB" }'A recorded order answers 200:
{ "orderId": "48213", "status": "Imported", "alreadyReceived": false, "contactId": 1042, "auraOrderId": "6b1f0c1e-…", "orderNumber": 10388, "subscriptionId": "9123345", "recurringState": "Created", "reasonCode": null, "reason": null, "warnings": []}contactId is the donor’s contact number in Auradonors. Keep it if your site
shows donors their giving. subscriptionId is the payment processor’s
subscription for the monthly gift.
The fields that matter
Section titled “The fields that matter”orderIdis the store’s own order id. Auradonors records an order once perorderId, so send it again whenever you’re unsure it arrived. An order Auradonors already has answers as it did the first time, withalreadyReceived: true, and nothing more happens.customerIdis the donor’s account on your store, if they have one. Auradonors links it to the contact, so their next order finds them even under a new email. Leave it out for a guest checkout.- Lines. A product line needs a
sku. A gift isisGift: true, and itsdesignationnames the fund.subtotalis before the store’s discounts andtotalis after. A gift that repeats carriesfrequency:Monthly,QuarterlyorAnnually. - Amounts are as charged.
totalmust equal every line’stotalplusshippingTotal,taxTotalandfeeTotal, to the cent. Auradonors records your shipping and tax as they are, and works nothing out again. payment.methodis one ofCreditCard,ACHorPayPal, or a name the organization has mapped (a gateway id, say). The payment was taken by your store; Auradonors records it, and never charges it again.processorCustomerId/processorPaymentMethodId: for a monthly gift, the donor’s saved payment profile at the organization’s processor (an Authorize.Net customer profile and payment profile). Auradonors sets the subscription up against it, starting one period after the order.appealCodecredits the order to one of the organization’s appeals.
When Auradonors can’t record it
Section titled “When Auradonors can’t record it”Auradonors keeps every order it can read, even one it can’t record yet. Either way it answers 202, and there’s no need to send the order again:
NeedsReview— a person has to decide something.reasonCodesays what:Webstore.UnknownSku,Webstore.UnknownPaymentMethod,Webstore.TotalsDontAddUporWebstore.NoFund.reasonsays it in a sentence. The order waits on the organization’s Website orders page.Failed— something went wrong while recording it, and Auradonors will try again by itself.
warnings lists anything recorded differently from what you sent, such
as a product that was out of stock and has been back-ordered. An order
is never refused because of stock.
| Status | Meaning |
|---|---|
| 200 | Recorded |
| 202 | Kept, not recorded yet — see status |
| 400 | The order couldn’t be read; nothing was kept. The body lists every problem |
| 401 | The key isn’t valid |
| 403 | The organization’s plan doesn’t include website orders, or the store is switched off |
| 429 | Too many requests; wait and send again |
| 503 | The organization’s records can’t be reached right now; send again later |
Check on an order
Section titled “Check on an order”curl https://api.auradonors.com/api/integrations/v1/{tenantSlug}/webstore/orders/48213 \ -H "Authorization: Bearer aura_…"The answer has the same shape as the one you got when you sent the order. An order Auradonors never received answers 404.
Donor accounts
Section titled “Donor accounts”A site’s My Account pages can show donors their own giving and let them
manage their monthly gifts, through routes under
/api/integrations/v1/{tenantSlug}/webstore/donors, with the same key.
Every route takes the donor’s store account id (customerId) and reaches
only the contact that account is linked to; a monthly gift only when it
belongs to that donor.
| Route | What it does |
|---|---|
POST /donors/resolve |
Find the donor behind a store account, by the account, then email and name, then name and address; with "create": true, add them when there’s no match |
PUT /donors/{customerId}/link |
Link a store account to a contact number |
POST /donors/{customerId}/details |
Add an address, phones or emails the donor entered; nothing is ever deleted |
GET /donors/{customerId}/orders?priorYears= |
Their orders, by year |
GET /donors/{customerId}/giving?priorYears= |
Their gifts, by year, with funds |
GET /donors/{customerId}/recurring-gifts |
Their monthly gifts |
POST /donors/{customerId}/recurring-gifts/{subscriptionId}/cancel |
Cancel one, at the processor first |
PUT /donors/{customerId}/recurring-gifts/{subscriptionId} |
Change its amount, card or billing address |
curl -X POST https://api.auradonors.com/api/integrations/v1/{tenantSlug}/webstore/donors/resolve \ -H "Authorization: Bearer aura_…" \ -H "Content-Type: application/json" \ -d '{ "customerId": "1077", "firstName": "Jane", "lastName": "Smith", "email": "[email protected]" }'An account Auradonors can’t place answers "found": false. A repeating gift
that isn’t the donor’s answers 404, as one that doesn’t exist does.
Related
Section titled “Related”- Errors
- Live API explorer — the Online store section, including the donor-account routes a site’s My Account pages use.