One warning first. The snippet calls we use are internal routes that HighLevel's own web app makes, not a documented public API, and we haven't found a public route for writing snippets. Treat what follows as a workaround we've observed, and expect it to change.
What you're looking at
The snippet appears in Conversations > Snippets under the name you sent. Open it and the message is empty. Your code logged a success, so nothing flagged it.
That success is the trap. A good response from the create call tells you a record exists. It doesn't tell you the body was kept.
Make sure it's a snippet you're writing
In HighLevel, reusable text for SMS is a Text Snippet. A workflow's Send SMS action pulls it in through its Templates selector.
Email-builder templates are a different thing, with their own documented route. HighLevel's current public route for creating one is POST /emails/locations/{locationId}/templates with Version v3, and the older v2 create route is marked deprecated. Neither makes a text snippet, so don't point snippet code at them.
Why the body disappears
In the recipe we recorded, creating a snippet is a POST that returns a new record with no body in it. The text has to be written afterwards, by a PUT to that same record.
The PUT replaces the whole record. Send only the body and the name can be wiped. So the update carries everything at once: the name, the type, and the message nested under template.body.
Our own notes haven't always agreed on this. An earlier note described the body being accepted on create. We now write it in a second step and read it back either way, because that holds whichever behavior you get. HighLevel has changed this before, so check what your own calls return.
The fix, step by step
This is the order we run it in. Nothing in it is clever. Skipping the last two steps is how blank snippets end up inside live workflows.
- Confirm that what you're making is a Text Snippet, not an email template.
- Create the snippet and keep the id that comes back.
- Update that id with the name, the type and template.body in one request.
- Read the saved snippet back and compare its body with what you sent.
- Open it in Conversations > Snippets and look at it once before any workflow uses it.
The create response says a record exists. Only a read-back says the message is in it.
Repairing a blank snippet by hand
If only a few came out empty, fixing them in the app is quicker than rerunning code. Open Conversations > Snippets, find the blank one, edit it, paste the message and save.
To make a new one by hand, the current screen uses + New Snippet, then Add Text Snippet. Older guides call the button Add Snippet. HighLevel has renamed it before, so go by what you see.
After any fix, open a workflow's Send SMS action, pick the snippet from Templates, and read the text that fills in.
Mistakes that blank it again
Once the integration works, these are the habits that break it again.
- Sending the body alone on the update and losing the name.
- Counting a success response as proof the text saved.
- Pointing snippet code at an email-template route because that route has docs.
- Running a long-lived integration on an internal route with no check that would catch it changing.
Rather have it set up for you?
We'll put your text snippets in place with the copy inside them, check every one and wire them into the workflows that send them, starting from a 30-minute 1:1 with Rob.
