Fixing eCommerce Automation That Fails Without Any Error Logs
1. Inventory sync fails silently when mapped across multiple warehouses
So this one took me an entire morning. My Shopify store uses a third-party warehouse system (Extensiv), and I had a Zap syncing inventory counts to our marketing dashboard in Airtable. Things looked fine in Zapier — the run history was green, the data preview looked right. Clients would ask, “Is that SKU really sold out?” I’d reload Shopify. In-stock. Airtable? Still empty. No errors, and no clue.
The sync breaks silently when the same product is split across multiple warehouse locations and the Zap grabs the wrong field. Shopify’s API bundles inventory levels across all locations, but the field coming through in the webhook only included location_id=primary
, even though our actual inventory was sitting in a secondary warehouse. There’s no red flag. Just… blank Airtable values and headaches.
I had to manually pull JSON into a formatter step to parse inventory_levels
as an array and sum them. Not documented anywhere. Also: Airtable sometimes converts 0 to an empty cell, which made debugging harder than it needed to be. I now route inventory into a Numbers table first to visually see weird IDs before syncing.
2. Abandoned cart emails fire twice because of delayed webhook retries
We’ve got an automation for abandoned carts that triggers when someone adds something to the cart and doesn’t check out in 30 mins. It uses Make.com. At one point, people started getting two identical emails about their cart. But the send step showed only one execution.
Found out this is due to a retry loop on the initial webhook. Buried in Make’s scenario logs, the webhook fired twice for the same session UUID, just seconds apart. No built-in deduplication. My guess is a transient error (or the webhook couldn’t resolve DNS fast enough the first time), so it hit retry logic and didn’t sync the original call’s state.
Quick fix was adding an Airtable base with a table of cart hashes and timestamps. Every abandoned cart email checks that table before sending. If there’s a record within, say, 90 seconds, it skips. Still not bulletproof, but it cut duplicates by like 90% without extra tooling.
3. Product reviews get stuck in moderation due to webhook success response
I almost missed this one completely — we had a Form submission from a Klaviyo email campaign that let buyers leave a review through Typeform. Typeform then fires a Zap to create a new review in Loox. It worked. Review showed up. Then… vanished.
Turns out: the Loox API treated any review submitted within less than one second after a purchase as suspicious. But here’s the kicker — it didn’t reject it. The API call returned a 200 OK
, and the review was flagged behind the scenes for moderation. Hidden. No errors shown. Zapier marked it as complete.
The fix? Add a 2-second delay between the Typeform trigger and the review creation step — just enough for the Loox back-end to chill. Not kidding. Two seconds. I tried with and without delays across five test purchases. Delayless reviews vanished. 2s-lagged ones posted instantly.
4. Discounts fail when CartHook modifies line_item properties downstream

We use CartHook for post-purchase upsells. Once someone checks out, there’s a webhook that triggers a Zap to send purchase data to a CRM with discount codes tracked by line_item properties. All working fine — until one day half the campaigns appeared to lose coupon codes.
Here’s what happened: CartHook modifies line_items
after the order is completed, before the webhook goes out. BUT if CartHook adds a gift or bumps quantity, it rewrites the array and occasionally drops the applied_discount
property. No errors again. It looked like the customer didn’t use a code.
I had to create a two-step workaround. First, I let Shopify send its own webhook directly to a Google Sheet the moment checkout occurred. Then, CartHook’s modified data still feeds into the CRM, but I added a compare step using the Sheet as truth. It’s brittle but enough to log when discounts go missing.
5. Stripe webhooks arrive out of order for identical test purchases
Testing Stripe events for refunds in staging, I ran into something that made no sense. Two tests, same customer, same flow: purchase → refund → rollback. The rollback triggered a new charge. But somehow the webhook for charge.refunded
reached Zapier after the charge.succeeded
, causing our flow to refund the rollback payment, not the original.
Webhook processing isn’t guaranteed in-order, especially with short timeframes. Stripe says so in their docs, quietly. But Zapier doesn’t enforce ordering either, even if you try to debounce manually. No errors — just totally broken logic.
The workaround? I started logging all Stripe events to an Airtable base keyed by source.transfer_group
. Then used a Find step before any refund action to ensure we were dealing with the latest purchase, not an old record ghosted in late.
Key tip: Avoid any logic assuming the last webhook = latest event. Always check timestamps and tie back to something user-level like email or cart ID.
6. Facebook Ads lead forms drop values if fields use custom titles
We ran a campaign with Facebook Lead Ads using custom questions. Nothing fancy — just renamed “Phone Number” to “Preferred Mobile” or whatever marketing thought sounded trendier. The Zap picked up leads fine… sometimes. Around 1 in 7 came through with empty fields.
“The field is there in the preview, but it’s just blank. No error, no skipped task.”
The cause: Facebook Lead Ads API sends field keys based on the default question label, not the one displayed to the user. If you rename “Phone Number” but don’t map both the original and renamed keys in Zapier’s Data In trigger — silent missing data.
Eventually found a workaround: Have the Zap trigger on “Catch Raw Hook” instead of the default Facebook integration. That way, you get custom_question_answers
as JSON and can manually map field labels, regardless of their visible name. Slightly chaotic, but no more invisible blank fields.
7. Shopify order updates blend line items during exchange workflows
I ran into this while testing post-purchase automations. A customer wants an exchange. They check out with Item A, then support uses the built-in Shopify exchange flow to replace it with Item B. This triggers the same order updated webhook as a new purchase — but the payload merges both line items.
No flags indicate which item was returned vs which is new. Zapier sees both products and mistakenly assumes it’s a bundle order. Our product tagging logic got confused and added both SKUs to Klaviyo, creating chaos in segment logic (“Bought Item A” overlaps with “Bought Item B”).
No errors show up. The webhook fires once, clean 200s all around. But what you’re looking at in the payload is a hybrid of old and new order data. There’s no distinction unless you grab the processed_at
timestamps and sort the items. Even then, Shopify sometimes considers updated SKUs as same-timestamp actions. You have to compare the old order state (if available) and rebuild expected behavior manually.
8. Google Sheets cell overwrite chains collapse if one upstream skip fails
I had built a 5-step Zap that updated a Google Sheet row when an order shipped, then re-reads the row and sends an email with the tracking info. One order failed — no email sent, no row updated. It just blinked green and moved on like nothing was wrong.
Dug into it: a custom Filter step skipped because the order had no tracking URL yet. That was expected. But none of the downstream steps fired — which is fine except that the Sheet update never hit. Because I hadn’t separated the Sheet update from the filtered branch, the entire row update chain silently collapsed.
From that point on, tracking never got recorded — even once the shipment updated — because the system thought it already had.
Specific tips if you’re battling the same Google Sheets chain logic:
- Keep Sheets update steps BEFORE filters whenever possible
- Always verify green step ≠ successful changes — check row diffs manually
- Use a timestamp column for each Zap run so you know when it actually happened
- Don’t trust preview data — force a live refresh before each run
- If Sheet values feed logic later, snapshot them to Airtable or Notes first
The Sheet said it updated, the Zap said it ran — but the cell was untouched for days. Classic false positive behavior and no way to tell unless you’re tracking runs externally.