Skip to content

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.

Before sending anything, you can ask what a key is connected to. Nothing is read or changed:

Terminal window
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.

Terminal window
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.

  • orderId is the store’s own order id. Auradonors records an order once per orderId, so send it again whenever you’re unsure it arrived. An order Auradonors already has answers as it did the first time, with alreadyReceived: true, and nothing more happens.
  • customerId is 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 is isGift: true, and its designation names the fund. subtotal is before the store’s discounts and total is after. A gift that repeats carries frequency: Monthly, Quarterly or Annually.
  • Amounts are as charged. total must equal every line’s total plus shippingTotal, taxTotal and feeTotal, to the cent. Auradonors records your shipping and tax as they are, and works nothing out again.
  • payment.method is one of CreditCard, ACH or PayPal, 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.
  • appealCode credits the order to one of the organization’s appeals.

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. reasonCode says what: Webstore.UnknownSku, Webstore.UnknownPaymentMethod, Webstore.TotalsDontAddUp or Webstore.NoFund. reason says 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
Terminal window
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.

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
Terminal window
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.

  • Errors
  • Live API explorer — the Online store section, including the donor-account routes a site’s My Account pages use.