FlowmageDocs

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:

  1. Start
  2. Store the webhook
Save incoming webhooks to a tableDownloadOpen in Flowmage

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.

KeyValue
formatExactly "flowmage.flow".
formatVersionThe number 1.
exportedAtWhen the file was written, as an ISO 8601 time such as "2026-10-22T09:00:00.000Z".
nameThe flow's name.
graphThe 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.
requiresWhat the flow uses from the workspace, in lists named connections, tables, flows, secrets, schemas, files and customNodes.
descriptionOptional: a line about what the flow does.
tagsOptional: each { "name": "…", "color": "…" }.
subflowOptional: { "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 requiresIts keysMatches
connectionsid, name, providerA connection with that name, for that service
tablesid, name, optional columnsA table with that name, in any case
flowsid, nameA 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

  • formatVersion as text. Write the number 1, not "1".
  • A missing list in requires. Write every list, even empty; only flows may be left out.
  • An id a step uses that requires does not list. Import silently removes it: list every connection, table and flow the steps use.
  • Empty optional keys. Leave tags, notes and description out rather than empty.
  • Expecting the trigger to come along. Add it on the flow's Triggers tab: How triggers start flows.