Send Messenger campaigns to any slice of your Google Sheet

By General Input

Filter your audience sheet into a segment, see who is actually reachable, then send a Messenger campaign and log every result back to the sheet.

Integrations

  • Manychat
  • Google Sheets

Type

App

Categories

  • Marketing

Build me a Messenger send desk. My audience lives in Google Sheets, one row per person with an email or a phone plus columns like segment, last purchase, and source. I want to turn any slice of that sheet into a Manychat campaign without exporting anything or hand picking contacts inside Manychat. The spreadsheet is the source of truth for who exists and who has been contacted; Manychat is only the send channel.

Setup view. Let me save the spreadsheet ID, the tab name, and which row is the header. Read the audience with the Google Sheets Get Values operation, using Batch Get Values when I have the audience split across more than one tab or range. Infer the columns from the header row rather than hardcoding them, and let me map which column holds email and which holds phone, since every audience sheet names those differently. Cache the parsed rows for the session so filtering does not re-read the sheet on every keystroke.

Segment builder. Show the sheet as a table and let me filter rows into a segment in the UI: pick values from a column, combine a few conditions, and see the matching row count update live. Filters should work on whatever columns exist, so drive them off the inferred headers. Let me save a segment definition and rebuild it later against fresh sheet data, because the sheet keeps changing underneath me.

Resolution. Once I have a segment, resolve each row to a Manychat subscriber with Find Subscriber by System Field. That operation accepts email or phone but only one per request, so try the email first and fall back to the phone when there is no email or the email finds nothing. There is no list-all-subscribers endpoint in Manychat, which is exactly why the audience has to come from the sheet and get resolved row by row. Rows that resolve to nothing stay visible in the table as unresolved. Never silently drop them, because a missing match is information I need.

Enrichment and the review table. For every row that did resolve, call Get Subscriber Info to pull the full subscriber object, then show a review table with one line per person: the identifying columns from their sheet row, whether they are reachable, the tags they already carry, and when they last interacted. Split the table into reachable and unreachable groups before I commit to anything, with counts on each. Also load the page's existing tags with Get Tags and custom fields with Get Custom Fields so I can see and reuse what already exists rather than inventing new tag names.

The reachable split is the important part. Send Content fails with error 3021 when you message someone outside the 24 hour window without a message tag, so compute reachability from the last interaction timestamp on the subscriber object returned by Get Subscriber Info. Verify the exact field name against a live response before relying on it rather than assuming, and if the field is absent treat that person as unreachable rather than guessing they are fine. Anyone last active more than 24 hours ago goes in the unreachable group with the reason shown.

Composing and sending. From the review table let me choose one of two paths. Either pick an existing sequence, loaded with Get Flows and sent with Send Flow, or write a one off message in a composer and send it with Send Content using the Dynamic Block v2 format. Default the recipient list to the reachable group only, show me exactly how many people will receive the send, and require an explicit confirmation before anything goes out. A dry run that shows the resolved recipient list without sending is worth having.

Every send also stamps the person with Add Tag to Subscriber by Name, using a campaign tag I choose or one derived from the campaign name. That tag is how I suppress people from the next campaign, so let me use an existing tag as an exclusion filter back in the segment builder. The stamp should follow a successful send, and a failed send should not leave a tag claiming the person was contacted.

Add a Write this campaign button that runs a background agent. The agent reads the selected segment's sheet columns, works out what those people actually have in common, such as a shared source, a similar last purchase, or a common segment value, and proposes two or three message variants tuned to that. It drops the drafts into the composer for me to edit and pick from. The agent must not send anything itself; drafting is the whole job. Show its progress while it runs and land the variants in the app where I can see them side by side.

Write back after every send. Use the Google Sheets Append Values operation to log one row per recipient with a timestamp, who they were, what was sent (the flow name or the message text), and the outcome: sent, rejected, or unresolved, with the error reason when the send failed. Batch these into a single append call per campaign rather than one call per recipient, because the Sheets write quota is 60 requests per minute per user and a per-recipient append would blow through it. Let the results log go to its own tab so the audience list stays clean.

Throttle everything and show progress. Manychat's limits are per account and shared across everything using the same API key: Find Subscriber by System Field allows 50 requests per second, subscriber reads including Get Subscriber Info allow 10 per second, Get Flows allows 10 per second, subscriber writes including Add Tag allow 10 per second, Send Content allows 25 per second, and Send Flow allows 20 per second with a hard cap of 100 per subscriber per hour. Build resolution and sending as throttled batches with a visible progress bar and a running count, never a single fan out. Note that because every send is paired with a tag write, the real send pace is governed by the 10 per second subscriber write limit rather than the higher send limits, so pace to the slower of the two.

Handle failure without losing the run. Retry 429 responses with backoff, keep going when an individual recipient fails, and show me a per-recipient status list as the campaign progresses. If a send is interrupted, I should still be able to see who was already contacted and the sheet should still have their rows, so a resumed or repeated campaign does not double message anyone who already got it.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentLocal listing health board for every location you manageLet support send one-off Loops emails without an engineerStop cold emails to anyone with a live deal in PipedriveiMessage campaign console with pre-flight checks and delivery boardLinkedIn Ads budget pacing dashboard for every client accountFront desk appointment confirmation board for the next 3 daysGive your team Looker numbers without buying more seatsBuild audience segments from product usage and push to LoopsTurn the people who engage with your posts into Pipedrive leads