Skip to content

Tag-Based Flow Architecture in Power Automate

Entity-area tags turn a flat list of Power Automate flows into a navigable architecture. A naming system that maps to ADO, source control, and AI agent batches.

Alex Pechenizkiy 9 min read
Tag-Based Flow Architecture in Power Automate

Open a production Power Automate flow list. Twenty, maybe thirty flows. Can a new team member tell which ones handle reviews, which handle evaluations, which are notification flows, which fire on signing step changes?

If the answer takes longer than five seconds, the flows do not have an architecture. They have a list.

This pattern is what turns a list into a system. Three-letter entity-area tags group flows by the Dataverse table they operate on. Every flow gets a tag prefix, a sequence number, and a type suffix. The result is a small set of tag groups that map cleanly to ADO work items, source control, architecture diagrams, and AI agent batches.

This builds on the naming conventions that govern individual flow names. Naming tells you WHAT a flow does. Tags tell you WHERE it belongs in the architecture.

Architecture map showing four tag groups (REV, EVL, STP, NTF) connecting Dataverse tables to ADO, source control, and AI agents

The Problem with Flat Flow Lists

A flat list looks like this:

  • AssignEvaluator-Author
  • AssignFirstSigner
  • Author Past Due
  • Author Reminder
  • ChainAdvance
  • CreatePersonnelEvaluations
  • Cycle Closed
  • Cycle Launched
  • Evaluation Complete
  • Form Assigned
  • Ready for Acknowledgment
  • Ready for Signature
  • Rejection to Author
  • ResolveSigner
  • Signer Heads-Up
  • Signer Past Due
  • StepAwaiting
  • StepRejected

Names in alphabetical order. No hierarchy. No grouping. There is no way to tell which flows touch the same table, which are notifications versus business logic, or which fire on a schedule versus in real time.

When a notification requirement lands and a flow count doubles overnight, a flat list collapses fast. In Flow Inventory, the argument is that discovery without classification is just a list. Tags are the classification layer.

The Tag System

Four three-letter tags organize flows by entity area. The illustrative example below uses a performance management application built on three core Dataverse tables, plus a notification layer.

Tag Entity Area Example Flow Count Dataverse Table
REV Review Cycle 2 app_personnelreviewcycle
EVL Evaluation 5 app_personnelevaluation
STP Signing Step 3 app_evaluationsigningstep
NTF Notification 14 Read-only across all tables

Each tag maps to exactly one Dataverse entity area. REV flows only touch app_personnelreviewcycle. EVL flows only touch app_personnelevaluation. STP flows only touch app_evaluationsigningstep. NTF flows query across tables but never write to any of them.

This is a strict rule, not a guideline. A flow tagged STP only does signing step logic. If a flow needs to touch two entity areas, it calls a child flow. The tag stays clean.

The Naming Pattern

Every flow follows this structure:

<App> | [{TAG}{##}] {Description} - {Type}

Examples:

  • Northwind | [REV01] CreatePersonnelEvaluations - Business Logic
  • Northwind | [EVL03] EvalAccessTeam - Business Logic
  • Northwind | [STP01] ChainAdvance - Business Logic
  • Northwind | [NTF01] Form Assigned - Daily Digest

This builds on the foundational naming pattern from Naming Conventions That Scale. That article covers the base layer: project prefix, descriptive names, consistent formatting. Tags are the next layer up. They add architectural grouping on top of individual flow names.

Channel Suffixes for Notifications

The NTF tag accepts a channel suffix to future-proof for multi-channel delivery:

  • NTF-EMAIL for email notifications
  • NTF-INAPP for in-app notifications
  • NTF-TEAMS for Microsoft Teams adaptive cards

Designing the naming structure for channels that do not exist yet pays off later. When a Teams integration ships, NTF-TEAMS-01 slots in. No renaming. No restructuring.

How Tags Map to Everything

Tags are not a naming trick. They are an organizational primitive that maps to every tool in the development lifecycle.

Artifact How Tags Appear Example
Power Automate [TAG##] prefix in display name Northwind | [EVL01] AssignEvaluator-Author
Azure DevOps Tag in work item title EVL01: Assign evaluator on Draft status
Architecture diagrams Labeled boxes per tag group REV group, EVL group, STP group, NTF group
Source control Tag-based file naming flows/Northwind-EVL01-AssignEvaluator.json
AI agent batches Grouped by tag for parallel generation Agent 1: NTF01, NTF10, NTF11 (author-facing)
Priority tiers Tags define deployment phases REV/EVL/STP = Phase 1, NTF P1 = Phase 2

When an ADO work item is titled “EVL01: Assign evaluator on Draft status,” the exact flow it maps to, the exact table it touches, and the exact solution it lives in are all determined. When a file in source control is named Northwind-EVL01-AssignEvaluator.json, the same is true. One tag, one concept, across every tool. This only works when flows are solution-aware. Loose flows cannot be grouped or governed this way.

Sample Inventory

Here is a sample inventory using the four-tag taxonomy on a hypothetical performance management application. The point is to show structure, not to prescribe a specific flow set.

Business Logic Flows

Tag Flow Name Trigger Purpose
REV01 CreatePersonnelEvaluations Review status set to Open Creates evaluation records from template roles
REV02 ReviewAccessTeam Review created Adds reviewee, supervisor, coach to review access team
EVL01 AssignEvaluator-Author Evaluation status set to Draft Resolves evaluator by role, assigns ownership
EVL02 AssignFirstSigner Evaluation status set to Submitted Finds step 1, assigns first signer, sets Signing Off
EVL03 EvalAccessTeam Evaluator field populated Adds evaluator to access teams, creates Step 0 (Authoring)
EVL04 StampSigningConfig Evaluation created Parses template signing config JSON, creates signing step rows
EVL05 ResolveSigner Signer role changed Role-based signer resolution from organizational hierarchy
STP01 ChainAdvance Step status set to SignedOff Advances to next signer or sets Fully Signed Off
STP02 StepAwaiting Step status set to Awaiting Adds signer to evaluation and review access teams
STP03 StepRejected Step status set to Rejected Resets evaluation to Draft, reassigns ownership to author

Look at the tag column. Without reading anything else, the structure is visible: 2 review flows, 5 evaluation flows, 3 signing step flows. Each group maps to one Dataverse table. Each flow performs exactly one logical operation.

Notification Flows (Scheduled)

A scheduled batch runs daily on weekdays. Each flow handles exactly one notification type.

Tag Description Table Queried Recipient
NTF01 Form Assigned app_personnelevaluation Author
NTF02 Ready for Signature app_evaluationsigningstep Signer (non-self)
NTF03 Ready for Acknowledgment app_evaluationsigningstep Employee (self-signer)
NTF04 Signer Heads-Up app_evaluationsigningstep Signer (future)
NTF07 Evaluation Complete app_personnelevaluation Author
NTF08 Cycle Launched app_personnelreviewcycle All participants
NTF09 Cycle Closed app_personnelreviewcycle All participants
NTF10 Author Reminder app_personnelevaluation Author
NTF11 Author Past Due app_personnelevaluation Author
NTF12 Author Past Due Supervisor Escalation app_personnelevaluation Author's supervisor
NTF13 Signer Past Due app_evaluationsigningstep Signer
NTF14 Signer Past Due Supervisor Escalation app_evaluationsigningstep Signer's supervisor

Notice the numbering gap: there is no NTF05 or NTF06 in this table. Those are real-time flows, listed below. The numbers are stable identifiers, not sequential counters. Gaps are fine. Renumbering is not.

Notification Flows (Real-Time)

Tag Description Trigger Recipient
NTF05 Rejection to Author Step status changed to Rejected Author
NTF06 Rejection to Previous Signers Step status changed to Rejected Previous signers (all with SignedOff status and lower stepOrder)

These two flows fire immediately on rejection events. Everything else is batched into daily digests. That is a deliberate design choice. If a supervisor escalation flow fired in real time, a supervisor with 15 overdue evaluators would receive 15 emails in seconds. A daily digest produces one email per supervisor. Tags make this distinction visible at the inventory level.

Why Tags Enable AI-Assisted Development

Tags are more than an organizational nicety. They are an architectural requirement for AI-assisted development. Because each tag maps to one Dataverse table and one functional area, you can hand an AI agent a scoped batch of flows with only the context it needs. No cross-table confusion, no conflicting patterns, no prompt bloat from unrelated flows.

A reasonable batching strategy for the notification layer above:

Agent Tag Group Flows Why This Batch
Agent 1 Author-facing NTF01, NTF10, NTF11 Same table, same recipient type
Agent 2 Signer-facing NTF02, NTF03, NTF04 Same table, same recipient type
Agent 3 Event + completion NTF05, NTF06, NTF07 Event-driven triggers, distinct from scheduled
Agent 4 Escalation + broadcast NTF08, NTF09, NTF12, NTF13, NTF14 Supervisor resolution pattern, cycle queries

Flows within a tag group share the same Dataverse table, the same query patterns, and the same recipient resolution logic. The author-facing batch only needs context about app_personnelevaluation and author-facing email templates. The signer-facing batch only needs context about app_evaluationsigningstep and signer-facing templates.

Without tags, a single AI agent would need full context on all notification flows simultaneously. With tags, each agent thread operates on a focused batch. The patterns (variable initialization, FetchXML queries, Apply-to-each loops, SharedMailboxSendEmailV2 actions) are documented in a spec. Tags define the batches. Specs define the patterns. The AI executes.

This is the value of tags that nobody else is writing about. Naming conventions are not just for humans reading flow lists. They are grouping signals for AI systems building flows in parallel.

Implementing Tags in a Project

You do not need a complex application to use tags. Here is how to start.

Step 1: Identify entity areas. Look at the Dataverse tables. Group flows by the primary table they trigger from or operate on. Each group gets a 3-letter tag. For an Accounts, Contacts, and Opportunities domain, the tags might be ACC, CON, OPP.

Step 2: Number sequentially within each tag. ACC01, ACC02, CON01, CON02. Numbers indicate creation order, not priority or importance.

Step 3: Add channel suffixes for multi-channel flows. If notification flows could span email, Teams, and in-app, use NTF-EMAIL, NTF-TEAMS, NTF-INAPP. If only email exists today, still use NTF-EMAIL. The convention is ready before the channels exist.

Step 4: Use the same tags everywhere. ADO work items, architecture diagrams, file names, solution XML. One tag, one concept, across all tools. If EVL01 means “assign evaluator” in Power Automate, it means “assign evaluator” in the ADO backlog, the architecture diagram, and the source control folder.

Step 5: Document the tag dictionary. A reference table mapping every tag to its entity area, Dataverse table, and flow count. Keep it in solution documentation. Update it when flows are added. This is the single source of truth.

Microsoft recommends codifying naming conventions in a style guide so all team members follow the same standards. Your tag dictionary is that style guide. Pin it. Put it in the repo README.

The Difference Tags Make

Side by side, before and after:

Without Tags With Tags
AssignEvaluator-Author Northwind | [EVL01] AssignEvaluator-Author - Business Logic
Form Assigned Northwind | [NTF01] Form Assigned - Daily Digest
ChainAdvance Northwind | [STP01] ChainAdvance - Business Logic
Author Past Due Supervisor Escalation Northwind | [NTF12] Author Past Due Supervisor Escalation - Daily Digest
ReviewAccessTeam Northwind | [REV02] ReviewAccessTeam - Business Logic

The left column is a list. The right column is an architecture. You can sort by tag, filter by type, group by entity area, and batch for AI generation. Same flows. Different level of control.

Tags are not overhead. They are the cheapest architectural decision on a Power Platform project. Four three-letter codes turn an unrelated set of flows into a system that can be explained in one table.

To see tags applied as visual documentation, Architecture Diagrams with Draw.io MCP shows how to generate flow inventory diagrams directly from tag-based inventories like this one.


Spec-Driven Power Platform Series

This article is part of a series on building Power Automate solutions with specs, governance, and AI:

  1. Tag-Based Flow Architecture - How 3-letter prefixes make a flow set manageable
  2. Spec-First Development - Why specs should exist before the designer opens
  3. Notification Architecture - Notifications that cannot break business logic
  4. FetchXML in Power Automate - When OData $filter is not enough
  5. Building Solution ZIPs - The undocumented packaging guide
  6. What AI Gets Wrong - And why human correction is the point
  7. Spec-Driven Power Automate - The full story

AZ365.ai - Azure and AI insights for architects building on Microsoft. Follow Alex on LinkedIn for architecture deep dives.

Stay in the loop

Get new posts delivered to your inbox. No spam, unsubscribe anytime.

Related articles