strapi/strapi · error · Error

Impossible to proceed to the given step

Error message

Impossible to proceed to the given step

What it means

Thrown by createFlow's set() method when can(step) returns false — i.e., the requested step is at an index earlier than the current step (the flow only allows forward movement, with one exception: re-sending the same transfer stage is permitted). This guards the server-side transfer state machine against clients that send steps out of order or attempt to go backward.

Source

Thrown at packages/core/data-transfer/src/strapi/remote/flows/index.ts:72

      const indexesDifference = findStepIndex(step) - findStepIndex(state.step);

      // It's possible to send multiple time the same transfer step in a row
      if (indexesDifference === 0 && step.kind === 'transfer') {
        return true;
      }

      return indexesDifference > 0;
    },

    cannot(step: Step) {
      return !this.can(step);
    },

    set(step: Step) {
      const canSwitch = this.can(step);

      if (!canSwitch) {
        throw new Error('Impossible to proceed to the given step');
      }

      state.step = step;

      return this;
    },

    get() {
      return state.step;
    },
  };
};

View on GitHub (pinned to 4a4101264d)

Solutions

  1. Send transfer steps in the order defined by DEFAULT_TRANSFER_FLOW; do not resend an earlier step once the server has advanced.
  2. Ensure client and server run compatible Strapi versions so the flow definition matches.
  3. If a step failed and must be retried, restart the entire transfer (new transferID) rather than replaying an earlier step.

Example fix

// before — client sends steps out of order
flow.set({ kind: 'transfer', stage: 'init' }); // after bootstrap already ran
// after — check before setting, or start a new transfer
if (flow.can({ kind: 'transfer', stage: 'init' })) {
  flow.set({ kind: 'transfer', stage: 'init' });
}
Defensive patterns

Strategy: validation

Validate before calling

// Check flow.can(step) before calling set()
if (flow.can(step)) {
  flow.set(step);
} else {
  // step is behind current — reject the client message or start a new transfer
}

Prevention

When it happens

Trigger: A client sends a transfer step that precedes the current one (e.g., requesting 'init' after 'bootstrap' already ran), or an action step that has already been executed and isn't idempotently repeatable.

Common situations: Version mismatch between client and server causing different flow definitions; a buggy/retrying client resending an earlier step after the server advanced; a custom client that doesn't follow the ordered flow (init → bootstrap → schemas → entities → links → ...).

Related errors


AI-assisted analysis of strapi/strapi@4a4101264d (2026-08-12). Data as JSON: /api/errors/472d8f1a00fac7bc. Report an issue: GitHub.