Stitchwork Docs

Messaging

Write to one customer from their record — by email, text or WhatsApp — and see the whole conversation in one place: what was sent, what became of it, and what they said back. One customer at a time, written and sent by a person.

The conversation on the record

Every customer has a Messages tab. It shows every email sent from Stitchwork and every text in either direction, oldest first, with what happened to each — delivered, bounced, read, clicked — and who sent it. The composer underneath picks the channel the customer last wrote on, and tells you plainly when a channel is closed and why (no number on file, they replied STOP, WhatsApp's window has passed).

Drafts from the assistant land in the same composer. Nothing is sent until you press Send, and a message that started as an AI draft is marked that way on the record.

Beside the Send button, the composer says what the client has agreed to hear about on the chosen channel (see marketing permissions) — quietly when nobody has asked them, plainly when they said no. It never stops a message: a client is owed news of their own order, appointment or repair whatever they said about offers, and whoever is writing knows which this is.

Email

Email goes from Stitchwork's sending address, signed with your name and your shop's, with your reply-to address on it — so a customer's answer lands in your own inbox. Set and confirm the reply-to in Settings → Workspace; until it is confirmed, nobody can email a customer from Stitchwork. Customers' replies to email are not brought back into Stitchwork; they are in that inbox. A quote emailed to a customer passes the same checks and lands on the same record.

RuleWhy
A subject and up to 4,000 charactersA note to one customer, not a newsletter.
30 emails and 30 texts an hour per workspaceComfortable for a person working a list; a stop for a script.
A hard bounce or a spam complaint stops further emailA dead address or an unhappy recipient harms delivery for every other customer. The reason shows on the record.

Click and open tracking

Both are off until an owner or admin turns them on in Settings → Messaging. With click tracking, links in the email pass through Stitchwork on the way, so a click shows on the record; every tracked link is signed, so it can only ever lead where you wrote it. With open tracking, a one-pixel image reports when the email is shown — treat it as a hint, because Apple Mail and some company filters load images on their own. The plain-text version of every email always goes exactly as written. Texts are never tracked.

Texts and WhatsApp

Texts go through your own Twilio account — your numbers, your sender name, billed to you by Twilio at their rates. Connect it in Settings → Messaging with the Account SID and Auth Token from the Twilio console, plus the number you text from (or a Messaging Service) and, if you have one approved, a WhatsApp sender. The credentials are checked with Twilio before anything is saved, and the token is stored encrypted and never shown again.

  1. Connect

    Paste the Account SID, Auth Token and your number in Settings → Messaging.

  2. Point replies at Stitchwork

    Press Point my SMS number here, or paste the inbound URL shown into "A message comes in" on your number, Messaging Service or WhatsApp sender in Twilio.

  3. Check the country

    Numbers on records are often written without a country code ("07700 900123"). Set the country they are in, so they are read correctly; a number that cannot be read confidently is refused, never guessed.

WhatsApp's 24-hour window

WhatsApp only allows a free-form message within 24 hours of the customer's last WhatsApp message to you, so it is for replying. Outside the window the composer says so and offers email or a text instead.

STOP and START

A customer who replies STOP (or UNSUBSCRIBE, CANCEL, END, QUIT) is not texted again — on every record carrying that number — until they reply START. A "Yes" from somebody who never opted out is treated as what it is: an answer. A STOP also goes on the client's marketing permissions as a no on that channel; a START lets texts through again but is not counted as agreeing to marketing.

The STOP belongs to the number as well as the record. If it comes from a number nobody has on file yet, that number still cannot be texted once it is typed onto a record, imported, or matched in the Messages inbox. Matching the STOP to a customer in the inbox blocks texting on their record too. The same goes for an email address that hard-bounced or marked you as spam, and both outlive the customer: delete someone at their request and the opt-out is the one thing kept, so a later import cannot bring their number or address back into use.

When a customer replies

A text or WhatsApp reply is matched to the customer by their number and lands on their record. It also puts them on today's follow-up list — one open follow-up per customer, so five texts in a row are one thing to do, not five — and emails whoever gets your contact-form enquiries (the owner and admins, unless you set another address). A number that matches nobody waits on the Messages page, where you say whose it is; every message from that number moves to their record, and the number is saved to it if it had none.

Saved replies

The messages a shop writes every week — after a visit, "it has arrived", the gentle check-in — written once, in your voice, by an owner or admin in Settings → Messaging → Saved replies, and picked from Start from a saved reply in the composer on any customer. Three starters can be added in one click and rewritten to sound like you.

Picking one fills in {first_name}, {name}, {my_name} (whoever is sending) and {shop}, and leaves it in the box to read and change — nothing sends by itself. A reply can be kept for email only or for texts only, and is offered only on that channel. For email, a closing line that is only {my_name} is dropped, because the email is signed already. The personal message, from what the customer has looked at and said, is what the assistant drafts; saved replies are the house ones.

GET    /api/v1/message-templates                 anyone on the team
POST   /api/v1/message-templates                 {"name", "channel": "any|email|text", "subject", "body"}
POST   /api/v1/message-templates/starters        the three starters, any not already there
PUT    /api/v1/message-templates/{id}
DELETE /api/v1/message-templates/{id}

What it is not

There is no bulk send, no scheduling, no sequence and no campaign tool, and nothing an agent or the assistant writes reaches a customer without a person pressing Send. A message to a list is a different thing in law and in an inbox, with consent and unsubscribe obligations this deliberately does not take on.

For developers

EndpointDoes
GET /api/v1/customers/{id}/messagesThe conversation, and which channels are open right now, each with the reason when one is not.
POST /api/v1/customers/{id}/messages{channel, subject?, body} — send one, as the signed-in person.
GET /api/v1/messages/inboxTexts customers sent; ?filter=unread|unmatched.
POST /api/v1/messages/texts/{id}/attach{customer_id} — say whose an unknown number is.

An MCP connection can read both sides — get_customer_emails and get_customer_texts — and has no tool that sends.