medusajs/medusa · error · Error

Method 'scheduleStepTimeout' not implemented.

Error message

Method 'scheduleStepTimeout' not implemented.

What it means

AbstractTransactionStore.scheduleStepTimeout is an optional hook used by the workflow engine to schedule per-step timeouts (e.g. for async waitFor steps or long-running steps with a timeout configured). The abstract base throws to force custom storage adapters to explicitly opt in to timeout scheduling.

Source

Thrown at packages/core/orchestration/src/transaction/datastore/abstract-storage.ts:139

    timestamp: number,
    interval: number
  ): Promise<void> {
    throw new Error("Method 'scheduleTransactionTimeout' not implemented.")
  }

  async clearTransactionTimeout(
    transaction: DistributedTransactionType
  ): Promise<void> {
    throw new Error("Method 'clearTransactionTimeout' not implemented.")
  }

  async scheduleStepTimeout(
    transaction: DistributedTransactionType,
    step: TransactionStep,
    timestamp: number,
    interval: number
  ): Promise<void> {
    throw new Error("Method 'scheduleStepTimeout' not implemented.")
  }

  async clearStepTimeout(
    transaction: DistributedTransactionType,
    step: TransactionStep
  ): Promise<void> {
    throw new Error("Method 'clearStepTimeout' not implemented.")
  }

  async clearExpiredExecutions(): Promise<void> {
    throw new Error("Method 'clearExpiredExecutions' not implemented.")
  }
}

View on GitHub (pinned to 5e06e544a2)

Solutions

  1. Implement scheduleStepTimeout in your storage adapter (store the timestamp/interval and schedule the timeout check, e.g. via Redis key expiry or a scheduler)
  2. Disable/avoid step-level timeouts if your storage cannot support them
  3. Switch to the official Redis storage which implements timeout scheduling
  4. Update your adapter after upgrading orchestration to pick up new abstract members

Example fix

// before
async scheduleStepTimeout(transaction, step, timestamp, interval) {
  throw new Error("not implemented")
}

// after
async scheduleStepTimeout(transaction, step, timestamp, interval) {
  await this.redis.set(
    `stepTimeout:${transaction.transactionId}:${step.id}`,
    String(timestamp),
    "PX", Math.max(0, timestamp - Date.now())
  )
}
Defensive patterns

Strategy: validation

Validate before calling

if (storage.scheduleStepTimeout === AbstractTransactionStore.prototype.scheduleStepTimeout) {
  throw new Error('Step timeouts unsupported by this storage; remove step timeout config')
}

Prevention

When it happens

Trigger: A workflow step defines a timeout (e.g. createStep with timeout config, or a step that transitions to WAITING with a scheduled timeout) and the configured workflow storage does not override scheduleStepTimeout. The engine calls it via TransactionOrchestrator when scheduling the step's timeout timestamp.

Common situations: Custom Redis/DB storage adapter implementing only persistence methods; version upgrade that introduced step timeout scheduling; using steps with timeout: <seconds> against an outdated community storage adapter.

Understand the failure class

Related errors


AI-assisted analysis of medusajs/medusa@5e06e544a2 (2026-08-27). Data as JSON: /api/errors/9a2d361cf97485f2. Report an issue: GitHub.