Skip to main content
for-builders

Upload & Validate Your Workflow

How to upload your n8n JSON or TypeScript workflow for publishing — accepted formats, validation, and common errors.

Written By Philippe

Last updated 3 days ago

Upload & Validate Your Workflow

The first step to publishing a workflow is uploading your workflow file. indie.money accepts two formats.

Where to Start

The upload flow lives in the Sell tab, not the Marketplace or Run tabs.

  1. Open the Sell tab in the top navigation — the Sell console
  2. Click + New workflow
  3. Upload your file (steps below)

Your published workflows then appear under Published Workflows → Listed workflows.

Accepted Formats

FormatExtensionSource
n8n JSON.jsonExport from n8n via "Download Workflow" button
TypeScript.tsWritten using the @indie-money/workflow-sdk

Zapier and Make.com formats are not yet supported.

How to Export from n8n

  1. Open your workflow in n8n
  2. Click the three-dot menu (⋮) in the top right
  3. Select Download
  4. Save the .json file

Validation Step

After uploading, indie.money automatically validates your workflow:

Common Validation Errors

ErrorCauseFix
Unsupported node: [node_type]Node not in supported listReplace with a supported alternative or remove the node
Invalid JSONFile is malformedRe-export from n8n; do not manually edit the JSON
No trigger node foundWorkflow has no starting pointAdd a trigger node (Webhook, Schedule, Manual)
Execute Workflow node detectedSub-workflow dependency foundDeploy the sub-workflow first, then map its address in the Connect step (step 2)
Wait time exceeds the 5 minute run limitA Wait node is configured for longer than a single run may takeShorten the wait, or split the work across runs with a Schedule Trigger. See Wait Node
[name] is not available in Code nodesA Code or Function node calls something the sandbox does not provide — setTimeout, setInterval, URL, URLSearchParams, structuredClone, fetch, require, process.env, $env, $secrets, $getWorkflowStaticData, $evaluateExpression, $fromAI, $tool, $getPairedItem, $execution.customData, Intl.RelativeTimeFormat, or a crypto.subtle key functionUse the alternative the message names. See Code Node
The [header] request header is removed before the workflow sees the requestThe workflow reads authorization, cookie, x-forwarded-for, cf-connecting-ip, x-real-ip, x-ph-distinct-id, payment-signature or sign-in-with-x from a Webhook node's headersHave the caller send the value in a custom header (for example x-caller-token) or a query parameter, and read that. See Webhook Node
[name] is not available in expressionsAn ={{ }} expression uses setInterval, $env or $evaluateExpressionUse the Wait node (setInterval), $vars ($env), or write the expression in the field itself ($evaluateExpression)
$() needs a node nameAn ={{ }} expression calls $() with no node nameWrite the node's name: $('NodeName')
unsupported syntax: async function (or await)An ={{ }} expression uses async or await. An expression returns its value at once, so a promise never settlesRemove the async / await, or move the step to a Code node
This URL calls the workflow's own Webhook node by its n8n pathAn HTTP Request node URL ends in /webhook/<path> or /webhook-test/<path> for a Webhook node in the same workflowThe webhook address is assigned at turn-on. Read it from a $vars value: set a placeholder before turn-on, then replace it with the address the dashboard shows
This node name is reserved by the platformA node is named __x402-overhead__ or __self-run-fee__, names the platform uses for its fee linesRename the node in n8n, then re-export and re-upload

Naming Your Workflow Nodes

You can name your workflow nodes anything that helps you read the workflow — Fetch, Merge, Data, whatever fits the step. Two names are reserved for the platform's fee lines: __x402-overhead__ and __self-run-fee__. Node names are labels on the graph; they are never executed as code.

The logic inside node parameters runs in an isolated sandbox: no direct outside calls. Use indie.money node types (HTTP Request, OAuth-credentialed nodes, etc.) when a step needs to reach external services.