Tag-Based Flow Architecture: REV, EVL, STP, NTF - 24 Flows, Zero Confusion
Entity-area tags turn 24 Power Automate flows into a navigable architecture. A naming system that maps to ADO, source control, and AI agent batches.
Open your production Power Automate flow list right now. You have 20, maybe 30 flows. Can you tell which ones handle reviews? Which handle evaluations? Which are notification flows? Which fire on signing step changes?
If you can’t answer those questions in under five seconds, your flows don’t have an architecture. They have a list.
I built 24 cloud flows for a federal performance management system called Meridian at Apex Federal Solutions. Ten business logic flows. Fourteen notification flows. Three Dataverse entities. Two trigger types. Without a tagging system, this would have been unmanageable by flow twelve. With tags, every flow is findable, groupable, and batchable for AI generation.
This builds on the naming conventions I covered earlier. Naming tells you WHAT a flow does. Tags tell you WHERE it belongs in the architecture.
The Problem with Flat Flow Lists
Here’s what 24 flows look like without any organizational system:
- AssignEvaluator-Author
- AssignFirstSigner
- Author Past Due
- Author Past Due Supervisor Escalation
- Author Reminder
- ChainAdvance
- CreatePersonnelEvaluations
- Cycle Closed
- Cycle Launched
- EvalAccessTeam
- Evaluation Complete
- Form Assigned
- Ready for Acknowledgment
- Ready for Signature
- Rejection to Author
- Rejection to Previous Signers
- ResolveSigner
- ReviewAccessTeam
- Signer Heads-Up
- Signer Past Due
- Signer Past Due Supervisor Escalation
- StampSigningConfig
- StepAwaiting
- StepRejected
Twenty-four items in alphabetical order. No hierarchy. No grouping. You can’t tell which flows touch the same table, which are notifications vs. business logic, or which ones fire on a schedule vs. in real time.
When Sarah Chen, our Director of Talent Operations, submitted requirements for email notifications across the signing workflow, we went from 10 flows to 24 overnight. I knew immediately that a flat list would kill us. In Flow Inventory, I argued that discovery without classification is just a list. Tags are the classification layer.
The Tag System
Four three-letter tags organize all 24 flows by entity area:
| Tag | Entity Area | Flow Count | Dataverse Table |
|---|---|---|---|
| REV | Review Cycle | 2 | mrd_personnelreviewcycle |
| EVL | Evaluation | 5 | mrd_personnelevaluation |
| STP | Signing Step | 3 | mrd_evaluationsigningstep |
| NTF | Notification | 14 | Read-only across all tables |
Each tag maps to exactly one Dataverse entity area. REV flows only touch mrd_personnelreviewcycle. EVL flows only touch mrd_personnelevaluation. STP flows only touch mrd_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. Period. 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:
Meridian | [{TAG}{##}] {Description} - {Type}
Real examples from production:
Meridian | [REV01] CreatePersonnelEvaluations - Business LogicMeridian | [EVL03] EvalAccessTeam - Business LogicMeridian | [STP01] ChainAdvance - Business LogicMeridian | [NTF-EMAIL-01] 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. If naming conventions tell you WHAT a flow does, tags tell you WHERE it belongs in the system.
Channel Suffixes for Notifications
The NTF tag includes a channel suffix to future-proof for multi-channel delivery:
NTF-EMAIL- Email notifications (current, 14 flows)NTF-INAPP- In-app notifications (planned)NTF-TEAMS- Microsoft Teams adaptive cards (planned)
This wasn’t an afterthought. I designed the naming structure for channels that don’t exist yet. When the Teams integration ships, NTF-TEAMS-01 slots right 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 | Meridian | [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/Meridian-EVL01-AssignEvaluator.json |
| AI agent batches | Grouped by tag for parallel generation | Agent 1: NTF-EMAIL-01, 10, 11 (author-facing) |
| Priority tiers | Tags define deployment phases | REV/EVL/STP = Phase 1, NTF P1 = Phase 2 |
When I open an ADO work item titled “EVL01: Assign evaluator on Draft status,” I know the exact flow it maps to, the exact table it touches, and the exact solution it lives in. When I open source control and see Meridian-EVL01-AssignEvaluator.json, same thing. One tag, one concept, across every tool. This only works when flows are solution-aware. Loose flows can’t be grouped or governed this way.
The Full Inventory
This is the complete Meridian flow inventory. Twenty-four flows, four tag groups, zero ambiguity.
Business Logic Flows (10 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, you can see the structure: 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 (12 flows)
All 12 run daily at 8:00 AM Eastern, weekdays only.
| Tag | Description | Table Queried | Recipient |
|---|---|---|---|
| NTF-EMAIL-01 | Form Assigned | mrd_personnelevaluation | Author (evaluator) |
| NTF-EMAIL-02 | Ready for Signature | mrd_evaluationsigningstep | Signer (non-self) |
| NTF-EMAIL-03 | Ready for Acknowledgment | mrd_evaluationsigningstep | Employee (self-signer) |
| NTF-EMAIL-04 | Signer Heads-Up | mrd_evaluationsigningstep | Signer (future) |
| NTF-EMAIL-07 | Evaluation Complete | mrd_personnelevaluation | Author (evaluator) |
| NTF-EMAIL-08 | Cycle Launched | mrd_personnelreviewcycle | All participants |
| NTF-EMAIL-09 | Cycle Closed | mrd_personnelreviewcycle | All participants |
| NTF-EMAIL-10 | Author Reminder | mrd_personnelevaluation | Author (evaluator) |
| NTF-EMAIL-11 | Author Past Due | mrd_personnelevaluation | Author (evaluator) |
| NTF-EMAIL-12 | Author Past Due Supervisor Escalation | mrd_personnelevaluation | Author's supervisor |
| NTF-EMAIL-13 | Signer Past Due | mrd_evaluationsigningstep | Signer |
| NTF-EMAIL-14 | Signer Past Due Supervisor Escalation | mrd_evaluationsigningstep | Signer's supervisor |
Notice the numbering gap: there is no NTF-EMAIL-05 or NTF-EMAIL-06 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 (2 flows)
| Tag | Description | Trigger | Recipient |
|---|---|---|---|
| NTF-EMAIL-05 | Rejection to Author | Step status changed to Rejected | Author (evaluator) |
| NTF-EMAIL-06 | 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’s a deliberate design choice. If NTF-EMAIL-12 (supervisor escalation) fired in real time, a supervisor with 15 overdue evaluators would get 15 emails in the span of seconds. Daily digest, 8 AM, one email per supervisor. Tags make this distinction visible at the inventory level.
Why Do 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, and no prompt bloat from unrelated flows.
I built the 14 notification flows using parallel AI agent threads. Each agent received a batch of 3-4 flows from the same functional tag group:
| Agent | Tag Group | Flows | Why This Batch |
|---|---|---|---|
| Agent 1 | NTF-EMAIL (author-facing) | 01, 10, 11 | Same table, same recipient type |
| Agent 2 | NTF-EMAIL (signer-facing) | 02, 03, 04 | Same table, same recipient type |
| Agent 3 | NTF-EMAIL (event + completion) | 05, 06, 07 | Event-driven triggers, distinct from scheduled |
| Agent 4 | NTF-EMAIL (escalation + broadcast) | 08, 09, 12, 13, 14 | 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. Agent 1 only needed context about mrd_personnelevaluation and author-facing email templates. Agent 2 only needed context about mrd_evaluationsigningstep and signer-facing templates.
Without tags, a single AI agent would need full context on all 14 flows simultaneously. With tags, each agent thread operates on a focused batch. The patterns - variable initialization, FetchXML queries, Apply-to-each loops, SharedMailboxSendEmailV2 actions - were documented in a spec. Tags defined the batches. Specs defined the patterns. The AI executed.
This is the unique 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 Your Project
You don’t need a federal performance management system to use tags. Here’s how to start.
Step 1: Identify entity areas. Look at your Dataverse tables. Group flows by the primary table they trigger from or operate on. Each group gets a 3-letter tag. If you have flows for Accounts, Contacts, and Opportunities, your 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 you have notification flows that could span email, Teams, and in-app, use NTF-EMAIL, NTF-TEAMS, NTF-INAPP. If you only have email, still use NTF-EMAIL. You’ll thank yourself when the Teams channel arrives.
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 your ADO backlog, your architecture diagram, and your source control folder.
Step 5: Document the tag dictionary. Create a reference table that maps every tag to its entity area, Dataverse table, and flow count. Keep it in your solution documentation. Update it when you add flows. This is your 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. Print it. Pin it to your Teams channel. Put it in your repo README.
The Difference Tags Make
Here is the before and after, side by side:
| Without Tags | With Tags |
|---|---|
| AssignEvaluator-Author | Meridian | [EVL01] AssignEvaluator-Author - Business Logic |
| Form Assigned | Meridian | [NTF-EMAIL-01] Form Assigned - Daily Digest |
| ChainAdvance | Meridian | [STP01] ChainAdvance - Business Logic |
| Author Past Due Supervisor Escalation | Meridian | [NTF-EMAIL-12] Author Past Due Supervisor Escalation - Daily Digest |
| ReviewAccessTeam | Meridian | [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 24 flows. Completely different level of control.
Tags are not overhead. They are the cheapest architectural decision you will make on a Power Platform project. Four three-letter codes turned 24 unrelated flows into a system I can explain in one table.
If you want to see these tags in action 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 24 flows 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
- 14 Flows in 10 Minutes - 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
Notification Architecture That Cannot Break Your Business Logic
Separate Power Automate notification flows from business logic. 14 flows, zero write operations, daily digests over real-time floods.
The 10-Minute Build: How Specs and AI Produced 14 Power Automate Flows
Power Automate flows built by AI in 10 minutes -- but only because two years of governance made specs machine-readable. The full architecture story.
Spec-Driven Power Platform: The Complete Series
7 articles on building Power Automate flows with specs, governance, and AI. From tag-based architecture to solution packaging to honest AI collaboration.