Back to blog Best Practices

Five Workflow Patterns Every Ops Team Needs

Liam Donovan
Five workflow pattern diagrams

When ops teams describe their automation problems to us, the specifics vary widely — one team is routing leads between CRM and sales sequences, another is syncing procurement approvals with their finance system, a third is managing employee onboarding across five different tools. But the structural problems underneath are almost always the same.

After working with RevOps and BizOps teams across a range of industries, we've found that most operational automation needs can be addressed by five core workflow patterns. These aren't feature categories — they're structural approaches to how your workflow handles data flow, state, and failure. Understanding them changes how you design automations from the start, rather than retrofitting reliability onto workflows that were built to handle only the happy path.

Pattern 1: Fan-Out to Multiple Systems

Fan-out is the pattern where a single trigger event needs to propagate to multiple downstream systems simultaneously, or in parallel. A common example: a new deal reaches "Closed Won" in your CRM, and the workflow needs to simultaneously create a project in your project management tool, send a notification to your customer success Slack channel, update a revenue tracking sheet, and kick off a customer onboarding sequence in your email platform.

The implementation mistake teams make here is sequential execution — step 1 creates the project, then step 2 sends the Slack notification, then step 3 updates the sheet. If step 2 takes three seconds because of API latency, steps 3 and 4 wait unnecessarily. More critically, if step 2 fails, steps 3 and 4 never run at all.

True fan-out uses parallel branches: after the trigger, split into independent branches that execute concurrently. Each branch has its own error handling — a failure in the Slack notification branch doesn't block the project creation branch. The workflow completes when all branches resolve, and individual branch failures are logged independently.

One nuance: fan-out should only be used when the downstream steps are genuinely independent. If the revenue tracking sheet update requires the project ID that was created in the project management step, those two steps have a dependency and need to run in sequence, not parallel.

Pattern 2: Conditional Branching on Field Values

Conditional branching sounds basic — it's an if/else — but the implementation details determine whether your branching logic stays maintainable over time or collapses into an unreadable condition nest.

The critical discipline is keeping branch conditions tied to a single authoritative field value, not to compound expressions that try to evaluate business logic inline. Consider the difference between a condition that checks deal.segment == "enterprise" versus one that checks deal.annual_contract_value > 50000 AND deal.employee_count > 200 AND deal.industry IN ["Finance", "Healthcare", "Legal"]. The first is readable, maintainable, and testable. The second is business logic embedded inside workflow configuration that no future ops team member will be able to audit quickly.

Where possible, push complex categorization logic upstream: have your CRM or enrichment tool resolve the complex conditions into a single, well-named field — segment, tier, routing_group — and branch your workflow on that single field. This makes both the workflow and the business logic independently auditable.

Also important: define explicit fallback branches for values you haven't mapped. If your branch handles enterprise, mid-market, and SMB but a new segment value appears (say, strategic added by the marketing team mid-quarter), the fallback branch determines whether the record gets silently routed to a default or gets flagged for manual review. The latter is almost always correct.

Pattern 3: Retry with Exponential Backoff

Most workflow steps that call external APIs fail transiently — the API is under brief load, a rate limit was hit, a network partition lasted 200 milliseconds. Retrying after a short delay will succeed in the majority of these cases. The question is how to retry without hammering an already-struggling API or creating duplicate side effects.

Exponential backoff is the standard approach: retry after 15 seconds, then 60 seconds, then 5 minutes, then 30 minutes. Each successive retry waits longer, giving the downstream system time to recover. After a configurable number of attempts (typically 3–5), the step is marked as permanently failed and routed to a dead-letter queue.

The important implementation detail is distinguishing retriable from non-retriable errors before the first retry attempt. HTTP 5xx errors and timeouts are retriable — they indicate a transient server-side problem. HTTP 4xx errors (400 Bad Request, 401 Unauthorized, 422 Unprocessable Entity) indicate a data or authentication problem that won't resolve by waiting. Retrying a 401 wastes retry budget and delays the alert that would prompt someone to fix the auth token. The retry policy should check the error class before queuing a retry.

A side effect concern with retries: if the failed step was a write operation (create record, send email, process payment), a successful retry might create a duplicate. This is the idempotency problem applied to retry logic. The step should either use idempotency keys — a unique identifier passed to the API that lets it recognize and deduplicate repeated requests — or use a read-before-write check to confirm the record doesn't already exist before creating it.

Pattern 4: Human-in-the-Loop Approval Gates

Not every step in an operational workflow should be automated end-to-end. Contract approvals above a spend threshold, exceptions to standard pricing, headcount requests, and vendor onboarding decisions often require a human review step. The pattern here is an approval gate: the workflow runs automatically until it reaches a step where a decision is needed, then it pauses and waits for human input before continuing.

A well-designed approval gate includes three components: the notification (where and how the approver is asked to act), the timeout behavior (what happens if the approver doesn't respond within the defined window), and the rejection path (what the workflow does if the approver denies the request).

Teams often design the notification and the approval action but forget the timeout and rejection paths. An approval workflow that waits indefinitely for a response is a workflow that can silently stall for days. Set a timeout — 24 or 48 hours is typical for business approvals — and define whether a timeout triggers an escalation (notify the approver's manager), an automatic approval (safe for low-risk, low-value requests), or an automatic rejection (safer for high-risk requests where proceeding without approval is worse than blocking).

Pattern 5: Scheduled Reconciliation

Event-driven workflows handle new records and updates in real time, but they can't catch records that were created or modified outside the workflow — by a direct CRM edit, a CSV import, or a manual update by a sales rep. Scheduled reconciliation is a workflow that runs on a timer (hourly, daily, weekly) and checks your systems for records that are out of sync with the expected state.

A practical example: a nightly reconciliation workflow that queries your CRM for contact records created in the last 24 hours that have no assigned owner, no lead source, or no follow-up task created. These are records that either bypassed the routing workflow or where the routing workflow failed silently. The reconciliation workflow creates a report, routes unassigned records to a review queue, and alerts the RevOps team of the count.

Reconciliation workflows are not a substitute for good event-driven automation — they're a safety net. They catch the records that slipped through, which tells you where your event-driven workflows have gaps. Over time, a well-maintained reconciliation workflow should generate fewer and fewer alerts as you close the gaps in your real-time automation coverage.

The Patterns Compound

These five patterns aren't mutually exclusive — a mature operational workflow typically combines several of them. A lead routing workflow does conditional branching (segment determination) plus fan-out (CRM write + Slack notification + sequence enrollment) plus retry with backoff on the CRM write step plus a human-in-the-loop gate for edge cases that fall outside the routing rules.

We're not saying every workflow needs all five patterns from day one. Simple automations genuinely don't. The point is recognizing which pattern is structurally appropriate for each part of your workflow before you build it, rather than adding retry logic and branching as afterthoughts when the workflow starts misbehaving in production.

Operational workflows that hold up under real conditions aren't more complicated than ones that don't — they're just designed around the right patterns from the start. The difference between a lead routing workflow that works reliably at 2am and one that silently drops records is usually not code quality; it's whether the person who built it had retry logic, idempotency, and fallback branches in mind when they drew the first diagram.

← Back to all articles