DEV Community

PayloadFlatten Team
PayloadFlatten Team

Posted on

How to Cut Make.com Operations by 80% When Logging Nested Webhook JSON to Google Sheets

If you send nested e-commerce or billing webhooks (Shopify orders/create, Stripe invoice.paid, WooCommerce orders) from Make.com into Google Sheets, the classic pattern is:

  1. Custom Webhook trigger (1 op)
  2. Iterator module over line_items[] (1 op)
  3. Google Sheets: Add a Row inside the loop (N ops — one per item)

For an order with 10 line items, that burns 12 Make operations per webhook and risks hitting Google Sheets' 60 writes/min/user rate limit during bursts (leaving half-written orders).

The Fix: Decouple Ingestion From Flattening

Instead of iterating inside Make, push the raw JSON payload string into one cell and un-nest it inside Google Sheets:

[Custom Webhook (1 op)] ──▶ [Google Sheets: Add a Row (1 op total)]
                                     │
                                     ▼
          Column A stores raw JSON string ({{1.body}})
                                     │
                                     ▼
          Column B expands dynamically via sheet formula
Enter fullscreen mode Exit fullscreen mode

Your Make scenario drops to 1–2 operations total, regardless of whether an order has 2 line items or 50.

Turning Raw JSON in Column A Into Clean Rows

Suppose cell A2 holds a raw Shopify webhook payload:

{
  "order_id": "#10492",
  "customer": { "email": "alex@example.com" },
  "line_items": [
    { "id": "item_1", "name": "Wireless Keyboard", "quantity": 1, "price": "129.00", "sku": "KB-PRO-BLK" },
    { "id": "item_2", "name": "USB-C Braided Cable", "quantity": 2, "price": "14.50", "sku": "ACC-CBL-02" }
  ]
}
Enter fullscreen mode Exit fullscreen mode

You have two clean ways to unroll A2:A in Google Sheets without brittle REGEXEXTRACT chains:

Option A: Custom Apps Script Function

If you want full DIY control in Extensions → Apps Script, write a recursive flattener that walks objects/arrays with dot notation and pads missing columns across rows so headers stay aligned when new keys appear.

Option B: Zero-Maintenance Formula (=FLATTEN_JSON_ROWS())

With PayloadFlatten for Google Sheets (client-side Apps Script add-on — data never leaves your Google Sheet):

  • 1 row per webhook payload:
  =FLATTEN_JSON(A2:A)
Enter fullscreen mode Exit fullscreen mode
  • 1 row per line item (repeating parent order fields cleanly):
  =FLATTEN_JSON_ROWS(A2:A, "line_items")
Enter fullscreen mode Exit fullscreen mode

Parent fields (order_id, customer.email) repeat on every row alongside item_number and each line item's fields (line_items.id, line_items.name, line_items.quantity, line_items.price, line_items.sku), so =SUM() and pivot tables keep working even when payloads evolve.

Quick Comparison

Metric Make Iterator Loop (15 items) Single-Write + In-Sheet Flatten
Make operations per order ~17 ops 1–2 ops
Partial rows on Sheets 429 error Possible mid-loop Atomic single write
Schema change maintenance Re-map Make modules Auto-expands new keys

If you want to test the interactive flattener on your own webhook payload before installing anything, there is a free browser sandbox on the Make Webhook JSON to Google Sheets guide.

Top comments (0)