A workflow is getting too complex when one small change affects unrelated branches, failures are hard to locate, or every run needs manual repair. Count not just nodes but responsibilities: can you state the input, output, and failure behavior of each section?
Extract a repeated transformation into a reusable step or split independent jobs into separate workflows. Define the data passed between them, then test normal, empty, malformed, and repeated input. Be careful with retries: splitting a workflow should not cause duplicate emails or records.
Keep one observable promise per workflow, with logs or status that reveal where it failed.