Learn ·3 min read

Four things that broke while I built my first serious AI automation

The audit tool took about eight days longer than it should have. Not because the logic was hard — the logic was eight modules in a straight line. Because four separate things broke, and each one looked like a different problem than it was.

Writing them down because I'll hit at least two of these again.

1. Invisible required fields

The first runs failed with BundleValidationError: Validation failed for 3 parameter(s).

Three parameters. But the module only had one field I'd filled in — the URL. What three?

Make's HTTP module has required boolean fields that don't appear as required in any obvious way: serializeUrl, useQuerystring, useMtls. When you configure a module by clicking through the UI, Make fills them in silently. When you create it programmatically, it doesn't — and you get a validation error that names a count but not the fields.

The tell was that some modules worked and others didn't. The ones that worked were the ones I'd opened and saved in the interface.

Lesson: if a module works after you touch it manually and fails when generated, the difference is defaults you can't see.

2. A function that doesn't exist

Next error: "We don't recognise toJSON. Did you mean escapeJSON?"

I'd used toJSON() to safely escape a large block of text into a JSON request body. Reasonable function name. Exists in plenty of languages. Doesn't exist in Make.

The equivalent is escapeJSON() — but with an important difference. toJSON (in the languages that have it) wraps the result in quotes. escapeJSON escapes the contents but doesn't add quotes. So this is broken:

"content": {{escapeJSON(4.auditPrompt)}}

And this is correct:

"content": "{{escapeJSON(4.auditPrompt)}}"

One character of difference, completely different outcome.

3. The silent shutdown

This one cost the most time.

Three runs failed in a row. Make has a maxErrors setting, defaulted to 3. Hit it, and Make switches the scenario off automatically.

That's sensible on its own. What isn't obvious is what happens next: the webhook keeps accepting submissions and returning HTTP 200. My website kept showing visitors a green "your audit is being generated" message. The data queued up and nothing processed it.

So from the outside — from a visitor's perspective, and from mine — everything looked fine. It wasn't.

I only found it by checking the webhook directly and seeing queueCount: 1 alongside scenarioIsActive: false.

Lesson: a success message on your website means the webhook accepted the payload. It does not mean the automation ran. Those are different things, and the gap between them is where you lose leads without ever knowing.

I've since raised maxErrors to 20. A temporary rate limit shouldn't be able to take a lead-generation tool offline silently.

4. Two credentials with the same name

The last one is the most embarrassing, and the one I'd bet money I repeat.

The audit calls two different APIs. Hostinger Mail authenticates with Authorization: Bearer <token>. Anthropic authenticates with x-api-key: <key> — different header, and no prefix on the value.

I set up the Hostinger credential first. Then I set up the Anthropic one and accepted the default name Make suggested.

Both ended up named "Ismaeel's API Key Auth key".

In the module's credential dropdown, they appeared as two identical entries. I spent two days regenerating Anthropic keys, convinced the key itself was bad, because every run returned 401. The key was fine. The module was sending a Hostinger token to Anthropic in a header Anthropic ignores.

Lesson: name credentials after what they authenticate to, not who created them. "Anthropic x-api-key" would have saved two days.

The pattern

Three of these four were silent or misleading. The validation error named a count instead of fields. The auto-shutdown returned success messages. The naming collision produced an authentication error that pointed at the key rather than the selection.

The debugging skill isn't knowing the platform. It's noticing when the error message is describing a symptom rather than a cause — and going and checking the thing the error isn't talking about.

AutomationAI
Related
Newsletter

Get new posts by email

One email when I publish something worth reading — what I built, what broke and what I learned. No spam, unsubscribe any time.

Not live yet — the signup goes live with the newsletter shortly.