Automation Practice


Airtable, Make, Apify, AnyMail Finder, and ChatGPT. If you've spent any time in the automation space over the last couple years, this combination probably looks familiar. Scrape leads with Apify, find and verify their email with AnyMail, run them through ChatGPT for enrichment or scoring, orchestrate the whole thing in Make, and land it all in Airtable where a human can actually work the list. It's become the default architecture for outbound systems, and there's a good reason for that. Every piece of it is low code, every piece of it is cheap relative to what it replaces, and you can stand up a working version in an afternoon.

A client came to me a few months back convinced their new outbound system had gone stale. Deal flow that used to trickle in from scraped lists had slowed to almost nothing, and nobody could say why. Make wasn't throwing errors. Every scenario showed green. The scraper was pulling fresh leads on schedule, the enrichment step was populating fields correctly, and Airtable looked exactly the way it was supposed to look. Nothing was broken on paper. That's exactly what made it dangerous, and it's the pattern I keep running into with this stack. The failures that actually hurt you aren't the ones that show up as an error message in your inbox. They're the ones that just quietly cost you money while everything looks fine on the surface.

A bad prompt can disqualify a deal you never even knew you had

That client's problem turned out to be a single line in a qualification prompt. The scenario pulled each scraped lead into ChatGPT with instructions to disqualify anything that didn't look like a strong fit, and buried in those instructions was a rule treating missing employee count data as a red flag. Half the good targets in their niche simply didn't list one on their website. The model did exactly what it was told. It just wasn't told the right thing, and there's no exception thrown for a bad business judgment call. Every one of those leads got silently routed to a disqualified table and never seen again.

This is the part of GPT prompt engineering inside an AI workflow that people underestimate. You're not writing a prompt, you're writing a policy, and a policy with rigid, poorly considered boundaries costs you real revenue every single time it runs. The fix isn't complicated. Review your qualification prompt the same way you'd review a sales rep's talk track, on a schedule, with actual disqualified leads in front of you. Pull a sample from the disqualified bucket every couple weeks and ask yourself if a human would have made the same call. If the answer is no more than once, the prompt needs work, not the leads.

I've run into a version of this same brittleness on the Airtable side too, not just in prompts. I wrote about a lead scoring formula that was quietly miscategorizing leads because it only matched an exact set of job titles and fell apart the moment someone's title said "VP" instead of "Vice President." Same root problem as the qualification prompt, just showing up in a different layer of the stack. Rigid matching logic anywhere in your pipeline, whether it's a GPT prompt or an Airtable formula, fails the same quiet way.

Treat Make scenarios like code, because that's what they are

I hear a version of "I'm not really a developer" a lot from people building serious things in Make, and I get where it comes from, but the tool doesn't care what your job title is. The moment you're branching logic, handling different data shapes, and passing state from one module to the next, you're programming. The visual interface just changed the syntax.

That means the same discipline that keeps real codebases from falling apart applies here too, and the one that gets skipped most often is error handling. It's easy to build the happy path first, watch it work on your test data, and call it done. But production data won't stay clean. A scraped contact is missing a last name. An API you're calling for enrichment times out for three seconds longer than usual. AnyMail comes back with no match instead of a verified address. None of that is rare. It's Tuesday.

If your scenario has no branch for those cases, Make doesn't throw a dramatic error that gets your attention. Depending on how it's built, it either stops silently partway through, or worse, it keeps going with a null value sitting in a field that something downstream was counting on being populated. That record limps through the rest of the pipeline broken, and it looks identical to every other record in your Airtable view. Nobody notices until a client asks why a lead they should have heard from three weeks ago never got contacted.

This is one of the Make.com best practices that gets skipped most, and it's the one that matters most. Build for the failure cases on purpose. Add error handlers on the modules that talk to external services, not just the ones you're worried about. Route failures somewhere visible, a status field, a dedicated Airtable view, a Slack ping, something a human will actually see without going looking for it. The goal isn't to eliminate failure. Things will always fail somewhere in a stack with this many external dependencies. The goal is to make sure failure is loud instead of quiet, because quiet is what costs you.

The Tony Stark trap

There's a specific feeling that hits once you've automated your third or fourth workflow and realized how much of what used to require a whole department can now run through a handful of connected tools. It's genuinely intoxicating, and I don't think anyone building in this space is immune to it. You start seeing automation opportunities everywhere, and the instinct is to just keep building, keep connecting, keep adding branches and conditions until the system can handle every edge case you can imagine.

This is where a lot of these builds go from clever to unmanageable. A scenario that started as "scrape, enrich, land in Airtable" grows a dozen conditional branches, three different enrichment paths depending on lead source, a retry loop bolted onto another retry loop, and eventually nobody, including the person who built it, can explain what happens when a record hits step fourteen. You've built something powerful and something completely unmaintainable at the same time, and those two things trade off against each other more than people want to admit.

The test I use is simple. Could someone else, a contractor, a new hire, future me in eight months, open this scenario cold and understand what it does within a few minutes. If the answer is no, it's not sophisticated, it's fragile. Complexity that only lives in one person's head isn't an asset. It's a liability with a delay on it, and the bill comes due the day that person is unavailable and something breaks.

Build like it's DRY, because the same rules that keep code maintainable apply here

Don't repeat yourself is old advice from software development, and it holds up perfectly in this world of visual automation. Every time you duplicate logic instead of reusing it, you've created two places that both need to be updated the next time something changes, and you will eventually update one and forget the other. That's the actual, mechanical way these systems rot.

The way I keep this in check, in any Airtable automation I build, is by grouping scenarios around a single logical function and refusing to let responsibilities bleed into each other. My contact enrichment doesn't overlap with my company enrichment, because those are two different jobs enriching two different kinds of records, and mixing them means a change to one drags risk into the other for no reason. Web scraping has its own dedicated lane, and it hands off clean, scraped data. It doesn't also try to normalize or validate that data along the way, because normalization is a separate job with its own logic and its own failure modes.

A flow should do exactly that. Flow. Data should move from one clearly scoped stage to the next in a straight, legible line, each stage owning one job and handing off a clean result to the next. When something breaks, you should be able to point at the exact stage responsible within seconds, not spend an afternoon tracing logic that's tangled across half a dozen unrelated concerns.

This is really just microservices thinking applied to low code. In real software architecture, nobody builds one giant application that scrapes, enriches, scores, and stores data all in the same process, because that's exactly how you end up with a system where touching one piece risks breaking three others. You break it into services that each do one job well, and you let them talk to each other through something durable in between rather than assuming every step will always run in a perfect, uninterrupted sequence. That's what a queue is for. In this stack, your Airtable tables and Make webhooks are effectively playing the role of that queue, holding a record in a known state between stages so that if enrichment fails, scraping doesn't have to run again, and if scoring fails, you're not re-scraping and re-enriching a record that was already fine. Treat each stage as its own service with its own job, let the data queue up cleanly between them, and you get the same resilience a real engineering team pays for, without needing to run actual infrastructure to get it.

Here's what that looks like laid out end to end, and where the damage actually starts:

Apify AnyMail GPT qualification Make Airtable Sales

bad prompt here

everything below this line still runs, and still costs you Make credits on a record that was never going anywhere

Low code never removed the engineering, it just hid it (and left you with the technical debt)

People assume the expensive part of this stack is the AI call, and it usually isn't. A qualification prompt runs on pennies. What actually burns your Make credits is everything that happens after a bad call, every enrichment step, every router branch, every retry a misclassified record drags through the rest of your scenario. Spending a little more time getting the prompt right the first time is close to free. Leaving it loose and letting every downstream operation pay for that looseness, execution after execution, is where the real cost hides.

I've made the cost case for AI-assisted prospecting over manual research before, breaking down what manual prospecting actually costs in hours and dollars compared to a paid AI subscription. The same math applies one layer down inside the automation itself. The token cost of a well-built prompt is nothing compared to what a badly-built one costs you in wasted operations downstream.

I picked up a Make automation for a gaming company that made this painfully literal. The scenario ranked inbound prospects using a tiered system, and the client was genuinely fun to work with on it, we used Dragon Ball power levels for the tiers, so a prospect could land anywhere from Base to Super Saiyan 3 depending on how well they scored. The scoring leaned heavily on job title, and that's where it fell apart. Engineering managers were consistently landing in tiers reserved for actual decision makers, when in most of these orgs an engineering manager can champion a tool internally but isn't the one signing off on the purchase. The prompt wasn't broken. It ran successfully every time. It was just quietly overweighting a title that looked senior without asking whether that title actually controlled budget, and every misclassified lead that flowed through as a false Super Saiyan burned real Make credits getting routed, enriched, and eventually followed up on by a rep chasing someone who was never going to sign.

Vibe coding, low code automation, and visual AI orchestration have made it possible for one person to do what used to take an entire department, and that's a genuinely good thing. But low-code was never the same thing as low-risk, and it never actually removed the engineering. It just made it easy enough for people to build real systems without realizing that's what they were doing. I saw the same lesson play out on a much higher-stakes build recently, architecting a healthcare portal on Power Platform, where the low-code layer compressed the implementation time but didn't remove a single ounce of the actual thinking behind gateway auth, data sync patterns, or where the performance bottlenecks would show up. The businesses that get real, compounding value out of this stack aren't the ones with the fanciest scenarios. They're the ones applying engineering discipline to tools that make engineering look deceptively simple.

If you're running Airtable, Make, Apify, and AnyMail together and you're not sure whether your own qualification logic or error handling would hold up to this kind of scrutiny, that's usually the first place worth having someone take a second look.