Why responses are not delivered

Finds why responses never reach your Telegram, Google Sheet, Zapier or webhook, and what to do about it

Free agent skill for Claude Code, Codex, Cursor and Gemini CLI. It works through the SurveyNinja MCP server, with your permissions.

Category
Deliver responses
Tags
integrations, leads
Works with
Claude Code, Codex, Cursor, Gemini CLI
MCP tools
15, 9 of them change data
Version
1.0.1, October 20, 2026
Made by
SurveyNinja
Price
Free
See also
Webhooks integrationGoogle Sheets integrationTelegram notifications
Skill file
SKILL.md

What it does

  • A cause, not "something broke". The skill finds the actual reason: the bot was removed, access to the table was revoked, the zap was turned off.
  • From simple to thorough. It starts with the free check of the integration state, then reads delivery logs.
  • Resend only after the fix. Resending while the cause is still there repeats the same rejection.

Example

You type

Responses stopped arriving in our Google Sheet. Find out why

What the assistant brings back

148
Waiting to resendpiled up over 6 days
3
Causes found
2
Fixed by youneed a sign-in
148
Will resendonce the cause is gone
  1. Telegram bot removed from the Leads group on 23 September
  2. Google Sheets access to the Google account revoked
  3. Zapier sending on, one zap subscribed
  4. Website webhook receiver answers 500
  5. Email notifications recipient confirmed, delivery running
The main cause: the bot was removed from the group

Add the bot back to the Leads chat and the 148 waiting messages go out in one resend. Resending while the bot is outside the group just repeats the same rejection.

The states above are an example. The assistant checks the integrations of your own survey.

How it works

  1. Goes from cheap to expensiveIt reads the integration state first, which covers most cases and costs nothing. Logs come next, and only if the reason is still unknown.
  2. Pulls the actual reasonThe bot was removed from the group, Google access was revoked, the zap was turned off, the receiver answers 500. The assistant names the cause in plain words.
  3. Tells a delay from a breakdownA Google Sheet set to refresh once a day is not broken. The assistant explains the refresh mode before anyone starts fixing things.
  4. Resends only after the fixA retry against a live failure repeats the same rejection and fills the log with noise. The cause gets fixed first, and the resend comes after.

Try also

  • Telegram notifications stopped coming. What happened?
  • Check every integration on this survey and resend what piled up

What it will not do

  • Do not suggest a plan upgrade or lead to payment
  • Do not enable sending yourself
  • Do not resend "just in case"
  • Do not delete an integration to "reset" it

The skill works with your permissions. Tools that change data are marked, so you check what the assistant is about to do before you confirm. To cut access, remove the connector in the assistant or delete the API key.

In short

Which channels does the skill check?

Email notifications, Telegram, Google Sheets, Zapier and webhooks.

Where does it start?

With the integration state of the survey. It already has a ready reason: not on the plan, not connected, or switched off. That covers most cases and costs nothing.

Where does it see the reason for a failure?

For Telegram, in the delivery log with Telegram's own refusal text. For webhooks, in the receiver's status code. For Google Sheets, in the table's state: whether access is alive and how often it refreshes. For Zapier, in whether sending is on and how many zaps are subscribed.

Will the responses that piled up be lost?

For Telegram and webhooks, no: once the cause is fixed, the skill resends them. A Google Sheet catches up with one sync. Resending earlier is pointless, because the same refusal repeats.

Will the skill connect or switch on an integration by itself?

Telegram it can connect from the chat if you agree: it returns a bot link, and you add the bot to your chat. Google Sheets and Zapier are connected in the app or in Zapier, and the assistant gives you the steps. Sending that was switched off it turns on only with your consent, because people often switch it off on purpose.

Will it ask for my system's keys?

No. Webhook header values are hidden behind asterisks, and the skill neither asks you to read them out nor offers to rewrite them as a test.

The full skill

The SKILL.md file the assistant reads, exactly as it is in the archive.

Show the full text

Why responses are not leaving the survey

A silent integration has several different causes, each with a different fix. Work strictly in order: every next step costs more than the previous one.

Reply to the person in the language they write in.

Reasons and log messages are collected in references/reasons.md.

1. Get the survey id

Nothing can be done without it. If the survey was named in words, find it with get_quiz_list and confirm it is the right one before changing anything.

2. Read the state: get_quiz_integrations

It returns Telegram, Zapier and Google Sheets with a ready-made reason in the blocked field. This covers most requests and costs nothing. The response also lists channels SurveyNinja does not offer; ignore them.

Reason Meaning What to do
blocked_by_tariff not included in the plan state it plainly and stop, see the rule below
not_connected no connection at all Telegram: offer manage_quiz_messenger activate, which returns the bot link the person adds to their chat; Google Sheets and Zapier connect in the app: give the steps
disabled connected, sending switched off ask whether that was deliberate; enable only with consent
empty settings are fine go to step 3

Email notifications and webhooks are not in this response. They have their own checks, see steps 5 and 6.

3. Find the refusal

Each channel shows its cause in a different place.

Telegram: get_integration_logs with integration telegram. The refusal text is there (bot removed from the group, chat deleted, topic closed), and the unsent counter shows how much is waiting.

Google Sheets: manage_quiz_google_sheets with the show action. It shows whether access to the Google account is alive, the refresh mode and when the last export happened. Two common causes:

  • access to the Google account was revoked, or the table was deleted: the person reconnects the table in the app, because that needs a Google sign-in;
  • nothing is broken, the refresh mode is scheduled (once a day) or manual, so rows appear later or only on command. Explain it and ask whether to switch to realtime with "set_sync_mode".

Zapier: manage_quiz_zapier with the show action. It shows whether sending is on and how many zaps are subscribed. Zero zaps means the zap was deleted or turned off on the Zapier side. SurveyNinja keeps no log of what Zapier did next: the run history is in the person's Zapier account, under the zap's history.

4. Resend only after the cause is fixed

  • Telegram: resend_integration_logs, one entry by log_id or every failure over a period.
  • Google Sheets: manage_quiz_google_sheets with sync_now pushes what piled up. "export_all" re-exports every answer; ask where to (a new file, a new sheet, or replace, which overwrites the current sheet) before running it.
  • Zapier: once the zap is back on in Zapier, new responses flow again. There is no resend from the survey side.

Resending while the cause is alive is pointless: the same refusal repeats and the log fills with noise. The person fixes their side first: returns the bot to the group, restores access to the table, turns the zap back on.

5. Email notifications

get_quiz_email_settings: is the notification on, is each address confirmed (the checked field) and switched on. An address that was added but never confirmed receives nothing, while the settings look complete. That is the most common cause: ask the person for the code from the letter and confirm it with confirm_quiz_email_recipient. A recipient or the whole notification switched off is turned back on with toggle_quiz_email_recipient or toggle_quiz_email, after asking. If everything is confirmed and on, ask the person to check their spam folder.

6. Webhooks separately

get_quiz_webhooks lists the webhooks, whether each is on, and whether one switched itself off after a run of failed deliveries. get_quiz_webhook_logs is the delivery log with the receiver's response code. resend_quiz_webhook_log resends after the receiver is fixed, and toggle_quiz_webhook turns a self-disabled webhook back on.

Header values in responses are masked: they hold access keys to someone else's system. Do not ask the person to read them out, and do not offer to rewrite headers "to test": passing headers to an update replaces the whole list.

What to say at the end

Three things: which channel is silent, for what exact reason, and what the person needs to do. If the cause was fixed and the backlog resent, say how many went out.

What not to do

  • Do not suggest a plan upgrade or lead to payment. When the plan blocks a channel, name the reason and stop.
  • Do not enable sending yourself. A disabled integration is often disabled on purpose.
  • Do not resend "just in case". See step 4.
  • Do not delete an integration to "reset" it. Deleting Zapier removes its subscriptions, and the zap has to be rebuilt in Zapier; deleting a webhook loses its headers and log.
The SurveyNinja ninja on a rocket

Connect SurveyNinja to your assistant

The MCP server works on every plan, Free included. Sign up, allow access and ask your assistant to build the first survey.