1Install the app
Any Android phone with a SIM. A spare phone on a charger at the shop works well.
Turn the Android phone your business already has into a texting line with an API, an inbox and webhooks. Customers see the number they know. No new number, no carrier paperwork.
Install the app, scan a code, send your first text in about five minutes.PhoneGateway runs on a phone you own, with the SIM and plan you already pay for. We add the API, the dashboard and the safety rails.
Any Android phone with a SIM. A spare phone on a charger at the shop works well.
Open your dashboard, add a phone, scan the code. The phone is connected in seconds and only ever talks to our servers.
One request from your app, a form, Zapier or the dashboard. The phone sends it from its SIM and reports back.
Every text in and out of the phone is in one place, your other tools hear about it the moment it happens, and STOP is honored without you lifting a finger.
Read and reply from any computer. Anyone on your team can answer; the customer still sees one number.
Received, sent, delivered, failed, opted out. Each delivery is signed and retried until your server says OK.
STOP, HELP and START are answered on the spot. A number that opted out is blocked for your account, and nobody else's.
A plain JSON API with keys you make in the dashboard. Idempotency keys, message history, conversations and per-phone sending. Full reference in the docs.
curl https://api.phonegateway.app/v1/messages \ -H "X-API-Key: ptl_your_key" \ -H "Content-Type: application/json" \ -d '{"to": "+19165550142", "body": "Hi Maria, your estimate is ready.", "ref": "estimate-1042"}'
const res = await fetch("https://api.phonegateway.app/v1/messages", { method: "POST", headers: { "X-API-Key": process.env.PHONEGATEWAY_KEY, "Content-Type": "application/json" }, body: JSON.stringify({ to: "+19165550142", body: "Hi Maria, your estimate is ready.", ref: "estimate-1042" }), }); const { message } = await res.json(); // message.status === "queued"
import requests, os r = requests.post("https://api.phonegateway.app/v1/messages", headers={"X-API-Key": os.environ["PHONEGATEWAY_KEY"]}, json={"to": "+19165550142", "body": "Hi Maria, your estimate is ready.", "ref": "estimate-1042"}) print(r.json()["message"]["status"]) # queued
HTTP/1.1 202 Accepted { "message": { "id": "msg_8f2c1a7e9b3d4c5e6f70", "direction": "outbound", "status": "queued", "contact": "+19165550142", "line_number": "+19165550199", "ref": "estimate-1042", "segments": 1, "queued_at": 1731024180 }, "deduped": false }
message.receivedwebhookA customer texted the phone. Body, number, and the ref of your last text to them.message.sentwebhookThe phone handed it to the carrier.message.deliveredwebhookThe carrier confirmed delivery to the handset.message.failedwebhookIt could not be sent, with the reason.contact.opted_outwebhookSomeone replied STOP. Stop texting them in your tools too.Carriers watch personal numbers for bulk patterns. PhoneGateway paces sends, respects quiet hours and pauses a phone before a problem turns into a suspended line. Every limit is yours to adjust.
Sensible caps per phone, so a bug in your code can't blast a backlog.
Texts leave one at a time at a human pace. Auto-replies skip the gap.
Checked in the recipient's time zone from their area code, not yours.
Three opt-outs in a day from one phone's sends pauses that phone until you look.
If the texts should come from the number on your trucks, your door and your Google listing, this is the simplest way to automate them.
Appointment reminders, "on my way" texts, estimate follow-ups and review requests from the shop phone, answered from any computer.
SMS in your app without a carrier registration process or per-message pricing. Keys, idempotency, webhooks and history like you'd expect, plus an MCP server so Claude Code, Codex or any AI agent can text through your account.
Give each of your customers their own texting line on their own phone. One platform key creates accounts, pairs phones and sends on their behalf.
Texts go out on the carrier plan you already pay for, so we never charge per message. One price covers the account, every phone on it and everyone on your team.
$9 a month, or $90 a year, for the whole account: every phone on it, the dashboard, the API and webhooks. Start with a 3-day trial, no card needed. We don't charge per text; texts go out on your carrier plan.
Any Android phone (Android 8 or newer) with a SIM and a plan that includes texting. Many businesses use a spare phone that sits on a charger. Your carrier's normal texting rules and any plan charges apply.
Not for sending. iOS doesn't let apps send texts on your behalf. The dashboard works in any browser, including on an iPhone.
You're texting your own customers from your own phone, which is what the phone is for. The rules that apply to any business texting still apply: text people who agreed to hear from you, identify yourself, and honor STOP. PhoneGateway handles STOP automatically and paces sends so your number doesn't look like a bulk sender. It's not built for mass marketing blasts, and our terms don't allow them.
The app receives texts that arrive on the connected phone while it's connected, so replies reach your inbox and STOP works. It doesn't read older messages, your contacts, photos or other apps. Most people connect a phone used only for the business.
Texts wait in the queue and go out when it's back. If it stays offline past your limit (six hours by default), waiting texts fail with a clear reason and your webhook hears about it, so an old backlog never blasts out later.
Yes, up to ten per account. Sends go to the phone that checked in most recently, or to the one you name in the request.