The flow file
The .flowmage.json file that Export writes and Import reads: its keys, what it needs from a workspace, and what import does with it.
Export in a flow's menu on Flows writes one; Import at the top of the page reads one. Every flow diagram on this site is one too:
- Start
- Store the webhook
The keys of a flow file
One JSON object, saved as .flowmage.json. Import reads only these keys and drops any other; every key without Optional is needed.
| Key | Value |
|---|---|
format | Exactly "flowmage.flow". |
formatVersion | The number 1. |
exportedAt | When the file was written, as an ISO 8601 time such as "2026-10-22T09:00:00.000Z". |
name | The flow's name. |
graph | The canvas: nodes, edges and, if there are any, notes. A node has an id, a type, a version, a label, its config and a position. An edge has a source, a sourcePort and a target. |
requires | What the flow uses from the workspace, in lists named connections, tables, flows, secrets, schemas, files and customNodes. |
description | Optional: a line about what the flow does. |
tags | Optional: each { "name": "…", "color": "…" }. |
subflow | Optional: { "params": […] }, the parameters a calling flow passes. |
Node types and their settings are in the node reference. This whole file imports, publishes and runs; it answers a webhook with what the webhook sent:
{
"format": "flowmage.flow",
"formatVersion": 1,
"exportedAt": "2026-10-22T09:00:00.000Z",
"name": "Echo a webhook",
"graph": {
"nodes": [
{
"id": "__start__",
"type": "core.start",
"version": 1,
"label": "Start",
"config": {},
"position": { "x": 0, "y": 0 }
},
{
"id": "reply",
"type": "core.return",
"version": 1,
"label": "Reply",
"config": { "value": "{{ trigger.body }}" },
"position": { "x": 224, "y": 0 }
}
],
"edges": [{ "source": "__start__", "sourcePort": "out", "target": "reply" }]
},
"requires": {
"connections": [],
"tables": [],
"schemas": [],
"files": [],
"secrets": [],
"customNodes": [],
"flows": []
}
}How they behave
What a flow needs is matched by name, and its steps then point at what matched:
In requires | Its keys | Matches |
|---|---|---|
connections | id, name, provider | A connection with that name, for that service |
tables | id, name, optional columns | A table with that name, in any case |
flows | id, name | A flow with exactly that name |
- What does not match is left for you. The node loses it, and you pick one in the editor. Import flow lists every need under What this flow needs here, found or missing.
- Import checks the shape, not the nodes: keys, size and depth. The editor checks node types, settings and expressions, and counts what is wrong in its top bar.
- An imported flow is a draft with no trigger; import publishes nothing. A name in use gets a number, as in
Echo a webhook (2). - Export leaves things out: triggers, test data, run settings and the flow's icon; a credential typed into a field is blanked. Set them again after import.
- The file has a size limit, on Limits.
Common mistakes
formatVersionas text. Write the number1, not"1".- A missing list in
requires. Write every list, even empty; onlyflowsmay be left out. - An id a step uses that
requiresdoes not list. Import silently removes it: list every connection, table and flow the steps use. - Empty optional keys. Leave
tags,notesanddescriptionout rather than empty. - Expecting the trigger to come along. Add it on the flow's Triggers tab: How triggers start flows.