Most CRMs only check the stage a deal is leaving. This one checks every stage a move crosses, so a three-stage jump can't skip the approval in between.

A sales pipeline with an approval step usually only checks one thing: is the stage you're leaving right now gated? That's an easy rule to write and an easy rule to get around, because a deal rarely moves one stage at a time. A rep drags a card three columns over. An API integration bulk-updates a batch of deals straight to Negotiation. A CSV import lands rows directly into whatever stage the file says. Every one of those is a jump, not a step, and a gate that only checks the stage you started from waves the jump straight through the stage it was actually supposed to stop.
A pipeline stage can be marked as requiring approval. In principle that's simple: nobody advances a deal out of that stage unless they're on the approved list for it, or an admin. In practice, "advances out of" is where the simple version breaks, because a deal doesn't have to pass through a gated stage on its way somewhere else. It can jump clean over it.
Picture a five-stage pipeline where stage three requires the sales director's sign-off. A deal sitting in stage two gets dragged directly to stage four. It was never sitting in stage three, so a gate that only asks "is the FROM stage gated" sees nothing to check. Stage three's approval requirement just got skipped by a card that never technically left it, because it never technically entered it either.
The fix isn't a better from-stage check. It's asking a different question: which stages does this specific move cross? A forward move from position 2 to position 4 crosses whatever gated stages sit at positions 2 and 3, not just position 2. The system computes that full set for every stage change, forward moves only, and requires the person making the move to be an approver of every single one of them, not just one. A jump across three gated stages needs the actor to clear all three, or be an admin. One approval doesn't cover a shortcut past two more.
Lost deals are the deliberate exception: marking a deal lost never requires approval, whatever stage it's leaving, because blocking someone from recording a dead deal helps nobody. Backward moves and lateral moves inside the same stage category never trigger the gate either. The check only exists for forward progress, which is the only direction a rushed or careless move can quietly buy something it shouldn't have.

A gated stage isn't gated by a vague "someone senior has to look at this." It's gated by a named list of people, assigned per stage, the same way a hotel group can name specific people to own a locked field on a deal. If a rep hits the gate, the response doesn't just say "blocked," it names exactly who on the team can actually clear it, so the rep knows who to go ask instead of guessing or escalating blind. An admin can always clear any gate, the same override that applies everywhere else in the platform.
That specificity is the difference between a gate that slows a team down and one that actually routes the decision to the right desk. A generic "pending approval" status tells a rep nothing about who to interrupt. A named approver list does.

Here's the case that's easy to miss until it actually happens: a deal doesn't only move because someone on the sales team drags it. Accepting a hosted proposal can automatically advance the deal to the next stage, no rep involved at all. If that automatic advance would cross a gated stage, the system runs the exact same approval check it runs for a manual move, and the outcome is the same: the move doesn't silently go through just because the trigger this time was a client's own click. Instead of blocking the client's acceptance or quietly bypassing the gate, the deal's advance falls back to a notification instead of an actual stage change. The client's "yes" is recorded. The deal's position waits for a person who's actually allowed to move it there.
That's a real design choice worth naming: the two safest wrong answers, silently skip the gate because a person wasn't the one who triggered it, or block the client from accepting at all, both fail somebody. Falling back to a flag instead of a forced move is the option that protects the approval without punishing the client for saying yes.
Every stage change writes a row to the deal's own history, the same append-only log that already powers a hotel group's conversion funnel and cycle-time reporting. When a move crosses one or more gated stages, that fact is recorded on the history row too, not folded away once the approval clears. Months later, someone auditing why a deal reached Negotiation without ever sitting in Proposal for the usual few days can see the real answer: it jumped, an approver was checked and cleared it, and here's the record of that decision sitting on the deal's own timeline. Nothing about a fast approval process here comes at the cost of losing the trail of what actually happened.
The approval check is a hard stop, not a workflow with its own escalation timers or reminders beyond the initial notice. There's no auto-approve-after-N-days fallback, and there's no delegate-my-approvals-while-I'm-out setting. If the one person on an approver list for a stage is unreachable, every deal behind that gate waits, the same way it would with a single-person sign-off in any process. That's a real limit worth knowing before a hotel group builds a five-person approval chain around a single named approver.
What it does guarantee is narrower and more concrete: nobody advances a deal past a gate they aren't cleared for, whether the move was a single drag, a multi-stage jump, a bulk update, or a client's own proposal acceptance. A B2B CRM that only checks the stage a deal is leaving is checking the wrong thing. The stages in between are exactly where a shortcut hides.
Twenty minutes, your real properties, no generic demo environment.