Tag: Desktop Flows

  • Attended vs Unattended RPA for Power Automate Desktop Flows

    Attended vs Unattended RPA for Power Automate Desktop Flows

    Two computer setups side by side illustrating attended vs unattended RPA in Power Automate desktop flows

    You built the desktop flow. It works. Now comes the question that actually decides the economics of the whole project: does it run on a person’s machine while they watch, or on a dedicated machine at 3 AM with nobody around? That is the attended vs unattended RPA decision, and I keep seeing teams get it wrong in both directions. Some pay for unattended bots to run flows that need a human answer halfway through. Others burn an employee’s afternoon babysitting a flow that should have been scheduled on a VM.

    I have built both kinds. Here is how I compare them now, dimension by dimension.

    The Attended vs Unattended Cost Gap

    Attended RPA is included in the Power Automate Premium per-user licence, which sits around $15 per user per month. If a person is signed in and triggers the flow on their own machine, that licence covers it.

    Unattended is a different animal. The unattended process licence runs around $150 per bot per month, and if you want Microsoft to host the machine for you, the hosted process option lands around $215 per month. Want two flows running concurrently on the same machine? That is another unattended licence. This is the ten-times gap, and it is where How to Run a Power Platform Licensing Audit Before You Ship earns its keep. I have watched estimates double after someone finally read the concurrency rules.

    Machine and Session Requirements

    Attended flows need an active, unlocked Windows session. The user is signed in, the screen is visible, and the flow drives the UI in front of them. Lock the screen mid-run and the flow dies. That is not a bug. It is the definition of attended.

    Unattended flows create their own session on a machine where nobody is signed in. That means the machine must allow it: no other active session on that account, credentials stored in the connection, and on standard Windows 10 or 11 you get exactly one unattended run at a time per machine. Multiple parallel sessions need Windows Server or multiple machines in a machine group. The Microsoft Learn requirements for unattended runs are strict, and every requirement you skip becomes a 4 AM failure.

    Failure Modes

    Attended flows fail loudly and recover cheaply. The user is right there. A selector breaks, a popup appears, the flow stops, the human clicks past it and reruns. Annoying, but the blast radius is one person’s afternoon.

    Unattended flows fail silently and recover expensively. Nobody sees the unexpected dialog box. The run sits there until timeout, the queue backs up, and you find out from the downstream team the next morning. Everything covered in Selectors vs Image Recognition for Power Automate Desktop Flows matters three times more unattended, because there is no human to absorb the surprise. If you go unattended, you also need error handling, screenshots on failure, and alerting. Budget that build time. It is not optional.

    Human in the Loop

    Some processes genuinely need a person mid-flow. A judgment call, an approval, a value read off a paper document. Attended handles this naturally with input dialogs. Unattended cannot do it at all, and I have seen teams contort a process into ugly two-phase flows just to force it unattended. If a human decision sits in the middle of your process, that is your answer. Do not fight it.

    Throughput Ceiling

    This is where unattended wins without argument. An attended flow runs when a human is available, which means business hours, one run at a time, competing with the person’s actual job. An unattended machine group with three VMs runs around the clock and processes a queue in parallel. If your volume is hundreds of transactions a day, attended is not a real option no matter how cheap the licence looks. Concurrency also introduces its own gotchas inside the flows themselves — why variables break when you turn on concurrency in Power Automate is worth reading before you scale a machine group.

    At a Glance

    Dimension Attended Unattended
    Licence cost ~$15/user/month (Premium) ~$150/bot/month, ~$215 hosted
    Session User signed in, unlocked Bot creates its own session
    Failure recovery Human fixes it live Needs alerting and retry logic
    Mid-flow human input Native Not possible
    Throughput Business hours, serial 24/7, parallel with machine groups

    Choose Attended If, Choose Unattended If

    Choose attended if the process needs human judgment mid-run, if volume is low enough that a person triggering it is not a bottleneck, or if you are still stabilising the flow and want a human catching the surprises. It is also the honest choice for a pilot. Prove the flow works attended before paying unattended prices.

    Choose unattended if volume demands overnight or parallel runs, if the process is fully deterministic with no human decision anywhere, and if you have already invested in error handling and monitoring. And before either: check whether the target system has an API. As I have argued before, a lot of desktop flows should not exist at all. The best RPA licence is the one you never had to buy. More of my reasoning on these trade-offs is on my LinkedIn.

    Frequently Asked Questions

    What is the difference between attended vs unattended RPA in Power Automate Desktop?

    Attended RPA runs on a user’s machine while they are actively signed in, with the flow triggered by the person in front of it. Unattended RPA runs on a dedicated machine with no one present, typically on a schedule, creating its own session automatically. The key distinction is whether a human needs to be available during the run.

    How much does unattended RPA cost compared to attended in Power Automate?

    Attended automation is covered under the Power Automate Premium per-user licence at around $15 per user per month. Unattended requires a separate process licence at roughly $150 per bot per month, rising to around $215 if you use Microsoft-hosted machines. Running flows concurrently requires additional licences, which can cause costs to climb quickly.

    When should I use attended RPA instead of unattended for desktop flows?

    Use attended RPA when the process requires a human decision or input at some point during the run, or when the volume does not justify the higher licence cost. Unattended is better suited for high-volume, fully automated processes that can run overnight or in bulk without any human involvement.

    Why does my unattended desktop flow fail when no one is watching?

    Unattended flows can fail silently because there is no user present to handle unexpected popups, broken selectors, or login prompts. Unlike attended flows where a person can intervene immediately, unattended runs may sit idle until they time out, causing queues to back up before anyone notices the issue.

  • Selectors vs Image Recognition for Power Automate Desktop Flows

    Selectors vs Image Recognition for Power Automate Desktop Flows

    Comparison of Power Automate Desktop selectors and image recognition for UI automation reliability

    Every desktop flow forces the same decision at some point: do you target the application through Power Automate Desktop selectors, or do you fall back to image recognition and click on pixels? I have built flows both ways, and I have babysat flows built both ways. The short answer is that selectors break less often and are cheaper to fix. But the honest answer needs numbers, because there are situations where image recognition is genuinely the only option, and pretending otherwise sets teams up for pain.

    One caveat before the comparison. If the target system has an API or a documented connector, neither of these is the right answer. I wrote about that in Stop Reaching for Desktop Flows. This post assumes you have already lost that argument and the UI is all you have.

    What Breaks Power Automate Desktop Selectors

    Selectors read the application’s accessibility tree. They break when the tree changes: a developer renames a control, an update reshuffles the window hierarchy, or the selector was recorded with a fragile ordinal like Button[3] instead of a stable attribute like AutomationId. The failure is loud and specific. You get an error naming the exact UI element that could not be found, and the flow stops at that step.

    Image recognition breaks when pixels change. A theme update, a new font, Windows display scaling moving from 100% to 125%, a notification toast overlapping the target, or an unattended machine resolving at 1024×768 instead of the 1920×1080 you recorded at. None of these are code changes. Most of them are things IT does without telling you. The failure is often not even a failure: the match lands on the wrong lookalike button and the flow keeps running with wrong data.

    Maintenance Cost

    When a selector breaks, I open the UI element repository, repair one attribute, and I am done in ten minutes. The fix is surgical because the error tells me exactly which element died. Better yet, editing the custom selector to use wildcards on volatile attributes (window titles that include document names, for example) prevents whole categories of future breaks.

    When an image match breaks, I have to reproduce the exact visual state of the machine to re-capture the image. If the flow runs unattended, that means connecting to the runner, matching its resolution and scaling, and re-recording. I have seen a single Windows font scaling change take out six image-based steps across three flows in one morning. Each one needed a new capture. There is no surgical fix for pixels.

    Environment Sensitivity

    Selectors are largely immune to resolution, scaling, and theming. The accessibility tree does not care whether the window is maximized or what DPI the session runs at. This matters enormously for unattended runs, where the RDP session Power Automate creates may not match your development machine at all.

    Image recognition is hostage to the environment. You can loosen the tolerance parameter (it defaults to 10 in PAD’s image actions) to survive minor rendering differences, but every point of tolerance you add increases the chance of a false positive match. Tight tolerance breaks on scaling changes. Loose tolerance clicks the wrong thing. There is no setting that gives you both.

    Debuggability

    A failed selector produces an error message with the element name and the step. You can read the run history in the Power Automate Desktop portal and know what happened without touching the machine. A failed or mismatched image gives you “image not found” at best and silent wrong-clicks at worst. Diagnosing it means screenshots, session recordings, and guesswork. The same principle that makes AI agents fail in production when they worked fine in testing applies here: silent failures and poor observability compound until something important breaks without warning.

    Dimension Selectors Image recognition
    Breaks on UI tree changes Any pixel change
    Fix time Minutes, one attribute Re-capture on matching environment
    DPI and resolution Mostly immune Highly sensitive
    Failure mode Loud, named element Silent wrong-clicks possible

    Where Image Recognition Actually Wins

    Citrix and RDP sessions where the remote application streams as a bitmap and exposes no accessibility tree. Legacy Java apps without the access bridge configured. Canvas-rendered UIs that paint everything into a single element. In these cases selectors return nothing and image recognition, ideally combined with OCR to verify state before clicking, is the legitimate tool. In my experience, that covers maybe one flow in ten. The rest use images out of convenience, and convenience at build time is fragility at run time.

    The Decision Rule

    Choose selectors if the accessibility tree exposes the element at all, even if you have to hand-edit the selector with wildcards to make it stable. Choose image recognition only when the tree is genuinely empty, and when you do, pin the runner’s resolution and scaling, verify with OCR before destructive clicks, and document the capture environment. If you are routing outputs from these flows into Power Platform agents, the same measurement discipline covered in How to Measure Useful Work Per Dollar for Your Power Platform AI Agents applies: you need to know whether the automation is actually completing useful work, not just running without errors. Drag and drop fast. Plan even faster.

    Frequently Asked Questions

    When should I use Power Automate Desktop selectors instead of image recognition?

    Power Automate Desktop selectors are the better default choice because they read the application’s accessibility tree rather than pixels, making them resistant to resolution changes, theme updates, and display scaling. Image recognition is only worth considering when a UI element has no accessible properties for a selector to target.

    Why do Power Automate Desktop selectors break after application updates?

    Selectors break when the underlying accessibility tree of the application changes, such as when a developer renames a control or a software update reshuffles the window hierarchy. Using stable attributes like AutomationId instead of positional references like Button[3] reduces how often this happens.

    Why does image recognition in Power Automate Desktop click the wrong element?

    Image recognition matches on pixels, so changes like a new font, a notification covering the target, or a different screen resolution can cause the match to land on the wrong button without throwing an error. This makes failures harder to detect because the flow continues running with incorrect actions.

    How do I reduce maintenance work when desktop flow UI elements keep breaking?

    Switch from image-based clicks to selectors wherever possible, since selector errors identify the exact element that failed and repairs are usually quick attribute fixes. Using wildcards on volatile parts of a selector, such as window titles that include document names, can also prevent entire categories of recurring breaks.

    About the author: Halilcan Soran is a Senior Business Analyst at Visa working on process optimization with Power Platform, RPA, and agentic AI. He previously led a 15-person team at Thomson Reuters, where the Power Automate solutions he built started his automation career. More about Halilcan · LinkedIn

  • Stop Reaching for Desktop Flows When a Cloud Flow Would Do the Job

    Stop Reaching for Desktop Flows When a Cloud Flow Would Do the Job

    Decision guide for cloud flows vs desktop flows in Power Automate

    I keep seeing the same pattern on LinkedIn and in community calls. Someone builds a desktop flow to read an Outlook inbox. Someone else builds a desktop flow to write rows into SharePoint. Then they wonder why the bot crashes every time IT pushes a Windows update. The cloud flows vs desktop flows decision is not a style choice. It is an architecture choice, and most teams get it backwards.

    The problem

    People reach for desktop flows because they saw a demo where someone automated a click on a button and it felt powerful. So now every automation idea starts with Power Automate Desktop open and a recorder running. That is how you end up with a UI automation reading an Exchange mailbox that has had a documented Graph API for years.

    Here is the rule I use, and it has not failed me yet.

    If the system has an API or a connector, use a cloud flow. If it does not, use a desktop flow. That is it.

    Everything else is rationalisation. Outlook has a connector. SharePoint has a connector. Dataverse has a connector. SAP has a connector. ServiceNow has a connector. Salesforce has a connector. If you are clicking buttons in any of these with Power Automate Desktop, you are building a fragile silo for a problem that was already solved.

    Cloud flow Desktop flow
    Target has a first-party connector Always. Over 1000 connectors exist. Never. You are rebuilding a solved problem.
    Target has a documented REST API Custom connector or HTTP action. One-time investment. No. UI automation against an API-backed system is selector fragility for nothing.
    Legacy app, Citrix, thick client, no API Not possible. The one real use case. Build it knowing the maintenance cost.
    Typical failure mode API error you can read and handle. Moved window, font scaling change, 3am patch reboot.
    Maintenance Low after setup. Babysitting forever.

    The fix

    Before you open Power Automate Desktop, run through three checks.

    Check 1. Does the target system have a Power Automate connector? Go to the connector reference and search. There are over 1000 connectors. If yours is there, the conversation is over. Build a cloud flow.

    Check 2. Does the target system have a documented REST API? If yes, and there is no premade connector, build a custom connector or use the HTTP action in a cloud flow. Still cloud. A custom connector is a one-time investment that pays back for years. A desktop flow against the same system needs babysitting forever.

    Check 3. Is the target a legacy desktop app, a Citrix session, a thick client with no API, or a website with no public API and aggressive anti-automation? Now you have a real desktop flow use case. Build it, but build it knowing the maintenance cost.

    The reason this matters is not aesthetics. It is failure modes. Cloud flows fail on API errors you can read and handle. Desktop flows fail because someone moved a window, changed a font scaling setting, or the machine running the unattended bot rebooted for patches at 3am. I wrote about this exact trade-off in RPA vs AI automation. Determinism is the whole point of RPA. The moment you put RPA in front of a system that already exposes a stable contract through an API, you are throwing away the determinism you came for and replacing it with selector fragility.

    One more pattern I see and want to call out. Hybrid flows are fine. A cloud flow that triggers a desktop flow only for the one screen that has no API is a perfectly clean design. What is not clean is a desktop flow that opens Outlook, opens SharePoint, opens Excel Online, all through the UI, when every single one of those has a first-party connector. That is not automation. That is a recorded macro pretending to be an enterprise solution. If you are prototyping flow logic and want a faster feedback loop without spinning up connectors every time, Thirty Days Running Ollama Locally for Automation Work covers where local AI actually saves time during that phase and where it falls short.

    The Microsoft Learn docs lay this out clearly under Power Automate documentation, but the guidance gets lost in the noise. The short version, from what I have built and watched others build: API first, connector second, custom connector third, desktop flow last. Reverse that order and you will spend more time fixing the automation than you saved by building it. And if your flows are starting to touch Dataverse directly, the Power Platform May 2026 Update has a few things worth turning on before you go further, particularly Power Fx UDTs hitting GA.

    Frequently asked questions

    When should I use a desktop flow instead of a cloud flow?

    Only when the target system has no connector and no documented API. That means a legacy desktop app, a Citrix session, a thick client, or a website with no public API. If a connector or REST API exists, build a cloud flow. No exceptions have held up in anything I have built or watched others build.

    Can I combine cloud flows and desktop flows?

    Yes, and the clean pattern is a cloud flow that orchestrates everything and triggers a desktop flow only for the one screen that has no API. The anti-pattern is a desktop flow driving Outlook, SharePoint, and Excel Online through the UI when all three have first-party connectors.

    Why do desktop flows need more maintenance than cloud flows?

    Because they fail on things that have nothing to do with your logic. A moved window, a font scaling setting, an unattended machine rebooting for patches. Cloud flows fail on API errors you can read, log, and handle in the flow itself.

    What if there is no premade connector for my system?

    Check for a documented REST API first. If one exists, build a custom connector or call it with the HTTP action from a cloud flow. That is a one-time investment that pays back for years. A desktop flow against the same system needs attention every time the UI shifts.

    About the author: Halilcan Soran is a Senior Business Analyst at Visa working on process optimization with Power Platform, RPA, and agentic AI. He previously led a 15-person team at Thomson Reuters, where the Power Automate solutions he built started his automation career. More about Halilcan · LinkedIn