Wednesday, June 17, 2026

Power Automate Desktop (PAD)

Power Automate Desktop (PAD)

Part A — Beginner (Q1–Q30)

# Question Short Answer
1 What is Power Automate Desktop (PAD)? A low-code RPA tool from Microsoft used to automate repetitive desktop and web tasks by recording or building flows visually.
2 What is RPA? Robotic Process Automation — software "robots" that mimic human actions on a UI to automate rule-based tasks.
3 Difference between Power Automate (cloud) and PAD? Cloud flows run on triggers/connectors in the cloud; PAD runs on the desktop to automate UI, files, and legacy apps.
4 What is a desktop flow? A sequence of actions built in PAD that automates a task on a Windows machine.
5 What are actions in PAD? Pre-built building blocks (like "Click", "Read from Excel") that you drag into the flow designer.
6 What is the Actions pane? The left-hand panel listing all available actions grouped by category.
7 What is a variable in PAD? A named container that stores data (text, number, list, datatable, object) used during a flow.
8 How do you create a variable? Use "Set variable" action, or variables are auto-produced as outputs of other actions.
9 What variable data types does PAD support? Text, Numeric, Boolean, List, Datatable, Datarow, Custom object, Datetime, and others.
10 What is the percent notation %variable%? The syntax PAD uses to reference or evaluate a variable or expression inside a field.
11 How do you run a flow in PAD? Click the Run button in the flow designer or trigger it from the console.
12 What is the PAD console? The home screen listing all your flows, where you can run, edit, or schedule them.
13 What is the recorder in PAD? A feature that captures your mouse and keyboard actions and converts them into flow steps.
14 Can PAD automate web browsers? Yes, via browser automation actions using extensions for Edge, Chrome, and Firefox.
15 What is a UI element? A captured reference to an on-screen control (button, field, link) that PAD interacts with.
16 Where are UI elements stored? In the UI elements repository of the specific flow.
17 How do you add a comment in a flow? Use the "Comment" action to document logic for readability.
18 What is the "Send keys" action? Sends keystrokes to the active window to simulate typing or shortcuts.
19 What is the "Wait" action? Pauses the flow for a fixed number of seconds.
20 How do you display a message to a user? Use the "Display message" action to show a dialog box.
21 What is "Input dialog" used for? To prompt the user to enter a value during flow execution.
22 How do you read data from Excel in PAD? Launch Excel, then use "Read from Excel worksheet" action.
23 How do you write to Excel? Use "Write to Excel worksheet" action specifying cell or column/row.
24 What is a Datatable? A variable type that holds rows and columns, similar to a table or grid.
25 What is a Datarow? A single row from a datatable.
26 How do you launch an application? Use "Run application" action with the executable path.
27 What file actions does PAD offer? Copy, move, delete, rename files; read/write text files; get file info.
28 How do you take a screenshot in a flow? Use the "Take screenshot" action.
29 Difference between Run and Debug? Run executes fully; Debug lets you step through with breakpoints and inspect variables.
30 Is PAD free? A free version is available for Windows 11/10 (attended); paid plans unlock cloud-connected and unattended automation.


Part A — Intermediate (Q31–Q60)

# Question Short Answer
31 What is a conditional action? "If", "Else if", "Else" actions that branch logic based on conditions.
32 What is a "Switch" action? Evaluates one value against multiple cases, like a multi-branch if.
33 What loops does PAD support? For each, Loop (fixed count), Loop condition (while), and the loop control actions.
34 Difference between "Loop" and "For each"? "Loop" runs a set number of times; "For each" iterates over items in a list or datatable.
35 What does "Exit loop" do? Breaks out of the current loop immediately.
36 What does "Next loop" do? Skips to the next iteration of the loop.
37 How do you handle errors on a single action? Open the action's "On error" tab to set retry, continue, or go-to behavior.
38 What is a "Block error" / "On block error"? A way to wrap multiple actions and define error handling for the whole block.
39 What is a subflow? A reusable group of actions within a flow that can be called like a function.
40 How do you call a subflow? Use the "Run subflow" action.
41 Why use subflows? To organize logic, avoid repetition, and improve maintainability.
42 What are input and output variables? Variables marked to receive data into a flow or return data out, enabling parameter passing.
43 How does PAD pass data to a cloud flow? Through input/output variables when the desktop flow is invoked by a cloud flow.
44 Difference between attended and unattended automation? Attended runs with a logged-in user present; unattended runs without supervision, often scheduled.
45 How do you schedule a desktop flow? Trigger it from a cloud flow using a schedule, since PAD itself has no native scheduler.
46 What is image-based automation? Locating and clicking UI by matching screenshots instead of structured UI elements.
47 When would you use image-based clicking? When stable UI selectors aren't available (e.g., Citrix, virtual desktops, images).
48 What is OCR in PAD? Optical Character Recognition to extract text from images or screens.
49 Which OCR engines does PAD support? Windows OCR engine and Tesseract.
50 How do you extract data from a web page? Use "Extract data from web page" to capture tables, lists, or specific elements.
51 Difference between "Populate text field" and "Send keys"? Populate sets a field's value directly via the UI element; Send keys simulates raw keystrokes.
52 How do you handle pop-ups or dialogs? Detect them with UI elements/window actions and click or dismiss accordingly.
53 How do you convert text to a number? Use "Convert text to number" action or expression functions.
54 How do you manipulate text in PAD? Actions like trim, replace, split, pad, get subtext, and change case.
55 What is the "Get subtext" action? Extracts a portion of a string by position and length.
56 How do you split a string into a list? Use "Split text" with a delimiter to produce a list.
57 How do you parse a date? Use "Convert text to datetime" with a format specifier.
58 How do you handle CSV files? Read with "Read from CSV file" and write with "Write to CSV file" actions.
59 What is a custom object / JSON in PAD? A structured key-value object; PAD can convert JSON to/from custom objects.
60 How do you call a web API in PAD? Use the "Invoke web service" (HTTP) action with method, URL, headers, and body.


Part A — Advanced (Q61–Q85)

# Question Short Answer
61 What strategies make UI selectors more robust? Use stable attributes, avoid index-only selectors, leverage anchors, and use wildcards for dynamic values.
62 How does PAD identify elements (selectors)? Through a hierarchy of UI element attributes (control type, name, class) forming a selector path.
63 How do you make a selector dynamic? Edit the UI element to insert a variable into an attribute (e.g., %itemName%).
64 How do you handle dynamic or changing web pages? Add waits for element existence, use relative selectors, and reduce reliance on fixed indexes.
65 What is the "Wait for" family of actions? Actions that pause until a UI element, window, image, or condition appears/changes.
66 Why prefer "Wait for element" over fixed "Wait"? It waits only as long as needed, making flows faster and more reliable than hard-coded delays.
67 How do you implement retry logic? Use the "On error" retry policy, or a loop with a counter and try/catch-style block error.
68 How can you run PowerShell or scripts from PAD? Use "Run PowerShell script", "Run VBScript", "Run JavaScript", or "Run Python script" actions.
69 How do you run a SQL query in PAD? Use the database actions: open SQL connection, execute SQL statement, close connection.
70 How do you work with COM/automation in legacy apps? Use window/UI automation actions or scripts; PAD can drive apps exposing accessible UI.
71 How do you secure credentials in PAD? Store secrets in Azure Key Vault or environment variables; avoid hardcoding passwords.
72 What is the role of the on-premises data gateway? Not used by PAD directly; PAD connects via the machine/machine groups for cloud-triggered runs.
73 How is a desktop flow triggered from the cloud? A cloud flow uses the "Run a flow built with Power Automate Desktop" action targeting a registered machine.
74 What is a machine in Power Automate? A registered Windows device with the PAD runtime that can execute desktop flows.
75 What is a machine group? A pool of registered machines that distribute desktop flow runs for load balancing and resilience.
76 Difference between direct and gateway connectivity? Direct connectivity registers the machine to the cloud directly; the older model relied on a gateway.
77 How do you handle exceptions globally? Wrap logic in block errors, log failures, capture screenshots, and route to a clean-up subflow.
78 How do you log flow execution? Write to a file, database, or send results back to a cloud flow; use screenshots for diagnostics.
79 How do you debug a failing flow? Use breakpoints, run from a specific action, inspect variable values, and check the UI element selectors.
80 How do you optimize a slow desktop flow? Replace fixed waits with conditional waits, minimize UI hops, batch data ops, and reduce screenshots.
81 Difference between picture-in-picture and full desktop run? Picture-in-picture runs attended automations in an isolated session so you can keep working.
82 How do you reuse logic across many flows? Use subflows within a flow, or copy/standardize patterns; share via solutions in the cloud.
83 What are solutions in Power Platform? Containers that package flows and components for ALM (move dev → test → prod).
84 How do you move a desktop flow between environments? Add it to a solution and export/import, or use pipelines for ALM.
85 How do you handle sensitive input variables? Mark them as sensitive so their values are masked in logs and run history.


Part A — Expert (Q86–Q100)

# Question Short Answer
86 How do you design for unattended automation at scale? Use machine groups, idempotent flows, robust error handling, queueing, and centralized logging/monitoring.
87 How do you implement a work-queue pattern in PAD? Store items in Dataverse/SharePoint/SQL, have flows pick pending items, lock, process, then mark status.
88 How do you ensure idempotency in automation? Check state before acting, use unique keys, and design steps so re-runs don't duplicate effects.
89 What governance considerations apply to RPA? DLP policies, environment strategy, credential vaulting, naming standards, monitoring, and CoE oversight.
90 What is the Center of Excellence (CoE) Starter Kit? A Microsoft toolkit to govern, monitor, and scale Power Platform adoption across an organization.
91 How do you apply DLP to desktop flows? Define data loss prevention policies in the admin center to control connector usage and data movement.
92 How do you handle concurrency and locking? Use machine groups for parallelism plus record-level locking in the data store to avoid double processing.
93 How do you monitor desktop flow runs? Use run history, the monitoring portal, machine/machine-group dashboards, and CoE analytics.
94 How do you implement CI/CD for PAD flows? Use solutions with Power Platform Pipelines or Azure DevOps/GitHub to promote across environments.
95 How do you secure unattended run credentials? Store and retrieve secrets from Azure Key Vault; use service accounts with least privilege.
96 Common reasons selectors break in production? App updates, locale changes, dynamic IDs, layout changes, and resolution/DPI differences.
97 How do you make flows resilient to UI changes? Use stable attributes, anchors, OCR/image as fallback, defensive waits, and centralized selector updates.
98 How do you decide between attended and unattended? Attended for human-in-the-loop tasks; unattended for high-volume, scheduled, fully rule-based processes.
99 How do you measure RPA ROI? Track hours saved, error reduction, throughput, and cost per transaction versus manual processing.
100 When is RPA the wrong solution? When a proper API/integration exists, the process changes constantly, or the UI is too unstable to automate reliably.


Part B — Beginner Scenarios (Q1–Q25)

# Scenario Short Answer
1 A user must copy 50 rows from one spreadsheet into a web form daily. How do you start? Map the manual steps first, capture the form's UI elements, then build a loop that reads each row and fills the form.
2 Your recorded flow clicks the wrong button after the app window resizes. Likely cause? The recorder captured a position-based selector; recapture using a stable attribute instead of coordinates.
3 A teammate's flow works on their PC but not yours. First thing to check? Confirm the app version, screen resolution, browser extension, and that the same UI elements exist on your machine.
4 You need the flow to greet the user by name at start. How? Show an input dialog to capture the name, store it in a variable, then display it in a message.
5 A flow must pause until a slow report finishes loading. How to avoid guessing the time? Use a "wait for element" on something that only appears when the report is done, instead of a fixed wait.
6 The same five actions appear in three places in your flow. What do you do? Move them into a subflow and call it from each place to reduce duplication.
7 A flow should only email a summary if at least one record was processed. How? Track a counter, then use an If condition to send the email only when the count is greater than zero.
8 You want to test a flow without sending real emails. How? Disable or comment the send action and use a display-message in its place during testing.
9 A flow needs to open a file whose name changes daily (date-stamped). How? Build the filename dynamically from the current date and pass that variable to the open-file action.
10 The user accidentally closes the target app mid-run. How to recover? Detect the missing window, relaunch the app, and resume or restart from a safe checkpoint.
11 You must skip blank rows in an Excel sheet. How? Inside the loop, use an If condition to continue to the next iteration when the key cell is empty.
12 A flow keeps typing before the page is ready. Fix? Add a wait-for-element-ready or wait-for-page-load before the typing action.
13 You need to confirm a flow ran successfully each morning. Simplest approach? Write a timestamped success line to a log file at the end of the flow.
14 A flow must handle both .xls and .xlsx files in a folder. How? List files with a wildcard pattern, then loop through and process each matching file.
15 The business wants the flow to ask "Are you sure?" before deleting records. How? Use a message box with Yes/No buttons and branch on the user's choice.
16 A flow should stop early if a required file is missing. How? Check if the file exists; if not, show a message and end the flow gracefully.
17 You need to rename hundreds of downloaded files consistently. How? Loop the files and apply a rename action using a built pattern (prefix + index/date).
18 The flow must copy text from a desktop app field into Excel. How? Capture the field as a UI element, read its value into a variable, then write it to the worksheet.
19 A flow runs too fast for a legacy app to keep up. Quick fix? Insert short waits or wait-for-element steps between actions to let the app catch up.
20 You want non-technical users to launch the flow easily. How? Pin it in the PAD console or surface it via a simple trigger so they just click Run.
21 A flow must extract today's date in yyyy-MM-dd format. How? Get the current datetime and convert it to text with that format specifier.
22 The flow should clear a field before typing into it. How? Focus the field, select all and delete (or set the field value to empty) before populating.
23 You need to verify a login succeeded before continuing. How? Wait for a post-login element (e.g., dashboard) to appear, and branch to error handling if it doesn't.
24 A flow must total a numeric column from Excel. Approach? Loop the rows accumulating a sum variable, or read the range and compute the total.
25 The user wants a popup at the end showing how long the flow took. How? Capture start and end datetimes, compute the difference, and display it in a message.



Part B — Intermediate Scenarios (Q26–Q55)

# Scenario Short Answer
26 A flow occasionally fails because a popup appears randomly. How to handle it? Before the main step, check for the popup element and dismiss it if present, then continue.
27 You must process 10,000 rows but the flow is slow. What do you optimize? Minimize per-row UI interactions, read/write in bulk where possible, and remove unnecessary waits/screenshots.
28 A web element is found but the click does nothing. Likely fix? The element may be obscured or not interactive yet; wait for it to be enabled/visible or scroll it into view first.
29 A flow needs to retry a flaky network call up to three times. How? Wrap it in a loop with a counter and a try/catch-style block error, breaking on success.
30 You must extract line items from PDF invoices. Approach? Use PDF extraction actions to pull text/tables, then parse the fields into a datatable.
31 The same flow must run for three different clients with different settings. How? Externalize settings into a config file/table and load the right set based on an input parameter.
32 A flow downloads a file but the next step runs before download completes. Fix? Wait until the file exists and its size stops changing before proceeding.
33 You need to compare two Excel sheets and flag mismatches. Approach? Read both into datatables, loop one keyed by a unique column, look up the other, and record differences.
34 A flow must send different emails based on order status. How? Use a Switch on the status value with a case for each path, or chained If/Else branches.
35 The target website shows a CAPTCHA. What's the right stance? Don't try to bypass it; redesign around an API/authorized channel or insert a human-in-the-loop attended step.
36 A flow throws "element not found" intermittently. How to stabilize it? Add wait-for-element with a timeout, improve the selector, and add retry on the action.
37 You must mask a password that appears in run logs. How? Mark the input variable as sensitive so its value is hidden in history and logs.
38 A flow needs data from a REST API and then enters it into an app. Approach? Invoke the web service, parse the JSON into a custom object, then drive the app UI with those values.
39 Two flows occasionally edit the same Excel file and collide. Fix? Serialize access (a lock/flag), or have one flow own the file and queue requests.
40 A long flow fails near the end and you don't want to redo everything. Design fix? Add checkpoints/state so the flow can resume from the last completed stage.
41 You need to validate an email format before submitting. How? Apply a regex/pattern check and branch to an error path if it doesn't match.
42 A flow must loop through rows but stop when it hits a "STOP" marker. How? Inside the loop, test the cell value and use exit-loop when it equals the marker.
43 The app sometimes opens in a different window position. How to click reliably? Use UI-element selectors (not coordinates) and bring the window to focus before interacting.
44 A flow needs to keep only unique values from a list with duplicates. How? Build a result list, and before adding each item, check it isn't already present.
45 You must capture an error screenshot only when something fails. How? In the block error / on-error handler, take a screenshot and save it with a timestamped name.
46 A flow reads a date as text but needs to do date math. How? Convert the text to a datetime using the source format, then add/subtract as needed.
47 The business wants a daily run but PAD has no scheduler. How? Trigger the desktop flow from a scheduled cloud flow.
48 A flow must handle a dropdown that loads options dynamically. How? Wait for the options to populate, then select by visible text rather than index.
49 You need to move processed files to an "archive" folder. How? After processing each file successfully, move it to the archive path; leave failures in place.
50 A flow's output must feed a Power Automate cloud flow. How? Define output variables in the desktop flow; the cloud flow reads them after the run.
51 The same selector breaks whenever the record ID changes. Fix? Parameterize the selector with a variable so it adapts to the current ID.
52 You must extract a number embedded in a sentence. Approach? Use regex/text actions to isolate the digits, then convert to a number.
53 A flow needs to send a Teams/email alert on failure. How? In the error handler, call a notification step (cloud flow or email action) with the error details.
54 A flow processes a folder that may be empty some days. How? Check the file count first and exit gracefully with a "nothing to process" log if zero.
55 You want to reuse one error-handling routine across many steps. How? Centralize cleanup/logging in a subflow and call it from each on-error handler.

Part B — Advanced Scenarios (Q56–Q85)

# Scenario Short Answer
56 An unattended flow fails at 2 AM with no one watching. How to make it safe? Add full error handling, logging, failure notifications, and a clean exit so the machine isn't left in a bad state.
57 A flow works attended but fails unattended. Common cause? The unattended session has no interactive desktop / locked-screen issues; ensure proper machine/session setup and no UI prompts.
58 Selectors break after a vendor app update. How to minimize future pain? Centralize selectors, use stable attributes/anchors, and add a fallback (OCR/image) for fragile elements.
59 Two machines in a group sometimes grab the same work item. Fix? Implement record-level locking/status in the data store so an item is claimed before processing.
60 You must process 50,000 items within a window using multiple bots. Design? Use a work queue plus a machine group, with each bot pulling and locking pending items.
61 A flow must run as a specific service account with vaulted secrets. How? Run unattended under that account and retrieve credentials from Azure Key Vault at runtime.
62 Throughput drops when many flows hit one database. What do you change? Add connection pooling/batching, reduce round-trips, and stagger or throttle concurrent runs.
63 A regulator needs an audit trail of every action a bot takes. Approach? Log each step (who/what/when, inputs/outputs) to a durable store, with sensitive data masked.
64 A flow must continue past a non-critical error but stop on critical ones. How? Classify errors in the handler: continue/log for non-critical, raise/abort for critical.
65 You need to promote a flow from Dev to Prod safely. Approach? Package it in a solution and move via Pipelines/ALM rather than manually rebuilding.
66 A long-running flow hangs and never times out. Fix? Set timeouts on waits and actions, and add a watchdog/overall time limit that aborts cleanly.
67 The same flow must support English and another locale's date format. How? Detect or parameterize locale and parse/format dates using the correct culture.
68 A bot must hand off to a human for approval mid-process. Design? Pause and route to an approval (cloud flow/Teams), then resume based on the decision.
69 You suspect a memory/resource leak over long runs. How to investigate? Monitor the machine's resource usage, close apps/handles you open, and split very long runs.
70 A flow must process items in priority order. How? Sort or query the work queue by priority before the processing loop.
71 Production fails but you can't reproduce it in Dev. Approach? Add detailed logging/screenshots in prod, compare environment/data differences, and replay with prod-like data.
72 A flow runs on Citrix/virtual desktop where UI elements aren't exposed. How? Fall back to image-based automation and OCR since structured selectors aren't available.
73 You need zero data loss if a bot crashes mid-batch. Design? Make each item idempotent and commit progress per item so a restart resumes safely.
74 A team wants standardized flows across many developers. How? Establish templates, naming conventions, shared subflows, and code-review/CoE standards.
75 A flow must not run two copies at once on the same machine. How? Use a lock/flag (file, mutex, or queue status) so a second instance exits if one is active.
76 The business changes the process weekly. Is RPA still right? Often no — high-change processes break UI bots; recommend an API/integration or stabilize the process first.
77 You must securely pass an API token to a flow without hardcoding. How? Pull it from Key Vault or an environment variable at runtime; never store it in the flow.
78 A bot must reconcile data between two systems and report drift. Approach? Pull both datasets, key-match them, compute differences, and output a reconciliation report.
79 A flow's run history shows random failures only under load. Likely area? Timing/race conditions — strengthen waits, add retries, and reduce contention on shared resources.
80 You need to roll back a faulty flow version quickly. How? Keep versioned solutions/exports so you can re-import the last known good version.
81 A flow must respect a maintenance window and not run during it. How? Gate execution with a time/window check (or schedule logic) that exits if inside the blackout.
82 Sensitive PII flows through a bot. What controls apply? Mask in logs, encrypt at rest/in transit, limit access, and apply DLP policies on connectors.
83 A flow must scale to more bots next quarter. What do you prepare? A queue-based architecture, a machine group, idempotent items, and centralized monitoring.
84 A vendor portal logs you out after inactivity. How to handle long jobs? Keep the session alive with periodic activity, or chunk work and re-login between batches.
85 You inherit an undocumented flow that breaks often. First steps? Map its logic, add logging, identify fragile selectors, and refactor into subflows with error handling.



Part B — Expert Scenarios (Q86–Q100)

# Scenario Short Answer
86 Leadership asks whether to automate a process at all. How do you decide? Assess volume, stability, rule-clarity, and ROI; automate stable high-volume rule-based work, defer the rest.
87 You're designing an enterprise RPA platform from scratch. Key pillars? Governance/CoE, environment strategy, queue architecture, credential vaulting, monitoring, and ALM pipelines.
88 Citizen developers are creating ungoverned bots. How to regain control? Stand up a CoE, apply DLP and environment policies, inventory existing flows, and set standards/training.
89 Two business units want conflicting changes to a shared bot. How to manage it? Parameterize/config-drive the shared logic, branch via solutions, and govern changes through a review process.
90 A critical bot must meet an SLA with high availability. Design? Use a machine group across hosts, health checks, automatic failover/retries, and proactive monitoring/alerting.
91 You must estimate capacity for a new automation program. Approach? Model transaction volume × handle time vs. bot hours, then size machines/groups with headroom for peaks.
92 Auditors require proof that bots only access permitted data. How? Enforce least-privilege service accounts, DLP policies, access logging, and documented data-flow diagrams.
93 A flagship process spans web, desktop, and APIs across teams. How to architect it? Orchestrate with a cloud flow calling modular desktop flows, each owning one system, with a shared queue/state.
94 Costs are rising with bot count. How to optimize spend? Consolidate flows, right-size machines, retire low-ROI bots, and prefer APIs where they replace UI automation.
95 You need a disaster-recovery plan for the automation estate. What's in it? Versioned exports, documented configs/secrets locations, machine rebuild steps, and tested restore procedures.
96 A merger doubles the systems your bots touch overnight. Strategy? Inventory and prioritize by ROI, reuse modular subflows, standardize patterns, and phase rollout by risk.
97 The board wants metrics on automation value. What do you report? Hours saved, error reduction, throughput, SLA adherence, cost per transaction, and adoption trends.
98 A bot caused a costly error in production. How to respond and prevent recurrence? Contain/rollback, root-cause the failure, add validation/guardrails and tests, and update the runbook.
99 You must choose between RPA and a proper system integration. How to frame it? Prefer integration when a stable API exists and volume/longevity justify it; use RPA for legacy/no-API or short-term needs.
100 Adoption stalled after early wins. How to scale sustainably? Build a CoE, reusable assets, training, a prioritized pipeline, executive sponsorship, and clear value tracking.




Friday, June 12, 2026

Create a Dataverse Table With Every Common Column Type Using Power Automate

Create a Dataverse Table With Every Common Column Type Using Power Automate

Create a Dataverse Table With Every Common Column Type Using Power Automate

If you have ever clicked through the maker portal to build a Dataverse table column by column, you know how slow it gets. There is a faster, repeatable way: send one HTTP request to the Dataverse Web API and let it build the whole table — primary column, choices, currency, dates, the lot — in a single shot.

In this post I will walk through a Power Automate cloud flow that does exactly that. It creates a demo table called Sample Product with one column of every common type, so you can see how each column type is defined in the Web API.


The idea in one line

Dataverse exposes a metadata endpoint. POST a JSON definition of your table to it, and Dataverse creates the table and all the columns you described.

POST https://yourorg.crm.dynamics.com/api/data/v9.2/EntityDefinitions

Replace yourorg with your own environment URL. You can find it in the Power Platform Admin Center under your environment's settings, or in the address bar when you open any model-driven app.


The flow at a glance

The flow has just two steps after the trigger:

Step Action What it does
Trigger Manually trigger a flow Lets you run it on demand with a button
1 Compose Holds the full table definition as JSON
2 HTTP request POSTs that JSON to the EntityDefinitions endpoint

Keeping the definition in a Compose action makes the flow easy to read and easy to tweak. The HTTP action just points at the Compose output.

Connector note: This example uses the HTTP with Microsoft Entra ID (preauthorized) connector (the "Invoke an HTTP request" action). It is a premium connector, but it handles authentication to Dataverse for you, so you do not have to manage tokens by hand.


Step 1 — Compose the table definition

The Compose action holds an EntityMetadata object. The top part describes the table itself; the Attributes array describes each column.

Here is the table-level part:

{
  "@@odata.type": "Microsoft.Dynamics.CRM.EntityMetadata",
  "SchemaName": "new_SampleProduct",
  "DisplayName": {
    "@@odata.type": "Microsoft.Dynamics.CRM.Label",
    "LocalizedLabels": [
      { "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", "Label": "Sample Product", "LanguageCode": 1033 }
    ]
  },
  "DisplayCollectionName": {
    "@@odata.type": "Microsoft.Dynamics.CRM.Label",
    "LocalizedLabels": [
      { "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", "Label": "Sample Products", "LanguageCode": 1033 }
    ]
  },
  "OwnershipType": "UserOwned",
  "IsActivity": false,
  "HasActivities": false,
  "HasNotes": false,
  "Attributes": [ ... ]
}

A few things worth knowing here:

Property Meaning
SchemaName The internal name. new_ is the default publisher prefix — change it to match your own solution publisher.
DisplayName The singular label shown in the UI ("Sample Product").
DisplayCollectionName The plural label ("Sample Products").
OwnershipType UserOwned means rows belong to a user or team. Use OrganizationOwned for shared reference data.
LanguageCode: 1033 The locale ID for English (United States). Use your own LCID if needed.

Why the double @@?

You will notice @@odata.type instead of @odata.type. This is a Power Automate quirk, not a Dataverse one. In Power Automate the @ symbol starts an expression, so to send a literal @ you have to double it. When the flow runs, @@odata.type is sent to Dataverse as @odata.type. If you copy this JSON somewhere outside Power Automate, drop one of the @ signs.


The column types, explained

Every column lives in the Attributes array and needs a matching @odata.type. Pick the wrong type and you get a 400 Bad Request. Here is each column type used in the demo table:

Column @odata.type Dataverse type Notes
Product Name StringAttributeMetadata Single line of text The primary name column. IsPrimaryName: true, MaxLength: 100. Every table needs exactly one.
Description MemoAttributeMetadata Multiple lines of text Format: TextArea, MaxLength: 2000.
Quantity IntegerAttributeMetadata Whole number Set MinValue / MaxValue to bound it.
Serial Number BigIntAttributeMetadata Big integer For very large whole numbers.
Weight DecimalAttributeMetadata Decimal number Has Precision (decimal places) and min/max.
Rating DoubleAttributeMetadata Float Floating-point number; also has Precision.
Price MoneyAttributeMetadata Currency Uses PrecisionSource (0 = no decimals, 1 = currency precision, 2 = pricing decimal precision).
Is Active BooleanAttributeMetadata Yes/No Needs an OptionSet with a TrueOption and FalseOption.
Received Date DateTimeAttributeMetadata Date and time Use Format: DateAndTime, or DateOnly for a date-only column.
Category PicklistAttributeMetadata Choice (single) A local choice set. Option values start at 100000000.
Tags MultiSelectPicklistAttributeMetadata Choices (multi) Note its AttributeType is Virtual, not MultiSelectPicklist.

The primary name column (the one you cannot skip)

{
  "@@odata.type": "Microsoft.Dynamics.CRM.StringAttributeMetadata",
  "AttributeType": "String",
  "AttributeTypeName": { "Value": "StringType" },
  "SchemaName": "new_ProductName",
  "IsPrimaryName": true,
  "MaxLength": 100,
  "FormatName": { "Value": "Text" },
  "RequiredLevel": { "Value": "None", "CanBeChanged": true, "ManagedPropertyLogicalName": "canmodifyrequirementlevelsettings" },
  "DisplayName": {
    "@@odata.type": "Microsoft.Dynamics.CRM.Label",
    "LocalizedLabels": [
      { "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", "Label": "Product Name", "LanguageCode": 1033 }
    ]
  }
}

If you forget IsPrimaryName: true, or include zero (or more than one) of them, the request fails. This is the most common mistake when building tables this way.

A choice column (single select)

A local choice set lives right inside the column definition. Each option needs a numeric Value and a label:

{
  "@@odata.type": "Microsoft.Dynamics.CRM.PicklistAttributeMetadata",
  "AttributeType": "Picklist",
  "AttributeTypeName": { "Value": "PicklistType" },
  "SchemaName": "new_Category",
  "OptionSet": {
    "@@odata.type": "Microsoft.Dynamics.CRM.OptionSetMetadata",
    "IsGlobal": false,
    "OptionSetType": "Picklist",
    "Options": [
      { "Value": 100000000, "Label": { "@@odata.type": "Microsoft.Dynamics.CRM.Label", "LocalizedLabels": [ { "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", "Label": "Electronics", "LanguageCode": 1033 } ] } },
      { "Value": 100000001, "Label": { "@@odata.type": "Microsoft.Dynamics.CRM.Label", "LocalizedLabels": [ { "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel", "Label": "Apparel", "LanguageCode": 1033 } ] } }
    ]
  }
}

Set IsGlobal: true if you want a global choice set that other tables can reuse. The multi-select column ("Tags") follows the same shape — the only real difference is the @odata.type and that its AttributeType is reported as Virtual.


Step 2 — The HTTP request

The second action posts the Compose output to Dataverse:

Setting Value
Method POST
URL https://yourorg.crm.dynamics.com/api/data/v9.2/EntityDefinitions
Body @outputs('Compose_Table_Definition')

And the headers:

Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json

On success Dataverse returns HTTP 204 No Content, with an OData-EntityId header pointing at your new table. No body comes back — the empty 204 is the success signal.


Two improvements worth adding

The base flow works, but two small additions make it production-friendly.

1. Put the table in a solution. As written, the new table lands in the Default Solution, which is an ALM anti-pattern — it makes the table hard to move between environments. Add this header to the HTTP action so the table is created inside your own unmanaged solution:

MSCRM.SolutionUniqueName: YourSolutionUniqueName

Use the solution's unique name, not its display name.

2. Read it back with a strong-consistency header. Metadata is cached, so if you immediately query the new table it might return a 404 because the cache has not caught up. When you read straight after creating, add:

Consistency: Strong

Wrap-up

With one Compose action and one HTTP request you can stand up a full Dataverse table — primary column, numbers, currency, dates, and both flavours of choice — without touching the maker portal. Because the whole definition is just JSON, you can version it, parameterise it, or drive it from a CSV or SharePoint list to build tables on demand.

The same EntityDefinitions endpoint also handles updates (PUT) and lets you add columns to an existing table later (POST to its Attributes collection), so this is a solid foundation for any metadata-as-code approach on the Power Platform.


Quick reference: column type to @odata.type

Column type you want @odata.type to use
Single line of text StringAttributeMetadata
Multiple lines of text MemoAttributeMetadata
Whole number IntegerAttributeMetadata
Big integer BigIntAttributeMetadata
Decimal number DecimalAttributeMetadata
Float DoubleAttributeMetadata
Currency MoneyAttributeMetadata
Yes/No BooleanAttributeMetadata
Date and time DateTimeAttributeMetadata
Choice (single) PicklistAttributeMetadata
Choices (multi) MultiSelectPicklistAttributeMetadata

Full flow JSON

Here is the complete flow, scrubbed of environment-specific values. Before you use it, replace two placeholders:

  • yourorg.crm.dynamics.com in the HTTP action URL with your own environment URL.
  • The connection details (connectionName, connectionReferenceLogicalName) will be set automatically when you add your own HTTP with Microsoft Entra ID connection — the placeholder values below are only there to keep the JSON valid.

Note: the @@odata.type double-@ is correct for this Power Automate definition (it is how the editor escapes a literal @). Keep it as-is when pasting into the flow editor's code view. If you ever send the body straight to Dataverse outside Power Automate, use a single @odata.type.

{
  "$schema": "https://power-automate-tools.local/flow-editor.json#",
  "connectionReferences": {
    "shared_webcontents": {
      "connectionName": "shared-webcontents-00000000-0000-0000-0000-000000000000",
      "connectionReferenceLogicalName": "new_sharedwebcontents_xxxxx",
      "source": "Invoker",
      "id": "/providers/Microsoft.PowerApps/apis/shared_webcontents",
      "displayName": "HTTP with Microsoft Entra ID (preauthorized)",
      "iconUri": "https://conn-afd-prod-endpoint-bmc9bqahasf3grgk.b01.azurefd.net/releases/v1.0.1800/1.0.1800.4648/webcontents/icon.png",
      "brandColor": "",
      "tier": "Premium",
      "apiName": "webcontents",
      "isProcessSimpleApiReferenceConversionAlreadyDone": false
    }
  },
  "definition": {
    "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
    "contentVersion": "undefined",
    "parameters": {
      "$authentication": {
        "defaultValue": {},
        "type": "SecureObject"
      },
      "$connections": {
        "defaultValue": {},
        "type": "Object"
      }
    },
    "triggers": {
      "manual": {
        "type": "Request",
        "kind": "Button",
        "inputs": {
          "schema": {
            "type": "object",
            "properties": {},
            "required": []
          }
        }
      }
    },
    "actions": {
      "Compose_Table_Definition": {
        "runAfter": {},
        "type": "Compose",
        "inputs": {
          "@@odata.type": "Microsoft.Dynamics.CRM.EntityMetadata",
          "SchemaName": "new_SampleProduct",
          "DisplayName": {
            "@@odata.type": "Microsoft.Dynamics.CRM.Label",
            "LocalizedLabels": [
              {
                "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                "Label": "Sample Product",
                "LanguageCode": 1033
              }
            ]
          },
          "DisplayCollectionName": {
            "@@odata.type": "Microsoft.Dynamics.CRM.Label",
            "LocalizedLabels": [
              {
                "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                "Label": "Sample Products",
                "LanguageCode": 1033
              }
            ]
          },
          "Description": {
            "@@odata.type": "Microsoft.Dynamics.CRM.Label",
            "LocalizedLabels": [
              {
                "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                "Label": "A demo table that shows every common column type.",
                "LanguageCode": 1033
              }
            ]
          },
          "OwnershipType": "UserOwned",
          "IsActivity": false,
          "HasActivities": false,
          "HasNotes": false,
          "Attributes": [
            {
              "@@odata.type": "Microsoft.Dynamics.CRM.StringAttributeMetadata",
              "AttributeType": "String",
              "AttributeTypeName": {
                "Value": "StringType"
              },
              "SchemaName": "new_ProductName",
              "IsPrimaryName": true,
              "MaxLength": 100,
              "FormatName": {
                "Value": "Text"
              },
              "RequiredLevel": {
                "Value": "None",
                "CanBeChanged": true,
                "ManagedPropertyLogicalName": "canmodifyrequirementlevelsettings"
              },
              "DisplayName": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Product Name",
                    "LanguageCode": 1033
                  }
                ]
              },
              "Description": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Primary name column (Single line of text).",
                    "LanguageCode": 1033
                  }
                ]
              }
            },
            {
              "@@odata.type": "Microsoft.Dynamics.CRM.MemoAttributeMetadata",
              "AttributeType": "Memo",
              "AttributeTypeName": {
                "Value": "MemoType"
              },
              "SchemaName": "new_Description",
              "Format": "TextArea",
              "MaxLength": 2000,
              "RequiredLevel": {
                "Value": "None",
                "CanBeChanged": true,
                "ManagedPropertyLogicalName": "canmodifyrequirementlevelsettings"
              },
              "DisplayName": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Description",
                    "LanguageCode": 1033
                  }
                ]
              },
              "Description": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Multiple lines of text.",
                    "LanguageCode": 1033
                  }
                ]
              }
            },
            {
              "@@odata.type": "Microsoft.Dynamics.CRM.IntegerAttributeMetadata",
              "AttributeType": "Integer",
              "AttributeTypeName": {
                "Value": "IntegerType"
              },
              "SchemaName": "new_Quantity",
              "Format": "None",
              "MinValue": 0,
              "MaxValue": 1000000,
              "RequiredLevel": {
                "Value": "None",
                "CanBeChanged": true,
                "ManagedPropertyLogicalName": "canmodifyrequirementlevelsettings"
              },
              "DisplayName": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Quantity",
                    "LanguageCode": 1033
                  }
                ]
              },
              "Description": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Whole number.",
                    "LanguageCode": 1033
                  }
                ]
              }
            },
            {
              "@@odata.type": "Microsoft.Dynamics.CRM.BigIntAttributeMetadata",
              "AttributeType": "BigInt",
              "AttributeTypeName": {
                "Value": "BigIntType"
              },
              "SchemaName": "new_SerialNumber",
              "RequiredLevel": {
                "Value": "None",
                "CanBeChanged": true,
                "ManagedPropertyLogicalName": "canmodifyrequirementlevelsettings"
              },
              "DisplayName": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Serial Number",
                    "LanguageCode": 1033
                  }
                ]
              },
              "Description": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Big integer (large whole number).",
                    "LanguageCode": 1033
                  }
                ]
              }
            },
            {
              "@@odata.type": "Microsoft.Dynamics.CRM.DecimalAttributeMetadata",
              "AttributeType": "Decimal",
              "AttributeTypeName": {
                "Value": "DecimalType"
              },
              "SchemaName": "new_Weight",
              "MinValue": 0,
              "MaxValue": 100000,
              "Precision": 2,
              "RequiredLevel": {
                "Value": "None",
                "CanBeChanged": true,
                "ManagedPropertyLogicalName": "canmodifyrequirementlevelsettings"
              },
              "DisplayName": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Weight",
                    "LanguageCode": 1033
                  }
                ]
              },
              "Description": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Decimal number.",
                    "LanguageCode": 1033
                  }
                ]
              }
            },
            {
              "@@odata.type": "Microsoft.Dynamics.CRM.DoubleAttributeMetadata",
              "AttributeType": "Double",
              "AttributeTypeName": {
                "Value": "DoubleType"
              },
              "SchemaName": "new_Rating",
              "MinValue": 0,
              "MaxValue": 1000000,
              "Precision": 2,
              "RequiredLevel": {
                "Value": "None",
                "CanBeChanged": true,
                "ManagedPropertyLogicalName": "canmodifyrequirementlevelsettings"
              },
              "DisplayName": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Rating",
                    "LanguageCode": 1033
                  }
                ]
              },
              "Description": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Float (floating point number).",
                    "LanguageCode": 1033
                  }
                ]
              }
            },
            {
              "@@odata.type": "Microsoft.Dynamics.CRM.MoneyAttributeMetadata",
              "AttributeType": "Money",
              "AttributeTypeName": {
                "Value": "MoneyType"
              },
              "SchemaName": "new_Price",
              "PrecisionSource": 2,
              "RequiredLevel": {
                "Value": "None",
                "CanBeChanged": true,
                "ManagedPropertyLogicalName": "canmodifyrequirementlevelsettings"
              },
              "DisplayName": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Price",
                    "LanguageCode": 1033
                  }
                ]
              },
              "Description": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Currency.",
                    "LanguageCode": 1033
                  }
                ]
              }
            },
            {
              "@@odata.type": "Microsoft.Dynamics.CRM.BooleanAttributeMetadata",
              "AttributeType": "Boolean",
              "AttributeTypeName": {
                "Value": "BooleanType"
              },
              "SchemaName": "new_IsActive",
              "DefaultValue": false,
              "RequiredLevel": {
                "Value": "None",
                "CanBeChanged": true,
                "ManagedPropertyLogicalName": "canmodifyrequirementlevelsettings"
              },
              "OptionSet": {
                "OptionSetType": "Boolean",
                "TrueOption": {
                  "Value": 1,
                  "Label": {
                    "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                    "LocalizedLabels": [
                      {
                        "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                        "Label": "Yes",
                        "LanguageCode": 1033
                      }
                    ]
                  }
                },
                "FalseOption": {
                  "Value": 0,
                  "Label": {
                    "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                    "LocalizedLabels": [
                      {
                        "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                        "Label": "No",
                        "LanguageCode": 1033
                      }
                    ]
                  }
                }
              },
              "DisplayName": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Is Active",
                    "LanguageCode": 1033
                  }
                ]
              },
              "Description": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Yes/No.",
                    "LanguageCode": 1033
                  }
                ]
              }
            },
            {
              "@@odata.type": "Microsoft.Dynamics.CRM.DateTimeAttributeMetadata",
              "AttributeType": "DateTime",
              "AttributeTypeName": {
                "Value": "DateTimeType"
              },
              "SchemaName": "new_ReceivedDate",
              "Format": "DateAndTime",
              "RequiredLevel": {
                "Value": "None",
                "CanBeChanged": true,
                "ManagedPropertyLogicalName": "canmodifyrequirementlevelsettings"
              },
              "DisplayName": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Received Date",
                    "LanguageCode": 1033
                  }
                ]
              },
              "Description": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Date and time. Use Format DateOnly for date only.",
                    "LanguageCode": 1033
                  }
                ]
              }
            },
            {
              "@@odata.type": "Microsoft.Dynamics.CRM.PicklistAttributeMetadata",
              "AttributeType": "Picklist",
              "AttributeTypeName": {
                "Value": "PicklistType"
              },
              "SchemaName": "new_Category",
              "RequiredLevel": {
                "Value": "None",
                "CanBeChanged": true,
                "ManagedPropertyLogicalName": "canmodifyrequirementlevelsettings"
              },
              "OptionSet": {
                "@@odata.type": "Microsoft.Dynamics.CRM.OptionSetMetadata",
                "IsGlobal": false,
                "OptionSetType": "Picklist",
                "Options": [
                  {
                    "Value": 100000000,
                    "Label": {
                      "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                      "LocalizedLabels": [
                        {
                          "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                          "Label": "Electronics",
                          "LanguageCode": 1033
                        }
                      ]
                    }
                  },
                  {
                    "Value": 100000001,
                    "Label": {
                      "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                      "LocalizedLabels": [
                        {
                          "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                          "Label": "Apparel",
                          "LanguageCode": 1033
                        }
                      ]
                    }
                  },
                  {
                    "Value": 100000002,
                    "Label": {
                      "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                      "LocalizedLabels": [
                        {
                          "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                          "Label": "Grocery",
                          "LanguageCode": 1033
                        }
                      ]
                    }
                  }
                ]
              },
              "DisplayName": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Category",
                    "LanguageCode": 1033
                  }
                ]
              },
              "Description": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Choice (single select).",
                    "LanguageCode": 1033
                  }
                ]
              }
            },
            {
              "@@odata.type": "Microsoft.Dynamics.CRM.MultiSelectPicklistAttributeMetadata",
              "AttributeType": "Virtual",
              "AttributeTypeName": {
                "Value": "MultiSelectPicklistType"
              },
              "SchemaName": "new_Tags",
              "RequiredLevel": {
                "Value": "None",
                "CanBeChanged": true,
                "ManagedPropertyLogicalName": "canmodifyrequirementlevelsettings"
              },
              "OptionSet": {
                "@@odata.type": "Microsoft.Dynamics.CRM.OptionSetMetadata",
                "IsGlobal": false,
                "OptionSetType": "Picklist",
                "Options": [
                  {
                    "Value": 100000000,
                    "Label": {
                      "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                      "LocalizedLabels": [
                        {
                          "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                          "Label": "New",
                          "LanguageCode": 1033
                        }
                      ]
                    }
                  },
                  {
                    "Value": 100000001,
                    "Label": {
                      "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                      "LocalizedLabels": [
                        {
                          "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                          "Label": "Featured",
                          "LanguageCode": 1033
                        }
                      ]
                    }
                  },
                  {
                    "Value": 100000002,
                    "Label": {
                      "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                      "LocalizedLabels": [
                        {
                          "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                          "Label": "On Sale",
                          "LanguageCode": 1033
                        }
                      ]
                    }
                  }
                ]
              },
              "DisplayName": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Tags",
                    "LanguageCode": 1033
                  }
                ]
              },
              "Description": {
                "@@odata.type": "Microsoft.Dynamics.CRM.Label",
                "LocalizedLabels": [
                  {
                    "@@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                    "Label": "Choices (multi select).",
                    "LanguageCode": 1033
                  }
                ]
              }
            }
          ]
        }
      },
      "Invoke_an_HTTP_request": {
        "runAfter": {
          "Compose_Table_Definition": [
            "Succeeded"
          ]
        },
        "type": "OpenApiConnection",
        "inputs": {
          "parameters": {
            "request/method": "POST",
            "request/url": "https://yourorg.crm.dynamics.com/api/data/v9.2/EntityDefinitions",
            "request/headers": {
              "Content-Type": "application/json; charset=utf-8",
              "OData-MaxVersion": "4.0",
              "OData-Version": "4.0",
              "Accept": "application/json"
            },
            "request/body": "@outputs('Compose_Table_Definition')"
          },
          "host": {
            "apiId": "/providers/Microsoft.PowerApps/apis/shared_webcontents",
            "operationId": "InvokeHttp",
            "connectionName": "shared_webcontents"
          },
          "retryPolicy": {
            "type": "none"
          }
        }
      }
    }
  }
}

Thursday, June 11, 2026

UiPath — Beginner to Advanced Guide

UiPath — Beginner to Advanced Guide

A structured learning path for RPA developers. Work through each section in order — each builds on the last.


Table of Contents

  1. What is RPA & UiPath?
  2. UiPath Studio — Interface & Setup
  3. Variables, Data Types & Arguments
  4. Control Flow — Sequences, Flowcharts & Decisions
  5. User Interface Automation
  6. Excel & Data Table Automation
  7. String Manipulation & Regex
  8. Error Handling & Logging
  9. PDF, Email & File Automation
  10. Selectors & UI Explorer
  11. Orchestrator — Managing Bots at Scale
  12. Reusable Libraries & Packages
  13. RE Framework (Robotic Enterprise Framework)
  14. Advanced Topics
  15. Best Practices & Certification Tips

1. What is RPA & UiPath?

RPA (Robotic Process Automation) is software technology that uses bots to automate repetitive, rule-based tasks that humans perform on computers — clicking, typing, reading files, filling forms, etc.

UiPath is the leading RPA platform. It has three core products:

ProductPurpose
UiPath StudioWhere you design and build automation workflows
UiPath RobotExecutes the workflows (attended or unattended)
UiPath OrchestratorWeb portal to deploy, schedule, monitor, and manage robots

Types of Robots

  • Attended Robot — works alongside a human; triggered manually. Used for tasks that need human input mid-process.
  • Unattended Robot — runs fully autonomously, triggered from Orchestrator on a schedule or via API.
  • Hybrid — combination of both, typically using the RE Framework.

Key Concepts

  • Process — an automation workflow you build.
  • Job — a single execution of a process on a robot.
  • Queue — a list of work items (transactions) stored in Orchestrator for unattended robots to process.
  • Asset — configuration values (credentials, URLs, settings) stored securely in Orchestrator.

2. UiPath Studio — Interface & Setup

Installation

  1. Download UiPath Studio Community Edition (free) from uipath.com.
  2. Install and sign in with your UiPath account.
  3. Activate the Community license.

Studio Interface

┌─────────────────────────────────────────────────────────┐
│  Ribbon (Home / Design / Execute / Debug tabs)          │
├──────────┬──────────────────────────────┬───────────────┤
│ Project  │                              │  Properties   │
│ Panel    │   Designer Canvas            │  Panel        │
│          │   (drag activities here)     │               │
│ Activities│                             │  Output Panel │
│ Panel    │                              │  (logs)       │
└──────────┴──────────────────────────────┴───────────────┘

Key Panels

  • Activities Panel — all available automation actions (search here).
  • Project Panel — your project's file tree.
  • Designer Canvas — where you build workflows visually.
  • Properties Panel — configure selected activity's settings.
  • Output Panel — see log messages when running/debugging.

First Automation — "Hello World"

  1. Create a new Process project.
  2. Open Main.xaml.
  3. Drag a Sequence activity onto the canvas.
  4. Inside it, drag a Message Box activity.
  5. Set the Text property to "Hello, UiPath!".
  6. Press F5 to run.

3. Variables, Data Types & Arguments

Variables

Variables store data during execution. Created in the Variables panel at the bottom of the canvas.

Data TypeExample ValueUse Case
String"John"Text data
Int3242Whole numbers
Double3.14Decimal numbers
BooleanTrue / FalseFlags / conditions
DateTimeNowDates and times
DataTableTable/spreadsheet data
Array of [T]{1, 2, 3}Lists of same type
List(Of T)Dynamic lists
Dictionary(Of K,V)Key-value pairs

Scope — always set the narrowest scope possible (the container the variable is used in).

Common Variable Operations

' Assign Activity
myString = "Hello " + firstName    ' String concat
counter  = counter + 1             ' Increment
isValid  = (age >= 18)             ' Boolean expression

Arguments

Arguments pass data into or out of a workflow (used when calling one .xaml from another).

DirectionMeaning
InValue passed into the workflow
OutValue returned from the workflow
In/OutPassed in, modified, passed back

Rule of thumb: use Variables for internal data, Arguments for data crossing workflow boundaries.


4. Control Flow — Sequences, Flowcharts & Decisions

Workflow Types

TypeBest For
SequenceLinear, step-by-step tasks
FlowchartDecision-heavy processes with branches
State MachineComplex state-driven processes (like RE Framework)

Decision Activities

If Activity

Condition: age >= 18
  Then: [activities if true]
  Else: [activities if false]

Switch Activity — like a switch/case statement; branch on a variable's value.

Flow Decision — a diamond-shaped decision node in Flowcharts.

Loop Activities

ActivityUse Case
WhileLoop while condition is true (check before)
Do WhileLoop while condition is true (check after)
For EachIterate over a collection (list, array, DataTable rows)
Retry ScopeRetry a block until success or max retries hit

Example — Loop Through a List

Assign: fruits = New List(Of String) From {"Apple","Banana","Cherry"}

For Each item In fruits
  TypeOf item As String
  Message Box: item

5. User Interface Automation

UI automation is the core of most RPA workflows — interacting with apps and websites.

How UiPath Identifies UI Elements

UiPath uses Selectors — XML strings that uniquely identify a UI element:

<wnd app='notepad.exe' cls='Notepad' title='Untitled - Notepad' />
<wnd ctrlid='15' />
<ctrl name='Text Editor' role='editable text' />

Key UI Activities

ActivityWhat It Does
ClickLeft/right click on any element
Type IntoType text into a field (clears first with Empty field option)
Get TextRead text from an element
Set TextSet text without simulating keystrokes
CheckCheck/uncheck a checkbox
Select ItemChoose from a dropdown
Send HotkeyPress keyboard shortcuts (Ctrl+C, Enter, Tab…)
Attach WindowScope activities to a specific window
Use Application/BrowserModern UI interaction (Studio 21+)

Input Methods

MethodSpeedBackground?Recommended For
DefaultMediumNoGeneral use
SimulateFastYesWeb / simple inputs
Window MessagesFastPartialDesktop apps
ChromiumAPIFastestYesChrome / Edge web

Image & Text Automation (Fallback)

When selectors are unreliable (Citrix, remote desktop, legacy apps):

  • Find Image + Click Image — click based on a screenshot template.
  • Computer Vision activities — AI-powered element detection.

Web Automation Example

Use Application/Browser: https://example.com
  Type Into [Username field]: "myuser"
  Type Into [Password field]: "mypass"
  Click [Login button]
  Get Text [Welcome message] → welcomeMsg
  Log Message: welcomeMsg

6. Excel & Data Table Automation

Excel Activities (requires Excel to be installed)

ActivityPurpose
Use Excel FileOpen/create an Excel file (modern, recommended)
Read RangeRead cells into a DataTable
Write RangeWrite a DataTable to a sheet
Append RangeAdd rows below existing data
Read CellRead a single cell value
Write CellWrite to a single cell
For Each Excel RowIterate rows one-by-one (modern)
Filter Data TableFilter rows by condition
Sort Data TableSort rows

DataTable Operations

' Create DataTable
Assign: dt = New DataTable

' Add columns
Invoke Code: dt.Columns.Add("Name", GetType(String))
             dt.Columns.Add("Age",  GetType(Integer))

' Add row
Invoke Code: dt.Rows.Add("Alice", 30)

' Get cell value
Assign: name = dt.Rows(0)("Name").ToString

' Row count
Assign: count = dt.Rows.Count

' Filter (LINQ)
Assign: filtered = (From row In dt.AsEnumerable()
                    Where row.Field(Of String)("Status") = "Pending"
                    Select row).CopyToDataTable()

Excel Automation Workflow Pattern

Use Excel File: "Input.xlsx"
  Read Range [Sheet1] → inputDT

For Each Row In inputDT
  ' Process each row
  Assign: name   = CurrentRow("Name").ToString
  Assign: email  = CurrentRow("Email").ToString
  ' ... do work ...
  Assign: CurrentRow("Status") = "Done"

Write Range → "Output.xlsx" [Sheet1]

7. String Manipulation & Regex

Common String Methods

str.ToUpper()                    ' "hello" → "HELLO"
str.ToLower()                    ' "HELLO" → "hello"
str.Trim()                       ' Remove whitespace from both ends
str.TrimStart() / str.TrimEnd()
str.Replace("old", "new")
str.Contains("search")          ' Returns Boolean
str.StartsWith("pre")
str.EndsWith("suf")
str.IndexOf("x")                ' Position of first occurrence
str.Substring(start, length)    ' Extract portion
str.Split(","c)                  ' Split into array by delimiter
str.Length                       ' Character count
String.Join(",", array)          ' Join array into string

String Formatting

' Concatenation
result = "Hello, " + name + "!"

' String interpolation (VB.NET)
result = $"Hello, {name}! You are {age} years old."

' Format
result = String.Format("Invoice #{0} — Total: ${1:F2}", invoiceId, total)

Regular Expressions

Used via the Matches, IsMatch, Replace activities or System.Text.RegularExpressions.Regex.

PatternMatches
\d+One or more digits
\w+One or more word characters
\s+One or more whitespace characters
[A-Z]{2,3}2–3 uppercase letters
^\d{5}$Exactly 5 digits (full string)
(\d{3})-(\d{4})Phone pattern with capture groups
' Extract all email addresses from text
Matches Activity:
  Input:   bigText
  Pattern: "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
  Result:  emailMatches  (IEnumerable(Of Match))

8. Error Handling & Logging

Try/Catch

Wrap risky operations in a Try Catch activity:

Try
  [activities that might fail]
Catch (Exception e)
  Log Message: "Error: " + e.Message  (level: Error)
  [recovery actions or rethrow]
Finally
  [always runs — good for cleanup]

Common Exception Types

ExceptionWhen It Occurs
SelectorNotFoundExceptionUI element not found
ImageOperationExceptionImage not found on screen
BusinessRuleExceptionCustom — data doesn't meet business rules
ApplicationExceptionApp crashed / unexpected behavior
NullReferenceExceptionVariable is Nothing/null
FormatExceptionWrong data type conversion

Retry Scope

Automatically retries a block on failure:

Retry Scope
  NumberOfRetries: 3
  RetryInterval:   00:00:05
  Body:   [activities to retry]
  Condition: [success condition check]

Logging Best Practices

' Log levels (use appropriately)
Log Message: "Starting process"           ' Info
Log Message: "Processing row: " + rowId  ' Trace
Log Message: "Retrying login..."          ' Warning  
Log Message: "Fatal: " + ex.Message      ' Error

' Always include context — who, what, which row
Log Message: $"[OrderBot] Processing order {orderId} for customer {custName}"

Global Exception Handler

In the Main.xaml, set Global Exception Handler to catch uncaught errors at the process level. Used in RE Framework's Main.xaml state machine.


9. PDF, Email & File Automation

File & Folder Operations

' File activities (System namespace)
Path Exists       → check if file/folder exists
Copy File         → copy a file to new location
Move File         → move/rename
Delete            → delete file or folder
Get Files         → list files matching pattern ("*.xlsx")
Create Directory  → make a folder
' Common paths in VB.NET expressions
Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
System.IO.Path.Combine(folderPath, fileName)
System.IO.Path.GetFileName(fullPath)       ' "report.xlsx"
System.IO.Path.GetExtension(fullPath)      ' ".xlsx"
System.IO.Path.GetFileNameWithoutExtension ' "report"

Email Automation

Outlook (via UiPath.Mail.Activities):

Get Outlook Mail Messages:
  MailFolder: "Inbox"
  Filter:     "[Subject] = 'Invoice'"
  Top:        50
  → emails (List(Of MailMessage))

For Each email In emails
  Assign: subject = email.Subject
  Assign: body    = email.Body
  For Each attach In email.Attachments
    Save Attachment → folderPath

Send Email:

Send Outlook Mail Message:
  To:      "recipient@company.com"
  Subject: "Automation Report"
  Body:    "Process completed. See attached."
  Attachments: {"C:\report.xlsx"}

PDF Automation

' Read all text from a PDF
Read PDF Text:
  FileName: "invoice.pdf"
  → pdfText (String)

' Then use String activities / Regex to extract fields
Matches: pdfText, "Invoice #(\d+)"  → invoiceNum
Matches: pdfText, "Total: \$([0-9,.]+)"  → totalAmt

10. Selectors & UI Explorer

What is a Selector?

A selector is an XML path that identifies a UI element. Example:

<wnd app='chrome.exe' title='Gmail - *' />
<webctrl tag='INPUT' name='Email' type='email' />

Dynamic Selectors

When selectors contain changing values (row numbers, IDs), use variables:

<!-- Static (breaks when row changes) -->
<webctrl idx='3' tag='TD' />

<!-- Dynamic (use variable) -->
<webctrl idx='{{rowIndex}}' tag='TD' />

In the activity, set the Selector property to a string expression:

"<webctrl idx='" + rowIndex.ToString + "' tag='TD' />"

UI Explorer

Open via Tools → UI Explorer. Use it to:

  • Inspect element attributes.
  • Build reliable selectors.
  • Test if a selector matches exactly one element.
  • Fix broken selectors after app updates.

Selector Best Practices

  • Prefer name, automationid, type over idx (index breaks easily).
  • Remove title attributes that include the document name (changes per file).
  • Use Anchor Base when no unique selector exists — anchor to a nearby stable element.
  • For dynamic tables, use Find Children + loop instead of hardcoded selectors.

11. Orchestrator — Managing Bots at Scale

Key Orchestrator Concepts

Tenants & Folders — organize robots, processes, and assets by team or department.

Machines — the computers where robots run. Register a machine by installing UiPath Robot and connecting it to Orchestrator.

Processes — published packages deployed to Orchestrator. A package is a .nupkg file you publish from Studio.

Jobs — triggered executions of a process. Can be scheduled (triggers) or on-demand.

Queues — the backbone of unattended RE Framework automation.

Queues

A Queue is a list of Queue Items (transactions). Each item has:

  • Specific Data — the payload (JSON/dictionary of fields like OrderID, CustomerName).
  • Status — New → In Progress → Successful / Failed / Retried.
  • Deadline / Postpone — optional time constraints.
  • Reference — a unique identifier for the item.

Dispatcher process — adds items to the queue. Performer process — picks up items one-by-one and processes them.

Assets

Stored credentials and config values:

Asset TypeExample
TextBase URL: https://app.company.com
IntegerMax retries: 3
BooleanSendEmailReport: True
CredentialSAP username + password

Access in workflow:

Get Asset:    AssetName: "SAP_Credentials" → credential
Get Asset:    AssetName: "BaseURL"         → baseUrl

Publishing a Package

  1. In Studio: Design tab → Publish.
  2. Choose Orchestrator as target.
  3. Set version number.
  4. In Orchestrator: Packages → deploy to a process.
  5. Create a Trigger (time-based or queue-based) to schedule it.

12. Reusable Libraries & Packages

Why Reuse?

Instead of rebuilding the same login workflow in every project, extract it into a Library and reuse it across projects.

Creating a Library

  1. New Project → Library.
  2. Build workflows (each .xaml becomes a callable activity).
  3. Publish to Orchestrator or a local NuGet feed.
  4. In other projects: Manage Packages → install your library.
  5. The library's workflows appear in the Activities panel.

Workflow Invoke Pattern

For smaller reuse within one project:

Invoke Workflow File: "Workflows\Login.xaml"
  Arguments:
    in_URL      (In):  baseUrl
    in_Username (In):  username
    in_Password (In):  password
    out_IsLoggedIn (Out): isLoggedIn

13. RE Framework (Robotic Enterprise Framework)

This is the most important section for production-grade automation. The RE Framework is UiPath's official template for building robust, scalable unattended bots.

Why RE Framework?

Without a framework, most bots:

  • Crash on unexpected errors and don't recover.
  • Can't be monitored or restarted cleanly.
  • Mix "get data" logic with "process data" logic.
  • Have no retry mechanism.

RE Framework solves all of this.

Architecture — State Machine

RE Framework uses a State Machine with 4 states:

                    ┌─────────────────┐
                    │  INITIALIZATION │  ← Start here (open apps, read config)
                    └────────┬────────┘
                             │ Success
                    ┌────────▼────────┐
              ┌────►│ GET TRANSACTION │  ← Fetch next work item from Queue
              │     └────────┬────────┘
              │              │ Item found
              │     ┌────────▼────────┐
              │     │   PROCESS       │  ← Do the actual work
              │     │   TRANSACTION   │
              │     └────────┬────────┘
              │              │
              └──────────────┘ (loop back for next item)
                             │ No more items
                    ┌────────▼────────┐
                    │  END PROCESS    │  ← Close apps, send report
                    └─────────────────┘

File Structure

MyProcess/
├── Main.xaml                    ← State Machine (do not edit logic here)
├── project.json                 ← Project metadata
├── Data/
│   └── Config.xlsx              ← All settings (URLs, queue names, etc.)
├── Framework/
│   ├── InitAllApplications.xaml     ← Open all apps, login
│   ├── CloseAllApplications.xaml    ← Close apps cleanly
│   ├── GetTransactionData.xaml      ← Get next queue item / row
│   ├── SetTransactionStatus.xaml    ← Mark item Success/Fail in Orchestrator
│   ├── InitAllSettings.xaml         ← Read Config.xlsx + Orchestrator Assets
│   ├── TakeScreenshot.xaml          ← Screenshot on error
│   └── RetryCurrentTransaction.xaml
└── Process.xaml                 ← YOUR BUSINESS LOGIC GOES HERE

Config.xlsx Structure

NameValueAssetDescription
OrchestratorQueueNameOrdersQueueQueue to read transactions from
MaxRetryNumber3Retries per transaction
logF_BusinessProcessNameOrderProcessorUsed in log messages
in_TransactionNumber0Counter (do not change)

Transaction Types

Queue-based (default): Items come from an Orchestrator Queue. Best for large volumes, parallel processing.

DataTable-based: Items come from an Excel file or database. Used when Orchestrator isn't available or for simpler use cases.

Exception Types in RE Framework

ExceptionBehavior
BusinessRuleExceptionItem marked Failed (Business). Not retried. Example: invalid data.
ApplicationExceptionItem marked Failed (Application) and retried up to MaxRetryNumber. Example: app timeout, element not found.
' Throw a BusinessRuleException (your code in Process.xaml)
Throw New BusinessRuleException("Order ID is missing or invalid")

' ApplicationExceptions are caught automatically by the framework
' — just let them propagate up from Process.xaml

Process.xaml — Your Code Goes Here

This is the only file you heavily edit. It receives one transaction at a time:

Input Arguments:
  in_TransactionItem  (QueueItem or DataRow)
  in_Config           (Dictionary(Of String, String))

Steps in Process.xaml:
1. Extract fields from in_TransactionItem
2. Open the target application (or it's already open from Init)
3. Perform the business steps
4. If data is invalid → Throw BusinessRuleException
5. If app misbehaves → let ApplicationException propagate

RE Framework Execution Flow (Detailed)

INIT STATE
  ├── InitAllSettings.xaml  → reads Config.xlsx, loads Orchestrator Assets
  ├── InitAllApplications.xaml  → opens apps, logs in
  └── On success → go to GET TRANSACTION STATE

GET TRANSACTION STATE
  ├── GetTransactionData.xaml
  │     Queue mode:  Get Queue Item from Orchestrator → transactionItem
  │     Table mode:  Get next unprocessed row
  └── If item found → PROCESS TRANSACTION STATE
      If no more items → END PROCESS STATE

PROCESS TRANSACTION STATE
  ├── Process.xaml (your business logic)
  ├── If BusinessRuleException:
  │     Mark item as Failed (Business) — do NOT retry
  ├── If ApplicationException (1st–Nth time):
  │     Take screenshot, log error
  │     If retries < MaxRetryNumber → restart Init, retry same item
  │     If retries exhausted → mark Failed (Application)
  └── If success → SetTransactionStatus "Successful" → loop to GET TRANSACTION

END PROCESS STATE
  ├── CloseAllApplications.xaml
  └── Send summary email (optional)

14. Advanced Topics

Parallel Processing

Parallel Activity — run multiple branches simultaneously:
  Branch 1: Process Web App
  Branch 2: Process Desktop App
  Branch 3: Write to Excel

Note: branches share the same thread pool. Use for I/O-bound work,
not for UI automation (which requires focus on one window at a time).

Invoke Code Activity

Run VB.NET or C# code directly when no activity exists:

' VB.NET code in Invoke Code
Dim result As String = ""
For Each line As String In text.Split(Environment.NewLine)
    If line.Contains("Total") Then
        result = line.Split(":"c)(1).Trim()
        Exit For
    End If
Next
' Pass result back via argument

API & HTTP Automation

HTTP Request Activity:
  EndPoint:    "https://api.example.com/orders"
  Method:      GET
  Headers:     {"Authorization": "Bearer " + token}
  → response (String / JObject)

Deserialize JSON:
  Input: response
  → jsonObj (JObject)

Assign: orderId = jsonObj("data")("id").ToString

Citrix / Virtual Desktop Automation

When the bot runs inside Citrix/VDI:

  • Standard selectors don't work (you're seeing pixels, not DOM).
  • Use Computer Vision activities (CV Click, CV Type, CV Get Text).
  • Or use Image activities as a fallback.
  • Best approach: ask the Citrix admin to enable accessibility on the hosted app.

Testing in UiPath

  • Workflow Analyzer — static analysis; catches naming issues, missing error handling.
  • Debug Mode — step through activities one-by-one; inspect variable values.
  • Breakpoints — pause execution at a specific activity.
  • Mock Testing — mock Orchestrator calls to test locally.
  • UiPath Test Manager — dedicated test management for RPA QA.

Performance Tips

  • Use SimulateClick / SimulateType where possible — no need for the window to be in focus.
  • Minimize Wait for Ready — use NONE mode and add explicit Element Exists checks.
  • Batch write to Excel at the end rather than writing each row individually.
  • For large DataTables, use LINQ instead of nested For Each loops.
  • Close applications properly to free memory.

15. Best Practices & Certification Tips

Naming Conventions

ElementConventionExample
Workflow filesPascalCaseGetTransactionData.xaml
VariablescamelCase with prefixstrCustomerName, dtOrderData, intCounter
Argumentsdirection prefixin_Config, out_Result, io_DataTable
ActivitiesDescriptive label"Type customer email into field", not "Type Into"

General Best Practices

  • One workflow = one responsibility. Keep workflows focused and short (< 50 activities visible on screen).
  • Log at every significant step. Use Business, Warning, and Error levels appropriately.
  • Never hardcode credentials. Always use Orchestrator Assets or Windows Credential Manager.
  • Never hardcode URLs or file paths. Store in Config.xlsx or Orchestrator Assets.
  • Always handle both ApplicationException and BusinessRuleException in RE Framework.
  • Use version control (Git). UiPath Studio integrates with Git natively.
  • Run the Workflow Analyzer before publishing. Aim for 0 errors, 0 warnings.
  • Take screenshots on error — invaluable for debugging production failures.

UiPath Certifications

CertLevelFocus
UiRPAAssociateStudio basics, automation fundamentals
UiARDProfessionalRE Framework, advanced automation, Orchestrator

Study path: UiPath Academy → take free courses → practice on real projects → take exam.


Quick Reference Card

COMMON SHORTCUTS (UiPath Studio)
  F5          Run workflow
  F6          Debug (step through)
  F7          Step Into
  F8          Step Over
  Ctrl+D      Disable activity
  Ctrl+E      Enable activity
  Ctrl+K      Create variable from selected property
  Ctrl+M      Create argument from selected property
  Ctrl+L      Open output log

ACTIVITY CHEAT SHEET
  Input/Output:   Read Range, Write Range, Read Cell, Write Cell
  UI:             Click, Type Into, Get Text, Send Hotkey, Check
  Logic:          If, Switch, While, For Each, Try Catch, Retry Scope
  Data:           Filter Data Table, Sort Data Table, Build Data Table
  File:           Copy File, Move File, Delete, Get Files
  String:         Assign (with .Replace, .Split, .Substring, etc.)
  Orchestrator:   Add Queue Item, Get Transaction Item, Set Transaction Status, Get Asset

Guide complete. Move to the RE Framework project for hands-on practice.

Featured Post

Power Automate Desktop (PAD)

Power Automate Desktop (PAD) Part A — Beginner (Q1–Q30) # Question Short Answer 1 What is Power Automate Desktop (PAD)? A low...

Popular posts