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.
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.
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 LogicNorthwind | [EVL03] EvalAccessTeam - Business LogicNorthwind | [STP01] ChainAdvance - Business LogicNorthwind | [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-EMAILfor email notificationsNTF-INAPPfor in-app notificationsNTF-TEAMSfor 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:
- Tag-Based Flow Architecture - How 3-letter prefixes make a flow set manageable
- Spec-First Development - Why specs should exist before the designer opens
- Notification Architecture - Notifications that cannot break business logic
- FetchXML in Power Automate - When OData $filter is not enough
- Building Solution ZIPs - The undocumented packaging guide
- What AI Gets Wrong - And why human correction is the point
- 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
Spec-Driven Power Platform: Series Overview
A connected methodology for building Power Automate solutions: spec-first authoring, tag-based architecture, notification separation, FetchXML over OData, and programmatic solution packaging.
Notification Architecture That Cannot Break Your Business Logic
Separate Power Automate notification flows from business logic. One rule: notification flows read Dataverse and send email, never write back. The notification layer becomes disposable without business risk.
AI-Powered Flow Review - Quality Gates Before Production
Pipeline approvals are rubber stamps. Use AI to review Power Automate flow JSON for error handling gaps, hardcoded values, and naming violations.