Pricing and reliability at real volume. Zapier bills by tasks, so a workflow with more steps or higher volume gets more expensive, and each additional step is one more place a Zap can fail quietly with no retry logic beyond what Zapier itself offers.
Logic its Paths feature can't express. Zapier's Paths handle a simple either/or split well. They're not built for a decision that depends on several conditions checked against live data in more than one system at once, which is a normal requirement the moment a workflow matters to the business.
Systems that don't fit the app directory. When one of your tools has no Zapier integration, or its data comes back shaped differently than whatever's on the other end expects, a Zap can't bridge that gap on its own. Custom code can.
Chains of Zaps that get fragile. A handful of Zaps feeding into each other works fine until one upstream field changes format and every Zap downstream breaks without anyone noticing for days.