Lookup List Sync

Lookup List Sync keeps a list of Records - a vendor list, a chart of accounts, a parts catalog, an employee roster - matched up to a CSV file in one pass. Instead of importing the file row by row, the action reads the whole file, compares it to the Records already in the system, and then only writes what actually changed: new rows become new Records, changed values are updated, and Records whose values all still match are left completely untouched. Because unchanged Records are not re-saved, running the same file again and again does not fill your audit history with no-op changes, and an "updated" count always means values really were written.


The CSV file

The first row of the file must contain the column names, and each following row is one entry in the list. Files produced by spreadsheet programs work as-is: quoted values, commas and line breaks inside quotes, and rows that end with an extra empty value are all accepted.


A common setup is a Record that receives the file - by upload, by import, or by a REST call that saves the response as a document - and then runs this action, either from workflow routing, from an Add-In button, or on a schedule.


The action's settings are organized into tabs.


Destination

Target Record Type is the list being maintained. It does not need to be the type of the Record the action runs on - that Record only carries the CSV file.


Source

CSV Document finds the file on the current Record: the newest document matching the Category, Sub Category, and Name you enter. Leave all three empty to use the newest document on the Record.


CSV Text is an alternative source: a variable that provides the CSV text itself, such as [FieldName] to read it from a field on the Record. When this is filled in it is used instead of the document.


Matching

Match Fields identify which CSV row belongs to which Record - for example an account number or vendor ID. Enter one field name per line. At least one is required. For Number and Date fields, matching is forgiving about formatting, so a value like 1,500 in the file still finds a Record stored as 1500, and 8/27/2026 finds 2026-08-27. For Text fields the value must match exactly as written, so 0145 in the file is not the Record stored as 145 - it is treated as a new row, and under Full Sync the old Record is deactivated. Run a Dry Run first when a file's formatting may have changed. The action does its own matching, so the target Record Type does not need - and should not use - Match fields of its own.


Compare Fields are the columns that count as changes. Leave it empty to compare every CSV column except the match fields. If your file carries columns that change on every export - a run timestamp, a sync counter - list only the columns that matter here, and those noisy columns will no longer make every row look changed. Compare Fields also controls what is written: columns outside the list are never written to existing Records, though every column is still written when a brand new Record is added. When columns are mapped, use the field names here, not the file's headers. Values in Number and Date fields are compared by what they mean, not how they are formatted: 250 and 250.00 are the same amount, and 8/27/2026 and 2026-08-27 are the same date, so formatting differences in the file do not cause updates. Fields defined as Text on the target Record Type are compared and matched exactly as written, so correcting a part number from 1233 to 1233.0 in a Text field is a real update and will be written. To correct the formatting of a Number or Date match field itself, include that field in Compare Fields.


Mapping and Defaults

Column Mapping handles files whose headers do not match your field names - common when the file comes from another system you do not control. Each mapping row renames one CSV column to a Record field before anything else happens: a file with a VENDOR_NO column can feed an Account field. Columns you do not map keep their own header name, and every other setting in the action uses the field names, never the file's headers. Leave the Record Field side of a row empty to ignore that column entirely, which is handy for junk columns you never want compared or written.


Default Values for New Records fill in fields the file leaves empty or does not include. New Records automatically receive the values that make them belong to the Target Record Type, so the file does not need a Record Type column. Defaults only apply when a new Record is created - a value from the file always wins, and existing Records are never changed by a default.


Options

Pre-Check File controls what happens when the file has problems, and it is on by default. With it on, the entire file is checked first and the action fails if any row has a problem - nothing at all is written, and the results list the problem rows so the file can be fixed. With it off, the good rows are processed normally, the problem rows are reported and skipped, and Full Sync deactivation is skipped whenever any problem was found. Turn it off when the file comes from a system you do not control and an occasional bad row should not stop the whole list from staying current.


Full Sync also deactivates Records that are missing from the file, so the list ends up exactly matching the file. Deactivated Records are recoverable - they are deleted the same way as a normal Record delete, never purged. As a safety measure, deactivation only ever runs against a perfect file: if any row had a problem, or the file has no data rows, the deactivation step is skipped and the results say so - a malformed or empty file can never empty the list, regardless of any other setting. When changing the file layout, run a Dry Run first.


Dry Run reconciles and reports without writing anything, and its results include each would-be change as old and new values - with invisible characters such as line breaks spelled out - so you can see exactly what a file would do before letting it.


Bypass Record Type Merge is on by default. New Records are always added as new, even if the Target Record Type has Match Fields of its own, because this action already matched every row against the list. Turn it off only if you want new rows to go through the Record Type's own matching, which can update an existing Record instead of adding one.


How changes are detected

Values are compared by what they mean, not how they are formatted: 250 and 250.00 are the same amount, and 8/27/2026 and 2026-08-27 are the same date, so formatting differences in the file do not cause updates. The exception is fields defined as Text on the target Record Type - those are compared exactly as written, so correcting a part number from 1233 to 1233.0 in a Text field is a real update and will be written. To correct the formatting of a match field itself, include that field in Compare Fields.


Results

Each run reports to the workflow log and fills two Temp Variables that the actions after it can use. [DMTMP(LISTSYNC_SUMMARY)] holds a one-line result with the counts - how many rows were added, updated, unchanged, and deactivated. [DMTMP(LISTSYNC_DETAILS)] holds the detail for troubleshooting: the IDs of the Records that were added, updated - with the names of the fields that changed on each - and deactivated, plus any rows that could not be processed, such as rows whose match values are empty or duplicated in the file. Use the variables however fits your process: a Send Email action to notify someone, an Add Record Note action to keep the results on a Record, or a filter that reacts to the outcome. The variables are filled even when Pre-Check File stops the run, so the reason is always available to the workflow.


Good to know

  • Changes made by the sync never start workflow on the list's Records. The Record the action runs on routes normally; the list itself stays quiet.
  • For large files, run the action from a deferred Action Set so it processes in the background.
  • Rows are matched to Records one to one: if the file contains the same match value twice, the first row is used and the rest are reported as errors.