BuilderVault
Build-your-own PMO blueprint

Intake and triage

Capture demand in one place, score it consistently, and route it to the right reviewers before work becomes shadow delivery.

Finished outcome: A lightweight portfolio intake portal with request scoring, approval routing, communications, and a decision log.

Business problem

Small PMO teams often receive requests through email, Teams chats, spreadsheets, and hallway conversations. The first tool should make demand visible without forcing a million-dollar enterprise platform rollout.

Core data model

  • Intake Requests
  • Business Sponsors
  • Scoring Criteria
  • Triage Decisions
  • Approval History
  • Communication Log

Portals and workflows to build

Intake Portal

Let business users submit new project, enhancement, automation, reporting, and process-improvement requests.

Power Platform build

  • Power Pages or canvas app request form
  • SharePoint or Dataverse request table
  • role-based views for submitters, triage team, and sponsors
  • attachment area for business case files

Automations

  • submission confirmation
  • triage team notification
  • missing-info request workflow
  • score threshold routing

Reporting

  • new requests by month
  • requests by department
  • average triage time
  • demand by category

Triage Workbench

Give the PMO team a queue for scoring, clarifying, rejecting, deferring, or moving requests to charter.

Power Platform build

  • canvas app queue gallery
  • priority and complexity scoring controls
  • decision notes panel
  • next-action assignment

Automations

  • reviewer assignment
  • sponsor clarification email
  • decision notification
  • weekly untriaged digest

Reporting

  • aging intake items
  • triage decision mix
  • reviewer workload
  • high-value demand pipeline

Power BI report pages

  • Portfolio demand funnel
  • intake aging by owner
  • request source and category trends
  • approved vs rejected request mix

Implementation roadmap

  • Define intake categories and required questions.
  • Build the request table and submitter form.
  • Add triage scoring and status transitions.
  • Automate submitter and reviewer communications.
  • Publish Power BI demand funnel and aging views.

Governance notes

  • Keep intake short enough that users actually submit requests.
  • Separate clarification from approval so early discovery does not look like commitment.
  • Store decision reasons for future prioritization conversations.

Next layer down: implementation details

Table build specs

EitherIntake Requests

Primary demand record submitted by business users and triaged by the PMO.

ColumnTypeRequiredNotes
TitleSingle line textYesShort request name used in queues and reports.
Request TypeChoiceYesProject, enhancement, automation, report, process improvement, support.
Business UnitChoice or lookupYesUse a lookup when departments need owners, sponsors, or reporting attributes.
SponsorPerson or lookup to Contact/UserYesThe accountable business sponsor.
Problem StatementMultiple lines textYesCapture the business pain in plain language.
Expected BenefitCurrency or numberNoUse text early if benefits are qualitative.
ComplexityChoiceYesLow, Medium, High. Feed scoring and routing.
Priority ScoreNumberNoCalculated from weighted criteria; avoid manual entry when possible.
Current StatusChoiceYesDraft, Submitted, Clarification Requested, Ready for Triage, Approved for Charter, Deferred, Rejected.
Decision ReasonMultiple lines textNoRequired when rejecting or deferring.

Relationships

  • One Intake Request can create one Project Charter.
  • Many Triage Decisions can relate to one Intake Request.
  • Many Communication Log rows can relate to one Intake Request.

Recommended indexes

  • Current Status
  • Business Unit
  • Sponsor
  • Submitted Date
  • Triage Owner
  • Decision Date
EitherScoring Criteria

Configurable scoring rubric so the PMO can change weights without editing the app.

ColumnTypeRequiredNotes
Criterion NameSingle line textYesStrategic alignment, benefit, urgency, risk, complexity.
WeightNumberYesUse whole numbers that total 100 across active criteria.
Score GuidanceMultiple lines textYesExplains what low, medium, and high scores mean.
ActiveYes/NoYesDeactivate instead of deleting to preserve history.

Relationships

  • Scoring Criteria is referenced by triage scoring controls.

Recommended indexes

  • Active
  • Sort Order

Recommended fields

  • Intake Request: Request ID, Title, Request Type, Business Unit, Sponsor, Requested By, Submitted Date, Current Status, Desired Start Date, Requested Due Date, Strategic Alignment, Problem Statement, Expected Benefit, Estimated Cost, Estimated Effort, Complexity, Risk Level, Priority Score, Triage Owner, Decision, Decision Date, Decision Reason, Next Stage.
  • Scoring Criteria: Criterion Name, Weight, Score Scale, Guidance Text, Active Flag, Sort Order.
  • Triage Decision: Request, Reviewer, Decision, Comments, Required Follow-up, Follow-up Owner, Follow-up Due Date.
  • Communication Log: Request, Audience, Message Type, Sent Date, Sent By, Delivery Channel, Message Summary.

Screens to build

  • Submit request screen with business need, value, timing, attachments, and sponsor information.
  • Requester status screen showing draft, submitted, clarification requested, triaged, rejected, deferred, or moved to charter.
  • PMO triage queue with filters for unassigned, aging, high score, missing info, and sponsor review needed.
  • Triage scoring screen with weighted criteria, total score, recommendation, decision notes, and next-stage action.

Power Apps screen blueprints

Business requesterRequest Intake Submit Screen

Capture a clean demand request without exposing PMO-only scoring fields.

Layout

  • Header with request type and save state
  • Left column for business need and sponsor
  • Right column for timing, benefit, complexity, and attachments
  • Footer command bar with Save Draft and Submit

Controls

  • frmIntakeRequest bound to Intake Requests
  • cmbRequestType
  • cmbBusinessUnit
  • cmbSponsor
  • txtProblemStatement
  • txtExpectedBenefit
  • dpDesiredStart
  • attBusinessCase
  • btnSaveDraft
  • btnSubmit

Formula notes

  • btnSubmit.DisplayMode checks required fields and varWorking
  • OnSuccess sets status to Submitted and navigates to confirmation
  • Use IfError around SubmitForm or Patch to show clear failure messages

Data sources

  • Intake Requests
  • Business Units
  • Sponsors or Users
  • Attachments
PMO analystPMO Triage Queue Screen

Work the intake backlog by owner, status, age, score, and business unit.

Layout

  • Filter rail for status, owner, business unit, aging
  • Gallery of intake cards
  • Selected request summary panel
  • Action buttons for assign, clarify, score, approve, defer, reject

Controls

  • galTriageQueue
  • cmbStatusFilter
  • cmbOwnerFilter
  • txtSearch
  • frmSelectedRequest
  • btnRequestClarification
  • btnMoveToScoring
  • btnDecision

Formula notes

  • Gallery Items uses delegable status and StartsWith filters
  • Age badge uses DateDiff(SubmittedDate, Today())
  • Decision buttons require decision reason for defer/reject

Data sources

  • Intake Requests
  • Triage Decisions
  • Communication Log
PMO analyst or review boardTriage Scoring Screen

Score requests consistently and produce a recommendation.

Layout

  • Request context summary
  • Repeating scoring criteria gallery
  • Weighted score panel
  • Recommendation and decision notes
  • Submit decision command bar

Controls

  • galScoringCriteria
  • sldCriterionScore
  • lblWeightedTotal
  • cmbDecision
  • txtDecisionReason
  • btnSaveScore
  • btnCreateCharter

Formula notes

  • Weighted score = Sum(criteria score * weight)
  • Recommendation maps thresholds to approve/defer/reject
  • Create charter button patches Project Charters and links intake request

Data sources

  • Scoring Criteria
  • Intake Requests
  • Triage Decisions
  • Project Charters

Dataverse solution component map

Create this as BV PMO Intake using publisher prefix bvpmointake.

Tables

  • bv_intakerequest
  • bv_scoringcriterion
  • bv_triagedecision
  • bv_communicationlog

Choices

  • bv_requesttype
  • bv_intakestatus
  • bv_complexity
  • bv_triagedecisiontype

Apps

  • PMO Intake Portal
  • PMO Triage Workbench

Cloud flows

  • Intake - Confirm Submission
  • Intake - Request Clarification
  • Intake - Create Charter
  • Intake - Weekly Aging Digest

Security roles

  • PMO Intake Requester
  • PMO Triage Analyst
  • PMO Sponsor Viewer
  • PMO Executive Viewer

Environment variables

  • PMO Intake Site URL
  • PMO Triage Team Email
  • PMO Digest Channel URL
  • Default Charter Owner

Dashboards

  • Demand Funnel
  • Triage Aging
  • Department Demand
  • Decision Mix

Power Fx snippets

btnSubmit.OnSelectSubmit intake request with validation
Formula / code
If(
    IsBlank(Trim(txtProblemStatement.Text)) || IsBlank(cmbRequestType.Selected) || IsBlank(cmbSponsor.Selected),
    Notify("Complete request type, sponsor, and problem statement before submitting.", NotificationType.Warning),
    IfError(
        Patch(
            'Intake Requests',
            Coalesce(varCurrentRequest, Defaults('Intake Requests')),
            {
                Title: txtTitle.Text,
                'Request Type': cmbRequestType.Selected,
                Sponsor: cmbSponsor.Selected,
                'Problem Statement': txtProblemStatement.Text,
                'Current Status': { Value: "Submitted" },
                'Submitted Date': Now()
            }
        ),
        Notify("The request could not be submitted.", NotificationType.Error),
        Notify("Request submitted for PMO triage.", NotificationType.Success)
    )
);

Implementation notes

  • Use Coalesce so the same button can submit a draft or new request.
  • Keep status transition in the same Patch as Submitted Date.
  • Replace SharePoint choice syntax with Dataverse choices if using Dataverse.
lblWeightedScore.TextWeighted triage score
Formula / code
With(
    {
        weightedScore: Sum(
            galScoringCriteria.AllItems,
            Value(txtScore.Text) * ThisRecord.Weight
        )
    },
    Text(weightedScore, "0")
)

Implementation notes

  • Store the final score on the intake request when the decision is saved.
  • Keep scoring criteria in a config table so weights are not hard-coded forever.

Power Automate flow pseudo-steps

FlowIntake - Confirm Submission

Trigger: When an intake request is created or status changes to Submitted.

Workflow map

Check Current Status equals Submitted. ->
Send confirmation email to requester. ->
Post adaptive card or Teams message to triage channel. ->
Create initial triage decision row assigned to PMO queue. ->
Write Communication Log row.

Useful expressions

  • @equals(triggerOutputs()?['body/CurrentStatus/Value'], 'Submitted')
  • coalesce(triggerOutputs()?['body/Sponsor/Email'], 'unassigned')
FlowIntake - Create Charter

Trigger: When triage decision changes to Approved for Charter.

Workflow map

Get intake request. ->
Create Project Charter record. ->
Copy sponsor, business unit, request title, problem statement, and expected benefit. ->
Update intake Next Stage to Charter. ->
Notify requester and charter owner.

Useful expressions

  • @equals(triggerOutputs()?['body/Decision/Value'], 'Approved for Charter')
  • formatDateTime(utcNow(), 'yyyy-MM-dd')

Status model

  • Draft
  • Submitted
  • Clarification Requested
  • Ready for Triage
  • Approved for Charter
  • Deferred
  • Rejected

Permissions

  • Requesters create and view their own submissions.
  • Department sponsors view requests tied to their business unit.
  • PMO triage members edit scores, owners, status, and decision fields.
  • Executives view all intake reporting without edit rights.

Workflow map

Requester drafts demand ->
Submit intake request ->
PMO validates completeness ->
Clarification loop if needed ->
Weighted triage scoring ->
Approve, defer, or reject ->
Create charter record when approved

Workflow logic

  • On submit, validate required fields, stamp submitted date, and notify the triage team.
  • When clarification is requested, email the requester and create a follow-up task.
  • When scoring is complete, calculate weighted score and recommend approve, defer, or reject.
  • When approved for charter, create a draft charter linked to the intake request.

Power BI measures and calculations

  • Intake Count = COUNTROWS('Intake Requests')
  • Average Triage Days = AVERAGEX('Intake Requests', DATEDIFF('Intake Requests'[Submitted Date], 'Intake Requests'[Decision Date], DAY))
  • Aging Requests = COUNTROWS(FILTER('Intake Requests', ISBLANK('Intake Requests'[Decision Date]) && 'Intake Requests'[Submitted Date] < TODAY() - 7))
  • Approval Rate = DIVIDE([Approved Requests], [Decided Requests])

MVP build sequence

  • Start with SharePoint for small PMOs or Dataverse when security and relationships matter.
  • Build the intake form with only fields needed for triage.
  • Add a PMO-only scoring and decision screen.
  • Automate submission, clarification, and decision notifications.
  • Create a Power BI demand funnel and aging page.

Starter template downloads