Looking for 3 n8n users with real workflow reliability issues — free pilot audit

Good morning or good afternoon to everyone in the n8n community.

I am looking for three n8n users who have a real-world workflow that seems to be working correctly but still raises doubts or concerns, or simply isn’t doing exactly what you expect.

I am working on a small pilot project focused on automation reliability and human oversight, and I want to test it against real-world issues rather than just examples we’ve invented ourselves.

I am looking for n8n workflows involving issues such as:

  • the workflow appears green or successful, but the expected outcome never actually happened;
  • an execution completes only partially;
  • a retry might repeat or duplicate an action;
  • data being overwritten or modified incorrectly;
  • uncertainty regarding permissions, credentials, or what actions an automation should be allowed to perform;
  • actions that you believe should require human review or authorization;
  • or cases where it is unclear whether an external action actually completed.

For the first three cases we select, I would like to conduct a limited, no-cost pilot audit.

The goal is to provide you with a brief report on the findings we can verify, such as:

  • what action was expected to occur;
  • what actually happened;
  • where the workflow might be lacking oversight;
  • where there is a lack of evidence that the action actually took place;
  • potential scenarios where the system reports success but fails to deliver the expected result;
  • ambiguous or partially completed results;
  • and recommendations for additional controls.

I do not need passwords or API keys.

We can work using screenshots with sensitive data masked, workflow exports, dummy data, or a test environment.

In return, I would simply ask for your honest feedback:

Did you find the audit useful? Which parts were helpful, and which were not?

That would be incredibly helpful for improving what I am building.

If anyone in the community has a suitable use case and would like to participate, I would greatly appreciate it.

Thank you very much for your time.

Quick update — this is the kind of case I’m looking for.

While researching this problem, I found a real n8n case where a workflow had hundreds of executions marked as successful, but the expected job was never actually completed.

That helped me clarify what I want to test in these three free pilot audits:

I’m especially interested in workflows where n8n says “Success,” but you are not fully sure the real-world outcome actually happened.

Examples:

  • a row was supposed to be written, but you are not sure it was;
  • an API call returned successfully, but the external system may not have changed;
  • part of a workflow ran while another important action never happened;
  • retries may have caused duplicate actions;
  • or the workflow is green, but you still need to manually verify the result.

The pilot is still free for the first three suitable cases.

I do not need API keys, passwords, or access to your production system.

A screenshot, sanitized workflow export, dummy data, or test environment is enough to start.

If you have a workflow like this, reply here or send me a message and briefly tell me:

1. What was supposed to happen?
2. What actually happened?
3. What part are you unsure about?

I’ll tell you whether it fits the pilot before you share anything else.

Hi Hilario,

I have the case you are describing, and I have it in production rather than as an example.

I run a WhatsApp outreach operation on self-hosted n8n. The failure that cost me the most was exactly the one you named: the run is green, the node returns HTTP 201, and the message never reaches a human being. The API accepted the request and the underlying session was closed. n8n had no way to know, because from its point of view the call succeeded.

That one has a nasty second half, and it is the part I would want a fresh pair of eyes on. The send fails silently, but the cadence still advances the touch counter. So the contact loses that touch permanently and no one ever finds out, because there is no error to look at. The execution list is a wall of green.

Three more from the same operation, all of them silent:

The cadence counts the record, not the person. The same lead in two rows gets every message twice. Here the same mobile number arrives in two formats depending on the area code, so a naive dedupe passes it through and the person receives duplicates while every run reports success.

A query returns zero rows and the branch simply ends. No error, no alert. The queue stops and it took me a week to notice.

The schedule trigger runs in UTC while the business runs in local time. The evening cutoff never fires and the morning message goes out in the middle of the night. Every execution is successful.

What I can give you:

One real workflow export with the values masked, plus the execution history around a specific incident where the run was green and the outcome did not happen. No credentials, no client data. I can also set up a stripped test instance if you prefer to work against something live rather than a file.

What you would get back is honest feedback, including the parts that do not work for me. I should be upfront about one thing: I sell a paid audit for cadence workflows, so I am not a neutral beginner and I will read your report with a critical eye. That may make me a worse pilot participant or a more useful one, and I would rather you decide that knowing it than find out later.

One question, because it decides whether a tool like yours is buyable or just interesting. Are you planning to detect these after the fact by reading execution history, or to sit in the path and hold the run until a human confirms? The first is a report. The second is a control, and it is the one I would actually pay for, because the problem is never learning that the message failed. It is that nobody was told in time to do anything about it.

Cristian

Hi Cristian, thanks a lot for getting back to me.

The problem you’re describing is exactly the kind of scenario I was looking for for this project. I understand your point, and I want to clarify that I’m not just trying to create a post-mortem report to analyze what went wrong after the fact.

What I’m testing is a way to control whether an action should proceed before it happens, when necessary, and then verify whether the actual outcome matched expectations.

Your case is especially interesting to me because it would serve as my first real-world pilot involving a workflow from someone outside the project.

If you’re on board, I’d like you to share the following:

  • a sanitized export of the workflow;
  • the execution details surrounding a specific incident;
  • what you expected to happen;
  • and what actually happened.

With that information, I can study the issue and understand what’s going on before making any proposals.

I don’t need passwords, API keys, or private client information—just the technical data required to understand the problem.

I also want to mention that I really value the fact that you already work professionally with these types of workflows and have experience conducting audits. That’s why your opinion is particularly important to me.

When the time comes to review my findings, I’d like you to be highly critical and strict with me. I don’t want you to say something is good just to be polite. If you spot flaws, useless features, faulty assumptions, or anything you wouldn’t pay to use, I want you to tell me straight.

For me, honest criticism from someone who works in this field is far more valuable than simply hearing that everything is fine.

If that works for you, let’s start with those materials and define the scope of the pilot from there.

Hi Hilario,

This is a great initiative. I build AI automation systems in n8n and have a production use case that fits this perfectly. I run an automated Telegram bot for civil services exam preparation that delivers daily quizzes and notes, and I frequently run into a silent failure issue.

1. What was supposed to happen? The workflow triggers on a schedule, queries a vector database for the day’s study context, generates a quiz using OpenAI, and pushes the message to subscribers via the Telegram API.

2. What actually happened? The execution shows completely green in n8n. The API nodes return success. However, due to strict rate limits or silent payload drops on the external API side, the messages don’t reach a portion of the users. n8n registers the HTTP request as successful, making the execution list a wall of green, while the real-world delivery has partially failed.

3. What part are you unsure about? I am unsure how to implement a reliable, lightweight feedback loop to verify actual delivery without bloating the workflow with a massive parallel monitoring system. Right now, a green status does not guarantee the end user actually received their content, and I usually only find out when someone complains.

I would love to participate in the pilot and can easily provide a sanitized export of the workflow along with dummy data.

Best, Pawan

Hilario, here is the material, in the four parts you asked for.

One note before anything else: the workflow I am describing is a reduced rebuild, not the production export. 8 nodes, no credentials, no real endpoint, no keys, no client data, fake copy and fake recipients. It imports into a clean n8n as-is, and I tested that. Everything that matters to the failure is identical to production: node order, the error-output wiring on the send, the SQL that advances the state, the cron. Everything else is gone.

I am telling you this up front rather than letting you assume you have the real thing. Tell me where to send it, a PM on this forum or an email address, and it goes out the same day.

1. What the workflow does

A cron-driven outbound cadence engine. Every 30 minutes during business hours it:

  1. SELECTs the rows whose next touch is due (next_touch_at <= NOW());
  2. decides, per row, whether to send the next touch or end the cadence;
  3. POSTs the message to a self-hosted messaging gateway;
  4. UPDATEs the row: increments touch_count, pushes next_touch_at forward by the cadence spacing.

Step 4 is irreversible in practice. Once next_touch_at moves forward, no later run will ever retry that touch. The row is not due anymore.

The whole design rests on one assumption: that step 3 succeeding means the person received a message. That assumption is false, and the workflow has no way to notice.

2. The incident

Time window: 31 July to 3 August 2026, one tenant’s messaging instance, production.

The messaging instance disconnected on 31 July. Nobody noticed, because nothing said so.

The engine kept running on schedule for three days against the dead instance. Over that window, 13 rows had their touch advanced for messages that were never delivered. Those 13 people are, from the database’s point of view, people who received touches 2, 3 and 4 of the cadence. They received nothing. They are now further along a sequence they never entered, and some of them reached the end of the cadence and were marked done: closed out, never to be contacted again by the engine.

Five of those executions carried an HTTP 500 Connection Closed from the gateway.

Here is the part that matters to you:

  • The executions were green. Status success.
  • The n8n execution detail showed “error on node: (none)”.
  • Nothing in the run distinguished those three days from a normal week. No log line, no failed node, no alert.

The cause was a two-property mistake on the HTTP node: onError: "continueRegularOutput" plus alwaysOutputData: true. So when the gateway errored, the item left through output 0, the success output, walked straight into the UPDATE, and advanced the touch. The error never became an error.

What I fixed, and what the fix does not cover

I changed the send node to onError: "continueErrorOutput" and wired output 1 into a Code node that does return [] and deliberately writes nothing to the database. The row stays due, and the next cron run retries it. I removed alwaysOutputData at the same time, because with a real error output it would only inject an empty item into the success branch.

That closes the case where the gateway answers with an error.

It does not close the case that actually worries me, and it is the reason I answered your post. This gateway returns HTTP 201 the moment it accepts the message into its own internal queue, not when the message is delivered. So:

  • gateway accepted, recipient number invalid: 201, nothing delivered, touch burned;
  • gateway accepted, then its session dropped before flushing the queue: 201, nothing delivered, touch burned;
  • gateway accepted, message silently dropped downstream: 201, nothing delivered, touch burned.

In all three the workflow is correct, the execution is green, the error output never fires, and the database records a touch that did not happen. There is nothing in the HTTP response to inspect, because the response is honest. It says “accepted”, and it was accepted. The only evidence of delivery lives out of band, in a delivery-status callback that arrives seconds to minutes later, on a different connection, long after the UPDATE has already run.

3. What I expected

  • Touch 2 sent to 13 people between 31 July and 3 August.
  • Any failure to send leaves the row due, so the next run retries it.
  • A run that could not deliver anything is visibly distinguishable from a run that delivered everything.

4. What actually happened

  • 0 of 13 messages delivered.
  • All 13 rows advanced as if delivered; several ran the cadence out and closed.
  • Every run green; no error on any node; three days before a human noticed, and they noticed from the absence of replies, not from any signal the system produced.

Where I will push on your framing

You said the point is to decide whether an action should proceed before it happens, then verify whether the outcome matched. That is the right shape for this, and it is why I answered you rather than skipping another audit offer. But it splits into two very different problems, and I think only one of them is actually hard.

The pre-action gate is the easy half. “Is the messaging instance connected right now? Is this recipient reachable? Has this person already been touched in the last N hours?” All of that is checkable before the send, and the reason it is missing from my engine is that nobody wrote it, not that it is hard to write. If your pilot delivers me a gate, I can build that gate myself in an afternoon. It is worth something, but not much.

The post-action verification is the hard half, and it is the one I would pay for. The problem is not knowing what I expected. I know exactly what I expected. The problem is that the moment I learn the truth is after the irreversible write already happened, on a different channel, and the workflow that did the writing is long gone. Solving that means one of:

  • holding the state advance until the delivery callback confirms, which means the engine stops being one linear execution and becomes a two-phase commit across two workflows, with its own new failure mode (callback never arrives, row pinned open forever); or
  • letting the write happen and reconciling afterwards, a compensating transaction, which needs an answer for “the touch was burned, now what: re-send and risk a duplicate, or skip and lose the person”.

Either way the interesting output is not a report. It is a decision about an irreversible write under an unresolved outcome.

So, being as blunt as you asked me to be:

  • If what comes back is a document telling me the 13 rows failed and I should add error handling, that has no value to me. I already know, and I already fixed the half a document can see.
  • If it flags the green execution as suspicious using only what is inside the n8n execution record, I will want to know the false positive rate before I believe it. Most of my green executions are genuinely fine, and an alarm that cries wolf gets muted within a week, which leaves me worse off than no alarm at all.
  • If it can express “this send was accepted but not confirmed, so do not advance the state yet”, and survive the callback never arriving, that is a product, and I would run it in production.

Tell me which of those you are actually building and I will scope the pilot to it. I would rather you aim at the hard half and fail than hand me a clean report about the easy half.

One practical note on scope: I have three more failure shapes in the same family. Naive dedup producing duplicate sends, an empty SELECT emitting a single {success:true} item that becomes a ghost record and travels the whole pipeline, and a scheduler resolving its cron in the wrong timezone and firing outside the allowed window. All three are silent and all three end green. I left them out on purpose so the pilot stays on one case. Say the word if you want them.

Hilario, here is the material, in the four parts you asked for.

One note before anything else: the workflow I am describing is a reduced rebuild, not the production export. 8 nodes, no credentials, no real endpoint, no keys, no client data, fake copy and fake recipients. It imports into a clean n8n as-is, and I tested that. Everything that matters to the failure is identical to production: node order, the error-output wiring on the send, the SQL that advances the state, the cron. Everything else is gone.

I am telling you this up front rather than letting you assume you have the real thing. Tell me where to send it, a PM on this forum or an email address, and it goes out the same day.

1. What the workflow does

A cron-driven outbound cadence engine. Every 30 minutes during business hours it:

  1. SELECTs the rows whose next touch is due (next_touch_at <= NOW());
  2. decides, per row, whether to send the next touch or end the cadence;
  3. POSTs the message to a self-hosted messaging gateway;
  4. UPDATEs the row: increments touch_count, pushes next_touch_at forward by the cadence spacing.

Step 4 is irreversible in practice. Once next_touch_at moves forward, no later run will ever retry that touch. The row is not due anymore.

The whole design rests on one assumption: that step 3 succeeding means the person received a message. That assumption is false, and the workflow has no way to notice.

2. The incident

Time window: 31 July to 3 August 2026, one tenant’s messaging instance, production.

The messaging instance disconnected on 31 July. Nobody noticed, because nothing said so.

The engine kept running on schedule for three days against the dead instance. Over that window, 13 rows had their touch advanced for messages that were never delivered. Those 13 people are, from the database’s point of view, people who received touches 2, 3 and 4 of the cadence. They received nothing. They are now further along a sequence they never entered, and some of them reached the end of the cadence and were marked done: closed out, never to be contacted again by the engine.

Five of those executions carried an HTTP 500 Connection Closed from the gateway.

Here is the part that matters to you:

  • The executions were green. Status success.
  • The n8n execution detail showed “error on node: (none)”.
  • Nothing in the run distinguished those three days from a normal week. No log line, no failed node, no alert.

The cause was a two-property mistake on the HTTP node: onError: "continueRegularOutput" plus alwaysOutputData: true. So when the gateway errored, the item left through output 0, the success output, walked straight into the UPDATE, and advanced the touch. The error never became an error.

What I fixed, and what the fix does not cover

I changed the send node to onError: "continueErrorOutput" and wired output 1 into a Code node that does return [] and deliberately writes nothing to the database. The row stays due, and the next cron run retries it. I removed alwaysOutputData at the same time, because with a real error output it would only inject an empty item into the success branch.

That closes the case where the gateway answers with an error.

It does not close the case that actually worries me, and it is the reason I answered your post. This gateway returns HTTP 201 the moment it accepts the message into its own internal queue, not when the message is delivered. So:

  • gateway accepted, recipient number invalid: 201, nothing delivered, touch burned;
  • gateway accepted, then its session dropped before flushing the queue: 201, nothing delivered, touch burned;
  • gateway accepted, message silently dropped downstream: 201, nothing delivered, touch burned.

In all three the workflow is correct, the execution is green, the error output never fires, and the database records a touch that did not happen. There is nothing in the HTTP response to inspect, because the response is honest. It says “accepted”, and it was accepted. The only evidence of delivery lives out of band, in a delivery-status callback that arrives seconds to minutes later, on a different connection, long after the UPDATE has already run.

3. What I expected

  • Touch 2 sent to 13 people between 31 July and 3 August.
  • Any failure to send leaves the row due, so the next run retries it.
  • A run that could not deliver anything is visibly distinguishable from a run that delivered everything.

4. What actually happened

  • 0 of 13 messages delivered.
  • All 13 rows advanced as if delivered; several ran the cadence out and closed.
  • Every run green; no error on any node; three days before a human noticed, and they noticed from the absence of replies, not from any signal the system produced.

Where I will push on your framing

You said the point is to decide whether an action should proceed before it happens, then verify whether the outcome matched. That is the right shape for this, and it is why I answered you rather than skipping another audit offer. But it splits into two very different problems, and I think only one of them is actually hard.

The pre-action gate is the easy half. “Is the messaging instance connected right now? Is this recipient reachable? Has this person already been touched in the last N hours?” All of that is checkable before the send, and the reason it is missing from my engine is that nobody wrote it, not that it is hard to write. If your pilot delivers me a gate, I can build that gate myself in an afternoon. It is worth something, but not much.

The post-action verification is the hard half, and it is the one I would pay for. The problem is not knowing what I expected. I know exactly what I expected. The problem is that the moment I learn the truth is after the irreversible write already happened, on a different channel, and the workflow that did the writing is long gone. Solving that means one of:

  • holding the state advance until the delivery callback confirms, which means the engine stops being one linear execution and becomes a two-phase commit across two workflows, with its own new failure mode (callback never arrives, row pinned open forever); or
  • letting the write happen and reconciling afterwards, a compensating transaction, which needs an answer for “the touch was burned, now what: re-send and risk a duplicate, or skip and lose the person”.

Either way the interesting output is not a report. It is a decision about an irreversible write under an unresolved outcome.

So, being as blunt as you asked me to be:

  • If what comes back is a document telling me the 13 rows failed and I should add error handling, that has no value to me. I already know, and I already fixed the half a document can see.
  • If it flags the green execution as suspicious using only what is inside the n8n execution record, I will want to know the false positive rate before I believe it. Most of my green executions are genuinely fine, and an alarm that cries wolf gets muted within a week, which leaves me worse off than no alarm at all.
  • If it can express “this send was accepted but not confirmed, so do not advance the state yet”, and survive the callback never arriving, that is a product, and I would run it in production.

Tell me which of those you are actually building and I will scope the pilot to it. I would rather you aim at the hard half and fail than hand me a clean report about the easy half.

One practical note on scope: I have three more failure shapes in the same family. Naive dedup producing duplicate sends, an empty SELECT emitting a single {success:true} item that becomes a ghost record and travels the whole pipeline, and a scheduler resolving its cron in the wrong timezone and firing outside the allowed window. All three are silent and all three end green. I left them out on purpose so the pilot stays on one case. Say the word if you want them.

Hi Cristian, good afternoon. Thanks a lot for explaining the case to me in such detail.

I understand where the real problem is now, and I have a much clearer picture of the situation you’re trying to solve.

I don’t want to spend the pilot phase auditing errors you’ve already fixed. I want to focus specifically on the HTTP 201 Accepted scenario, where the request is accepted but delivery is still not confirmed, and on how to avoid advancing to a practically irreversible state before knowing what actually happened with the message.

I’m also interested in examining how the system should handle cases where the callback never arrives—avoiding duplicate messages while also making sure we don’t lose that contact or burn that touch.

Please send me the simplified reconstruction via private message. I want to study it thoroughly first, understand how your workflow operates, and review the incident before proposing a solution or suggesting how we should tackle the problem.

I prefer to fully understand the case before assuming I already know the answer.

And please, keep being critical with me. Your previous explanation was very helpful precisely because you were direct about what would be valuable to you and what would not.

Thanks again, Cristian. I’ll start reviewing the material as soon as you send it.

Hi Pawan, thank you very much for sharing your case and for being willing to participate in my pilot. I really appreciate it.

Your problem is very interesting to me because it is very similar to the kind of reliability failures we are trying to study. The workflow can finish successfully and the API can respond as if everything worked, but in practice some users still do not receive the message.

I would like to include your case as one of the pilots we analyze.

If you are comfortable sharing it, could you send me a sanitized or anonymized version of the workflow? I do not need passwords, tokens, API keys, real user data, or any private information.

It would also help me a lot if you could share:

  1. One specific execution where the workflow appeared successful, but some users did not receive the message.
  2. What you expected to happen and what actually happened.
  3. What information Telegram or the API returns after the message is sent, for example response codes, IDs, errors, callbacks, or any other delivery-related signal.
  4. Approximately how many messages were being sent in that execution, especially if you think rate limits or volume may have played a role.

Everything can be fully sanitized.

What interests me most in your case is whether we can build a lightweight verification layer that can distinguish between “the workflow completed successfully” and “the real-world outcome actually happened”, without turning it into a large or overly complicated monitoring system.

Thank you again for sharing your case. Once I have the material, I will first map the exact point where the failure may be happening, and then I will share what I think would make sense to test.

If you are willing to participate, I really appreciate it. Thank you again.