How it works
- Step 1Request the report in Seller Central — Inventory → Inventory Reports → request
Active Listings Report(50,000 row cap) orAll Listings Report. Orders, Payments and FBA reports live under their own menus. Download the file but do not open it in Excel — open it and the corruption happens before this workflow ever sees it. - Step 2Fork the workflow — Click
Fork to my drafts. Forking requires you to be signed in; it copies the 4-node graph plus each node's config into a private draft you own, wired csv-cleaner → csv-find-replace → csv-column-filter → csv-header-rename, and snapshots it as version 1. No tier is required to fork — every node is Free-tier. - Step 3Drop the file onto Step 1 — Drag the tab-delimited
.txtonto the csv-cleaner node. Processing runs locally in your browser; the file is never uploaded to our servers. Watch each node flip pending → running → done in the run panel. - Step 4Adjust Step 2 to literal match — The seeded find string
_small\.assumes regex, but the workflow node matches literally. Change find to_small.so it patches real URLs. For a multi-suffix regex sweep (_small/_thumb/_medium), run the standalone csv-find-replace with regex mode on. - Step 5Retarget Step 3 for your report type — Active/All Listings have no
Statecolumn, so the defaultState = COMPLETEDfilter passes every row — leave it. For Settlement or Order reports, point the column/value at the status field you actually want to keep (e.g.transaction-type=Order), then re-run with a second value to split files. - Step 6Re-upload and check the Feed Processing Summary — Catalog → Add Products via Upload. After every upload, download the
Feed Processing Summaryfrom Inventory → Upload Status. Amazon reports the main job as 'successful' even when individual rows were silently rejected (error 8541) — the per-row truth is only in that summary. Your workflow's run trace is saved separately under the workflow's Runs list for your own audit trail.
The node chain (real blueprint)
Forking places these four nodes in a left-to-right chain (240px stride) and wires consecutive csv out→in ports. All four ports are compatible, so no edges are skipped. Config shown is exactly what the blueprint ships; the runtime column flags any option the orchestrator node does NOT forward to the engine.
| Step | Tool | Blueprint config | Runtime behaviour |
|---|---|---|---|
| 1 | `csv-cleaner` | trimWhitespace:true · removeEmptyRows:true · repairRows:true · deduplicate:false · delimiter:\t · skipRows:0 · normalizeSmartQuotes:true | Honours trimWhitespace; always removes empty rows + repairs. **delimiter, skipRows, normalizeSmartQuotes are NOT forwarded** — delimiter is auto-sniffed (tab detected). |
| 2 | `csv-find-replace` | find:_small\. · replace:. · caseSensitive:true · useRegex:true | Honours find/replace/caseSensitive. **useRegex is NOT forwarded** → literal match; use find _small. on the canvas. |
| 3 | `csv-column-filter` | column:State · operator:equals · value:COMPLETED · caseSensitive:false | Keeps rows where State equals COMPLETED. Missing column → all rows pass. Fully editable. |
| 4 | `csv-header-rename` | renames:{seller-sku→sku, asin1→asin, fulfilment-channel→fulfillment-channel} | Renames headers by name or index. Unknown names are skipped silently. |
Fork / schedule / credential / tier matrix
What this workflow needs from the orchestrator runtime, grounded in the fork route, tier precheck and run-history routes.
| Capability | This workflow | Detail |
|---|---|---|
| Fork | Sign-in required, any tier | POST /api/orchestrator/workflows/from-blueprint copies the graph + config into a private draft you own, snapshots v1, and writes a forked audit event tagged with the blueprint slug. |
| Tier to run | **Free** (no gate) | precheckWorkflowTier requires the strictest node minTier; all four CSV tools carry no minTier, so they default to free and the precheck never blocks this graph. |
| Schedule (cron) | **None by default** | The blueprint ships scheduleCron: null — it runs on demand. The platform does support cron (enqueue accepts source:"cron"), but you'd add a schedule yourself after forking. |
| Credentials | **None needed** | Pure CSV file tools with no API connectors. Files are processed client-side in your browser and are never uploaded to our servers — there are no secrets to store. |
| Run history / trace | Saved per run | workflow_runs keeps started_at, status, trace, input/output summaries; list the last 50 via GET /api/orchestrator/workflows/{id}/runs. Lifecycle events also land in workflow_audit_events. |
Amazon Feed Processing error codes (verbatim from Seller Central)
Verbatim wordings from Amazon's Feed Processing Summary — the per-row error report under Inventory → Upload Status.
| Code | Verbatim wording | Cause | Fix |
|---|---|---|---|
| **5000** | Your XML document is in the wrong format or is invalid. | Feed malformed: wrong delimiter, header missing/misordered, BOM mishandled, encoding mismatch, or curly quotes. | Let Step 1 sniff tab and repair rows; for curly quotes, pre-clean with the standalone csv-cleaner (normalizeSmartQuotes: true) since the node does not fold quotes. |
| **8005** | SKU [X] is invalid because the price is missing or invalid. | price empty, has a currency symbol, is bracket-negative, or has a thousands separator. | Strip symbols/separators with a csv-find-replace step before upload. |
| **8016** | Not enough product data to create the variation relationship between the parent and child products. | Parent/child variation-theme mismatch, or parent missing required variation columns. | Match variation-theme exactly on both rows. Manual. |
| **8541** | The SKU data you provided is different from what we have in our catalog. We have updated the data based on what is in our catalog. | Row's item-name / brand disagrees with the existing ASIN's catalogue. The update is **silently rejected**. | Match the existing catalogue exactly, or file a Brand Registry ticket. A trailing-whitespace SKU trips this too — Step 1's trim fixes that case. |
| **8542** | The product identifier you provided is associated with multiple ASINs in our catalog. | Your product-id matches more than one existing ASIN. | Submit using asin1 directly instead of product-id (Step 4 renames asin1→asin). |
| **8560** | At least one piece of mandatory information related to your product is missing. | A category-required field is blank (brand, manufacturer, bullet-point-1). | Check the category flat-file template — required columns are highlighted in red. |
| **99001** | Skipped due to a previous error in the feed. | An earlier row failed catastrophically; Amazon abandoned processing. | Fix the first reported error and re-upload. |
Cookbook
The forked graph is fixed: csv-cleaner → csv-find-replace → csv-column-filter → csv-header-rename, wired first-output to first-input on the csv port (all four are mutually compatible, so no edges are skipped on fork). What changes per report is the node config. Each recipe below shows the config to set on the canvas after forking. Important runtime note: the orchestrator's csv-cleaner node honours trimWhitespace and always repairs rows + drops blanks, but it does NOT forward skipRows, delimiter, or normalizeSmartQuotes to the engine — those options exist on the standalone csv-cleaner tool, not on the workflow node. Delimiter is auto-sniffed, so tab still works; for a header preamble or curly-quote folding, pre-clean with the standalone tool first. Likewise the csv-find-replace node runs in literal (non-regex) mode regardless of a useRegex flag — see the image-URL recipe.
Active Listings Report → re-importable file
ExampleThe default path. Drop the tab-delimited Active Listings .txt onto Step 1. The cleaner sniffs tab, trims, repairs rows; find/replace patches image URLs; the filter keeps COMPLETED rows (a no-op on Active Listings, which has no State column — every row passes); header rename maps seller-sku→sku, asin1→asin.
csv-cleaner { trimWhitespace: true } # tab auto-sniffed; rows repaired; blanks dropped
csv-find-replace { find: "_small.", replace: ".", caseSensitive: true }
csv-column-filter { column: "State", operator: "equals", value: "COMPLETED" } # no State col => keeps all
csv-header-rename { renames: {"seller-sku":"sku","asin1":"asin","fulfilment-channel":"fulfillment-channel"} }Fix image URLs literally (the _small suffix)
ExampleAmazon rejects derived thumbnail URLs. The default config sends find=_small\. which only works as a regex — but the workflow node runs find/replace in LITERAL mode, so _small\. would look for a real backslash. Change the find string to the literal _small. (no backslash) on the canvas. To use an actual regex (e.g. strip _small, _thumb, and _medium in one go), run the standalone csv-find-replace tool with regex mode on instead.
# In the workflow node (literal match):
csv-find-replace { find: "_small.", replace: ".", caseSensitive: true }
# In the standalone tool (regex mode), to catch all three suffixes:
find: _(small|thumb|medium)\.
replace: .
useRegex: trueSettlement / Order Report → keep only settled rows
ExampleReports with a status column (Settlement Flat-File, Order reports with order-status) often mix pending and final rows. Step 3 keeps rows whose State equals COMPLETED (case-insensitive). For a Settlement Report keyed on transaction-type instead, retarget the same node to that column and value.
# Default (status/State column):
csv-column-filter { column: "State", operator: "equals", value: "COMPLETED", caseSensitive: false }
# Settlement Report variant (keep order lines for accounting):
csv-column-filter { column: "transaction-type", operator: "equals", value: "Order" }
# Re-run with value: "Refund" to produce a second fileRound-trip an export back into Seller Central
ExampleActive/All Listings columns differ from what Add Products via Upload expects. Step 4 renames the export headers toward Inventory Loader names. You still must add an add-delete column (value u for update) yourself before uploading — the workflow renames headers but does not invent new columns.
csv-header-rename { renames: {
"seller-sku": "sku",
"asin1": "asin",
"fulfilment-channel": "fulfillment-channel"
} }
# then add a column add-delete = u on every row before re-uploadPre-clean an Inventory Loader template (two header rows)
ExampleThe Inventory Loader template ships with a version banner row (TemplateType=... Version=...) above the real header. The workflow node will NOT drop it (skipRows is not forwarded), so the banner becomes your header and every rename misses. Run the standalone csv-cleaner first with skipRows: 1, then feed the result into the workflow.
# Standalone csv-cleaner (honours skipRows): skipRows: 1 delimiter: "\t" normalizeSmartQuotes: true # Save output, then drop it onto the forked workflow's Step 1.
Edge cases and verbatim errors
Excel double-click merges all columns into row 1
Tab vs comma delimiterAmazon's .txt is tab-delimited; Excel's double-click parses comma. Step 1's cleaner sniffs the delimiter from the first line (tab is one of its four candidates), so the workflow reads it correctly. Never open the file in Excel between download and the workflow.
16-digit identifier in `product-id` rounded by Excel
Excel 15-digit precision bugIf you opened the file in Excel, 14+ digit identifiers show as scientific notation and digits past the 15th are replaced with zeros — permanently. The workflow treats every cell as a string, but it cannot recover data Excel already destroyed. Clean the original download, not an Excel re-save.
Inventory Loader template has a version banner above the header
skipRows not forwardedThe template ships a TemplateType=... Version=... row above the real header. The workflow's csv-cleaner node does NOT honour skipRows, so the banner becomes your header and Step 4's renames all miss. Pre-clean with the standalone csv-cleaner using skipRows: 1, then feed that into the workflow.
find string `_small\.` doesn't match any URLs
Regex flag ignoredThe blueprint seeds useRegex: true, but the workflow find/replace node runs literal-only — it escapes the pattern, so _small\. searches for a literal backslash that isn't there. Set the find string to _small. on the canvas, or run the standalone tool in regex mode.
Curly quotes survive and the feed still errors 5000
Smart-quote folding not forwardedThe node does not fold “ ” ‘ ’ to straight quotes (the option isn't passed through). If your data has smart quotes, pre-clean with the standalone csv-cleaner (normalizeSmartQuotes: true) before this workflow.
Source file is empty or has only the header row
Empty sourceAn empty drop yields an empty output — the cleaner reports 0 → 0 rows and downstream nodes pass nothing through. Re-request the report; an Active Listings export with zero rows usually means a status filter on Amazon's side, not a workflow fault.
Report column names changed (`fulfilment-channel` vs `fulfillment-channel`)
Schema driftAmazon varies spelling and casing between marketplaces and report versions. csv-header-rename matches by exact name; an unmatched key is skipped silently (no error). If a rename didn't apply, check the actual header text and update the renames map.
Same ASIN appears twice with different SKUs (multi-channel FBA)
Not a duplicateThe FBA Inventory Report lists each fulfilment channel (MFN + AFN) separately. Same ASIN with different seller-sku is the multi-channel split, not a dupe. This workflow does not deduplicate (deduplicate:false); if you add a dedupe step, key it on seller-sku, never ASIN.
Japanese / Chinese marketplace report uses UTF-16 LE
EncodingReports from Amazon.co.jp / Amazon.cn use UTF-16 LE with a FF FE BOM. The cleaner strips a leading BOM, but the workflow node does not expose an encoding override; if columns look garbled, pre-convert to UTF-8 with the standalone csv-cleaner's encoding option first.
Run fails midway and you want to retry
RecoverableEach node runs in order; an error on one node aborts the run by default (no partial corruption — nothing is uploaded). Fix the offending config and re-run. The previous attempt is still recorded in the workflow's run trace for comparison.
Frequently asked questions
Why does my Amazon report download as `.txt`?
Every Seller Central report is tab-delimited, and .txt is the convention for tab-separated values. It is **not** a CSV. Renaming to .csv doesn't help — Excel still parses with comma. Step 1's csv-cleaner auto-sniffs the tab delimiter regardless of extension (tab is one of its delimiter candidates).
Does this workflow really read the tab format, given the node doesn't forward a delimiter?
Yes. The blueprint sets delimiter: \t, but the orchestrator's csv-cleaner node doesn't pass that option through — instead the engine sniffs the delimiter from the first line of input, and tab is one of the four candidates it tests (, \t ; |). For a normal Amazon export the sniffer picks tab correctly, so the result is the same. The only time you'd need the explicit delimiter is a pathological file where commas outnumber tabs on row 1.
What is Amazon error `8541` and why does it 'silently' reject my update?
The SKU data you provided is different from what we have in our catalog. We have updated the data based on what is in our catalog. Amazon kept its existing record and ignored your update. The main UI reports the upload as 'successful' — the rejection only shows in the Feed Processing Summary under Inventory → Upload Status. Always open that summary after every upload. A trailing-whitespace SKU also triggers 8541; Step 1's trim fixes that case.
Why are leading zeros disappearing from my SKUs?
Excel did it, not this workflow. Opening a .txt or .csv in Excel triggers automatic numeric coercion. This workflow treats every cell as a string and never coerces. If you must view in Excel afterwards, use Data → From Text/CSV and set identifier columns to type Text before importing.
The default image-URL find string isn't matching. What's wrong?
The blueprint seeds find: _small\. with useRegex: true, but the workflow's find/replace node runs in literal mode — it does not forward the regex flag, so it escapes the pattern and looks for a real backslash. Edit the node's find string to _small. (no backslash) for a literal match. To strip _small/_thumb/_medium in one regex pass, run the standalone csv-find-replace with regex mode enabled.
What does Step 3's `State = COMPLETED` filter actually do?
It keeps only rows whose State column equals COMPLETED, case-insensitively. On Active/All Listings (which have no State column) it's a no-op — every row passes. On status-bearing reports it drops pending/partial rows. To split a Settlement Report instead, retarget the node to column: transaction-type, value: Order and re-run for each value you want.
Can I round-trip an Active Listings Report back into Seller Central?
Not directly — the column names differ. Active Listings uses item-name, seller-sku, price, quantity, asin1; Inventory Loader expects sku, add-delete, price, quantity. Step 4 renames the headers, but you still have to add an add-delete column (value u for update) yourself before uploading — the workflow renames columns, it doesn't create new ones.
What does the fork button do, and do I need a paid plan?
Forking copies the 4-node blueprint and its config into a private draft you own, wired csv-cleaner → csv-find-replace → csv-column-filter → csv-header-rename, and snapshots it as version 1. You must be signed in, but no paid tier is required — every node in this graph is Free-tier, so the run-time tier precheck never blocks it.
Is this workflow scheduled to run automatically?
No. The blueprint ships with scheduleCron: null, so it runs on demand when you drop a file. The platform does support cron scheduling (the enqueue endpoint accepts a cron source), but you would add a schedule yourself after forking — out of the box this is a manual, one-shot clean.
Where are my files processed — do you store the report?
The four CSV tools execute client-side in your browser; the report file is never uploaded to our servers, and there are no credentials or API keys involved. Only run metadata (status, timing, a short trace and input/output summaries) is recorded so you have a run history — the file contents themselves are not stored.
Can I see a history of past runs?
Yes. Each run is recorded in workflow_runs with its start time, status, a step-by-step trace and input/output summaries; the workflow's Runs view lists the last 50. Lifecycle events (fork, run triggered, run cancelled/resumed) are also written to a separate audit log for compliance.
What if my report has two ASIN rows for the same product (FBA multi-channel)?
That's expected on the FBA Inventory Report, which lists each fulfilment channel (MFN and AFN) separately — same ASIN, different seller-sku. It is not a duplicate. This workflow does not deduplicate. If you add a dedupe step, key it on seller-sku, never on ASIN, or you'll collapse legitimate multi-channel listings.
Local-first by design
This workflow executes entirely on your jadapps-runner. API keys, database credentials, and OAuth tokens are stored in an AES-GCM-encrypted vault on your device — they are never uploaded to JAD Apps' servers. The server only stores the workflow graph (the recipe), not the secrets.