Free cookie consent management tool by TermsFeed Create Custom Record Fields [Appian Records]
Create Custom Record Fields

This page explains how to create custom record fields.

Overview

Appian Records makes it easy to leverage your enterprise data seamlessly throughout your applications, but there are times when your data isn’t enough on its own. Instead, you may need to aggregate, extract, or change your existing data to show specific insights to your users.

When you sync your data in Appian, you can transform and manipulate your existing record data into the insights you need using custom record fields.

For example, in a Case record type, you may have a createdOn field and a closedOn field to show when each case was created and closed. However, account managers need to know how long each case was open to ensure the company is meeting their service-level agreements (SLAs).

To easily display this information, you can create a new custom record field on the Case record type called slaStatus. This field will calculate the difference between the created on and closed on date for each case, and displays a value of On Time or Overdue based on the difference.

Since custom record fields are created directly on your record type, you can reference them as quickly and easily as any other record field. Use your custom record fields to build charts, to sort and display data in grids, or as filter options in a user filter.

To learn more about using your record fields and custom record fields, see:

About custom record fields

Custom record fields allow you to calculate, simplify, or transform your existing data into new fields in the record type. This allows you to fill in gaps within your data, display new insights, or even just clean up your data, so you can build reports and queries with the data you need.

You can create custom record fields on any record type with data sync enabled. We have several templates to get you started creating your custom record fields—some are guided, and others provide a prepopulated expression with the functions you need.

You’ll choose which template to configure your custom record field based on your use case and when you want the field to be evaluated.

Custom record fields can be evaluated at two different times:

  • At sync time: The custom record field values are calculated whenever a sync occurs in the record type.

  • In real time: The custom record field values are calculated whenever the field is actively referenced in your applications.

All custom record field templates are preset to be evaluated at either sync time or in real time. In the following sections, templates that evaluate at sync time are denoted with a

If your business needs are more complex or you need more flexibility, you can also write your own custom record field expression. When you write your own expression, you can choose when the field values are evaluated.

Note:  Record types with data sync enabled can only have 100 fields, and no more than 40 of them can be custom record fields. For example, if your record type has 98 fields, you can only create two custom record fields.

When a custom record field evaluates at sync time, the field values are only calculated whenever a sync occurs in the record type. For example, when a scheduled sync occurs or when you use the Sync Records smart service to sync specific data, the custom record field values will be reevaluated.

Sync-time evaluations are useful when your field values are not time sensitive, or when you do not require related data.

For example, you could create a custom record field that evaluates at sync-time in order to concatenate two fields on your record type, like firstName and lastName.

Sync-time evaluations also allow you to leverage numerous functions, like if(), a!match(), or a!localVariables() so you can create conditional logic or more complex expressions.

For example, you could create a custom record field that evaluates at sync-time to returns the value High when a case has an urgency of 1 and a supportLevel of 3. Otherwise, return the value Low.

See any template that evaluates at sync-time, or any sync-time evaluation recipes for more examples.

When a custom record field evaluates in real time, the field values are calculated whenever the field is actively referenced in your applications. For example, when an end user views a bar chart or grid that contains the custom record field.

Since real-time evaluations occur more frequently, they are useful when you need to reference relative dates, like today’s date and time, or when you need to reference related record fields.

For example, you could create a custom record field that evaluates in real-time in order to subtract the createdOn date from today’s date. With more frequent evaluations, you can be confident that your calculation is always referencing the most current date.

Real-time evaluations leverage a special set of functions called custom field functions. These functions allow you to reference record fields, related record fields, and other custom record fields. Within each custom field function, you can leverage other supported functions like today() and now() in your calculations.

You must use at least one custom field function when creating a custom record field that evaluates in real-time. The available custom field functions include:

See any template that evaluates in real time, or the real-time evaluation recipes below for more examples.

The Aggregate Related Record Fields template allows you to aggregate and filter a related record field from a one-to-many relationship. You can use this template when your record type has a one-to-many relationship.

For example, let's say you have a Customer record type that has a one-to-many relationship with the Case record type, and you want to create a report that shows the number of open cases associated with each customer.

On the Customer record type, you can use this template to create a custom record field that gets the count of Ids from the Case record type, and filters on the status field so you only count cases with a status of "Open".

Once you create the field, the aggregation will automatically be grouped by the common field shared between the two record types. In this example, that would be the customer Id.

Use this template

To use this template:

  1. In the record type, go to Data Model.
  2. Click NEW CUSTOM RECORD FIELD.
  3. From SELECT A TEMPLATE, choose Aggregate Related Record Fields.
  4. Click NEXT.
  5. For Field, select the related record field you want to aggregate.
  6. For Aggregation Function, choose how you want to aggregate the field.
  7. To filter the aggregation, enable Filter related record values?
  8. Configure the following properties. Multiple filters are evaluated with an AND operator.
    • Field: The field to filter on.
    • Operator: The operator to apply to the selected field.
    • Value: The value to compare to the given field using the given operator.

    Note:  If there is a one-to-many relationship in the path between where you are aggregating data and where you are filtering, then you will observe “at least one” filter behavior.

  9. Click TEST to preview your custom record field values using your record data.
  10. Click NEXT.
  11. Enter a Name for the custom record field. This is how you’ll reference the field in your applications.
  12. Click CREATE.

When you filter the aggregation by a date or date and time field, you can select a Date Preset as your filter value.

These presets will dynamically filter your data based on the selected time frame. For example, if you select the date preset Today, the filter value will update each day to reflect the correct date. When you use a Date Preset, all date and time values are returned in Greenwich Mean Time (GMT).

See Date Presets for Filters to see the underlying expression associated with each preset.

Date Difference

The Date Difference template allows you to return the difference between two dates and display the results in days, hours, minutes, or seconds. This template is prepopulated with two custom field functions: a!customFieldDateDiff() and a!customFieldDefaultValue().

The a!customFieldDateDiff() function allows you to subtract two record fields or related record fields of type Date or Date and Time. By default, the a!customFieldDefaultValue() function is used in the endDate parameter so that, if the end date is null, it will be replaced by a default value.

Note:  The values in the prepopulated expression will vary based on your available dataset.

For example, let’s say you want to display the number of days it took to deliver each order on a read-only grid. You could use this template to create a custom record field that subtracts the submittedDate and the deliveryDate and returns the difference in days. If the order hasn’t been delivered yet (so the delivery date is null), then subtract the submittedDate from today’s date.

The expression would look like this:

1
2
3
4
5
6
7
8
a!customFieldDateDiff(
 startDate: recordType!Order.fields.submittedDate,
 endDate: a!customFieldDefaultValue(
    value: recordType!Order.fields.deliveryDate,
    default: today()
 ),
 interval: "DAY"
)

Tip:  For more examples using the Date Difference custom record field template, check out the AR_DateDiffDashboard in the Appian Retail application available for free in Appian Community Edition.

Use this template

To use this template:

  1. In the record type, go to Data Model.
  2. Click NEW CUSTOM RECORD FIELD.
  3. From SELECT A TEMPLATE, choose Date Difference.
  4. Click NEXT.
  5. For Expression, the a!customFieldDateDiff() function is prepopulated to subtract a record field from a related record field, and replace any null endDate values with today's date. Modify the expression as needed.

    You can replace the values in the expression with any of the following:

    • Record field or related record field references. You must reference fields using the recordType! domain. For example, recordType!Case.fields.createdOn.
    • Relative date and time functions, like today() or now().
    • Constants.
    • Other supported functions.
  6. Click TEST to preview your custom record field values using your record data.
  7. Click NEXT.
  8. Enter a Name for the custom record field. This is how you’ll reference the field in your applications.
  9. Click CREATE.

Extract Partial Dates

The Extract Partial Dates template allows you to return a particular value from a Date or Date and Time record field.

For example, let's say you have a Date and Time field called dateSubmitted, but you only need to know the date a ticket was submitted, not the time. You could use this template to create a custom record field called shortDateSubmitted to extract the date from the dateSubmitted field and set the new field to type Date.

Use this template

To use this template:

  1. In the record type, go to Data Model.
  2. Click NEW CUSTOM RECORD FIELD.
  3. From SELECT A TEMPLATE, choose Extract Partial Dates.
  4. Click NEXT.
  5. For Field, select the Date or Date and Time record field you want to extract the date from.
  6. For Unit of Time, select which part of the date you want to extract.
  7. Click NEXT.
  8. Enter a Name for the custom record field. This is how you’ll reference the field in your applications.
  9. For Error Value, choose the value to display if there is an error evaluating a custom record field value.
  10. Click CREATE.

Groups Based on a Date Difference

The Groups Based on a Date Difference template allows you to calculate the difference between two dates and organize the difference into groups. This template requires two record fields of type Date or Date and Time.

Tip:  Do you only want to calculate the difference between two dates? Try the Date Difference template instead.

For example, let’s say you have the record fields dateAssigned and dateClosed and you want to know whether a case was closed on time or overdue based on the service-level agreement (SLA).

Using this template, you can create a custom record field that calculates the number of days between the ticket's assigned date and closed date. Then, you can organize the differences into groups:

  • The On Time group includes values less than or equal to 5 days.
  • The Overdue group includes all remaining values.

But what if the ticket hasn't been closed? This would make the dateClosed null. To handle a null date, you can specify a Default Value to appear on the custom record field. In this example, we could set the Default Value to In Progress.

Use this template

To use this template:

  1. In the record type, go to Data Model.
  2. Click NEW CUSTOM RECORD FIELD.
  3. From SELECT A TEMPLATE, choose Groups Based on a Date Difference.
  4. Click NEXT.
  5. For Step 1: Calculate Difference, configure the following:
    • Start Date: The starting Date or Date and Time record field to subtract.
    • End Date: The ending Date or Date and Time record field to subtract.
    • Interval: The unit of time to calculate the difference.
  6. For Step 2: Create Groups, configure the following:
    • Number of Groups: The number of groups you want to categorize. You must have at least two groups.
    • Custom Field Value: The name of the field value to return based on the difference. The final Custom Field Value will display for any values that are not included in the other groups.
  7. For Step 3: Handle Null Start Date or End Date Values, enter a Default Value. This is the value that will display if the Start Date or End Date is null. You can only enter a static text value.
  8. Click NEXT.
  9. Enter a Name for the custom record field. This is how you’ll reference the field in your applications.
  10. For Error Value, choose the value to display if there is an error evaluating a custom record field value.
  11. Click CREATE.

Groups Based on a Range

The Groups Based on a Range template uses a range to organize your numerical data into groups. This template only supports record fields of type Number (Integer) or Number (Decimal).

For example, let's say you have a record field called price, and you want to create a chart that shows the distribution of prices in your orders.

Using this template, you can create a new custom record field called priceGroup so all prices that are less than or equal to $10 display as Low, prices greater than $10 and less than or equal to $30 display as Medium, and all other prices display as High.

Use this template

To use this template:

  1. In the record type, go to Data Model.
  2. Click NEW CUSTOM RECORD FIELD.
  3. From SELECT A TEMPLATE, choose Groups Based on a Range.
  4. Click NEXT.
  5. For Create Groups From, select a Number (Integer) or Number (Decimal) record field to base the range off of.
  6. For Number of Groups, select the number of groups you want to categorize. You must have at least two groups.
  7. For Custom Field Value, enter the name of the field value to return based on the specified range. The final Custom Field Value will display for any values that are not included in the other groups.
  8. Click NEXT.
  9. Enter a Name for the custom record field. This is how you’ll reference the field in your applications.
  10. For Error Value, choose the value to display if there is an error evaluating a custom record field value.
  11. Click CREATE.

Groups Based on Text Values

The Groups Based on Text Values template allows you to organize the text values from a record field into groups. This template only supports record fields of type Text.

For example, say you have a record field called title that contains all job titles in your organization, and you want to create a pie chart that displays the number of employees per functional area.

Using this template, you could combine all titles that contain the keyword "Software" or "Quality" into a group called Engineers. This means any employees with titles like Associate Software Engineer, Quality Engineer II, or Lead Software Engineer will appear as Engineering in the custom record field.

You could create a group for each functional area using this same logic, and include any remaining titles in the Other group.

Use this template

To use this template:

  1. In the record type, go to Data Model.
  2. Click NEW CUSTOM RECORD FIELD.
  3. From SELECT A TEMPLATE, choose Groups Based on Text Values.
  4. Click NEXT.
  5. For Create Groups From, choose the Text record field you want to create groups from.
  6. For Number of Groups, select the number of groups you want to categorize. You must have at least two groups.
  7. For Custom Field Value, enter the name of the field value to return based on the specified Record Field Values. The final Custom Field Value will display for any values that are not included in the other groups.
  8. For Operator, choose an operator:
    • Use the Contains operator to include any record field values that contain a partial match to the specified keyword or keywords.
    • Use the In operator to specify the exact record field values to include in the group.
  9. For Record Field Value, enter a keyword or record field value to determine which values are included in the group.
  10. Click NEXT.
  11. Enter a Name for the custom record field. This is how you’ll reference the field in your applications.
  12. For Error Value, choose the value to display if there is an error evaluating a custom record field value.
  13. Click CREATE.

Write Your Own Expression

If your business needs are more complex and cannot be satisfied by a template, you can write your own custom record field expression.

When you write your own expression, you’ll choose whether the field evaluates at sync-time or in real-time. Depending on your selection, the functions and fields you can use to create your custom record field will vary.

The table below outlines the key configuration differences between sync-time and real-time field evaluations:

  Sync-time evaluations Real-time evaluations
Supported fields Record fields and existing custom record fields that evaluate at sync-time Record fields, related record fields, and any existing custom record fields
Supported functions Use one or more supported functions Use one or more custom field functions
Supported objects None Constants
Reference record fields Use rv!record followed by a record type field reference in brackets

For example, rv!record[recordType!Case.fields.name]
Use a record type field reference

For example, recordType!Case.fields.name

See the recipes below for examples configuring custom record fields that evaluate at sync-time or in real-time.

Sync-time evaluation recipes

The following recipes illustrate how to create a custom record field that evaluates at sync-time. Each of these recipes leverage one or more record fields and supported functions.

Tip:  Want to use related record fields in your expression? Check out the real-time evaluation recipes instead.

Concatenate values

Goal: Create a new custom record field that concatenates record fields and displays them as one value.

In this example, we will use the concat() function to concatenate the record fields street, city, state, and zipCode from the Employee record type into a new custom record field called address:

1
2
3
4
concat(rv!record[recordType!Employee.fields.street], ", ", 
rv!record[recordType!Employee.fields.city],  ",  ", 
rv!record[recordType!Employee.fields.state], " ", 
rv!record[recordType!Employee.fields.zip]) 

Replace null values with a static value

Goal: Create a new custom record field that displays the null values in a record field as "N/A".

In this example, we'll create a new custom record field called cleanReference that displays any null values from the reference record field as "N/A". If the value is not null, then the record value will display.

1
a!defaultValue(rv!record[recordType!Applicant.fields.reference], "N/A")

Tip:  If you want to use related record fields or relative dates in your expression, create a custom record field that evaluates in real-time and use the a!customFieldDefaultValue() function. See an example below.

Use conditional logic with two record fields

Goal: Create a new custom record field with values based on the conditions of two record fields.

In this example, we'll use the record fields urgency and supportLevel to determine a ticket's priority level. Based on the value of each field, the new custom record field will display values of "High", "Medium", or "Low".

1
2
3
4
5
6
7
8
9
10
11
12
13
a!match(
  whenTrue:and(
	    rv!record[recordType!Case.fields.urgency] = 1,
	    rv!record[recordType!Case.fields.supportLevel] = 3
	    ),
  then: "High",
  whenTrue: and(
	      rv!record[recordType!Case.fields.urgency] = 2,
	      rv!record[recordType!Case.fields.supportLevel] = 2
	    ),
  then: "Medium",
  default: "Low"
)

Add, subtract, multiply, and divide record fields

Goal: Create a new custom record field using arithmetic operators to add, subtract, multiply, or divide record fields and displays the resulting values.

In this example, we'll use the record fields price, cost, and unitsSold to calculate the values for the new custom record field called profit.

1
2
(rv!record[recordType!Sales.fields.price] - rv!record[recordType!Sales.fields.cost])
* rv!record[recordType!Sales.fields.unitsSold]

Tip:  If you want to use related record fields in your expression, create a custom record field that evaluates in real-time and use any of the math related custom field functions. See an example below.

Create percentages using record fields

Goal: Create a new custom record field that performs a calculation on record field values and displays the values as a percentage.

In this example, we'll calculate the return on investment (ROI) using the record fields revenue and totalExpenses. When you add this field in a report or grid, you can use rich text to add the percent sign. For example, rv!record[recordType!Sales.fields.roi] & "%".

1
2
(rv!record[recordType!Sales.fields.revenue] - rv!record[recordType!Sales.fields.totalExpenses]) 
/ rv!record[recordType!Sales.fields.totalExpenses] * 100

Real-time evaluation recipes

The following recipes illustrate how to create a custom record field that evaluates in real-time.

Each of these recipes leverages one or more custom field functions. You must use at least one of these functions to create a custom record field that evaluates in real-time:

These recipes also highlight the ability to use related record fields, constants, and relative dates within the custom field expressions.

Goal: Create a new custom record field that replaces null values in a record field with values from a related record field.

In this example, we have a createdOn field on the Customer record type. If a customer has a null value for createdOn, then we want to display the createdOn field from the related record type Account instead.

To do this, we could create a new custom record field on the Customer record type that evaluates in real-time. Using the a!customFieldDefaultValue() function, we can replace any null values from the createdOn field from the Customer record type with the related record field createdOn from the Account record type.

1
2
3
4
a!customFieldDefaultValue(
    value: recordType!Customer.fields.createdOn,
    default: recordType!Customer.relationships.accounts.fields.createdOn
)

Goal: Create a new custom record field where the values are dependent on conditional logic.

In this example, the Case record type has a many-to-one relationship with the Status record type, and we want to display all open or in progress cases as "Active", and any cases relying on customer action or support action to display as "Paused". Otherwise, if a case has any other status, display the case as "Closed".

To do this, we could create a new custom record field on the Case record type that evaluates in real time. Using the a!customFieldMatch() function, we can use simplified if-then logic to determine the values of our custom record field.

1
2
3
4
5
6
7
8
9
10
a!customFieldMatch(
  value: recordType!Case.relationships.status.fields.name,
  equals: "Open",
  equals: "In Progress",
  then: "Active",
  equals: "Customer Action",
  equals: "Support Action",
  then: "Paused",
  default: "Closed"
}

Goal: Create a new custom record field that will add, subtract, multiply, or divide record fields and related record fields and displays the resulting values.

In this example, we want to calculate each employee's potential bonus amount.

The Employee record type has an annualSalary field, which contains each employee's salary amount. The Level record type has a percentBonus field, which determines the potential bonus amount based on an employee's level in the organization.

To calculate each employee's potential bonus amount, we could create a new custom record field on the Employee record type that evaluates in real-time so you can reference the related record field in your calculation.

1
2
3
4
5
6
a!customFieldMultiply(
  value: {
    recordType!Employee.fields.annualSalary,
    recordType!Employee.relationships.level.fields.percentBonus
  }
)

See all math-related custom field functions:

Goal: Create a new custom record field that performs a calculation using record field and related record field values and displays the result as a percentage.

In this example, we want to calculate the percent of projected revenue to total revenue. The formula to calculate the percent of projected revenue to total revenue is Projected Revenue / (Current Revenue + Projected Revenue).

The Customer record type has a currentRevenue field, which displays the current revenue generated by each customer. The Account record type has a projectedRevenue field, which displays the forecasted revenue for each customer account according to the sales department.

To calculate these values, we could create a new custom record field on the Customer record type that evaluates in real-time so that we can reference the related record field in our calculation.

1
2
3
4
5
6
7
8
9
a!customFieldDivide(
  numerator: recordType!Customer.relationships.account.fields.projectedRevenue,
  denominator:  a!customFieldSum(
    value: {
        recordType!Customer.fields.currentRevenue,
        recordType!Customer.relationships.account.fields.projectedRevenue
    }
  )
)

When you add this field in a report or grid, you can use rich text to add the percent sign. For example, rv!record[recordType!Customer.fields.percentProjectedRevToTotalRev] & "%".

Calculate values using other custom record fields

Goal: Create a new custom record field that performs a calculation using other custom record fields.

In this example, we want to calculate the percent change of sales generated this year versus last year for each country. The formula to calculate the percent change is (YTD Sales - LYTD Sales) / LYTD Sales.

On the Country record type, we already have two existing custom record fields that use the Aggregate Related Record Fields template: one calculates the year-to-date sales for all orders, and another that calculates the previous year-to-date sales for all orders. To calculate the percent change, we'll simply reference those existing custom record fields in our calculation.

1
2
3
4
5
6
7
a!customFieldDivide(
  numerator: a!customFieldSubtract(
      value1: recordType!Country.fields.ytdSales,
      value2: recordType!Country.fields.lytdSales
  ),
  denominator: recordType!Country.fields.lytdSales
)

Tip:  You can reference any existing custom record fields in your real-time calculations, regardless of when it evaluates.

Calculate values based on a constant

Goal: Create a new custom record field that returns its values based on the values of a constant.

In this example, we want to display the range of days in which an order is due based on the difference between today’s date and the delivery due date. Based on the difference, we want the custom record field to display "Overdue", "Due in the next 5 days", "Due in the next 6 to 10 days", or "Due after 10 days".

On the Order record type, we could create a custom record field that evaluates in real time and call it dueDateGroupingLabel.

We’ll use the a!customFieldMatch() function so we can return different values based on different conditions (the different ranges of days). For the value parameter, we’ll use the a!customFieldDateDiff() function to return the difference between today’s date and the delivery due date.

Then, we’ll create various whenTrue conditions using the a!customFieldCondition() function to determine which value to return based on the date difference. For example, when the difference is less than or equal to 0, then return the value “Overdue”. To make it easier to maintain these return values, we’ll use the constant cons!AR_CONS_DELIVERY_DUE_DATE_GRPOUPING to store the different labels.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
a!customFieldMatch(
  value: a!customFieldDateDiff(
    startDate: today(),
    endDate: recordType!Order.fields.deliveryDueDate,
  ),
  whenTrue: a!customFieldCondition(
    field: fv!value,
    operator: "<=",
    value: 0
  ),
  /* Returns "Overdue" */
  then: cons!AR_CONS_DELIVERY_DUE_DATE_GROUPING[1],
  whenTrue: a!customFieldCondition(
    field: fv!value,
    operator: "<=",
    value: 5
  ),
  /* Returns "Due in the next 5 days" */
  then: cons!AR_CONS_DELIVERY_DUE_DATE_GROUPING[2],
  whenTrue: a!customFieldCondition(
    field: fv!value,
    operator: "<=",
    value: 10
  ),
  /* Returns "Due in the next 6 to 10 days" */
  then: cons!AR_CONS_DELIVERY_DUE_DATE_GROUPING[3],
  /* Returns "Due after 10 days" */
  default: cons!AR_CONS_DELIVERY_DUE_DATE_GROUPING[4],
)

When you write your own expression or edit certain templates, you can use different functions to configure your custom record field in expression mode.

The table below outlines which functions can be used to create a custom record field based on their evaluation time (sync-time or real-time).

Note:  If your custom record field evaluates in real-time, you must use a custom field function to create the field values. Within a custom field function, you can leverage other functions as well, like today() or null().

See the supported functions listed on each custom field function page for more information.

Category Function Description Supported in
Array a!flatten()

Converts an array that contains other arrays into an array of single items.

Sync-time evaluation
Array a!update()

Inserts new values or replaces existing values at the specified index or field name and returns the resulting updated data.

Sync-time evaluation
Array append()

Appends a value or values to the given array, and returns the resulting array.

Sync-time evaluation
Array index()

Returns the data[index] if it is valid or else returns the default value.

Sync-time evaluation
Array insert()

Inserts a value into the given array and returns the resulting array.

Sync-time evaluation
Array joinarray()

Concatenates the elements of an array together into one string and inserts a string separator between each element.

Sync-time evaluation
Array ldrop()

Drops a given number of values from the left side of an array and returns the resulting array.

Sync-time evaluation
Array length()

This function returns the number of elements in an array.

Sync-time evaluation
Array rdrop()

Drops a given number of values from the right side of an array, and returns the resulting array.

Sync-time evaluation
Array remove()

Removes the value at a given index from an array, and returns the resulting array.

Sync-time evaluation
Array reverse()

Returns an array in reverse order.

Sync-time evaluation
Array updatearray()

Inserts new values or modifies existing values at the specified index of a given array, and returns the resulting array.

Sync-time evaluation
Array where()

Returns the indices where the values in the input array are true.

Sync-time evaluation
Array wherecontains()

Receives one or more values and returns an array of indices that indicate the position of the values within the array.

Sync-time evaluation
Base Conversion bin2dec()

Converts a Binary number as text to a Decimal number.

Sync-time evaluation
Base Conversion bin2hex()

Converts a Binary number as text to a Hex number as text.

Sync-time evaluation
Base Conversion bin2oct()

Converts a Binary number as text to an Octal number as text.

Sync-time evaluation
Base Conversion dec2bin()

Converts a Decimal number to a Binary number as text.

Sync-time evaluation
Base Conversion dec2hex()

Converts a Decimal number to a Binary number as text.

Sync-time evaluation
Base Conversion dec2oct()

Converts a Decimal number to an Octal number as text.

Sync-time evaluation
Base Conversion hex2bin()

Converts a Hex number as text to a Binary number as text.

Sync-time evaluation
Base Conversion hex2dec()

Converts a Hex number as text to a Decimal number.

Sync-time evaluation
Base Conversion hex2oct()

Converts a Hex number as text to an Octal number as text.

Sync-time evaluation
Base Conversion oct2bin()

Converts an Octal number as text to a Binary number as text.

Sync-time evaluation
Base Conversion oct2dec()

Converts an Octal number as text to a Decimal number.

Sync-time evaluation
Base Conversion oct2hex()

Converts an Octal number as text to a Hex number as text.

Sync-time evaluation
Conversion displayvalue()

Tries to match a value in a given array with a value at the same index in a replacement array and returns either the value at the same index or a default value if the value is not found.

Sync-time evaluation
Conversion externalize()

Converts the given value to a string representation so that it can be saved externally.

Sync-time evaluation
Conversion toboolean()

Converts a value to Boolean.

Sync-time evaluation
Conversion todate()

Converts a value to Date with Timezone.

Sync-time evaluation
Conversion todatetime()

Converts a value to Date and Time.

Sync-time evaluation
Conversion todecimal()

Converts a value to Decimal (double precision floating point).

Sync-time evaluation
Conversion toemailaddress()

Converts a value to email address.

Sync-time evaluation
Conversion tointeger()

Converts a value to Integer.

Sync-time evaluation
Conversion tointervalds()

Converts a value to Interval (Day to Second).

Sync-time evaluation
Conversion tostring()

Converts a value to Text.

Sync-time evaluation
Conversion totime()

Converts a value to Time.

Sync-time evaluation
Conversion touniformstring()

Converts a value to Text, preserving the original scalar or array structure.

Sync-time evaluation
Custom Fields a!customFieldCondition()

Used in the whenTrue parameter of a!customFieldMatch(), this function allows you to create a condition.

Real-time evaluation
Custom Fields a!customFieldDateDiff()

Used to create a custom record field, this function returns the difference between two dates as a Number (Integer). The difference can be returned in days, hours, minutes, or seconds. Returns null when the startDate or endDate is null or empty.

Real-time evaluation
Custom Fields a!customFieldDefaultValue()

Used to create a custom record field, this function returns a default value when the specified value is null or empty. All parameters must be of the same data type. When there are multiple default parameters, each parameter is evaluated in order and the first non-null or non-empty default will be returned.

Real-time evaluation
Custom Fields a!customFieldDivide()

Used to create a custom record field, this function returns the results of dividing two numbers. You can use record fields, related record fields, or literal values of type Number (Integer) or Number (Decimal) in your calculation.

Real-time evaluation
Custom Fields a!customFieldMatch()

Used to create a custom record field, this function evaluates the value parameter against multiple conditions and returns a value based on a match. If no match is found, the default parameter is returned.

Real-time evaluation
Custom Fields a!customFieldMultiply()

Used to create a custom record field, this function returns the result of multiplying a series of values. You can multiply record fields, related record fields, or literal values of type Number (Integer) or Number (Decimal).

Real-time evaluation
Custom Fields a!customFieldSubtract()

Used to create a custom record field, this function returns the difference between two numbers. You can subtract record fields, related record fields, or literal values of type Number (Integer) or Number (Decimal).

Real-time evaluation
Custom Fields a!customFieldSum()

Used to create a custom record field, this function returns a sum of values. You can calculate the sum of record fields, related record fields, or literal values of type Number (Integer) or Number (Decimal).

Real-time evaluation
Date and Time a!addDateTime()

Adds the specified increments of time to the startDateTime and returns a date and time value. You can select a process calendar to ensure the return value falls within the specified working days and time.

Sync-time evaluation
Date and Time caladddays()

This function adds a given number of working days as designated on the process calendar to a Date and Time value, and returns a Date and Time value that falls within the work time defined in the process calendar.

Sync-time evaluation
Date and Time caladdhours()

This function adds a given number of hours to a Date and Time plus any non-working hours (as designated on the process calendar) and returns the resulting Date and Time.

Sync-time evaluation
Date and Time calisworkday()

This returns whether or not the given Date and Time is a work day, according to the calendar defined for the system.

Sync-time evaluation
Date and Time calisworktime()

This returns whether or not the given Date and Time is within working hours, according to the calendars defined for the system.

Sync-time evaluation
Date and Time calworkdays()

This returns the actual number of work days between two Date and Times (both inclusive), according to the calendar defined for the system.

Sync-time evaluation
Date and Time calworkhours()

This returns the actual number of work hours between two given Date and Times (both inclusive), according to the calendar defined for the system.

Sync-time evaluation
Date and Time date()

Converts text into data accepted by the date data type and functions that require date parameters.

Sync-time evaluation
Date and Time datetime()

Converts the given Date and Time into a serial number that holds the Date and Time data type.

Sync-time evaluation
Date and Time datevalue()

Converts a value to a date.

Sync-time evaluation
Date and Time day()

Returns the day of the month from the day specified.

Sync-time evaluation
Date and Time dayofyear()

Returns the day number within the year.

Sync-time evaluation
Date and Time days360()

Returns the number of days between two dates, based on a 360-day calendar.

Sync-time evaluation
Date and Time daysinmonth()

Returns the number of days in the given month in the given year.

Sync-time evaluation
Date and Time edate()

Returns the date that is the number of months before or after the given starting date.

Sync-time evaluation
Date and Time eomonth()

Returns the date for the last day of the month that is the number of months before or after the given starting date.

Sync-time evaluation
Date and Time gmt()

Subtracts a time zone offset from a given Date and Time.

Sync-time evaluation
Date and Time hour()

Returns the hour from the time specified.

Sync-time evaluation
Date and Time intervalds()

Converts the given time components into an equivalent time duration, an interval expressing days to seconds. This value is treated as a duration (Joe ran the marathon in 3 hours and 23 minutes), not a point in time.

Sync-time evaluation
Date and Time isleapyear()

Returns a Boolean value for whether the given year is a leap year.

Sync-time evaluation
Date and Time lastndays()

Returns a Boolean value for whether the given date is within the last given number of days.

Sync-time evaluation
Date and Time local()

This is a Date and Time addition function, adding time zone offset to given Date and Time.

Sync-time evaluation
Date and Time milli()

This function returns the millisecond portion of a timestamp or the decimal number that represents 1 millisecond in days.

Sync-time evaluation
Date and Time minute()

Returns the minute from the time specified.

Sync-time evaluation
Date and Time month()

Returns the month from the specified date.

Sync-time evaluation
Date and Time networkdays()

Returns the number of working days between two specified dates.

Sync-time evaluation
Date and Time second()

Returns the seconds from the specified time.

Sync-time evaluation
Date and Time a!subtractDateTime()

Subtracts the specified increments of time from the startDateTime and returns a date and time value. You can select a process calendar to ensure the return value falls within the specified working days and time.

Sync-time evaluation
Date and Time time()

Converts the given time into an equivalent time value.

Sync-time evaluation
Date and Time timevalue()

Converts the given time into an equivalent interval.

Sync-time evaluation
Date and Time timezone()

Returns the default offset in minutes from GMT, which is generally the process initiator's time zone.

Sync-time evaluation
Date and Time timezoneid()

Returns the time zone ID for the current context.

Sync-time evaluation
Date and Time weekday()

Returns the day of the week of the specified date.

Sync-time evaluation
Date and Time weeknum()

Returns the week number within the year for the given date using a given methodology.

Sync-time evaluation
Date and Time workday()

Returns the date the given number of workdays before or after the given date.

Sync-time evaluation
Date and Time year()

Returns the year for the date specified.

Sync-time evaluation
Date and Time yearfrac()

Determine the fraction of the year.

Sync-time evaluation
Evaluation a!localVariables()

Lets you define one or more local variables for use within an expression. When used within an interface, the value of each variable can be refreshed under a variety of conditions, configured using a!refreshVariable(). When used outside of an interface, all refresh properties configured using a!refreshVariable() are ignored.

Sync-time evaluation
Evaluation load()

Lets you define local variables within an expression for an interface and evaluate the expression with the new variables, then re-evaluate the function with the local variables' values from the previous evaluation.

Sync-time evaluation
Evaluation with()

Lets you define local variables within a function and evaluate the expression with the new variables.

Sync-time evaluation
Informational a!defaultValue()

Returns a default value when the specified value is null or empty. When there are multiple default parameters, each parameter is evaluated in order and the first non-null and non-empty default will be returned. Null, "", and {} are all considered null or empty values.

Sync-time evaluation
Conversion cast()

Converts a value from its existing type to the specified type.

Sync-time evaluation
Informational error()

Raises an error with the given message, used for invalidating execution.This function never returns a value.

Sync-time evaluation
Informational infinity()

Represents a constant number that stands for positive infinity or a negative infinity if you negate the value.

Sync-time evaluation
Informational isinfinite()

Tests given numbers against positive and negative infinity, returning true if the number is infinite, false if the number is not infinite.

Sync-time evaluation
Informational isnegativeinfinity()

Tests given numbers against negative infinity, returning true if number is negative infinity, false if number is not negative infinity.

Sync-time evaluation
Informational a!isNotNullOrEmpty()

Returns false if the value is null, an empty string, or an empty list. Otherwise returns true.

Sync-time evaluation
Informational isnull()

Returns true if value is null, false otherwise.

Sync-time evaluation
Informational a!isNullOrEmpty()

Returns true if the value is null, an empty string, or an empty list. Otherwise returns false.

Sync-time evaluation
Informational ispositiveinfinity()

Tests given numbers against positive infinity, returning true if the numbers are positive infinity, false if the numbers are not positive infinity.

Sync-time evaluation
Informational nan()

Constant number representing Not A Number, generally used for comparison to the result of mathematical operations with invalid inputs. This is equivalent to a decimal (floating point) null, but nan() is provided for more explicit usage in mathematical expressions.

Sync-time evaluation
Informational null()

Returns a null value.

Sync-time evaluation
Informational runtimetypeof()

Returns the numerical representation of an Appian system data type when used during process execution.

Sync-time evaluation
Informational typename()

Returns the type name of a given type number.

Sync-time evaluation
Informational typeof()

Returns the type number of a given value.

Sync-time evaluation
Logical and()

Returns true if all inputs are true; returns false if at least one input is false.

Sync-time evaluation
Logical choose()

Evaluates the choice argument at the given index and returns the result.

Sync-time evaluation
Logical false()

Returns the Boolean value false.

Sync-time evaluation
Logical if()

Returns valueIfTrue if condition returns true; returns valueIfFalse otherwise.

Sync-time evaluation
Logical a!match()

Evaluates the value against multiple conditions and returns a value based on a match. If no match is found, the default is returned. For example, if "a" then "b" else "c".

Sync-time evaluation
Logical not()

Converts true into false, and false into true.

Sync-time evaluation
Logical or()

Returns true if any inputs are true; returns false if all inputs are false.

Sync-time evaluation
Logical true()

Returns the Boolean value true.

Sync-time evaluation
Looping a!forEach()

Evaluates an expression for each item in a list and returns a new array of the results.

Sync-time evaluation
Looping all()

Calls a rule or function that returns either true or false for each item in list, asks the question, "Do all items in this list yield true for this rule/function?", and returns true if all items in list evaluates to true.

Sync-time evaluation
Looping any()

Calls a rule or function that returns either true or false for each item in list by asking the question, "Do any items in this list yield true for this rule/function?" with the intent to discover if any item(s) yield true.

Sync-time evaluation
Looping apply()

Calls a rule or function for each item in a list, and provides any contexts specified.

Sync-time evaluation
Looping filter()

Calls a predicate for each item in a list and returns any items for which the returned value is true.

Sync-time evaluation
Looping merge()

Takes a variable number of lists and merges them into a single list (or a list of lists) that is the size of the largest list provided.

Sync-time evaluation
Looping none()

Calls a rule or function that returns either true or false for each item in list by asking the question, "Do all items in this list yield false for this rule/function?" with the intent to discover if no items will yield true.

Sync-time evaluation
Looping reduce()

Calls a rule or function for each item in a list, passing the result of each call to the next one, and returns the value of the last computation.

Sync-time evaluation
Looping reject()

Calls a predicate for each item in a list, rejects any items for which the returned value is true, and returns all remaining items.

Sync-time evaluation
Mathematical abs()

Returns the absolute value(s) of the specified number(s).

Sync-time evaluation
Mathematical ceiling()

Rounds the number up to the nearest multiple of the specified significance.

Sync-time evaluation
Mathematical combin()

Calculates the number of unique ways to choose m elements from a pool of n elements.

Sync-time evaluation
Mathematical a!distanceBetween()

Returns the distance between the two locations (in meters) specified by the start and end coordinates. The distance is calculated by tracing a line between the two locations that follows the curvature of the Earth, and measuring the length of the resulting arc.

Sync-time evaluation
Mathematical e()

Returns the value of e.

Sync-time evaluation
Mathematical enumerate()

Returns a list of integer numbers from 0 through n-1.

Sync-time evaluation
Mathematical even()

Rounds positive numbers up to nearest even integer and negative numbers down to the nearest even integer.

Sync-time evaluation
Mathematical exp()

Returns e raised to the specified power.

Sync-time evaluation
Mathematical fact()

The factorial of specified number.

Sync-time evaluation
Mathematical factdouble()

The double factorial of specified number (mathematically n!!).

Sync-time evaluation
Mathematical floor()

Rounds the number down to the nearest multiple of the specified significance.

Sync-time evaluation
Mathematical int()

Rounds the specified number down to the nearest integer.

Sync-time evaluation
Mathematical ln()

Returns the natural logarithm of the specified number, which is the power that e must be raised to in order to equal the specified number.

Sync-time evaluation
Mathematical log()

Returns the logarithm of the number using the specified base, which is the power that base must be raised to, to equal the number.

Sync-time evaluation
Mathematical mod()

Returns the remainder of dividend when divided by the divisor.

Sync-time evaluation
Mathematical mround()

Rounds the number to the specified multiple.

Sync-time evaluation
Mathematical multinomial()

Adds the specified integers and divides the factorial of the sum by the factorial of the individual numbers.

Sync-time evaluation
Mathematical odd()

Rounds positive numbers up to nearest odd integer and negative numbers down to the nearest odd integer.

Sync-time evaluation
Mathematical pi()

Returns the value of pi.

Sync-time evaluation
Mathematical power()

Returns the base number raised to the specified exponent.

Sync-time evaluation
Mathematical product()

Returns the product of the specified numbers.

Sync-time evaluation
Mathematical quotient()

Returns the quotient when numerator is divided by the denominator, and drops the remainder.

Sync-time evaluation
Mathematical round()

Rounds off the number to the specified number of digits.

Sync-time evaluation
Mathematical rounddown()

Rounds the number down to the specified digit.

Sync-time evaluation
Mathematical roundup()

Rounds the number up to the specified digit.

Sync-time evaluation
Mathematical sign()

Returns the number divided by its absolute value, which is 1 if the number is positive and -1 if the number is negative.

Sync-time evaluation
Mathematical sqrt()

Returns the square root(s) of the specified number(s).

Sync-time evaluation
Mathematical sqrtpi()

Multiplies the number by pi, then returns the square root of the product.

Sync-time evaluation
Mathematical sum()

Returns the sum of the specified numbers.

Sync-time evaluation
Mathematical sumsq()

Squares each number and then returns the sum of the squares.

Sync-time evaluation
Mathematical trunc()

Truncates a decimal number to the specified number of places after the decimal point.

Sync-time evaluation
Scripting offsetFromGMT()

Returns the offset (in minutes) from GMT of the given date and timezone.

Sync-time evaluation
Scripting property()

This function extracts a bean's property under a given key name (the nameOfProperty parameter).

Sync-time evaluation
Array contains()

Checks whether an array contains the value.

Sync-time evaluation
Array difference()

Returns the values in array1 and not in array2.

Sync-time evaluation
Array intersection()

Returns only those elements that appear in all of the given arrays.

Sync-time evaluation
Array symmetricdifference()

Returns the values unique to two arrays but are not in the intersection of them.

Sync-time evaluation
Array union()

Returns all unique elements from the given arrays.

Sync-time evaluation
Statistical avedev()

Returns the average deviation of the specified number(s).

Sync-time evaluation
Statistical average()

Returns the average of the specified number(s).

Sync-time evaluation
Statistical count()

Returns the number items in all arrays passed to the function.

Sync-time evaluation
Statistical frequency()

Uses the bin array to create groups bounded by the elements of the array.

Sync-time evaluation
Statistical gcd()

Returns the greatest common denominator of the specified non-negative number(s), which is the largest number that divides all the given numbers without a remainder.

Sync-time evaluation
Statistical geomean()

Returns the geometric mean of the specified number(s).

Sync-time evaluation
Statistical harmean()

Returns the harmonic mean of the specified number(s), which is the number of terms divided by the sum of the terms' reciprocals.

Sync-time evaluation
Statistical lcm()

Returns the least common multiple of the specified non-negative number(s), which is the smallest number that is a multiple of all the given numbers.

Sync-time evaluation
Statistical lookup()

Returns location of data within multiple values, or valueIfNotPresent.

Sync-time evaluation
Statistical max()

Returns the maximum of the specified number(s).

Sync-time evaluation
Statistical median()

Returns the median of the specified number(s).

Sync-time evaluation
Statistical min()

Returns the minimum of the specified number(s).

Sync-time evaluation
Statistical mode()

Returns the mode of the specified number(s), which is the most commonly repeated element.

Sync-time evaluation
Statistical rank()

Returns an integer representing the rank of the number in the specified array.

Sync-time evaluation
Statistical stdev()

Returns the standard deviation of the specified number(s).

Sync-time evaluation
Statistical stdevp()

Returns the standard deviation of the specified number(s), assuming that the numbers form the entire data set and not just a sample.

Sync-time evaluation
Statistical var()

Returns the variance of the specified number(s).

Sync-time evaluation
Statistical varp()

Returns the variance of the specified number(s), assuming that the numbers form the entire data set and not just a sample.

Sync-time evaluation
System a!map()

Creates a map of values (Any Type) with each value stored at the corresponding string key. Values stored in maps are not wrapped in variants.

Sync-time evaluation
Text char()

Converts a number into its Unicode character equivalent.

Sync-time evaluation
Text charat()

Returns the character at given index within specified string.

Sync-time evaluation
Text clean()

Returns the specified text, minus any characters not considered printable. Printable characters are the 95 printable ASCII characters plus three special characters: BACKSPACE (0x08), TAB (0x09), and NEWLINE (0x0a).

Sync-time evaluation
Text cleanwith()

Returns the specified text, minus any characters not in the list of valid characters.

Sync-time evaluation
Text code()

Converts the text into Unicode integers.

Sync-time evaluation
Text concat()

Concatenates the specified strings into one string, without a separator.

Sync-time evaluation
Text exact()

Compares two given text strings in a case-sensitive manner, returning true only if they are exactly the same.

Sync-time evaluation
Text extract()

Returns the value (or values, if the text contains multiple delimited values) between the delimiters from the given text.

Sync-time evaluation
Text extractanswers()

Returns an array of strings that respond to the questions provided.

Sync-time evaluation
Text find()

Returns index location of case-sensitive substring with given string.

Sync-time evaluation
Text fixed()

Rounds the specified number off to a certain number of decimals and returns it as text, with optional commas.

Sync-time evaluation
Text initials()

Returns only the uppercase characters from within the given text.

Sync-time evaluation
Text insertkey()

Returns the provided text, wrapped with the specified delimiters.

Sync-time evaluation
Text insertkeyval()

Returns the provided key-value pairs, wrapped with the specified delimiters.

Sync-time evaluation
Text insertquestions()

Returns an array of questions with a ==EOQ== at the end, returning a single string that can be parsed with extractanswers() function after it has been filled in by a user.

Sync-time evaluation
Text keyval()

Returns the value(s) associated with the given key(s).

Sync-time evaluation
Text left()

Returns a specified number of characters from the text, starting from the first character.

Sync-time evaluation
Text leftb()

Returns a specified number of bytes from the text, starting from the first byte.

Sync-time evaluation
Text len()

Returns the length in characters of the text.

Sync-time evaluation
Text lenb()

Returns the length in bytes of the text.

Sync-time evaluation
Text like()

Tests whether a string of text is like a given pattern.

Sync-time evaluation
Text lower()

Converts all characters in the text into lowercase (Unicode case folding).

Sync-time evaluation
Text mid()

Returns a substring from the middle of the specified text.

Sync-time evaluation
Text midb()

Returns a substring from the middle of the specified text.

Sync-time evaluation
Text padleft()

Pads text with spaces on the left so that it is a certain length.

Sync-time evaluation
Text padright()

Pads text with spaces on the right so that it is a certain length.

Sync-time evaluation
Text proper()

Converts each character in the text into proper case, meaning it will capitalize the first first letter of every word and convert the rest into lowercase.

Sync-time evaluation
Text replace()

Replaces a piece of the specified text with new text.

Sync-time evaluation
Text replaceb()

Replaces a piece of the specified text with new text.

Sync-time evaluation
Text rept()

Concatenates the text to itself a specified number of times and returns the result.

Sync-time evaluation
Text resource()

Retrieves a string of translated text appropriate for the current user, according to their language preference, by matching a given key with text.

Sync-time evaluation
Text right()

Returns a specified number of characters from the text, starting from the last character.

Sync-time evaluation
Text search()

Searches the text for a particular substring, returning the positional index of the first character of the first match.

Sync-time evaluation
Text searchb()

Searches the text for a particular substring, returning the positional index of the first byte of the first match.

Sync-time evaluation
Text soundex()

Returns the soundex code, used to render similar sounding names via phonetic similarities into identical four (4) character codes.

Sync-time evaluation
Text split()

Splits text into a list of text elements, delimited by the text specified in the separator.

Sync-time evaluation
Text strip()

Returns the provided text, minus any characters considered printable. Printable characters are the 95 printable ASCII characters plus three special characters: BACKSPACE (0x08), TAB (0x09), and NEWLINE (0x0a).

Sync-time evaluation
Text stripHtml()

Changes the provided HTML string into a plain text string by converting <br>, <p>, and <div> to line breaks, stripping all other tags, and converting escaped characters into their display values.

Sync-time evaluation
Text stripwith()

The function returns the provided text, minus any characters on the list of invalid characters.

Sync-time evaluation
Text substitute()

Substitutes a specific part of a string with another string.

Sync-time evaluation
Text toHtml()

Converts a string in plain text to the HTML equivalent that displays appropriately in an HTML page, by replacing reserved characters with their escaped counterparts.

Sync-time evaluation
Text trim()

Removes all unnecessary spaces from the text.

Sync-time evaluation
Text upper()

Converts all letters in the text into uppercase.

Sync-time evaluation
Text value()

Converts text representing a number into an actual number or datetime.

Sync-time evaluation
Trigonometry acos()

Returns the arccosine(s) of the specified number(s) in radians.

Sync-time evaluation
Trigonometry acosh()

Returns the hyperbolic arccosine(s) of the specified number(s) in radians.

Sync-time evaluation
Trigonometry asin()

Returns the arcsine(s) of the specified number(s) in radians.

Sync-time evaluation
Trigonometry asinh()

Returns the hyperbolic arcsine(s) of the specified number(s) in radians.

Sync-time evaluation
Trigonometry atan()

Returns the arctangent(s) of the specified number(s) in radians.

Sync-time evaluation
Trigonometry atanh()

Returns the hyperbolic arctangent(s) of the specified number(s) in radians.

Sync-time evaluation
Trigonometry cos()

Returns the cosine(s) of the specified number(s).

Sync-time evaluation
Trigonometry cosh()

Returns the hyperbolic cosine(s) of the specified number(s).

Sync-time evaluation
Trigonometry degrees()

Converts the measure(s) of the specified angle(s) from radians to degrees.

Sync-time evaluation
Trigonometry radians()

Converts the measure of the specified angle from degrees to radians.

Sync-time evaluation
Trigonometry sin()

Returns the sine(s) of the specified number(s).

Sync-time evaluation
Trigonometry sinh()

Returns the hyperbolic sine(s) of the specified number(s).

Sync-time evaluation
Trigonometry tan()

Returns the tangent(s) of the specified number(s).

Sync-time evaluation
Trigonometry tanh()

Returns the hyperbolic tangent(s) of the specified number(s).

Sync-time evaluation

Create Custom Record Fields

FEEDBACK