Thu, 08/28/2025 - 14:38 By Stephane Pelhatre Contributor Lloyd Sebag
dataver_functions

Introduction

Microsoft released in 2024 Dataverse low-code plugins. The promise was great : writing plugins using low-code tools. No need to have development skills and use a development environment as Microsoft Visual Studio, write C# code and register plugin in your environment.

There are two types of low-code plugins supported in Dataverse : instant and automated. The difference is the trigger. For instant low-code plugin the trigger is manual, the plugin must be explicitly called (for example from a Power Automate flow). Automated low-code plugins work like classic plugins : the trigger is a Dataverse table event. For example you can create an automated low-code plugin on Create event for Account table. Low-code plugin feature is still in preview.

Then Microsoft has introduced Power Fx functions (eventually renamed Dataverse functions). Functions are a low-code/no-code way to write reusable logic directly within Dataverse. Functions use Power Fx to execute a set of commands within Dataverse that run on the server-side. The trigger is also manual, so a function must be called explicitly .
The situation is therefore somewhat confusing as instant low-code plugins resemble Dataverse functions and both features are available in preview.
Technically functions and low-code plugins are 2 different tools, with their own Microsoft Learn Docs having their own sections.


learn1

Officially instant low-code plugins are deprioritized and are replaced with Dataverse functions. Automated low-code plugins are still available. You can find more information here : Use low-code plug-ins in Dataverse

disclaimer

In this article we will first briefly examine low-code plugins. We won't go into detail because, as we will see, they don't really work.
Then we will examine Dataverse functions in detail.

Low-code plugins

Let's briefly talk about low-code plugins.
To access low -code plugins interface you need to install a model-driven app called Dataverse Accelerator:

  1. Go to Power Platform Admin Center
  2. Click on Environments on the left pane.
    Then click on the ellipsis (...)  next to your environment, select Resources and then Dynamics 365 apps
    acc0
     
  3. Click on Install app on the command bar
    acc1
     
  4. Select Dataverse Accelerator in the list and click on Next
    acc2
     
  5. Check I agree to the terms of service and click on Install
    acc3
     
  6. Once the installation is complete Dataverse Accelerator app is available in the list of apps
    acc4

Now you can play the app and you will see the interface below:
acc5

As explained in the introduction there are two types of plugins : instant plugins that must be called explicitly and automated plugins that are triggered by an event on a table.
There is a button to create an instant plugin and another to create an automated plugin. Note that it 's a bit strange to have the option to create an instant plugin as this feature is deprioritized and replaced by Dataverse functions.

Then if you click on either of the two buttons ... nothing happens and the screen remains blank. I tried with several Dataverse environments located in different regions (US, Western Europe) with the same result : a blank screen.

This problem is understandable for instant plugins as they are replaced by functions. But regarding automated plugin it's a problem : it's impossible to create an automated plugin.
It was working a few months ago (but buggy as hell), but as of the date of writing this article (October 2025),  it no longer works.
Maybe it will work again in the future or maybe Microsoft will remove this feature.

Dataverse Functions

Introduction

Functions are a low-code/no-code way to write reusable logic directly within Dataverse (running server-side) without having to write C# code or deploying plugins.
Functions can have parameters: parameters allow you to pass information between the function and the context that runs it, making it easier to design business logic that can be reused in varying situations. Input parameters are used to provide data to the function, and allow you to control how the function behaves by passing in different values you specify in the Power Fx formula. Output parameters allow you to retrieve the results of a function for further use in your program.

How to create a function

  1. Open Power Apps Portal and select your environment
  2. Open the solution  where you want to build a function
  3. Click on New --> Automation --> Function

    funct1

    Provide the following details:
    - Display name : The human-readable name of the function. Can't be changed once created.
    - Description : provide additional context about the function, such as purpose, behavior, and so on. Can't be changed once created.
    - Input parameters(s) : add required input parameters. Input paramerts are optional.
      To add a parameter click on + New input parameter
     
    Following types are supported: Boolean, Datetime, Decimal, Float, Integer, String
    - Output result(s) : add output results parameters. Output results are optional. To add an output result click on + New output result
    - Table references
    : used to associate functions to specific tables. You can select up to five tables to read or write from in your function’s formula.
    - Formula: custom function that can be used to perform actions or calculations, defined using the Power Fx expression language

    Let's create a simple function to sum two numbers.
    I define my function CustomSum with two inputs parameters x and y and one output parameter z.The Power Fx formula to sum the 2 numbers is : {z:x+y}
    funct3


    Another example: let's implement a function that creates a contact from two input parameters firstname and lastname (both with string data type)
    This time we need to access a table to create a record, so I select 'Contacts' table in Table references
    I also define an output result message to indicate that the contact was created successfully
    In the Power Fx formula I use the function Collect() to create the record
    Collect(contact,  
       { 
       firstname: firstname, 
       lastname: lastname 
       } 
       ); 
    { 
       message: "New contact " & firstname & "," & lastname & " created"
    }

    funct5
     
  4. Click on Save to create the function
    Various components are created and added to the solution:
    - a Custom API
    - a Function
    - a FxExpression
    - a custom API Request Parameter for each input parameter (2 in my example)
    - a Custom API Response Property for each ouput result  (1 in my example)
    funct4

How to test a function

If you expect to find a button in the command bar when you select your function wihtin the solution, forget it. It is not possible to test a function inside a solution.
To test a function:

  1. Come out of the solution
  2. Click on More on the left pane and then click on Discover all
    test1
     
  3. Click on Functions
    test2

     
  4. Select your function and click on Test on the command bar
    test3

    Another way is to click on the ellipsis (...) and select Test in the menu
    test4
     
  5. Enter a value for each input parameter and click on Play
    Result is displayed in the text area at the bottom.
    In my example with function CustomSum I set x = 10 and y = 5 and we can see that value assigned to output result is 15
    Result is : {"@odata.context":"https://orgxxxxx.crm.dynamics.com/api/data/v9.0/$metadata#Microsoft.Dynamics.CRM.cr0de_CustomSumResponse","z":15}
    test5

    For the second function Create Contact I set firstname = 'John' and lastname = 'Doe'. You can see the result below:
    test6

How to delete a function

You must be careful if you want to delete a function. If you delete the function component in your solution only the function itself will be deleted, but related components (Custom API, FxExpression, custom API Request Parameters, Custom API Response Properties) will not be deleted. Therefore, you will end up with orphaned components.
To delete the function and all related components you must follow the same steps as for testing a function (see above): come out of the solution, click on More then Discover all and select Functions.
Then you can click on Delete on the command bar or click on the ellipsis (...) and select Delete.
delete

Trace logs

You can access Dataverse functions trace logs in the same place as classic plugins.
Open Power Platform Environment Settings app and click on Plug-in Trace Log on the left pane.
logs1
 

You have access to execution information (duration, message block, exception, ...)

logs2

Invoke a function

We now know how to create and test a function, but it's time to use it.
As explained previously, functions are only triggered manually, so you need to call them explicitly.
You can invoke functions in Dataverse from:

  • a canvas app
  • a custom page in a model driven app
  • a Power Automate flow
  • from another function
  • in your code (Web API)

You can obtain a code snippet of your function that you will then use to call that function:

  1. Open Power Apps Portal and select your environment
  2. Click on More on the left pane and then click on Discover all
  3. Click on Functions
  4. Select you function and click on Copy code snippet on the command bar
    snip1

    Another way is to click on the ellipsis (...) and select Copy code snippet in the menu
    snip2

Below the code snippet for my functions CustomSum and Create contact

Environment.cr0de_CustomSum({x:Value,y:Value})
Environment.cr0de_Createcontact({firstname:Value,lastname:Value})

Invoke a function from the Dataverse Web API

You can invoke a Dataverse function from the Web API with a POST request
Example with the function CustomSum:

POST [Organization URI]/api/data/v9.2/cr0de_CustomSum
OData-MaxVersion: 4.0
OData-Version: 4.0
Content-Type: application/json; charset=utf-8

{
   "x":4,
   "y":5
}

Here the result I get with the plugin WebAPI Launcher in XrmtoolBox:
invoke10

Invoke a function from within another function

You can invoke a function from any other function.
To invoke a function within another function, use the syntax: Environment.MyFunction({inputParam1: value1, inputParam2: value2, ... inputParamN: valueN}).
Since the output is always a record, use the dot notation to access the output parameters.
For example, if the function MyFunction has two output parameters defined as out1 and out2, you can access them in either of these two ways:

  • Environment.ExistingFunction({inputParam1: value1, inputParam2: value2, ... inputParamN: valueN}).out1
  • Environment.ExistingFunction({inputParam1: value1, inputParam2: value2, ... inputParamN: valueN}).out2

To demonstrate this, I create a new function CustomSum2 to add 2 and 3. To perform this operation I use the first function CustomSum.
The new function CustomSum2 has no input parameter and one output result result (Integer type).
Power Fx formula of the new function:
{
    result:Environment.cr0de_CustomSum({x:2,y:3}).z
}

invoke2

Invoke a function from a Power Automate cloud flow

To use a function in a cloud flow:

  1. Add a step to your flow
  2. select Microsoft Dataverse connector
  3. select Perform an unbound action action
  4. In Action Name, select the function (cr0de_CustomSum in my example) and provide values for the input parameters (x = 6 and y = 3 in my example)
    Invoke3
     
  5. Add a compose action using the output of the unbound action as an input so that you can access the results of the function as needed

Below the result:
invoke4

Limitations with functions

Functions have some limitations:

  • Max 5 tables per function
  • Only manual trigger, cannot be automated (that's the goal of low-code plugins)
  • Cannot call external API, limited to Dataverse
  • Still in preview : may have bugs. Not suitable for production
  • The following Power Fx function aren't currently supported with functions in Dataverse

    limit1