Xero
Send Webflow Ecommerce orders and form submissions to Xero as invoices and quotes with Zapier, Make, or n8n, or build the sync on the Xero and Webflow APIs.
Ecommerce takes orders and forms capture leads; Xero keeps the books. Completed orders require separate accounting records and bank reconciliation in Xero. Someone re-keys customer details and order totals into Xero by hand, and the two systems drift apart.
Connecting Xero and Webflow routes site events into Xero and can also send accounting updates back to the site. A Stripe feed in Xero imports the payments behind your store, while automation tools or direct API integrations create the matching sales and customer records.
This setup suits agencies that bill from proposal forms and Webflow Ecommerce merchants who reconcile Stripe payouts. It fits subscription sites that publish content once an invoice is paid. Bookkeepers and operations leads can run the Zapier or Make path without writing code. Developers who need line-item control build on the Webflow Data API and the Xero Accounting API.
How to integrate Xero with Webflow
What is Xero? Xero is cloud-based accounting software for small businesses. It covers invoicing and quotes, bank feeds and reconciliation, bill payments, expense claims, inventory, and reporting. The Xero Accounting API exposes contacts, invoices, quotes, payments, and items to outside systems.

Teams pair the two when the site handles sales or lead capture, and Xero serves as the ledger. Common triggers include a Webflow Ecommerce order or a quote request form. A project milestone stored as a Webflow CMS item can also start the flow. The accounting side then needs a contact plus the appropriate invoice or quote, with payment recorded without re-entry. Xero has no app in the Webflow Apps Marketplace, so every route below runs through an agent, an automation platform, or your own code.
The Xero-Webflow integration supports four approaches:
- The Xero and Webflow MCP servers let an AI agent read and draft records in both systems on request, with a person approving anything that reaches the ledger.
- Xero online invoice links and a Stripe feed add a Pay now route to a Webflow page and import Webflow Ecommerce Stripe payments into Xero without writing code.
- Zapier, Make, and n8n connect Webflow triggers such as new orders and form submissions to Xero actions such as Create Sales Invoice.
- The Webflow and Xero APIs give you full control over contact, invoice, payment, and CMS sync, but require server-side development.
Most implementations combine two or more of these methods depending on the complexity of the setup.
Connect the Xero and Webflow MCP servers
Xero publishes an open-source Xero MCP server, and Webflow runs its own Webflow MCP server. Add both to one MCP client and an agent can work across the two when you ask it to. It can read quote request submissions from a Webflow form, find or create the Xero contact, and draft the quote. In the other direction, it can list paid invoices in Xero and update the matching Webflow CMS items.
The Xero server's invoice and quote tools create records in Draft status, so a person still approves each one in Xero before it reaches the customer or the ledger. The server runs locally through npx and authenticates with either a Custom Connection or a bearer token from your own OAuth flow. Test it against the Xero Demo Company first, which Custom Connections can use for free. Webflow's MCP tools reference covers CMS items and form submissions but lists no Ecommerce order tools, so unattended order-to-invoice sync belongs on the automation or API routes below.
Link Xero invoices and Stripe payments from Webflow
Xero can share a link to any online invoice, quote, or credit note. Placing that link behind a Webflow button sends a customer to Xero's online invoice, where they can pay, with no code and no middleware. Store payments need no middleware either: a Stripe feed in Xero imports the Stripe transactions behind your Webflow Ecommerce orders. Neither path creates the invoice for you, so both depend on records that already exist in Xero.
Add a Xero online invoice or quote link to a Webflow button
This method works for deposits, retainers, and one-off invoices that you create in Xero first. The online invoice shows a Pay now button only once you set up a payment service and apply it to the invoice, and never while the invoice is a draft. Xero works with payment services such as Stripe and GoCardless, and with other providers through a custom URL. An invoice paid through a custom URL needs its payment applied by hand in Xero. Xero documents the link steps below in its online invoice sharing article.
To place the link:
- In Xero, open the Sales menu, select Invoices, and open the invoice.
- If the invoice is Draft or Awaiting approval, click the Approve & email arrow and select Approve & get link. If it is Awaiting payment or Paid, click the menu icon and select Get link.
- Click Copy.
- In Webflow, add a Button element and set its link to the copied URL.
- Publish the site.
For a quote, open Sales > Quotes, open the quote, click the menu icon, and select Get link.
Copying the link for a Draft or Awaiting approval invoice approves that invoice automatically. Xero also warns that anyone with the link can view the transaction. A Webflow page is public unless you gate it, so keep these links off public pages and share them by email or on a gated client page.
Import Webflow Ecommerce payments with a Stripe feed
Webflow Ecommerce checkout supports two payment providers, Stripe and PayPal, so a Webflow order can't be paid through a Xero payment service. Xero can import the Stripe side instead. Xero’s Stripe listing says transaction data flows into Xero whether a payment came through a Xero invoice or an ecommerce store. PayPal orders don't reach Xero this way.
To import the Stripe payments from your store, connect a Stripe feed in Xero:
- In Webflow, check which Stripe account the store uses under the Settings panel > Ecommerce > Payment.
- In Xero, open the Accounting menu, select Bank accounts, and click Add bank account.
- Start typing Stripe, select Stripe, and click Sign in to Stripe & connect.
- Sign in to that same Stripe account, click Connect my Stripe account, select the currencies to import, and click Finish.
Xero imports only transactions made after the feed connects, and they arrive on your Stripe payout schedule. Each payment shows as two statement lines, one for the gross amount and one for the Stripe fee. A Stripe account with more than one settlement currency needs a Xero plan that offers multicurrency. The feed does not require Stripe to be set up as a Xero payment service, which is a separate step that only adds Pay now to Xero invoices.
A statement line is not a sale. The feed gives you bank lines to reconcile, so each order still needs an invoice or other sales record in Xero to match against. Create those with Zapier, Make, or the API, or use a Xero App Store app such as Synder, which posts Stripe sales, fees, and payouts to Xero clearing accounts.
Connect with Zapier, Make, or n8n
Zapier, Make, and n8n each ship a Webflow connector and a Xero connector, and each pairs a Webflow trigger with a Xero action today. Make connects to Webflow through its Webflow app and appears in the Xero App Store. n8n's Webflow and Xero page says both services work through pre-defined actions or raw HTTP requests. Integrately, installable from the Webflow Marketplace, also describes creating Xero invoices when a Webflow order form is submitted.
Zapier
Named Zapier templates cover the order-to-invoice case. Zapier marks Xero as a Premium app, so confirm your Zapier plan includes it before you build. Your Xero user needs Standard or Adviser rights, because Read-only, Invoice Only, and Cashbook Client roles cannot use the API. The Webflow form must have received at least one submission before you connect it to a Zap.
To set up the integration:
- Open the template Xero invoices for orders, or start a new Zap with Webflow as the trigger app.
- Connect your Webflow account, then pick the site and a trigger such as New Order or New Form Submission.
- Connect Xero and choose the organisation.
- Map Webflow fields such as customer email and line items to the Xero Create Sales Invoice action. Fill in a Line Account Code even though the field is marked optional, because non-US organisations often get a TaxType validation error without it.
- Test the Zap and turn it on.
Trigger and action pairs available on Zapier:
- Webflow New Order → Xero Create Sales Invoice, followed by Create Payment for orders already paid
- Webflow Updated Order → Xero Create Sales Invoice, using the updated orders template
- Webflow New Form Submission → Xero Find or Create Contact, then Create New Quote Draft
- Xero New Sales Invoice → Webflow Create Item or Update Live Item
- Xero New Payment → Webflow Update Live Item, using the new payments template
A Xero organisation can connect to only one Zapier account at a time, and connecting it from a second account replaces the first connection. The New Payment trigger finds only payments created within the last 7 days, so reconciling a payment against an older invoice won't fire it.
Make
Make runs each Xero call as its own module, so a scenario can create the contact and the invoice as separate steps and branch between them. The Make Xero app includes Watch, Create, and Update modules for invoices and contacts. Other modules create quotes, payments, and bank transactions. Make's documentation lists the broad accounting.transactions scope for most of these modules, alongside accounting.contacts and accounting.settings.
To build a scenario:
- Add a Webflow Watch Events trigger and select the site and event.
- Add a Xero module that creates or updates the contact and map the customer fields.
- Add a Xero module that creates the invoice, map line items, and reference the contact from step 2.
- Turn the scenario on. Make lists Watch Events as a webhook trigger, so the scenario runs when Webflow sends the event.
n8n
Self-hosted and n8n Cloud deployments support the same Webflow and Xero workflow. The Webflow Trigger node fires on these events: Form Submission, Ecomm New Order, Ecomm Order Changed, Ecomm Inventory Changed, and Site Publish. It also fires on Collection Item Created, Updated, and Deleted. The Xero node supports Create, Get, Get All, and Update for contacts and invoices. Use an HTTP Request node against the Accounting API for quotes and payments.
To build a workflow:
- Add a Webflow Trigger node and choose Ecomm New Order or Form Submission.
- Add a Xero node with the Contact resource and the Create operation.
- Add a second Xero node with the Invoice resource and the Create operation. Set its contact from the previous node.
- For quotes or payments, add an HTTP Request node that sends a
PUTrequest tohttps://api.xero.com/api.xro/2.0/Quotesorhttps://api.xero.com/api.xro/2.0/Paymentswith your Xero credentials. APOSTto Payments deletes a payment rather than creating one. - Activate the workflow.
IFTTT offers Webflow Form submitted and New order triggers, and its Xero service includes a Create a sales invoice action. Automation workflows generally run in one direction, so a two-way contact sync needs one workflow per direction.
Build with the Webflow and Xero APIs
Line-item mapping, tax rates, account codes, idempotency, and error handling are available through direct API integration. This developer path needs a server, because the Xero OAuth 2.0 client secret must never reach the browser, so never call the Xero API from front-end JavaScript on a Webflow page. Webflow Cloud can host that server as a Next.js or Astro app with server-side API routes. Store the Xero client secret as a secret environment variable and read it only in server code. Webflow Cloud makes environment variables available at build time and at runtime, and masks secret values in its dashboard. Any other backend works the same way.
On the Xero side, create an app under My Apps in the Developer Portal. It gives you a client ID and client secret. Then set up authentication:
- Flow: Use the Authorization Code flow for a web server app that can store a client secret, and request
offline_accessto receive refresh tokens. A Custom Connection uses the client credentials grant against a single organisation instead, and Xero's documented calls for it send only theAuthorizationheader. Custom Connections are only available for organisations in Australia, New Zealand, the UK, and the US, and require an additional monthly subscription. - Tenant header: Standard apps call
GET https://api.xero.com/connectionsafter authorization. They send the returnedtenantIdasxero-tenant-idon every request. - Token lifetimes: Access tokens expire after 30 minutes and refresh tokens after 60 days. If your app misses the response to a refresh, it can retry with the previous refresh token for 30 minutes.
- Granular scopes: Apps created on or after 2 March 2026 use granular scopes. These replace the broad
accounting.transactionsscope withaccounting.invoices,accounting.payments,accounting.banktransactions, andaccounting.manualjournals. Apps created before that date can keep broad scopes until September 2027.
Moving an existing connection to new scopes requires the user to authorise your app again, because Xero needs explicit consent for the new permissions.
On the Webflow side, generate a site token at Site settings > Apps & integrations > API access > Generate API token. Only site administrators can create one. A site holds at most 5 tokens, and a token expires after 365 consecutive days without use. Send it as Authorization: Bearer YOUR_API_TOKEN. Build on the Data API at https://api.webflow.com/v2, not the older v1 API, which Webflow deprecated on 31 March 2025 in its deprecation notice.
The APIs involved:
- The Xero Accounting API handles
/Contacts,/Invoices,/Quotes,/Payments,/Items, and/CreditNotesunderhttps://api.xero.com/api.xro/2.0 - Webflow’s Data API handles CMS collections, Ecommerce orders, and form submissions
- Webflow webhooks trigger real-time events for
form_submission,ecomm_new_order,ecomm_order_changed, andcollection_item_changed - Xero webhooks send CREATE and UPDATE events for contacts, credit notes, invoices, overpayments, prepayments, and Xero App Store subscriptions. There is no payment event, so a paid invoice shows up as an invoice update
In the Xero API, PUT creates only and POST creates or updates. An optional Idempotency-Key header of up to 128 characters makes a quick retry safe, but Xero stores each key for only 6 minutes. Webflow retries a failed webhook up to 3 times at 10-minute intervals, so a retried order arrives after its key has expired and could create a second invoice. Record each processed Webflow order ID yourself, or set the invoice Reference to the order ID and check GET /Invoices?where=Reference="WF-{orderId}" before creating one.
Create a Xero invoice from a Webflow Ecommerce order
This flow replaces the Zapier New Order template with code you own. Webflow sends an ecomm_new_order webhook and your server verifies it. The server then creates the contact, invoice, and payment in Xero. You need Webflow scopes sites:write, ecommerce:read, and ecommerce:write, plus Xero scopes accounting.contacts, accounting.invoices, accounting.payments, and offline_access.
To implement this:
- Register the webhook with
sites:write:
POST https://api.webflow.com/v2/sites/{site_id}/webhooks
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
{
"triggerType": "ecomm_new_order",
"url": "https://your-server.example.com/webhooks/webflow/orders"
}
- Verify each delivery. Compute a SHA-256 HMAC over
x-webflow-timestamp+:+ the raw request body. Use your OAuth app client secret as the key. Webhooks created with a site token after April 14, 2025 each get their own secret key, which you use instead. Reject any request whose timestamp is older than 5 minutes.
const crypto = require("crypto");
const payload = `${req.headers["x-webflow-timestamp"]}:${rawBody}`;
const expected = crypto.createHmac("sha256", secret).update(payload).digest("hex");
const valid = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(req.headers["x-webflow-signature"]));
The request bodies and filter shape in this guide are illustrative. Check them against the Webflow webhooks reference linked above.
- Read
orderId,customerInfo.fullName,customerInfo.email,purchasedItems,totals, andcustomerPaidfrom the payload. CallGET https://api.webflow.com/v2/sites/{site_id}/orders/{order_id}if you need the full order. - Look up the contact first with
GET https://api.xero.com/api.xro/2.0/Contacts?where=EmailAddress="jane@example.com"and create it only if none exists. Xero recommends referencing contacts byContactID, not by name. WithsummarizeErrors=falsein the query string, Xero returns HTTP 200 even when an entity fails validation, so check each contact's status in the response:
POST https://api.xero.com/api.xro/2.0/Contacts?summarizeErrors=false
Authorization: Bearer {access_token}
xero-tenant-id: {tenantId}
Idempotency-Key: webflow-order-{orderId}-contact
Content-Type: application/json
{ "Contacts": [ { "Name": "Jane Doe", "EmailAddress": "jane@example.com" } ] }
- Create the invoice with
POST https://api.xero.com/api.xro/2.0/Invoices. SetTypetoACCREC, send only theContactIDfrom step 4 in the contact element, and include one line item perpurchasedItemsentry. SetReferenceto the order ID and derive theIdempotency-KeyfromorderId. Webflow'stotals.extrasarray carries the order's discounts, shipping, and taxes, so add shipping as its own line and setLineAmountTypesto match whether your store prices include tax. Give every line anAccountCodeand aTaxType: when a line has no tax rate, the API falls back to the tax rate on its account code. - Record the payment with
PUT https://api.xero.com/api.xro/2.0/Payments, notPOST, which deletes payments. Link theInvoiceIDand setAmountfromcustomerPaid. The invoice must be approved (statusAUTHORISED), the amount can't exceed what is still owing on it, and the payment needs anAccount: a bank account, or one with payments enabled, by code or ID. - Optionally mark the order fulfilled with
POST https://api.webflow.com/v2/sites/{site_id}/orders/{order_id}/fulfill.
ecomm_order_changed carries the order's status, one of pending, unfulfilled, fulfilled, disputed, dispute-lost, or refunded. Filter on status before creating anything. When an order becomes refunded, create a credit note with PUT /CreditNotes in Xero and record the refund with PUT /Payments against that credit note. Webflow's own POST /sites/{site_id}/orders/{order_id}/refund reverses the Stripe charge, so call it only when you mean to refund the customer.
Create a Xero contact and quote from a form submission
Quote request forms map to Xero Quotes. Register a form_submission webhook with a filter on the form name so only that form fires your endpoint. The payload carries name, formId, data with the submitted field values, and submittedAt. As an alternative to the webhook, set the form's destination to Custom action so it POSTs straight to your server. Submissions then won't be sent to or stored in Webflow, as the forms guide notes. You need Xero scopes accounting.contacts, accounting.invoices (quotes fall under this scope), and offline_access.
To implement this:
- Register the webhook:
POST https://api.webflow.com/v2/sites/{site_id}/webhooks
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
{
"triggerType": "form_submission",
"filter": { "name": "Quote Request" },
"url": "https://your-server.example.com/webhooks/webflow/quotes"
}
- Verify the signature as above and read the fields from
data. - Find or create the contact as in the order flow above.
- Create the quote with
POST https://api.xero.com/api.xro/2.0/Quotes, using theContactIDand anIdempotency-Keyderived from the submissionid.
Sites on the free Starter Site plan stop collecting after 50 total form submissions. That limit does not reset, so run a live quote pipeline on a paid Site plan.
Update a Webflow CMS item when a Xero invoice is paid
Xero has no payment webhook, so subscribe to invoice events and check the invoice status on each update. Each CMS item that should react to payment needs a field holding the Xero InvoiceID or ContactID for lookup. A Collection List on the site then filters on the field you update. You need Webflow scopes cms:read and cms:write, plus Xero scopes accounting.invoices.read and offline_access.
To implement this:
- Create an Invoice webhook under My Apps in the Xero Developer Portal, note its webhook key, and start the Intent to receive validation. Xero sends a series of test requests: return a 2xx status for every correctly signed payload and 401 for every incorrectly signed one.
- Validate
x-xero-signatureon every delivery. Compute HMAC-SHA256 over the raw body with your webhook key, base64-encode it, and compare. Respond within 5 seconds with a 2xx status and no cookies, and keep body-parsing middleware from altering the raw body. - For each event with
eventCategoryINVOICEand an updateeventType, fetchGET https://api.xero.com/api.xro/2.0/Invoices/{resourceId}and read the invoice status. - Look up the matching item and update its changed
fieldDatawithPATCH https://api.webflow.com/v2/collections/{collection_id}/items/{item_id}. - Publish with
POST https://api.webflow.com/v2/collections/{collection_id}/items/publishand anitemIdsarray, or write to the live item withPATCH https://api.webflow.com/v2/collections/{collection_id}/items/{item_id}/live.
If your endpoint stops answering, Xero retries immediately, then every 15 minutes, and disables the subscription after 24 hours. Events from that period are kept for up to 31 days and replayed in order once the subscription is healthy again.
What you can build with the Xero Webflow integration
These builds combine the methods above for the setups we see most often.
- Order-to-invoice for a Webflow Ecommerce store: The order workflow above creates a Xero invoice with the customer's name, email, and each purchased item. A Stripe feed then imports the payouts that those invoices reconcile against.
- Proposal form to quote for agencies: The form workflow above turns each proposal request into a Xero contact and a draft quote, which the account manager reviews and sends from Xero.
- Milestone billing from CMS items: A client project page is built on a Milestones collection. Marking an item complete fires the n8n Webflow Trigger Collection Item Updated event, or a
collection_item_changedwebhook to your server. Either one creates the Xero invoice for that milestone. - Payment-gated content and member fees: On a subscription site, the Xero New Payment trigger flips a CMS item to active, and the Collection List then shows the paid resource. Published CMS content is public, so login gating needs Outseta or Memberstack. Summit Digital's WCIB case study describes multi-tier membership fees on a stack that includes Webflow Enterprise, Outseta, Stripe, and Xero.
For line-item mapping, tax rates, and multi-currency invoices, the API path gives you control over every field. To see the same order trigger feed another app, automate orders with Zapier. To let an agent draft the quotes and update the CMS for you, connect Webflow’s MCP server.
Frequently asked questions
No. Xero has no app in the Webflow Apps Marketplace, so Webflow sites connect to Xero through automation platforms such as Zapier, Make, and n8n, through the Xero and Webflow MCP servers, or through custom code on the Xero Accounting API and the Webflow Data API. For store payments, a Stripe feed in Xero imports the Stripe transactions behind Webflow Ecommerce orders.
Yes. Zapier, Make, and n8n can each take a Webflow form submission and create a Xero contact and invoice, and Zapier can also create a draft quote from the same trigger. For control over line items and tax, a server can receive Webflow's
form_submissionwebhook and call the Xero Accounting API instead. Sites on the free Starter Site plan stop collecting after 50 total form submissions, so run a live pipeline on a paid Site plan.Yes, by linking to the invoice rather than taking payment in Webflow. Copy the online invoice link in Xero and set it as a Webflow button's link. The customer pays through the Pay now button on Xero's online invoice, which appears only after you set up a payment service such as Stripe and apply it to the invoice. Anyone with the link can view the invoice, so share it by email or on a gated page. Webflow Ecommerce checkout itself accepts only Stripe and PayPal. If Pay now is missing, Xero's payment service troubleshooting lists the causes.
Xero says its API can be used with all Xero plans, but not every feature is available on each, and its developer FAQ notes that Cashbook and Ledger plans exclude features such as invoicing. The user who connects Webflow tooling to Xero must be a Standard, Adviser, or Administrator level user with the Connected Apps permission, according to Xero's permissions FAQ.
Yes, with limits. Zapier's Update Webflow items when new payments are received in Xero template maps the Xero New Payment trigger to Update Live Item, so a CMS item can switch to active once a payment lands. That trigger only finds payments created within the last 7 days. Published CMS content is public, so the gate itself needs a membership tool such as Outseta or Memberstack, because Webflow retired User Accounts on January 29, 2026, along with their APIs and webhooks.
Description
Connecting Xero with Webflow creates invoices and quotes from Ecommerce orders and form submissions through Zapier, Make, n8n, or the Xero and Webflow APIs, and a Stripe feed in Xero imports the Stripe payments behind your store.
This integration page is provided for informational and convenience purposes only.
MeldAPI
Connect MeldAPI with Webflow to sync data from external apps into CMS collections automatically, without writing code.

Superflow
Connect Superflow, a website QA and visual feedback platform, with Webflow to collect pinned client feedback and run AI QA on staging and published pages.
Wized
Connect Wized, a low-code JavaScript framework, with Webflow to turn static sites into reactive web applications that authenticate users and call APIs.
albato
IDX with Firebase Studio
Connect IDX with Firebase Studio with Webflow to add application features to a Webflow front end.
BuildShip
Connect BuildShip with Webflow to run backend workflows from form, CMS, e-commerce, and other site events.

Boost.space
Connect Boost.space, a centralized data platform, with Webflow to sync CMS items, form submissions, and orders through one record database.

Byteline
Connect Byteline with Webflow to integrate Webflow eCommerce data with various platforms through OAuth-authenticated synchronization.

Webflow Pack for Coda
Connect Webflow with Coda to sync CMS collections as spreadsheet-style tables, manage content, and automate workflows without switching platforms.


