Back to the casebook
Case file 03Order-to-invoice / duplicate prevention

Shopify → Zoho → Xero Order Automation

A five-module Make.com flow that takes a Shopify webhook through Sheets, Gmail, Zoho stock, Xero contact resolution, and a referenced invoice.

0
manual steps
ShopifyMakeGoogle SheetsGmailZohoXero
Status: Case study

The problem

Orders were processed by hand: logged into a spreadsheet, invoiced manually in Xero, and confirmed with typed emails. Nothing checked whether the customer already existed in Xero, so duplicate contacts accumulated, and invoice references were inconsistent between orders.

The system

01Intake

A webhook receives the Shopify order payload.

02Logging

The order is written to Google Sheets as the running record.

03Notification

Gmail sends the customer confirmation.

04Resolution

A Xero contact search runs before anything is invoiced.

05Branching

Existing contact creates the invoice directly; a new contact is created first.

06Output

The Xero invoice is generated with the correct reference.

07Testing

Five scenarios were validated in ReqBin, from new customer to malformed payload.

What made it work

  • The contact-resolution router is the part that matters: invoicing only runs after the contact is resolved, so a first-time customer cannot create a duplicate record and an existing customer cannot create a second one.
  • Five scenarios were tested end to end: new customer, existing customer, no contact match, malformed payload and repeat order.
  • The spreadsheet acts as a log rather than a queue, so nothing waits on a human to move a row.

Evidence

Every step, captured.

The scenario, the payload, the order log, the stock check and the invoice. Click any image to open it at full size.

Test payload
{
  "order_id": "NZ10052",
  "order_number": "#NZ10052",
  "customer": {
    "name": "Sarah Chen",
    "email": "sarah.chen@demo.com"
  },
  "line_items": [{
    "title": "Running Shoes Black",
    "sku": "RUN-BLK-42",
    "quantity": 1,
    "price": "129.99"
  }],
  "shipping_address": {
    "address1": "15 Queen Street",
    "city": "Auckland",
    "zip": "1010",
    "country": "New Zealand"
  }
}
Execution log
21:14:07  webhook.received   order=#NZ10052 lines=2
21:14:07  sheets.append      row=4182
21:14:08  gmail.send         customer confirmation
21:14:08  xero.contacts      matches=1
21:14:08  route              existing_contact
21:14:09  xero.invoice       reference=#NZ10052
21:14:09  run.complete       manual_steps=0 errors=0

Outcome

A webhook arrives, the order is logged, the customer is notified, the contact is resolved or created in Xero, and the invoice is produced with the right reference, across five test scenarios with no manual steps.

14+
successful runs
<8s
average run
5
platforms
0
manual steps

Start with the process

Send the process that is still running by hand.

You get a written read on what can be automated, what it would take, and what it removes from the week. No pitch deck required.