--- title: "Best Practices: Component Configuration" slug: "best-practices-component-configuration" updated: 2025-09-26T07:39:55Z published: 2025-09-26T07:39:55Z canonical: "docs.unqork.io/best-practices-component-configuration" --- > ## Documentation Index > Fetch the complete documentation index at: https://docs.unqork.io/llms.txt > Use this file to discover all available pages before exploring further. # Best Practices: Component Configuration Use **Component Configuration best practices** to improve your module and application performance. The sections below provide best practices for module and component configurations. ## Module Configuration - Build a data dictionary before beginning your configuration. Doing so lets you capture all data requirements for your application. Once built, this data dictionary serves as your configuration guide. - Arrange the components in your module logically and procedurally. For example, place input components above the components that use them. Likewise, put output components below the components that use them. - Arrange components chronologically. The first component in your module is the component that triggers on New Submission. - Add tags to organize related modules. Module tags provide details about your module and make it easy to locate modules with the same tag. Tags help you filter the Modules list. ### Login and Logout Modules - In Login/Logout [Module Permissions](/v1/docs/module-permissions), set **Allow Access to Anonymous Users** to (ON) to provide Read-Only access to Anonymous Users. This enables end-users to view login and logout pages before authentication. [](https://cdn.us.document360.io/15548f06-2fba-434c-b0c1-5df88317dbd7/Images/Documentation/LoginLogout%20ModulePermissions.jpg?sv=2026-02-06&spr=https&st=2026-11-06T21%3A38%3A16Z&se=2026-11-06T22%3A38%3A16Z&sr=c&sp=r&sig=31qmLp2kguo7vXgIB1TJWaHzx4HvrR9p%2BoaorLGp9wE%3D) ### Header and Footer Modules - If the application is using Login/Logout modules, Set Header and Footer module RBAC permissions to allow anonymous access. In [Module Permissions](/v1/docs/module-permissions), set **Allow Access to Anonymous Users** to  **(ON)** to provide Read-Only access to Anonymous Users. This enables end-users to view header and footer pages prior to authentication. [](https://cdn.us.document360.io/15548f06-2fba-434c-b0c1-5df88317dbd7/Images/Documentation/LoginLogout%20ModulePermissions.jpg?sv=2026-02-06&spr=https&st=2026-11-06T21%3A38%3A16Z&se=2026-11-06T22%3A38%3A16Z&sr=c&sp=r&sig=31qmLp2kguo7vXgIB1TJWaHzx4HvrR9p%2BoaorLGp9wE%3D) - To improve security in Header/Footer modules with anonymous access enabled, apply [Component RBAC](/v1/docs/component-level-role-based-access-control-rbac) to individual components. ## Component Naming - Keep your Property IDs unique in each module and throughout your workflows. - Develop a component-naming convention and use it throughout your building process. - Use camel case (stylized as camelCase) without spaces or punctuation for Property IDs. For example, use firstName, middleName, and lastName. - Use descriptive Property IDs rather than generic IDs. For example, use addressHome or addressWork, rather than addressA or addressB. - For some components, use standard prefix abbreviations. For example, setting the Property ID for an Advanced Datagrid to enter beneficiaries as adgBeneficiaries. - Prefix the Property IDs of logic-type components (Calculator, Initializer, and so on) with the component type. For example, calcCommission for a Calculator component that determines a sales commission. - Keep Property IDs short for a cleaner display and smaller JSON payloads. - Use the Property ID as the Label Text when naming non-visual components. - Add labels (Label Text and Canvas Label Text) to all components that display for your end-user. - Enter api and schema Field Tags to API (application programming interface) and schema modules. That way, they display in the API Docs Dashboard and the Schema Docs Dashboard Life Cycle tools. ## Component Configuration Below is a glossary of components and best practices when using them. ### Advanced Datagrid Component - Button click events in the Advanced Datagrid component execute in a read-only data grid. ### Browser Storage Component It's best practice to use your module's unique module ID in the Browser Storage component's Namespace. For example, `inspections5ffddf6ae336b802494437c8`, where `5ffddf6ae336b802494437c8 `is the module ID of the front-end source module. The Namespace is where the source module stores its data on the browser. Only use **Property IDs** or [grid syntax](/v1/docs/grid-syntax-and-output-snippet) in and tables, unless referring to nested data in a [Plug-In component](/v1/docs/plug-in-component). ### Button Component - Use the Event Action type instead of Save or Validate. You can use a rule-specific trigger on button-click. Or, create a button to save a module submission. - Keep Button labels clear, concise, and descriptive. For example, `Add a Doctor` instead of `Add`. - Aim for no more than one Primary themed action button on a module screen. For example, an Add or Next button. - Aim for no more than one secondary-themed action button on a module screen. For example, a Save or Exit button. - Use Button Links or Button Link Classes for tertiary actions. For example, Next or Previous. - Multiple button clicks by an end-user might affect performance or break its logic. Use the **Restrict to Single Click** setting to avoid these issues. ### Calculator Component - It's best practice to use aliases that denote the input. Keep them short but avoid using aliases of A, B, C, and so on. - Calculator components don't store data. Your module's performance improves if you store the Calculator component's outputs in other components. - If you don't plan to use disabled components in your application, remove them to ensure optimal performance. Remember to check all active components that connect to disabled components. Ensure active components still function properly after you remove the disabled ones. - Use the component's Notes tab to comment on complex data processes. Add notes to explain what components are being triggered, trigger types, and the importance of each component. - Only use **Property IDs** or [grid syntax](/v1/docs/grid-syntax-and-output-snippet) in and tables, unless referring to nested data in a [Plug-In component](/v1/docs/plug-in-component). ### Checkboxes Component - Use Checkboxes when your end-user must select more than one predefined option. - Arrange Checkboxes in a single column. Consider breaking the boxes into two or more columns if the list is long or the associated text is short. - Consider using a Dropdown or Multi-Select Dropdown component if there are too many selection options. ### Columns Component - For applications that need four or more responsive columns, consider using a [Field Group component](/v1/docs/field-group-component) with CSS Flex Properties. CSS Flex allows for more control over the layout and responsiveness of the content in a column format. ### Data Table Component - Data Table components don't store data. Your module's performance improves if you store the Data Table component's outputs in other components. - If you don't plan on using disabled components in your application, remove them to ensure optimal performance. Remember to check all active components that connect to disabled components. Ensure active components still function properly after you remove the disabled ones. ### Date Input Component - Use a date picker when your end-user must select a specific date in the recent past or immediate future. Date pickers are especially helpful when the calendar context lets your end-user make a decision. For example, if your end-user selects a policy start date. - Avoid date pickers when your end-user knows the date and doesn't need a calendar. For example, a birthdate or expiration date. - Unqork recommends applying YYYY-MM-DD formats when using [MomentJS](/v1/docs/manipulating-dates-with-momentjs) formulas. This maintains data integrity when sorting due to the platform’s default sorting. - When using MomentJS, update the delimiter to a dash (-) instead of a forward slash (/) to ensure validation is correct. ### Data Mapper Component - It's best practice to build a data table with a spreadsheet tool (like Excel) when you populate the Data Mapper. Then, you can copy and paste from the spreadsheet tool into Unqork. > [!NOTE] > Ensure there isn't any sensitive data in the table. ### Data Workflow Component - For operators that require fields, like the [Formula](/v1/docs/formula-operator) operator, it is best practice to avoid using symbols and numerical values in the fields. For example, instead of using `Test1Key="value"`, use `TestOneKey="value"`. - Data Workflows timeout after five minutes in all environments. Build Data Workflows to complete operations in five minutes to prevent timeouts. - If you don't plan to use disabled components in your application, remove them to ensure optimal performance. Remember to check all active components that connect to disabled components. Ensure active components still function properly after you remove the disabled ones. - Add labels to all Data Workflow operators to describe their function. These labels make it easier to know the purpose of an operator without having to open the Info window. - Select the **Do Not Sanitize** setting in all your operators to improve application performance. - Organize Data Workflow components based on their function in your application. - Use the component's Notes tab to comment on complex data processes. Add notes to explain what components are being triggered, trigger types, and the importance of each component. #### Inputting Arguments that End with a $ Symbol When using Data Workflow input operator that connects to another operator port, the `_arg `returns `null `if the input value contains a `$ `at the end of the input. This error occurs regardless of the operator used. In this example, a Data Workflow component uses the text box input as the argument for another operator. In Express View, the DevTools Console displays the result of the Data Workflow configuration. Because the input ends with a $ symbol, the output returns as `null`. [](https://cdn.us.document360.io/15548f06-2fba-434c-b0c1-5df88317dbd7/Images/Documentation/Best%20Practices%20Config%20DataWorkflow%2001.png?sv=2026-02-06&spr=https&st=2026-11-06T21%3A38%3A16Z&se=2026-11-06T22%3A38%3A16Z&sr=c&sp=r&sig=31qmLp2kguo7vXgIB1TJWaHzx4HvrR9p%2BoaorLGp9wE%3D) To resolve this error, use a Set operator in a new Data Workflow. Configure your Data Workflow using the following steps: 1. Drag and drop a **D****ata Workflow** component onto your canvas. 2. Add the same inputs you used for your original Data Workflow that returned the null error. 3. Drag and drop a **Set** operator onto your Data Workflow canvas. 4. Configure the operator's **Info** window as follows: | Setting | Value | | --- | --- | | Category | Set | | Label | [0].text | | Path | [0].text | | Value | | 5. Connect the output port (right) of your input operators to the input ports (left) of the **Set** operator. 6. Drag and drop a **Console** operator onto your Data Workflow canvas. This will allow you to see the result of this Data Workflow configuration in your DevTools Console. 7. Connect the output port (right) of your **Set** operator to the input port (left) of the **Console** operator. [](https://cdn.us.document360.io/15548f06-2fba-434c-b0c1-5df88317dbd7/Images/Documentation/Best%20Practices%20Config%20DataWorkflow%2003.png?sv=2026-02-06&spr=https&st=2026-11-06T21%3A38%3A16Z&se=2026-11-06T22%3A38%3A16Z&sr=c&sp=r&sig=31qmLp2kguo7vXgIB1TJWaHzx4HvrR9p%2BoaorLGp9wE%3D) 8. **Save** your Data Workflow. 9. **Save** your module. In Express View, when you open the DevTools Console and enter an input that ends with a $ symbol, the Data Workflow you created will display the text correctly. [](https://cdn.us.document360.io/15548f06-2fba-434c-b0c1-5df88317dbd7/Images/Documentation/Best%20Practices%20Config%20DataWorkflow%2002.png?sv=2026-02-06&spr=https&st=2026-11-06T21%3A38%3A16Z&se=2026-11-06T22%3A38%3A16Z&sr=c&sp=r&sig=31qmLp2kguo7vXgIB1TJWaHzx4HvrR9p%2BoaorLGp9wE%3D) #### Inputting Data into Rows Using the Clean Keys Operator If workflow data returns a `null` value, use the [Clean Keys Operator](/v1/docs/clean-keys-operator) to replace the `null` value with an empty value before running other operators that manipulate the data. In the example images below, a Formula operator concatenates the **sector** key without cleaning keys. This creates inaccurate values for keys that contain `null` values: | [](https://cdn.us.document360.io/15548f06-2fba-434c-b0c1-5df88317dbd7/Images/Documentation/DWF%20CleanKeysFormula.jpg?sv=2026-02-06&spr=https&st=2026-11-06T21%3A38%3A16Z&se=2026-11-06T22%3A38%3A16Z&sr=c&sp=r&sig=31qmLp2kguo7vXgIB1TJWaHzx4HvrR9p%2BoaorLGp9wE%3D) | [](https://cdn.us.document360.io/15548f06-2fba-434c-b0c1-5df88317dbd7/Images/Documentation/DWF%20CleanKeysFormulaConsole.jpg?sv=2026-02-06&spr=https&st=2026-11-06T21%3A38%3A16Z&se=2026-11-06T22%3A38%3A16Z&sr=c&sp=r&sig=31qmLp2kguo7vXgIB1TJWaHzx4HvrR9p%2BoaorLGp9wE%3D) | | --- | --- | To resolve this issue, add a Clean Keys operator to remove `null `values, then concatenate fields using the [Create Field Operator](/v1/docs/create-field-operator). In the example images below, the Clean Keys operator replaces the **sector** key's `null `values with empty values. Then the Create Field operator concatenates the **sector** key: | [](https://cdn.us.document360.io/15548f06-2fba-434c-b0c1-5df88317dbd7/Images/Documentation/DWF%20CleanKeys%20CreateField.jpg?sv=2026-02-06&spr=https&st=2026-11-06T21%3A38%3A16Z&se=2026-11-06T22%3A38%3A16Z&sr=c&sp=r&sig=31qmLp2kguo7vXgIB1TJWaHzx4HvrR9p%2BoaorLGp9wE%3D) | [](https://cdn.us.document360.io/15548f06-2fba-434c-b0c1-5df88317dbd7/Images/Documentation/DWF%20CleanKeys%20CreateFieldConsole.jpg?sv=2026-02-06&spr=https&st=2026-11-06T21%3A38%3A16Z&se=2026-11-06T22%3A38%3A16Z&sr=c&sp=r&sig=31qmLp2kguo7vXgIB1TJWaHzx4HvrR9p%2BoaorLGp9wE%3D) | | --- | --- | To see an example of how the Data Workflow manipulates data using a Formula operator vs a Clean Key operator, click the following link: [https://training.unqork.io/#/form/66980e26ac7c4b3c7261fef6/edit](https://training.unqork.io/#/form/66980e26ac7c4b3c7261fef6/edit) ### Decisions Component - Decisions components don't store data. Your module's performance improves if you store the Decisions component's outputs in other components. - It's best practice to use aliases that denote the input. Keep them short but avoid using aliases of A, B, C, and so on. - If you don't plan on using disabled components in your application, remove them to ensure optimal performance. Remember to check all active components that connect to disabled components. Ensure active components still function properly after you remove the disabled ones. - Use the component's Notes tab to comment on complex data processes. Add notes to explain what components are being triggered, trigger types, and the importance of each component. - When using the Range type in the **Inputs** table, the Micro Decisions table does not support a value of `.length` . Instead, use the **Input** type Exact because it sets the value as a string. - Only use **Property IDs** or [grid syntax](/v1/docs/grid-syntax-and-output-snippet) in and tables, unless referring to nested data in a [Plug-In component](/v1/docs/plug-in-component). ### Dropdown and Multi-Select Dropdown Components - Avoid using Dropdown components when possible. Use Radio Button components if you have less than 5 options. It's best practice to use a Dropdown component when you have more than 5 options. - Only use the Multi-Select Dropdown component when applying multi-select or autocomplete functionality to your application. Otherwise, use the Dropdown component. These best practices enhance performance. ### Email Component Amazon SES Service Limitations: - If sending more than 3,000 emails daily, inform your CSM (customer success manager) of this requirement. - If sending more than 6,000 emails daily, discuss best practices with your CSM. ### File Component - Never augment, extend, or otherwise modify file objects in submission data. These file objects represent an Unqork file and altering them can cause issues with file uploads and downloads. - Using [logic components](/v1/docs/data-event-processing-components) to trigger a file download using the **page** or **pageOpen** Output Types is supported. But the value used with these Output Types must be a valid URL. Ideally this is the [Cloud Storage Delivery URL](https://developers.unqork.io/#section/Cloud-Storage-Delivery). - The following are some helpful formulas when dealing with file data: | Formula | Description | Syntax | | --- | --- | --- | | BASE64 | Transforms a binary value into a Base64 encoded string. | **BASE64**(value) | | TOBASE64 | Transforms a binary value into a Base64 encoded string. | **TOBASE64**(value) | | FROMBASE64 | Converts the Base64 encoded string into a binary value. | **FROMBASE64**(value) | ### Hidden Component - Use the Hidden setting to hide any component in Express View. Use the Hidden component for all non-visual fields. - The Hidden component is unique in that it holds any data structure. Other components only allow a single data structure. - It's best practice to use Hidden components when storing non-primitive [data types](/v1/docs/introduction-to-data-types-and-structures), like arrays and objects. Using other components to store non-primitives, like an array in a Text Field component, can lead to unpredictable and non-deterministic behavior. - Hidden components are invisible in Express View. This invisibility makes Hidden components great for moving information in the back-end of your module. Your information is useable elsewhere, but it isn't directly visible to your end-user. Use other components to change and reference the Hidden component's stored values. > [!NOTE] > If a module isn't set to Server Side Execution Only, end-users see the Hidden component's values in the HTML. ### HTML Element Component vs Content Component - Use the HTML Element component to add text to your module. All the text entered in the content area displays with the HTML tags applied. The HTML Element component lets you create unlimited HTML tags. - Use a Content component when adding a custom HTML block to your module. Unlike the HTML Element, Content components let you format text using any number of HTML tags. - If you need only one HTML tag, it's best practice to use an HTML Element component, not a Content component. - Delete empty HTML Elements or Content components. Keeping them unnecessarily bloats your module. - If you use an open tag in your HTML code, like