# The deal would not move stage

`move` runs the stage rules before it changes anything, and a rule it cannot satisfy stops the move with the reason attached. The usual reasons are a missing value, an open review, or a target stage the deal cannot reach from where it is. Satisfy the rule and the same move goes through; there is no override.

- **Status:** Available
- **Audience:** both
- **In the app:** #/sales
- **Last verified:** 2026-09-10
- **Canonical:** https://connectbyjbrh.com/docs/troubleshooting/stage-move-refused/

## The symptom

You drag a card to another column, or ask the Assistant to move a deal on, and it comes back where it started with a short message naming the rule. Nothing else changed: the value, the review flag and the relationship are exactly as they were, because the rules run before the write rather than after it.

A refusal here is a sentence about one rule, not a stack trace and not a generic failure. If what you are seeing is a spinner, a blank column or a deal that vanished rather than a refusal, that is a different problem — start at [A deal is not on the board](/docs/troubleshooting/deal-missing-from-pipeline/).

## The rules that block a move, commonest first

| Rule | How it reads | How to satisfy it |
|---|---|---|
| No value on the deal | The target stage needs a figure and there is none | `set_value` with the amount in **minor units** and the currency, then move |
| The deal is under review | A commercial question was raised and is still open | Answer it, then `clear_review`; see [Connect would not give a price](/docs/troubleshooting/connect-refused-to-quote/) |
| The target is not reachable from here | The stage order does not allow this jump | Move through the intervening stage, or pick the stage you actually mean |
| The deal is already closed | Won and lost are stages, and a closed deal is sitting in one | Move it back explicitly; both moves stay on the timeline |
| The record is not yours to move | Your session cannot write to that workspace's deals | Check which audience you are signed in as before assuming a fault |

> **Note** Two different stage changes share the word. A **deal** moves on the pipeline through `sales.move`. A **person** moves along the lifecycle through `move_stage`, whose vocabulary comes from `stages()` in `journey`. Refusing one is not refusing the other, and a rule you read about on one screen may not exist on the other.

## What Connect completed

- It resolved the deal, read its current stage, value and review state, and ran the stage rules against the target you asked for.
- It stopped at the first rule that failed and reported that rule by name, rather than reporting the last one or a summary of all of them.
- It left every field untouched. A refused move is not a partial move: there is no state where the stage changed but the value did not follow.
- It recorded the refusal as a decision, with its reason, so 'why did this deal sit in qualification for three weeks' is answerable later.

## What Connect did not complete

- It did not set the missing value for you. Inventing a deal size to satisfy a rule would defeat the rule.
- It did not clear the review. A review is a person's open question, and closing it is a person's answer.
- It did not queue the move to retry. Nothing is waiting; the move happens when you make it again.
- It did not notify the customer. Stage moves are internal, refused or not.

## What you can do

1. Read the refusal itself before changing anything. It names one rule.
   - Result: You fix the thing that is actually blocking, instead of setting a value on a deal that was refused for being under review.
2. If it is the value: set it in minor units, in the deal's currency.
   - Result: The pipeline total stops being wrong by the currency's exponent, which is the other bug this field causes.
3. If it is the review: settle the commercial question on the thread, then clear the review.
   - Result: The deal moves, and the answer is on the record where the next person will find it.
4. If it is the stage order: move through the stage you skipped, or reconsider the target.
   - Result: The pipeline keeps meaning something. A board where any deal can be anywhere is a list with colours.

## What an administrator can do, and when to escalate

Stage rules are workspace behaviour, so an administrator is the person who decides whether a rule is right. If a rule is refusing moves your team makes ten times a week and satisfying it adds nothing, that is a conversation about the rule rather than a fault in the move. An administrator can also confirm what a member may write, which is worth checking before a permission problem is investigated as a rules problem.

Escalate when the refusal names a rule that the deal plainly satisfies — a value that is set, a review that is cleared — and it still refuses after a reload. Bring the deal, the current stage, the target stage and the exact words of the refusal. Do not bring a screenshot of a customer's details when the four facts are enough.

## Questions

### Is there a way to force a move past the rules?

No. There is no override flag and no autonomy mode that grants one, because a rule that can be bypassed is a suggestion. Change the rule or satisfy it.

### The Assistant said it moved the deal and it did not.

Check the deal's stage rather than the reply. The Assistant reports what the tool returned, and a refusal returned from `move` should appear in its answer; if the two disagree, the deal's own record and the decision log are the authority.

### Can a move be refused for the person rather than the deal?

Yes — a member without permission to write on that workspace's deals sees a refusal that is about the session, not the stage. It reads differently, and the fix is a permission rather than a field.

## Related

- [Stage rules and refusals](https://connectbyjbrh.com/docs/sales/stage-rules/)
- [Opportunities: the deal record](https://connectbyjbrh.com/docs/sales/opportunities/)
- [A deal is not on the board](https://connectbyjbrh.com/docs/troubleshooting/deal-missing-from-pipeline/)
- [Moving a deal from stage to stage, end to end](https://connectbyjbrh.com/docs/workflows/move-opportunity/)
- [Lifecycle stages](https://connectbyjbrh.com/docs/relationships/lifecycle-stages/)

## What this page is based on

- `docs-source/sources/CHANNELS.md` §6 — `move`, stage rules and review
- `docs-source/sources/CHANNELS.md` §5 — `move_stage` and `stages()`
- Connect capability registry (docs-source/facts.py)
