Automated Stripe Revenue & Fee Reconciliation (Make.com)
A robust Make.com scenario to sync Stripe payments, handle merchant fees, and automate Xero bank reconciliation.
Tools: Stripe → Xero
Platform: Make.com
Short Answer
Every Stripe charge automatically creates a Xero Contact, a Sales Invoice, and a Payment. It also logs the Stripe fee as a 'Spend Money' transaction, ensuring your Xero Sales Ledger and Bank Account match the penny.
The Problem
Manual reconciliation of Stripe payments in Xero is time-consuming and prone to errors, especially when accounting for Stripe's 'Net' vs 'Gross' amounts. Businesses often struggle to match bank deposits because Stripe deducts processing fees before the payout hits the bank account.
The Outcome
Every Stripe charge automatically creates a Xero Contact, a Sales Invoice, and a Payment. It also logs the Stripe fee as a 'Spend Money' transaction, ensuring your Xero Sales Ledger and Bank Account match the penny.
Step-by-Step Guide
1. **Create Scenario**: Log in to Make.com and create a new scenario. Name it 'Stripe to Xero Reconciliation'.
2. **Stripe Trigger**: Add the **Stripe > Watch Events** module. Select 'Charge Succeeded' as the event type. Create a Webhook and connect your Stripe account using your Secret API Key.
3. **Router for Filtering**: Add a **Router** module. Set a filter after the trigger to only allow bundles where `Status` = `succeeded` and `Captured` = `true`.
4. **Find/Create Contact**: Add the **Xero > Search Contacts** module. Search by `Email`. Use a **Router** or **If/Else** logic: if no contact is found, use the **Xero > Create a Contact** module using data from the Stripe `Customer` object.
5. **Create Invoice**: Add the **Xero > Create an Invoice** module. Map the `Amount` from Stripe (Note: Stripe sends amounts in cents, use `{{item.amount / 100}}` to convert to dollars). Set the Status to 'Authorised'.
6. **Get Fee Details**: Add the **Stripe > Get a Balance Transaction** module. Map the `Balance Transaction ID` from the trigger. This is critical to retrieve the exact `fee` amount.
7. **Log Payment**: Add the **Xero > Create a Payment** module. Map the Invoice ID from step 5 and the Bank Account ID where your Stripe payouts land.
8. **Log Stripe Fee**: Add the **Xero > Create a Bank Transaction** module. Set the Type to 'SPEND'. Map the fee amount from Step 6 (`{{item.fee / 100}}`). This accounts for the merchant expense.
9. **Error Handling**: Right-click the Xero modules and select **Add Error Handler (Ignore)** or **Break**. This prevents the scenario from stopping if a duplicate invoice error occurs.
10. **Save and Activate**: Schedule the scenario to run 'Immediately' via the Webhook.
Data Mapping
| Stripe Source Field | Xero Destination Field | Make.com Transformation/Syntax | Importance |
| :--- | :--- | :--- | :--- |
| `Customer: Email` | `Contact: Email Address` | `lower(email)` | Required (Unique ID) |
| `Amount` | `Invoice: Unit Amount` | `{{amount / 100}}` | Required (Currency conversion) |
| `ID` (Charge) | `Invoice: Reference` | `Stripe Ref: {{id}}` | Audit Trail |
| `Created` | `Invoice: Date` | `parseDate(timestamp; "X")` | Date Formatting |
| `Balance Transaction: Fee` | `Bank Transaction: Amount` | `{{fee / 100}}` | Expense Tracking |
| `Currency` | `Invoice: Currency` | `upper(currency)` | Multicurrency Support |
Gotchas & Failure Modes
• **Decimal Precision**: Stripe provides amounts in cents (integers). Always use the `/ 100` math operator in Make.com to avoid $100 appearing as $10,000 in Xero.
• **The ID Trap**: Do not use Stripe's 'Payment Intent ID' for Xero's internal ID fields; use them only in the 'Reference' or 'Memo' fields to avoid schema errors.
• **Rate Limits**: Xero has a limit of 60 requests per minute. If processing high-volume Stripe events, use a 'Sleep' module or Make's 'Commitment' settings to throttle the flow.
• **Connection Expiry**: Xero's OAuth token can occasionally disconnect. Set up a 'Scenario Error' alert in Make.com to notify you via email if the module fails to authenticate.
Verification Checklist
- [ ] **Webhook Check**: Trigger a test payment in Stripe (Test Mode) and verify the bundle appears in the Make.com 'Watch Events' module.
- [ ] **Math Check**: Verify the Xero Invoice 'UnitAmount' matches the Stripe 'Amount' after the `/ 100` calculation.
- [ ] **Contact Check**: Ensure no duplicate contacts are created in Xero if the same email pays twice.
- [ ] **Fee Alignment**: Check the Xero 'Bank Transactions' tab to ensure the Stripe processing fee was logged as a separate expense.
- [ ] **Execution History**: Review the Make.com 'History' tab to ensure all modules show a green checkmark.
Ready to Automate?
Build this automation with Make.com in minutes.