Selected work

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.

  1. 01Webhook or a manual test
  2. 02Date window
  3. 03Split WooCommerce and Laravel
  4. 04One brand at a time
  5. 05Normalize, then amount, count, and cancel rate
  6. 06On error: Discord. On success: update T.Sales by brand id, then a done message

Technical architecture

Orchestrationn8n and JavaScript
WooCommerceCustom order-status API. Live window: today and the next day
LaravelGET /api/sales, month total
SheetGoogle Sheets: brand, total spent, T.Sales, Meta, TikTok, Google
ConfigURL, credentials, and statuses sit outside the calculation. A single-brand test path runs before a change is applied to all