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

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 Typ...

Popular posts