# Segment explorer and broadcast send desk for Customer.io

> See exactly who is inside every Customer.io segment, check how much two audiences overlap, then send your broadcast to a list you actually trust.

- Workflow type: app
- Services: Customer.io, Google Sheets
- Categories: Marketing, Operations
- Published: 2026-08-17

## What it does

- Lists every segment in your Customer.io workspace with its size, and opens any one so you can page through the real people inside it with search and sorting on their details.
- Compares any two segments side by side so you can see who sits in both and stop sending the same message to the same person twice.
- Lets you pick the exact recipients and send your broadcast with personal details filled in for each one, with a warning before you hit an audience bigger than you meant to.
- Keeps the history of what already went out for each broadcast, and exports any segment or overlap list to Google Sheets for the campaign brief.

## What you'll need

- A Customer.io account with access to your segments and broadcasts
- At least one broadcast in Customer.io set up to be triggered from outside the tool
- The ids of the broadcasts you send most often, so you can save them once in the send desk
- A Google account and a spreadsheet you want your audience exports to land in

## Prompt

Build me an app for reviewing Customer.io audiences before I send to them. Today it is hard to see who is actually inside a segment until after a broadcast has gone out, so this app is a segment explorer joined to a send desk. It has two main tabs: Audiences, where I browse and compare segments and start a send, and History, where I see what has already gone out for a given broadcast.

The Audiences tab opens on a list of every segment in the workspace, loaded with Customer.io List Segments. Show name, segment id, type, and size in a table I can search by name and sort by any column. If the segment listing does not return a member count for a segment, leave the size cell blank with a small control to calculate it on demand. Do not page through the membership of every segment just to populate that column on first load, because that would be thousands of requests before I see anything.

Clicking a segment opens the member browser, backed by Customer.io Get Segment Membership. That operation is cursor paginated: each response carries a next token that must be passed back as the start parameter on the following call, and you keep going until the token is empty. The default page size is 1000 and the maximum is 30000, so request a moderate page (around 500 to 1000) and give me a Load more control plus a visible count of how many people are loaded so far out of the segment total. Show the person identifier (id, email, and cio_id) alongside their traits as columns, let me search across everything already loaded, and let me sort on any trait column. Every row has a checkbox, with select all on the current page and a persistent running count of how many people I have selected.

The compare view lets me choose two segments and see how much they overlap. Load the membership of both with the same paged reader, then intersect them on the workspace primary identifier. Report three numbers clearly: only in the first segment, only in the second, and in both, plus the overlap as a percentage of each segment. List the overlapping people in the same table component used by the member browser. Because both sides have to be fully paged before the numbers are exact, show progress while loading and make it obvious when a total is still partial rather than quietly showing a wrong number.

From a segment view or an overlap list I select recipients and open the send desk. There is no operation that lists broadcasts, so do not build a broadcast picker that fetches them. Instead let me maintain my own small roster of broadcasts inside the app: I add an entry with the broadcast id and a friendly label, the app saves it, and the send desk and History tab both choose from that saved roster. Let me edit and remove entries.

Sending uses Customer.io Trigger Broadcast, and the most important rule to get right is that the audience is exclusive: the request accepts exactly ONE of recipients, ids, emails, per_user_data, or data_file_url, and sending more than one is invalid. Model this as a single audience mode selector rather than a set of independent fields. When one mode is active, the inputs belonging to the other modes are disabled and cleared so I cannot half fill two of them. Expose these modes: explicit person ids, explicit email addresses, per person data where I supply recipients together with their personalization values, and a filter that describes the audience instead of naming people. Validate before sending and block with a plain explanation if the payload would carry two audience types.

For personalization, give me a shared data section that applies to the whole send, and, when I am in the per person mode, an editable grid where each selected recipient gets their own values. Prefill that grid from the traits already loaded for those people so I am not retyping names. Before I confirm, show a review panel with the broadcast label, the audience mode, the exact recipient count, and a sample of the merged data for the first few people.

Two guardrails matter. First, I set an audience size threshold that the app remembers, and any send that would reach more people than that has to pass a confirmation dialog naming the real count before it goes. Second, API triggered broadcasts are rate limited to one request per ten seconds per broadcast, so enforce that in the interface: after a successful trigger, disable sending for that specific broadcast id with a visible countdown, key the cooldown per broadcast rather than globally, and serialize sends instead of firing several at once. Also pace the membership paging, since the Customer.io app API allows about ten requests per second for the workspace overall, and if a request comes back rate limited, back off and retry rather than looping.

The History tab shows what already went out. I pick a broadcast from my saved roster and the app calls Customer.io List Broadcast Triggers to show every trigger for it, newest first, with the trigger id, when it ran, its status, and how many people it reached. Clicking a row calls Customer.io Get Broadcast Trigger and opens the full detail, including the data that was sent and the recipient filter that was used, so I can see exactly what a past send targeted.

Anywhere I am looking at a list of people, a segment view, my current selection, or an overlap result, I can export it to Google Sheets with Append Values. Let me choose the spreadsheet and tab, write a header row when the tab is empty, and include the segment or comparison name, the identifier columns, the trait columns currently shown, and the time of the export. Remember the last spreadsheet and tab I used so the next export is one click.

Persist per user of the app: the saved broadcast roster, the audience size threshold, the export destination, and my column and sort preferences in the member browser. The app is read only against Customer.io apart from sending: it never creates, edits, or deletes segments or customer records, and the only writes are triggering a broadcast and appending rows to my spreadsheet.

## How to customize

- Set the audience size that triggers a warning before sending, so a small list goes out quietly and a big one always asks first.
- Choose which customer details show as columns in the member browser and which one the list sorts by.
- Point exports at whichever spreadsheet and tab your campaign briefs already live in.

## FAQ

### Can I see who is actually in a segment before I send anything?

Yes, that is the main point of the app. Clicking any segment pages through the real people inside it, with their details shown as columns you can search and sort, so you can sanity check an audience before it receives anything.

### Will this stop me from sending the same message to the same person twice?

Pick two segments and the app shows how many people sit only in the first, only in the second, and in both. You can review or export that overlap list and adjust who you send to before anything goes out.

### What happens if I try to send to a much bigger audience than I meant to?

You set a size limit that feels safe for your team. Whenever a send would reach more people than that, the app stops and asks you to confirm, showing the actual number of people involved.

### Can I send to just a handful of people instead of a whole segment?

Yes. You can select specific people from a segment and send only to them, or hand the whole audience over as a filter. The app makes you choose one of those approaches per send, because Customer.io accepts only one audience definition at a time.

### Does this change anything in my Customer.io account?

The app only reads your segments and the people in them. The one thing it writes is the broadcast you choose to send, and it never edits or deletes segments or customer records.

Use this prompt in General Input: https://www.generalinput.com/prompts/segment-explorer-and-broadcast-send-desk-for-customerio