This guide walks you through building a UI module that lets Creators upload a CSV file and import its records into a Data Model in bulk. The module handles the full sequence: generating an upload URL, uploading the file, running the import, and checking job status, all from a single button click.
Download the example module bundle to use as a starting point. After importing, replace every placeholder before using the module:
Placeholder | Appears in | Replace with. |
|---|---|---|
|
| The ID of the target Data Model or module. |
|
| A comma-separated list of field names to display from existing records (for example, |
Prerequisites
Creator or Express Administrator access to your workspace.
A target Data Model to receive the imported records.
A CSV file with data matching your Data Model's field structure.
Familiarity with the Plug-In, Decisions, and File components.
Module Overview
Organize the module into three field groups: for initialization logic, for the Creator-facing UI, and for the backend Plug-In component sequence.
Name | Key | Component | Purpose |
|---|---|---|---|
On-Load Initializer |
| Initializer | Triggers |
List Submissions |
| Plug-In | Loads existing records from the target module on page load. |
Refresh Button |
| Button | Lets the Creator check import status manually; enabled when a job is running. |
File Upload |
| File | Accepts the CSV the Creator wants to import. |
Enable Button Rule |
| Decisions | Enables |
Import Button |
| Button | Starts the upload and import sequence. |
Success Initializer |
| Initializer | Sets the response field to indicate success. |
Error Initializer |
| Initializer | Sets the response field to indicate failure. |
Generate Upload Link |
| Plug-In | Calls the Upload-Link endpoint to get a pre-signed URL. |
Upload File |
| Plug-In | Posts the file bytes to the upload URL. |
Import Records |
| Plug-In | Calls the Import endpoint with the returned file key. |
Get Job Status |
| Plug-In | Checks import progress using the job ID. |
Check Status Rule |
| Decisions | Shows a status message and resets the form when complete. |
The example Property IDs in this guide use a
pluginprefix (for example,pluginExport) for clarity. The platform default for Plug-In components isplug— see Property ID Naming Conventions.
How to read settings tables
The tables below describe each configurable option as it shows in the platform. Values are formatted as follows:
inline code— a value to type exactly as shown | Bold — a value selected from a drop-down, radio button, tab, or choice chip | ON/OFF — toggle state | ✓ — checkbox checked | ☐ — checkbox unchecked
Set Up the Field Groups
Create three field groups in the module to keep components organized.
Field Group | Contains |
|---|---|
| The on-load Initializer and the submissions list Plug-In. |
| The buttons, file component, and enable rule the Creator interacts with. |
| All import Plug-In components, status logic, Initializers, and hidden fields. |
Create the Supporting Fields
Add the following fields to fgConfig. These fields carry data between components throughout the upload and import sequence.
Property ID | Component | Default | Purpose |
|---|---|---|---|
| Hidden | — | Stores the pre-signed upload URL returned by |
| Hidden | — | Stores the Unqork file key returned after the file upload. |
| Hidden | — | Stores the import job ID returned by |
| Hidden | — | Stores the current job status returned by |
| Hidden | — | Set to |
Configure initOnload
The initOnload Initializer component fires when the module first loads and triggers the pluginListSubmission Plug-In component to populate the existing records view.
Add an Initializer component to
fgOnLoad.Configure the following settings:
Setting
Value
Property ID
initOnloadTrigger Type
New Submission
Configure the Outputs:
#
Property ID
Type
Value
1
pluginListSubmissionTrigger
GO
Configure pluginListSubmission
The pluginListSubmission Plug-In component loads existing records from the target module when the page renders. It is triggered by the initOnload Initializer component and has no outputs. The platform writes the response data directly to any connected display components.
Add a Plug-In component to
fgOnLoadafterinitOnload.Configure the following settings:
Setting
Value
Property ID
pluginListSubmissionTrigger Type
Manual
Endpoint URL
https://{environment}.unqork.io/fbu/uapi/system/getSubmissionsMethod
Configure the Inputs:
#
Property ID
Value
1
moduleId'REPLACE_WITH_MODULE_ID'2
fields'REPLACE_WITH_FIELDS'(comma-separated field names to return, for example'firstName,lastName,email')
Configure fileUpload
The fileUpload File component captures the CSV the Creator selects. After a file is chosen, it triggers the ruleFileUpload Decisions component to enable the import button.
Add a File component to
fgUI.Configure the following settings:
Setting
Value
Property ID
fileUploadLabel
Upload FileAccepted File Types
.csvUnder Triggers, set the Post Upload drop-down to
ruleFileUpload.
Configure ruleFileUpload
The ruleFileUpload Decisions component checks whether a file has been selected and enables the btnBulkImport Button component when is present. It is triggered by the fileUpload File component after each file selection.
Add a Decisions component to
fgUIafterfileUpload.Configure the following settings:
Setting
Value
Property ID
ruleFileUploadTrigger Type
Manual
Configure the Inputs:
#
Property ID
Alias
Type
1
fileUploadAExact
Configure the Outputs:
#
Property ID
Type
1
btnBulkImportDisabled
Add row in the Decision grid:
fileUploadbtnBulkImport_disabled(wildcard)
=IF(LEN(A)>0,'no','yes')
Configure btnBulkImport
The btnBulkImport Button component starts the upload and import sequence. It starts disabled and is enabled by the ruleFileUpload Decisions component a file is selected. On successful validation, it triggers the pluginGenerateUploadLink Plug-In component.
Add a Button component to
fgUIafterruleFileUpload.Configure the following settings:
Setting
Value
Property ID
btnBulkImportLabel
Bulk ImportAction
Validate
Initial State
Disabled
Under Triggers, set the On Validation Success drop-down to
pluginGenerateUploadLink.
Configure btnRefresh
The btnRefresh Button component lets the Creator manually re-check import job status. It triggers the pluginGetJobDetails Plug-In component on click, and the ruleCheckStatus Decisions component enables it a job is running. It starts disabled.
Add a Button component to
fgUIabovefileUpload.Configure the following settings:
Setting
Value
Property ID
btnRefreshLabel
RefreshAction
Event
Initial State
Disabled
Under Triggers, set the On Click drop-down to
pluginGetJobDetails.
Configure initSuccess
The initSuccess Initializer component sets the response field to Success when the import completes. It is triggered by components that confirm a successful outcome.
Add an Initializer component to
fgConfig.Configure the following settings:
Setting
Value
Property ID
initSuccessTrigger Type
Manual
Configure the Outputs:
#
Property ID
Type
Value
1
responseValue
Success
Configure initError
The initError Initializer component sets the response field to Fail when something goes wrong. All Plug-In components in fgConfig reference it as their error handler.
Add an Initializer component to
fgConfigafterinitSuccess.Configure the following settings:
Setting
Value
Property ID
initErrorTrigger Type
Manual
Configure the Outputs:
#
Property ID
Type
Value
1
responseValue
Fail
Configure pluginGenerateUploadLink
The pluginGenerateUploadLink Plug-In component gets a pre-signed URL for uploading the file to the Unqork Cloud. It is triggered by the btnBulkImport Button component. On success, it triggers the pluginUploadFile Plug-In component.
Add a Plug-In component to
fgConfig.Configure the following settings:
Setting
Value
Property ID
pluginGenerateUploadLinkTrigger Type
Manual
Endpoint URL
https://{environment}.unqork.io/fbu/uapi/bulkOperations/uploadLinkMethod
POST
No Inputs are required for this endpoint.
Configure the Outputs:
#
Property ID
Value
1
uploadLinkuploadLinkUnder Triggers, set the Post Trigger drop-down to
pluginUploadFileand the Error Handler drop-down toinitError.
Configure pluginUploadFile
The pluginUploadFile Plug-In component posts the file bytes to the pre-signed URL using multipart/form-data. It is triggered by the pluginGenerateUploadLink Plug-In component. On success, it triggers the pluginBulkImportRecord Plug-In component. The endpoint URL is built dynamically from the uploadLink field.
Add a Plug-In component to
fgConfigafterpluginGenerateUploadLink.Configure the following settings:
Setting
Value
Property ID
pluginUploadFileTrigger Type
Manual
Endpoint URL
/api{{data.uploadLink}}Method
POST
Multipart
ON
Configure the Headers:
#
Property ID
Value
1
Connect-Typemultipart/form-dataConfigure the Inputs:
#
Property ID
Value
1
filefileUpload[0]['url']Enable Resolve Base64 on the
fileinput so the platform sends the file bytes rather than the base64 string.Configure the Outputs:
#
Property ID
Value
1
fileKeyfileKeyUnder Triggers, set the Post Trigger drop-down to
pluginBulkImportRecordand the Error Handler drop-down toinitError.
Configure pluginBulkImportRecord
The pluginBulkImportRecord Plug-In component calls the Import endpoint using the fileKey from the upload step. It is triggered by the pluginUploadFile Plug-In component. On success, it triggers the pluginGetJobDetails Plug-In component to begin polling.
Add a Plug-In component to
fgConfigafterpluginUploadFile.Configure the following settings:
Setting
Value
Property ID
pluginBulkImportRecordTrigger Type
Manual
Endpoint URL
https://{environment}.unqork.io/fbu/uapi/bulkOperations/importMethod
POST
Configure the Inputs:
#
Property ID
Value
1
dataModelOrModuleId'REPLACE_WITH_MODULE_ID'2
fallbackRecordOwnercurrentUser['email']3
fileFormat'CSV'4
fileLocationfileKey5
namefileUpload[0]['name']6
storeInData'true'Configure the Outputs:
#
Property ID
Value
1
statusdata.status2
jobIdidUnder Triggers, set the Post Trigger drop-down to
pluginGetJobDetailsand the Error Handler drop-down toinitError.
Configure pluginGetJobDetails
The pluginGetJobDetails Plug-In component checks the status of the import job. It is triggered by the pluginBulkImportRecord Plug-In component on success, and by the btnRefresh Button component when the Creator clicks it manually. On completion, it triggers the ruleCheckStatus Decisions component.
Add a Plug-In component to
fgConfigafterpluginBulkImportRecord.Configure the following settings:
Setting
Value
Property ID
pluginGetJobDetailsTrigger Type
Manual
Endpoint URL
https://{environment}.unqork.io/fbu/uapi/bulkOperations/jobs/{{data.jobId}}Method
GET
Configure the Outputs:
#
Property ID
Value
1
statusdata.statusUnder Triggers, set the Post Trigger drop-down to
ruleCheckStatus.
All BDO endpoints in this module use the
bulkOperations(camelCase, no hyphen).
Configure ruleCheckStatus
The ruleCheckStatus Decisions component reads the job status written by the pluginGetJobDetails Plug-In component, triggers a pop-up message, and enables the btnRefresh Button component while the job is running. When the job reaches completed, it clears and resets fgUI so the Creator can start another upload.
Add a Decisions component to
fgConfigafterpluginGetJobDetails.Configure the following settings:
Setting
Value
Property ID
ruleCheckStatusTrigger Type
Manual
Configure the Inputs:
#
Property ID
Alias
Type
1
jobIdAExact
2
statusExact
Configure the Outputs:
#
Property ID
Type
1
btnRefreshDisabled
2
fgUIPop Message
3
fgUIMulti
Add row per job status in the Decision grid:
Status
btnRefresh_disabledfgUI_popMessagefgUI_multicreated=IF(LEN(A)>0,'no','yes')Import started.inProgress=IF(LEN(A)>0,'no','yes')Import in progress.completed=IF(LEN(A)>0,'no','yes')Import complete.clear.resetpartiallyCompleted=IF(LEN(A)>0,'no','yes')Import partially complete.canceled=IF(LEN(A)>0,'no','yes')Import canceled.failed=IF(LEN(A)>0,'no','yes')Import failed.The formula in the disabled column uses
A(thejobIdalias). Theclear.resetmulti-action oncompletedclearsfgUIand resets the form for the next upload.
Test the Module
Open the module in Preview.
Select a CSV file using the Upload File component. The Bulk Import button enables when a file is present.
Click Bulk Import.
Click Refresh until the pop-up message reads
Import complete.Open the submission using the platform's submission inspection method. See Debugger for how to access submission data from Express View.
Confirm the
jobIdandstatusfields contain the expected values.Navigate to the target Data Model's Record Collection to verify the imported records appear.
Changelog
Date | Change. |
|---|---|
2026-10-01 | Full restructure: field groups table, per-component Configure sections, Inputs/Outputs as UI-matching tables, Test the Module section, bundle download link (EN-8164). |
2026-09-30 | Initial publication (EN-8164). |