What's new in App Studio, Macros, and Tracking
This topic lists new features and enhancements added in Supply Chain 42.
App Studio
New Statement Editor functions
The Statement Editor includes new functions for data manipulation. These include new aggregation, mathematical, comparison, date, and string functions.
For more information, see Statement Editor functions.
Aggregation functions:
-
VAR
-
VARZ
-
VARP
-
VARPZ
-
PercentOfSum
Inline functions:
-
Abs
-
DateAdd
-
DateDiff
-
DateName
-
DoesNotEndWith
-
EndsWith
-
Exp
-
IfNull
-
IndexOf
-
InValueRange
-
IsLike
-
IsNotLike
-
IsNotNullAll
-
IsNotNullAny
-
IsNotNullOrEmptyAll
-
IsNotNullOrEmptyAny
-
IsNullAll
-
IsNullAny
-
IsNullOrEmptyAll
-
IsNullOrEmptyAny
-
Ln
-
Log
-
NewID
-
NullIf
-
Pow
-
Sign
-
SubString
-
Trunc
Macros
The Run NextGen NO Model action updates
The Run NextGen NO Model action now uses the default Solving Engine if no selection is made in the Solving Engine configuration setting.
The action also now includes new configuration fields.
-
Solving Engine – This indicates the version of the solving engine to use.
-
Resource Size – This indicates the level of resources to use for the solve.
-
Enhanced
-
Premium
-
Standard
-
For more information, see Design Engines.
Changes for prior releases

App Studio
Better file naming for Grid exports
The Grid widget Export feature now names the export file using the grid name and the date and time of the export.
Easier Bulk Updates to columns in grids
When bulk updating a Grid widget column, you can now search the Values field as a searchable dropdown list. The list filters dynamically as you type.

App Studio
Updating apps in production using draft apps
You can now update an existing App Studio app using a draft copy of the app, rather than updating the live app. A draft copy of an app is an exact copy of an app that is inaccessible to app users, which an app designer can use to make and test changes safely without affecting the live version of the app. All assets for the app (app boards, widgets, user defined databases, dynamic views, and sessions) except the Decision Data Model (DDM) are copied, and the draft app only uses the copies. The draft app will reference the live DDM.
For example, you can:
- Make changes to app boards such as adding or changing widgets
- Add or remove app boards
- Add columns and tables to the database
When the changes are finalized in the live app, the draft app is archived and the database for the draft is deleted.
The database copy limit is 20 GB. If the database is larger than 20 GB, the schema of the database is copied, instead.
If you are interested in this feature, please contact Coupa Support for access.
Copying databases larger than 20GB
You can now copy databases whose sizes are greater than or equal to 20GB.
Data Grid Improvements
You can now copy values from a Grid or Pivot Grid widget regardless of the editability conditions of a particular column. Values can be copied from a single cell across data grids and pivot grids.
A new Clear All Filters button is available on the Grid widget toolbar. When you click Clear All Filters, all active filters in the data grid are removed.

App Studio Tracking
New App Studio Tracking App
The new Tracking app gives Customer Administrators a way to monitor and support the highly customized App Studio solutions that our customers are creating and running within the Supply Chain platform. This app helps diagnose a number of performance, scaling and concurrency issues that are very difficult to diagnose.
The new Tracking app captures and displays metrics for:
-
Apps
-
App Boards
-
Databases and other assets
-
Macros
The Tracking app is now available to Customer Administrators on the Supply Chain home page's Administration menu.

Macros
New Select Action
The new Select action allows you to choose columns from a single table or multiple joined tables to produce an output record set that can be written to a new or existing table. You can:
-
Use Table mapping to define relationships that indicate which records are included (Join types).
-
Use a computed field to create an expression that computes a value using fields from one or more tables.
-
When using an existing table as the output, use field mapping to map output fields to the existing table structure.
This action enables a simplified workflow compared to using the existing Create Table and Insert actions:
-
You do not need to specifically know or define the structure of the table first.
-
The table does not need to exist before the “insert” part can be constructed.
-
The table is dropped when refilled, so it doesn’t matter if there is an older definition of it currently in existence.
This new action does not replace the Create Table or Insert actions.
This function is the Macros analogue of the Select Transform in Data Guru. The Select Transform action in Data Guru performs the functions of both Select and Insert actions in the same transform: using an existing table or creating a new table is selected via a radio button.
New Update Table Action
The new Update Table action updates existing rows in a single table. It also allows you to add new columns to the table before updating, but not to add new rows.
This is different from the existing Update Action, which allows updating of existing columns in multiple tables, as well as assigning values to parameter values.
The new action simplifies the workflow compared to using the existing Add Column action and Update action:
-
There is only one table involved.
-
Columns do not need to exist in the table in order for the update to be built. You can add new columns to the table and then update them in a single action.
-
There are no ordering considerations.
This is the Macros analogue of the Update Transform in Data Guru.

Document Grid Menu
A new right-click menu has been added to the column header on grid widgets in the Layout Designer and Application Viewer. Sorting, Fixing, Conditional Formatting, Clearing and Calculated Columns modification can now be applied to grids.
Macros
Import and Export Macros
The ability to Import and Export a macro has been added. Now, you can easily export a macro or a packaged folder of macros to share with others and import macros into your project to view and modify them.
Drop Table Logic Action
The ability to Drop a table from a macro has been added. Now, you can easily remove a table at the end of a macro run.

Addition of CountZ and CountAllZ functions
The CountZ and CountAllZ functions have been added to the system. The CountZ and CountAllZ functions are the similar to the Count and CountAll functions, except that nulls are treated as zero.
Statement Editor update
For auto incremented columns and computed columns, the Statement Editor is unavailable. These types of columns are computed automatically by the system.
Macros
Using the Snap Grid
A new Snap Grid button has been added to the design surface to enable you to show or hide a grid on the design surface. Now, you can easily snap a grid to the design surface.
Using the Zoom Slider
A new Zoom Level Slider has been added to the design surface to enable you to easily zoom in and out of the design surface. Now, you can quickly zoom in and out to better navigate the design surface.
Copy and paste a macro action
The ability to copy a macro action has been added while working on the macro. This will save time if you need to insert similar actions into another macro with small changes for each action.
Excel Import action update
The ability to specify that all empty cells are treated as null or default empty values has been added to Excel Import Action.

Preview During Dynamic View Creation
A new Preview tab will be added to the Dynamic View editor to enable you to quickly see the results of your dynamic views. This will help you validate that you have set up a view correctly. Previously, you had to create an App Studio app board for every view you wanted to preview, which required access to App Studio.
Duplicating Dynamic Views
You will now be able to duplicate an existing dynamic view. You can then use this duplicated view as a starting point for a new view.
Macros
Unique icons added for each Macros action
The following macro actions will now have unique icons to help identify them on the Macros workspace:
-
Insert
-
Update
-
Delete
-
Scalar Query
-
Excel Export
-
Excel Import
-
DA Model
New RowNumber function added to Statement Editor
A new window function called RowNumber will be added to the Statement Editor. This function returns the sequential number of a row within a partition of a result set, starting at 1 for the first row in each partition. It can be used with all data types.
RowNumber will work similarly to the Rank and DenseRank functions. It must be used with the OrderBy function and optionally can use the PartitionBy function.
New ToDateTime() conversion function
The ToDateTime() function has been added to the Statement Editor. This function converts the value to its left to a date. It is available for Float, Integer, and String data types.
Culture parameter added to conversion functions
All conversion functions will now include a Culture parameter. This change has been made to the conversion functions provided in the Statement Editor:
-
ToString()
-
ToFloat()
-
ToInteger()
-
ToDateTime()
The Culture parameter allows you to specify the formatting used to display the data according to the locale of the users (for example, whether decimal values use a comma or a period). Valid values for the Culture parameter are pulled from .NET’s list of available culture codes. When you edit the function using the Statement Editor interface, a number of commonly used values will display when you click in the Culture field. You can select a value or type the value you need. You can also add the Culture value using the Statement Text Editor.
To ensure backwards compatibility, if no Culture is specified then the function will use the current locale, which either comes from the user’s browser or the (also optional) locale in the LLAPI call that started the macro. In addition, the conversion is performed using the CAST() function. This is the pre-existing functionality.
Formatting with the ToString() function
The ToString() function has been enhanced to include a Formatting parameter. This parameter allows the user to specify the formatting of the resulting string.
In the ToString() function, the interaction of the Formatting and Culture parameters is as follows:
-
If you omit both parameters, a default conversion to a string using the CAST() function is used. This is the existing functionality and is done for backwards compatibility.
-
If only Format is specified, then it is used and Culture defaults to the culture from the browser or LLAPI Culture value. Note that this is a .NET format string.
-
If only Culture is specified, the format defaults based on the data type. For float types, we recommend F2 or similar.
-
If both Format and Culture are specified, they are both used.
Improved entry of function parameters in Statement Editor
When a parameter in the Statement Editor is a simple string constant and not a longer expression, the Statement Editor will now provide a toggle to switch between entering the parameter value in a text field, or selecting from a dropdown list.
Function reference help improved
The Statement Editor function reference in the help has been expanded and improved. This includes more use cases and more information about using functions together.

Conditional formatting with hidden columns
Conditional formatting in App Studio now allows you to create rules based on hidden columns or use a hidden column as a dynamic condition to apply formatting to another column.

App Studio
SCDP 33.4.0 Recipe Views
Recipe Views are now available for use in macros and dynamic views.
New If Then Else Function
The If function provides the ability to use conditional logic within the columns of a macro action. This is crucial for product categorization, classification, and policy generation within the model build process. This will allow you to use a single macro action with multiple conditions, rather than multiple macro actions, each with their own conditions.
This function will be available wherever the Statement Editor is available, including in app boards and dynamic views.
The following example is used to drive the policies assigned to products. Classifications might happen on many dimensions such as cost, order volume, order frequency, ordering pattern etc.
IF (Pareto.Score > 0.8, ‘A', IF (Pareto.Score > 0.6, ‘B', IF (Pareto.Score > 0.4, 'C', IF (Pareto.Score > 0.2, 'E’, 'U’))))
New Partition By Function
The Partitioned By function is used for model building. This function allows you to use ‘partition by’ and ‘order by’ logic within the columns of the Insert and Update macro actions. It is used with aggregate functions such as Sum and Count. You can partition by multiple columns and expressions using the Statement Editor.
Use Cases
The use cases for this function include:
- Calculating and ranking top production locations by volume or top sources for each product
- Intermediary calculations in model building
Previously, this functionality required the use of Coupa’s Supply Chain Data Guru product.
This function will be available wherever the Statement Editor is used, including in app boards and dynamic views.
The syntax of the function is:
<table>.<field>.<function>.PartitionBy(<table>.<field>)
The following example partitions orders by location and sums them by location:
Orders.quantity.Sum().PartitionBy(Orders.location)
This would give the following result from a sample Orders table:
product | location | quantity | result |
a | 1 | 1 | 3 |
b | 1 | 2 | 3 |
c | 2 | 3 | 7 |
d | 2 | 4 | 7 |
e | 3 | 5 | 11 |
f | 3 | 6 | 11 |
The Partition By function can be used with the Order By function to partition, accumulate, and order results by a field. The following example partitions and accumulates orders by location, and orders them by quantity:
Orders.quantity.Sum().PartitionBy(Orders.location).OrderBy(Orders.quantity)
This would give the following result from a sample Orders table:
product | location | quantity | result |
a | 1 | 1 | 1 |
b | 1 | 2 | 3 |
c | 2 | 3 | 3 |
d | 2 | 4 | 7 |
e | 3 | 5 | 5 |
f | 3 | 6 | 11 |
The Order By function can be used without the Partition By function to order results without partitioning. The following example accumulates orders by quanity, and orders them by quantity in descending order:
Orders.quantity.Sum().OrderBy(Orders.quantity DESC)
This would give the following result from a sample Orders table:
product | location | quantity | result |
f | 3 | 6 | 6 |
e | 3 | 5 | 11 |
d | 2 | 4 | 15 |
c | 2 | 3 | 18 |
b | 1 | 2 | 20 |
a | 1 | 1 | 21 |
Additional functions being added to support the Partitioned Value functions are:
-
CumulativeSum: this requires the OrderBy() function while PartitionBy() is optional
-
Rank: this requires the OrderBy() function while PartitionBy() is optional
-
DenseRank: this requires the OrderBy() function while PartitionBy() is optional
The default sort order for the new functions is ascending. You can change this sort order to descending by suffixing the statement with 'desc'.
New Weighted Average Function
The Weighted Average function is used for model building. This function allows you to use weighted average logic within the columns of the Insert macro action.
Use Cases
The use cases for this function include deriving an average production or transportation cost from historic transactions weighted by different numeric attributes (production quantity, sales volume, etc.). The weighted average function applies the following weighted average calculation:
-
sum(table.column * weighting_table.column) / Sum(weighting_table.column )
The syntax for Weighted Average is:
<table>.<field>.AverageWeightedBy(<table>.<column>)
For example, "orders.quantity.AverageWeightedBy(orders.cost)" would produce an average quantity weighted by cost.
If the Orders data was:
product | quantity | cost |
1 | 1 | 3 |
1 | 2 | 4 |
1 | 3 | 5 |
2 | 4 | 6 |
2 | 5 | 7 |
2 | 6 | 8 |
3 | 7 | 9 |
3 | 8 | 10 |
3 | 9 | 11 |
3 | 8 | 0 |
The results from the Weighted Average function would be:
product | average quantity weighted by cost |
average with no weighing for comparison |
1 | 2.166667 | 2 |
2 | 5.095238 | 5 |
3 | 8.066667 | 8 |
In this example, the Weighted Average function is being used to weigh by Quantity:
This function will be available wherever the Statement Editor is available, including in app boards and dynamic views.
Visual Joins in Macros
This new capability allows you to visually define joins as a property of macro actions. You will no longer be required to build manual joins before creating macro actions.
Visual Joins Examples
This capability is available in the Insert, Update, Delete, Scalar Query, and Bulk Parameter Update actions.
Using visual joins you can:
- Add and remove joins
- Change a join's type
- Create aliased tables for use with the joins
When you create joins for an action this way, the Statement Editor is filtered to only use the aliased tables referenced in the joins you created. You will no longer need to create <table1>.<table2> references in the Statement Editor to make the joins work. Just pick the tables and columns you need and they will be joined.
Using Statements to Pass Parameters to Functions
The Statement Editor has been updated. It will now allow you to use a statement to specify the value of a parameter, rather than just a text or numerical value.
Statement Editor Examples
You can also now edit the parameters passed to a function without re-selecting the function in the Statement Editor.
This change will not impact parameters such as datepart and daterollup that currently allow you to select a value from a list.
In the following examples, the existing parameters have been specified by statements:
In this example, the updated Statement Editor has been used to specify the three parameters for this If function:
In this example, the updated Statement Editor has been used to specify the parameters for this Partition By function:
In this example, the updated Statement Editor has been used to specify the parameters for this Order By function. Note the ability to sort using the sort icon on the parameter lines:
Latest version of the DDM assets will be used
When selecting a Decision Data Model (DDM) connection in a macro or an app, the latest version of the DDM connection will be used.
Whenever executions are triggered by the following processes, the executions will use the latest version of the DDM asset selected as the connection:
- App
- Macro
- Manual joins
- Dynamic views

Grid Widget enhancements
The following enhancements have been made to the Grid widget:
- Boolean columns can be displayed as a toggle switch.
- Column sorting and filtering can be enabled or disabled.
- Borders can be removed from the grid.
- The vertical scroll bars can be turned off.
- Row highlighting when users hover over a row can be disabled.
- A new multi-select option allows users to select multiple items from a list.
Note: This feature is controlled by a Coupa feature toggle and needs to be enabled by Coupa for users to see it.

SCDP 31.1.0 New Run Model Recipe action
A new Technology action has been added to allow you to run existing model recipes as part of a macro.
Map Widget Improvements
The Map widget can now include a legend, and map points can be scaled by a database column such as stock or demand.
Insert Action Improvements
The Insert action has been improved to make adding columns easier. You can pick a table from a data source connection and add columns quickly from the table. Columns whose name and data type match between the source and destination will be automatically mapped, which speeds up the process.
Conditional Formatting Improvements
Conditional formatting in widgets has been improved to provide more features and increase ease of use. You can now:
- Review and edit existing conditional formatting rules.
- Apply rules to multiple columns at once.
- Choose to use your own conditional rules or the rules provided by the builder.
- Use conditional formatting based on dynamic values.
- Control the Icon widget's colors. The background color, icon color, and font color can each be conditionally controlled to convey information.
Using Functions in the Sort By and Conditions Fields of Widgets
You can now use Aggregate functions in the Sort By and Conditions fields of widgets.

Import and Export Data to/from Local Excel Files via a Macro Action
App users can import data from Excel workbooks using an App Studio macro. This allows easier import of data from multiple Excel sheets, which simplifies the process for importing ad hoc data into your apps.
Export Apps with Assets
To make moving an app easier, you can export an app’s assets from Data Management in addition to the app definition. When you export an app, you will receive an email that includes a link for downloading the app and its assets. This allows easier portability of apps and creating app templates.
Grid Widget Enhancements
The Grid widget is being enhanced to make it more flexible and useful. It will now:
- Allow users to select entries from a database lookup table. This makes data entry more consistent.
- Allow the grid to be filtered based on lookup table entries. This allows the Designer to provide user-specific drop down values. For example, a user would select from a list of suppliers that are applicable to the user.
- Save hidden column values if they are defaults, and not if they are auto-incremented. This increases data accuracy.
- Allow the Designer to establish grouping for a grid that will appear when the grid is opened. This supports more organized presentation of data.
- Allow subtotals for columns and groupings.
Edit in Excel Enhancements
Edit in Excel includes several new Grid widget features, making it more useful and more consistent with the Grid widget. It will now:
- Allow users to select entries from a database lookup table.This makes data entry more consistent.
- Allow the worksheet to be filtered based on lookup table entries. This allows the Designer to provide user-specific drop down values. For example, a user would select from a list of suppliers that are applicable to the user.
- Enforce validation rules when saving. This increases data accuracy.
- Commit default values back to the grid when saving (including for hidden columns and non-global variables). This increases data accuracy.
Parameter Prompts Translation Support
Parameter prompts can be translated. This will assist with multi-lingual support.
Pass Parameters via URLs
You can share a scenario with other users by sharing a link to the scenario via email. This assists iterative collaboration based on model results. This is particularly helpful when there are too many scenarios available to easily pick from a list of available scenarios.
Clickable Icons with Tooltips
Icons are customizable to make them more useful and attractive. The Designer can:
- Add an icon color and a background color.
- Control font size, color, and style (bold or italic).
- Control vertical and horizontal placement of the icon.
- Add a tooltip to the icon.
Run Custom Algorithms
App designers can now run custom algorithms to analyze their data. The new Run Custom Algorithm action enables designers to add a custom algorithm to a macro for execution on models or custom databases. Detailed logging of custom algorithm runs is available in queue management.

Improved input validation when editing data in grids or Excel
When editing records from a grid or in Excel, columns configured to validate input now function as expected. This update includes the following improvements:
- Validation is performed for any columns accessed from joins.
- Data in Excel can't be saved if validation errors are present.
- Fixed selection lists are no longer ignored and now function correctly.
- Selection lists from lookup tables support conditions.
- Error messages provide specific details to help troubleshoot problems.
- Default values are saved from Excel back to the grid in the app.
- Default values in hidden columns are also saved from Excel back to the grid, except for columns configured to auto increment.
Multi-lingual support for buttons with parameters
Parameters can be configured to prompt the app user to specify a locale for the display of onscreen text.

Preview an app
You can preview your app without leaving Layout Designer. This allows you to quickly see what your users will see without leaving the Layout Designer.
Navigation improvements
You can include an app name on the title bar of the app. This allows you to customize your interface for your organization.
Builder concurrency
If an app board is already in use by another Builder, App Studio will notify you.
Grid widgets
Editable columns have a bold header to distinguish them.
The following can be customized in Grid widgets:
- Header background and text color
- Font size, weight, and italicization
- Show/hide alternate row colors, column lines, and row lines
- Cell text color
- Horizontal alignment
Panel widgets
You can customize the amount of white space between panels.
You can specify an image as a background for a panel. This is useful for creating a landing page for your app.
Button widgets
You can add an icon to a button and change the button width. The default values for new buttons was improved.
Tab widgets
You can customize the color of the tabs and the text on the tabs.
Integrity checks
You can see a summary of data connections when you run a project integrity check.
Macro improvements
You can duplicate a macro action. This allows you to quickly add another instance of the action.
If you create a loop in your macro, the workspace will warn you by highlighting all actions withing the loop.
Last modified: Thursday April 17, 2025