I’ve been running around in circles for three days now. I built a set of nested workflows on the free/trial version (1.123), but migrating over to 2.1 (and now 2.26) is proving to be a challenge.
my latest problem is that I have workflow A that calls workflow B, which has a database table insert node.
If I run B with mock data directly (copied from A), updates to the database are fine, but if I run B from A, then the database updates become literal (ie: {{ $json.field }}) instead of the referenced values.
I’m at my wits end. Would love some help, happy to share the workflows in DM.
It sounds like a data mapping glitch—those are the worst to track down. If the database is saving the literal code {{...}}, it usually means the expression can’t find the data path it’s looking for.
To help you spot the fix, can you share:
A JSON sample of what A is sending to B.
A JSON sample of what B actually receives.
A screenshot of the DB node settings in B.
Often in the newer versions, the path might just need a quick refresh to point to the right input!
Thanks so much for responding @Simon_Hubs really appreciate it.
Unfortunately apparently new forum users aren’t allowed to upload attachments, I’m not sure how to get around that. I’ll try reaching out to you directly on LinkedIn if I can.
Apparently I can upload images, but not json. Weird thing I noticed, in the execution screenshot I’m not seeing the ‘fx’ before those entries, but when I go to the workflow in the editor I do.. perplexing.
(I just ran a test again, and same same. if I look at the node in the editor, I see the ‘fx’ designations next to the assignments, but in the execution I don’t, and it’s all literal.
this is a known behavior change with sub-workflows in newer n8n versions.
When workflow B is called from A, the incoming data is wrapped under the execution input, and expressions like {{$json.field}} may no longer resolve the same way they do when you run B standalone with mock data. That’s why you’re seeing literals instead of values.
What to check/fix:
In workflow B, inspect the incoming JSON structure when it’s triggered by A (Execution data → Input).
Update expressions to reference the correct path (often something like {{$json.body.field}} or {{$json[0].field}}).
Avoid relying on mock data for sub-workflows — always test with real execution input.
If you’re using Execute Workflow, make sure “Wait for completion” and input mapping are set explicitly.
Once the expressions point to the actual input shape from A, the DB node will stop inserting literals and use real values again.
If you want, you can share the workflows and I can help you pinpoint the exact path to use.