1. The Requirement That Looked Simple

In the Apex Property Operations project, the original requirement sounded straightforward:

Ensure Work Orders always reference the correct Property.

On paper, this felt like something a single Flow could handle.

In practice, the moment I started building, it became clear that trying to force everything into one Flow would create more problems than it solved.

2. The Early Mistake: Overloading One Flow

My initial instinct was to:

  • add more decision elements
  • handle more scenarios
  • “just tweak” the same Flow

Very quickly, the Flow became:

  • harder to read
  • harder to reason about
  • riskier to change

At that point, the problem wasn’t Salesforce — it was design.

data architecture

3. The Realisation: One Responsibility Per Flow

The breakthrough came when I stepped back and reframed the problem:

What is each piece of logic actually responsible for?

That led to a cleaner architecture built around separation of concerns.

Instead of one oversized Flow, I designed multiple focused flows, each with a single purpose.

4. The Final Flow Architecture

🔹 Flow 1: Derive the Correct Property

  • Triggered on Work Order save
  • Retrieves the Property from the related Maintenance Request
  • Populates or corrects the Work Order Property

Responsibility: Data derivation

🔹 Flow 2: Ensure Consistency

  • Runs when relevant fields change
  • Verifies alignment between related records
  • Applies corrective updates if needed

Responsibility: Ongoing data integrity

🔹 Flow 3: Guardrails and Clean-Up

  • Handles edge cases
  • Prevents unintended side effects
  • Reduces the risk of recursion or conflicting updates

Responsibility: Stability and safety

Each Flow was:

  • easier to understand
  • easier to test
  • safer to maintain

5. Before-Save vs After-Save: A Deliberate Choice

Another key design decision involved when each Flow should run.

Rather than defaulting everything to before-save or after-save, I chose based on intent:

  • Before-save where values could be set cleanly
  • After-save where related records needed to be queried or corrected

This avoided:

  • unnecessary updates
  • recursion loops
  • unpredictable behaviour

6. Why This Matters More Than “Fewer Flows”

It can be tempting to aim for:

“One Flow that does everything.”

In reality:

  • complexity hides bugs
  • monolithic flows are fragile
  • future changes become risky

By splitting logic across focused flows:

  • changes are localised
  • intent is clearer
  • future admins can reason about the system faster

7. What This Taught Me About Salesforce Design

This project reinforced several principles I now design by:

  • Simplicity is about clarity, not fewer components
  • Flows should tell a story when read top to bottom
  • Maintainability matters more than cleverness
  • Salesforce rewards restraint

8. Outcome

  • Predictable automation behaviour
  • Reduced risk of recursion
  • Cleaner debugging
  • A solution that can evolve without fear

Most importantly, the system now behaves reliably even as requirements grow.


9. What This Demonstrates as a Salesforce Admin

  • Architectural thinking beyond “just building flows”
  • Understanding of execution order and automation limits
  • Comfort making trade-offs
  • Focus on long-term maintainability

✅ This completes the Apex Property Operations automation story

Together, these three posts show:

  1. How the automation was built
  2. Why certain tools were chosen
  3. How the design evolved responsibly

Continuous Learning and Iteration

This solution is not treated as “finished” in the absolute sense. As with most real-world Salesforce implementations, I expect to revisit parts of the design as usage patterns evolve or as I gain further insight. I may refine individual flows, simplify logic, or restructure elements based on hindsight — and I see that as a strength rather than a flaw. Salesforce administration is an iterative discipline, and the ability to reflect, adapt, and improve over time is a core part of building resilient, long-term solutions.