# Bulk SMS send desk with cost checks and delivery results

> See exactly who you are about to text, what it will cost against your balance, and who actually got it, before and after you hit send.

- Workflow type: app
- Services: ClickSend, Google Sheets
- Categories: Marketing, Operations
- Published: 2026-08-16

## What it does

- Pulls your audience from either a saved ClickSend contact list or a range in a Google Sheet, then shows every recipient in a table with a running count and a clear warning on any number that is not formatted correctly
- Checks your account balance and the estimated cost of the send side by side before anything goes out, so you never discover mid blast that you ran out of credit
- Automatically skips anyone sitting on an opt out tab in your sheet, and lets you send a test to your own phone first
- Sends immediately or at a scheduled time, with a queue you can cancel from, and a results view showing delivered versus failed with the reason for each failure
- Writes the outcome for every recipient back to the source sheet so the row shows who actually received the message

## What you'll need

- A ClickSend account with credit on it
- A Google account, if you want to pull your audience from a spreadsheet and write results back to it
- Customer phone numbers that include the country code, for example +14155552671
- Your own mobile number, for test sends
- Optionally, a tab in your spreadsheet listing anyone who has opted out

## Prompt

Build me a bulk SMS send desk on top of ClickSend and Google Sheets. I open it whenever I need to text a list of customers, and it exists so I can see exactly who I am about to message and what it will cost before I commit, instead of fighting the ClickSend console. Three tabs: Compose, Scheduled, and Results.

Compose is the main screen. At the top I pick my audience one of two ways. Option one is an existing ClickSend contact list: use List Contact Lists to populate a dropdown, then List Contacts in List to load the members once I choose one. Option two is a Google Sheet: I give a spreadsheet, a tab and a range, and the handler uses Get Values to read it, letting me map which column holds the phone number and which columns hold merge fields like first name. Remember the last spreadsheet, range and column mapping I used so the next visit is one click.

Whichever source I pick, show the parsed recipients in a table with a running count above it. Validate every number against E.164, meaning a leading plus and a country code, and flag anything that fails with a visible warning on the row, because ClickSend rejects malformed numbers with INVALID_RECIPIENT. Trim whitespace and strip separators before validating, and where a number is obviously missing the country code offer a one click fix that applies a default country code I configure. Deduplicate repeated numbers and show how many duplicates were collapsed. Invalid rows are excluded from the send by default but stay visible in the table so I can correct them.

Bake in a suppression rule. My spreadsheet has an opt out tab, and anyone whose number appears there must be removed from the recipient set automatically, before both the cost estimate and the send. Read the audience range and the opt out tab together using Batch Get Values so it is a single request. Show a suppressed count in the table header, for example twelve recipients, three suppressed, so the removal is never silent, and let me click through to see which numbers were dropped.

Below the audience is the composer. Give me a message body field with a live character and segment counter that understands SMS encoding: 160 characters per segment for plain GSM characters and 153 per segment once a message spans multiple parts, dropping to 70 and 67 if I type an emoji or other Unicode character that forces UCS-2. Warn me at the moment a message tips into an extra segment, since that multiplies the cost of the whole send. Support merge fields from the sheet columns and show a live preview rendered against the first recipient. Include a test send button that fires Send SMS to just my own saved number so I can see the real thing on my phone before spending anything.

The pre send cost guard is the feature that makes this app worth opening. Call Get Account to read my balance and currency, and Calculate SMS Price to get ClickSend's own estimate for this exact audience and message rather than guessing at the math. Display estimated spend for this send next to remaining balance, plus what the balance would be afterwards. If the estimate exceeds the balance, block the send with a clear message that the account needs a top up, because balance is deducted on submission and an underfunded send fails with INSUFFICIENT_CREDIT. Let me set an optional spend ceiling that also locks the send button when an audience would cost more than that in one go.

Sending branches on the audience type. When the audience is a saved ClickSend contact list, use Send SMS Campaign against that list id. When it is an ad hoc sheet audience, use Send SMS with the recipients batched into the messages array rather than looping one call per person, respecting the 1000 message per request limit and chunking across several calls for bigger audiences. Both paths accept an optional scheduled time, passed as a Unix timestamp in seconds and omitted entirely when I want it to go immediately. Show a confirmation dialog restating the final recipient count, the segment count and the estimated cost before anything is submitted. Store the returned message ids alongside the phone number and, for sheet audiences, the source row number, because the Results tab needs that mapping later.

The Scheduled tab lists sends still sitting in the queue with their scheduled time, recipient count and the opening line of the message. Each row gets a cancel button backed by Cancel Scheduled SMS, and there is a cancel everything button backed by Cancel All Scheduled SMS for when I need to stop a send in a hurry. Confirm before either one runs and refresh the list afterwards.

The Results tab reports on sends that already went out. Use Get SMS History for the outbound records, Get SMS Delivery Receipts for carrier confirmed status, and Get SMS Statistics for account level totals. Show delivered versus failed as headline counts for the selected send, then a per recipient table with the number, status and, for failures, the specific reason so I can tell a bad number apart from a carrier rejection. Let me filter down to just the failures and copy that set out.

From the Results tab, a write back button pushes outcomes to the source Google Sheet using Update Values, matching on the stored row mapping so each customer's row records what happened to them, with a status column, a failure reason column and a timestamp. Only write back for audiences that came from a sheet, and tell me how many rows were updated.

Finally, when an ad hoc sheet audience turns out to be one I use repeatedly, give me a save as list button that creates a reusable ClickSend list with Create Contact List and then adds each valid recipient with Create Contact, carrying over name and merge fields where the sheet has them. Once saved, that list shows up in the audience dropdown on the next visit and can be sent to with Send SMS Campaign.

Throughout, remember my configuration between visits: the spreadsheet and range, the column mapping, the opt out tab name, my test number, the default country code, the default sender id and any spend ceiling. Keep a local history of past sends with their audience, message and results so the Results tab has something to select from. Handle rate limiting gracefully by backing off and retrying when ClickSend returns a throttling response, and surface any error message plainly rather than failing silently.

## How to customize

- Point it at the spreadsheet, tab and column that hold your phone numbers, and name the tab you use for opt outs
- Set a spend limit so the send button locks if an audience would cost more than you want to spend in one go
- Change the default sender name or number, and decide whether sends go out immediately or always get scheduled
- Adjust which columns the delivery results get written into on the source sheet

## FAQ

### Do my customers have to already be in ClickSend?

No. You can pick a contact list you have already saved in ClickSend, or just point the app at a range in a Google Sheet. If a spreadsheet audience turns out to be one you text often, there is a button to save it as a reusable ClickSend list so it is one click next time.

### Will it stop me from texting people who asked to be left alone?

Yes. Keep an opt out tab in your spreadsheet and the app removes anyone on it from the recipient list automatically, before the send and before the cost estimate. The recipient table shows you how many people were suppressed so nothing disappears silently.

### How do I know what a send will cost before I commit?

The app shows your current balance and currency next to an estimated cost for the exact audience and message you have loaded, priced per recipient. If the estimate is close to or over your balance the app warns you rather than letting the send fail partway through.

### Can I schedule a text for later and still change my mind?

Yes. Pick a send time and the message goes into a scheduled queue. The Scheduled tab lists everything waiting to go out with a cancel button on each one, plus a cancel everything option if you need to stop a send in a hurry.

### What happens to phone numbers that are typed wrong?

They get flagged in the recipient table before you spend anything. Numbers need the full country code to be accepted, so the app highlights anything missing a country code or otherwise malformed and keeps it out of the send rather than letting it fail on its own.

### How will I know who actually received the message?

The Results tab shows delivered versus failed counts with the specific reason for each failure, and a button writes those outcomes back onto the source spreadsheet so each row records what happened to that person.

Use this prompt in General Input: https://www.generalinput.com/prompts/bulk-sms-send-desk-with-cost-checks-and-delivery-results