Case study 11
Sales sync. Thirty brands, one performance sheet.
Automated collection from more than 30 WooCommerce and Laravel stores into one performance sheet, with cancellation logic and a live alert when a store fails.
- Sector
- E-commerce account management
- Type
- Production sync from stores into a shared sheet
- Role
- End-to-end owner: the workflow, the data contract, the three paths, the calculation, alerts, and production
The business problem
- The sales total was gathered by hand from every store.
- A completed order and a cancelled order were not defined the same way.
- Three teams share the sheet: Performance 1, Performance 2, and Gulf. A wrong figure could reach an ad-spend decision.
What the system changes
It is in production. Daily collection time is not listed. Laravel returns the month total. The WooCommerce window currently covers today and the next day, not the calendar month. The sheet update is the sales total, not a claimed full month for WooCommerce.
One sales figure
Confirmed sales use the accepted statuses for that brand. Cancellations are counted on their own, by amount and by count.
The same row
The sheet updates on the brand id. A rerun does not duplicate the row.
Each team runs alone
One team can refresh without touching the other.
A failed store is not silent
The supervisor gets the brand and the team. A success sends a completion note.
Writes are paced
A short wait sits between sheet writes.
System workflow
No brand names, store URLs, API keys, or real sales figures.
- 01Webhook or a manual test
- 02Date window
- 03Split WooCommerce and Laravel
- 04One brand at a time
- 05Normalize, then amount, count, and cancel rate
- 06On error: Discord. On success: update T.Sales by brand id, then a done message
Technical architecture
| Orchestration | n8n and JavaScript |
|---|---|
| WooCommerce | Custom order-status API. Live window: today and the next day |
| Laravel | GET /api/sales, month total |
| Sheet | Google Sheets: brand, total spent, T.Sales, Meta, TikTok, Google |
| Config | URL, credentials, and statuses sit outside the calculation. A single-brand test path runs before a change is applied to all |