System fields
All editionsModern DFFS recognizes a small set of optional list columns. If a column with one of these internal names exists in your list, DFFS fills it in automatically on save. If it doesn’t exist, nothing happens — there is no setting to switch on and no penalty for leaving them out. You opt in purely by adding the column.
1. The fields
| Internal name | Type | What DFFS writes |
|---|---|---|
DFFSSaveType | Single line of text | How the item was saved: save, saveandedit, quicksave or autosave. See Section 3. |
_DFFSID | Single line of text | A unique id generated when the item is first saved — a timestamp, e.g. 1675185443242. Stable for the life of the item. |
_vLookupID | Single line of text | A unique id in the format userId:timestamp, e.g. 12:1675185443242. Legacy — see Section 4. |
Why do two of them start with an underscore? Purely for backwards compatibility with Classic DFFS, which used those exact names. New system fields drop the underscore — which is why the newest one is
DFFSSaveTypeand not_DFFSSaveType. The underscore carries a real cost (see the next section), so there is no reason to repeat it in new work.
2. Creating the columns
Columns without a leading underscore
Add a Single line of text column and name it exactly DFFSSaveType — no spaces. The modern Add column UI is fine for this.
SharePoint derives the internal name from the name you give the column at creation time, so “DFFS Save Type” would become DFFS_x0020_Save_x0020_Type and DFFS would never find it. Once the column exists you can rename the display name to anything you like — the internal name stays put.
Columns with a leading underscore
The modern list UI cannot create these. Adding a column called
_DFFSIDfrom the + Add column button in the list view will not produce the internal name_DFFSID. You must create it from List settings instead.
- Open the list, then Settings (gear) → List settings.
- Under Columns, choose Create column.
- Type the name exactly —
_DFFSIDor_vLookupID— and pick Single line of text. - Save. Verify the internal name by opening the column again and reading the
Field=parameter at the end of the browser’s address bar.
The same applies to any other tooling that sets the internal name directly (PnP PowerShell, REST, a site column in a template) — the restriction is in the modern Add column UI, not in SharePoint itself.
3. DFFSSaveType — controlling Power Automate flows
Modern DFFS saves the item to SharePoint on a Quick save and on every Auto save tick, not just when the user finishes the form. Any flow using the standard “When an item is created or modified” trigger therefore fires on those intermediate saves too — long before the user is done.
DFFSSaveType gives the flow something to test, so it can tell a real save from an intermediate one:
| Value | Written when |
|---|---|
save | The user clicks Save / Save and exit — including the finish button on the last step of a multi-step form. |
saveandedit | The user clicks Save and open in EditForm from NewForm. |
quicksave | The user clicks Quick save (the form stays open). |
autosave | The form is saved by the automatic save interval. |
In the flow, open the trigger’s Settings → Trigger conditions and add a condition so the flow only runs on a real, final save:
@equals(triggerOutputs()?['body/DFFSSaveType'], 'save')
To run on both save variants:
@or(equals(triggerOutputs()?['body/DFFSSaveType'], 'save'), equals(triggerOutputs()?['body/DFFSSaveType'], 'saveandedit'))
Using a trigger condition rather than a Condition action means no flow run is created at all for the saves you don’t care about — quick saves and autosaves never consume a run.
No
OData_prefix here. SharePoint’s REST/OData layer — which is what Power Automate reads — exposes a field whose internal name starts with an underscore under anOData_prefix, so_DFFSIDarrives asOData__DFFSID. BecauseDFFSSaveTypehas no underscore, what you see is what you type.
Two things worth knowing
- The values are fixed English tokens and will never be localized or renamed. They are part of the API surface your trigger conditions are built on — a form displayed in Norwegian still writes
quicksave. - The value stays on the item until the next DFFS save. If someone later edits the item in Quick Edit, in a view, or from a script, the field still reads
savefrom the last DFFS save, and the flow triggers again. Where that matters, have the flow’s first action write a different value back (for exampleprocessed, or clear the field): the trigger condition then blocks the flow’s own update from re-triggering it, and a later non-DFFS edit won’t match the condition either.
The Misc tab → Save & actions group tells you whether
DFFSSaveTypewas found in the current list, so you can confirm the column was created with the right internal name without leaving the form builder.
Adding the column does not make Quick save or Auto save write to SharePoint any more often than before — the value rides along with a save that was going to happen anyway, and idle autosave ticks are still skipped.
4. _DFFSID and _vLookupID
Both are unique-id columns that DFFS populates automatically when the item is created. Their purpose is to give an item a stable identifier that is available in the form, so it can be copied into a related item — something the built-in ID column can’t do on a NewForm, because SharePoint hasn’t assigned it yet.
_DFFSID
The current one. The value is a timestamp such as 1675185443242. Its most common use is linking a child item back to its parent: when a child is created from the parent’s form, the parent’s _DFFSID is transferred into a plain text column on the child, and that column becomes the relationship. Because it’s ordinary text rather than a lookup, it works even when the two lists live in different sites — see the Repeating Sections guide.
_vLookupID Legacy
Kept for compatibility with Classic DFFS. Classic’s vLookup used a column of this name, in the format userId:timestamp (e.g. 12:1675185443242), and Modern DFFS still auto-populates it so imported configurations and existing lists keep working unchanged.
Don’t add
_vLookupIDto a new list. It exists so Classic configurations survive the move to Modern DFFS. For anything new, use_DFFSID.
5. Notes
- All three columns are optional. A list without them behaves exactly as it always has.
- DFFS only writes these columns; it never requires them to be visible on the form. Hide them from your views if you’d rather users didn’t see them.
- The internal name is what matters, not the display name. Rename the display name freely after the column exists.