5 n8n Gotchas I Hit Automating My CD Collection

In my last post, I walked through the CD collection automation I built with n8n — scan a barcode, pull metadata from MusicBrainz, fall back to Discogs and AI for cover art, generate bilingual articles, and log everything to a spreadsheet.

That post covered the happy path. This one covers the parts that actually taught me something: the bugs that don’t show up until you’re testing against 1000+ real, messy CDs instead of a clean demo. If you’re building — or thinking about building — anything similar, these are the five that cost me the most time.

1. HTTP Request nodes fire once per array item, not once per workflow

This one bit me early and quietly. When an HTTP Request node in n8n receives an array of items from the node before it, n8n’s default behavior is to run that HTTP call once for every item in the array — not once for the whole batch.

For a single API call meant to fetch, say, the full release details for one CD, that’s invisible. But once you’re processing genre lists, tracklists, or anything that naturally comes back as multiple items, you can end up firing the same request five or six times without realizing it — which is a great way to get rate-limited or, worse, to silently duplicate data downstream.

The fix: enable “Execute Once” in the node’s settings whenever the call is meant to run a single time regardless of how many items are flowing into it. It’s a one-checkbox fix, but only once you know to look for it. Otherwise the symptom is just “why is this API call happening way more than I expected,” which is a frustrating thing to debug from the output side.

2. WordPress’s REST API caps you at 100 items per page — no exceptions

When I went to pull existing categories from WordPress to reconcile against new genres, everything worked fine in testing… until my category list grew. The WordPress REST API has a hard limit of 100 items per page (per_page=100), and it will not give you more than that in a single request, no matter what you pass in.

If your logic assumes “fetch categories” returns everything in one shot, it’ll quietly work fine for months and then start silently missing categories the moment you cross 100 — which means duplicate categories start getting created instead of reused ones, and nothing throws an error to tell you why.

The fix: don’t assume a single fetch is complete. Use n8n’s built-in pagination handling (or loop manually on the response headers indicating total pages) so you keep pulling pages until you’ve got the full set. It’s a small amount of extra plumbing that saves you from a bug that only appears once your data has grown — which is exactly the worst time to find it.

3. AI-generated content can break your JSON payload before it even gets sent

Once I started generating article content with AI, I ran into a class of bug I hadn’t dealt with before: the AI would occasionally include an unescaped quote, apostrophe, or line break in its output, and that would silently corrupt the JSON body of the next request — the one sending that content on to WordPress. The error you get back is unhelpful (“invalid request”) and gives you almost no clue that the actual problem is a stray character three steps upstream.

The fix: never hand-build the JSON string for a request that includes AI-generated text. Instead, assemble the payload in a Code node using JSON.stringify() on the actual object, so escaping is handled properly regardless of what characters show up in the content. Once I moved to that pattern, this entire category of bug disappeared.

4. Bilingual category trees are their own beast

Because I publish each CD in both English and Portuguese, genres need to map to two separate WordPress category trees under two different parent categories (Music / Música), with Polylang tying the translated pairs together. This turned out to be one of the more involved parts of the whole build, for a few compounding reasons:

  • Some genres translate cleanly to Portuguese; others don’t have a widely accepted translation at all, so a straight lookup table isn’t enough on its own — it needs regular upkeep as new genres show up.
  • Each language’s category list has to be fetched and reconciled separately, with the correct parent category ID passed dynamically, since Polylang doesn’t merge them for you.
  • WordPress escapes special characters in category names (so & comes back as &), and if your matching logic compares the raw genre string against the escaped category name, near-identical genres like “Rock & Roll” and “Rock & Roll” get treated as different categories — which creates duplicates that look like one-off typos but are actually an encoding mismatch.

The fix: normalize encoding before comparing (decode HTML entities on both sides), and keep a single canonical translation dictionary rather than letting each part of the workflow keep its own copy — divergent copies of the same lookup table drift apart fast and are hard to spot until two nodes disagree with each other.

5. Your own host’s bot protection can block your own automation

The strangest one: partway through testing, some of my own REST API calls started silently failing — not because of a code bug, but because Imunify360 (a security layer on the hosting side) started flagging the automated, rapid-fire requests as bot traffic and blocking them.

The fix: two parts. First, get the automation’s traffic pattern allow-listed or adjust the security rules so legitimate API traffic isn’t mistaken for an attack. Second — and this is good practice regardless — build in a throttled loop pattern using Wait nodes between calls, so the workflow doesn’t hammer the API in a tight burst. It’s more resilient to rate limits and bot detection alike, and it’s just a better citizen of any API you’re calling repeatedly.


None of these are exotic problems — they’re the kind of thing that shows up in almost any real-world automation once you move past a clean demo and start feeding it messy, real, at-scale data. That’s usually where the actual engineering work lives.

If you’re dealing with something similar in your own business — data scattered across systems, manual entry that should be automated, or a workflow that “mostly works” until it hits scale — this is exactly the kind of problem I like solving. Get in touch if you’d like to talk through it.

Leave a Reply

Your email address will not be published. Required fields are marked *