# Copy Guide — every email and text the Blueprint sends

STATUS: v1, 2026-08-26. Read by the build stage before it writes a single template, and by anyone editing a preset.

Why this exists, in the owner's words after inspecting a real build: "If we provide everything generic, our users will not be impressed and will not stay with us long." The workflows are only as good as the words inside them. This guide is the standard every message is written to and rewritten to.

## 0. The one rule

**Every message is a complete, send-ready template, written from the client's brief, that a real person would be glad to have signed.** Never an outline. Never a placeholder sentence. Never "insert benefit here." If a fact is missing from the brief, write the message without that fact; do not invent one.

## 1. How copy flows through a build

1. The preset ships **complete templates** (`templates.emails[]` with `subject` + `html`, `templates.sms[]` with `body`) written from placeholder brief fields. They are the floor, not the ceiling.
2. The build stage **rewrites every template from the real brief**: `business.name`, `offer.summary`, `offer.leadMagnet`, `offer.pricePoints`, `audience.ideal`, `audience.painPoints`, `audience.objections`, `goal.followUpStyle`, `voice.threeWords` (tone), `voice.signatureLine` (verbatim in the instant email and text), and `extended.*` (Agency OS ICA / offer / brand DNA) when present.
3. The rewrite **keeps**: the cadence (which day, which channel), the single CTA, the merge fields, the STOP lines, the length limits, and the compliance rules of the industry (clinic: nothing clinical in a message).
4. The result is written to **both** the template (`html` / `body`) and the matching asset (`emails[].body` / `sms[].body`), and the send step references the template with `templateRef`. An asset with only `copyDirection` reports `needsContent` and will not build.
5. Each template's `copyDirection` (on the asset) says what that message is for. Honor it; it encodes the sequence's logic (day 8 gives a tip, day 14 handles price, day 27 is the decision sheet).

## 2. The shape of a message: Hook → Resonance → Belief → Action

Every email and every text, in this order, however short:

| Beat | What it does | Test |
|---|---|---|
| **Hook** | Earns the next three seconds. Names the reader's situation, not our product. | Would the first six words stop *this* person, and only this person? |
| **Resonance** | Shows we understand before we sell. Their words for the problem (from `audience.painPoints`), not ours. | Could they say "that's exactly it"? |
| **Belief** | Gives a reason to trust the promise: a mechanism ("we treat less first, then adjust"), a process ("here's the visit minute by minute"), or a real proof point from the brief. | Does the proof match the size of the claim? No proof, smaller claim. |
| **Action** | One ask. One. A reply, a tap, a word. | Could they do it with a thumb in under ten seconds? |

A text can do all four in two sentences. An email does it in 60 to 150 words.

## 3. What the Gary V / Alex Hormozi standard means here: five concrete tests

Run every message through all five. A message that fails one gets rewritten, not shipped.

1. **The Jab test (give before you ask).** In any three consecutive touches of a sequence, at least two give something with no ask beyond a reply: a tip they can use today, the answer to an objection they have not voiced yet, a decision aid ("three questions to ask anyone you hire"), a plain-words explanation of cost. The third may ask for the booking. A sequence that asks every time is spam with a nice font.
2. **The Value Equation test (Hormozi).** Every message that asks for the next step raises the dream outcome and the likelihood, and lowers the time and the effort, in words: what they get ("a written plan you keep"), why it will work ("we check your benefits before you come in"), how fast ("30 minutes", "this week"), how easy ("reply with one word"). If a message lowers none of the four, it is not ready.
3. **The Says-who test.** Every specific (a number, a result, a "most people", a "clients tell us") either traces to the brief or comes out. "We are passionate about quality" fails on the other side: it is a claim nobody can check and nobody believes. Specific and true, or gone. No fabricated stories, no invented client, no "one customer told me last week."
4. **The Lock-screen test.** Read the SMS's first six words, or the email's subject plus first line, as a lock-screen preview. They must say who this is and why it matters to the reader *today*. "Just checking in" fails. "Dana at Glow: mornings or afternoons?" passes.
5. **The Thumb test (make it easy to say yes).** The reply is one word, one tap, or one day of the week. The CTA is the only link. Nobody is asked to "let us know if you have any questions" or "feel free to reach out." Binary questions beat open ones: "mornings or afternoons?", "still on the list this season, or should I close your file?"

## 4. Voice

- **One person to one person.** Every message is signed by a named human (`{{custom_values.owner_first_name}}`), addresses `{{contact.first_name}}`, and uses "I" and "you." No "we at [Business] are excited to."
- **Plain spoken English.** Contractions. Short sentences. The way the owner talks to a client at the front desk. If a sentence would sound odd said out loud, cut it.
- **Tone from the brief.** `voice.threeWords` sets it ("warm, direct, unhurried" reads differently from "bold, playful, fast"). `voice.signatureLine` goes in verbatim, as its own paragraph after the greeting of the instant email, and as the second sentence of the instant text when it fits.
- **Honest about being automated where it matters.** The last message of a sequence says it is the last automatic one. A "no pitch, just checking" text must contain no pitch.
- **No hype, no pressure words, no fake urgency.** A deadline exists only when the store or calendar actually enforces it (a code that expires, a calendar that fills). "Act now", "limited time", "don't miss out" never appear.
- **No em-dashes.** Use a period, a comma, a colon, or restructure.

## 5. Email rules

| Rule | Detail |
|---|---|
| Subject | 45 characters or fewer (60 hard cap). Sentence case. No ALL CAPS, no exclamation marks, no "Re:" / "Fwd:" tricks, no spam words (free!!!, guaranteed, act now). The first name in the subject is allowed once per sequence. |
| First line | Doubles as preview text. Starts the hook; never "Hi {{contact.first_name}}, I hope this finds you well." |
| Length | 60 to 150 words. The decision-sheet email may reach 200 because it is a list. |
| Layout | Single column, 600px max, 16px Arial-family text, short paragraphs (1 to 3 sentences), a bulleted list where there are three or more parallel items. No hero images required; a text-first email lands and loads. |
| CTA | One. A button (`CTA:` paragraph in the preset source) or one text link. The same destination, never two different ones. The last nurture emails may add "or reply to this email" as the zero-effort alternative; that is the same ask, not a second one. |
| Signature | First name, business name, phone: `{{custom_values.owner_first_name}}` / `{{custom_values.business_name}}` / `{{custom_values.business_phone}}`. |
| Proof | Only from the brief. No invented testimonials, numbers, credentials, or anecdotes. Where a preset leaves room for proof and the brief has none, delete the sentence. |
| Exits | Every sequence offers a graceful out ("reply with the word later", "reply less"). GHL appends the unsubscribe footer; do not fake one. |

## 6. SMS rules

| Rule | Detail |
|---|---|
| Length | 160 characters rendered is the target (one segment). 320 is the hard cap; the validator rejects longer. Measure with real values (a long business name counts). |
| Identify | The first text of every workflow names the business and, where it fits, the person. Later texts in the same workflow within seven days may skip it. |
| STOP line | "Reply STOP to opt out." on the first text of every workflow and on any text after a gap of seven days or more. Not on every text (it reads like a robot). |
| Links | No link in the instant text (deliverability, and it reads like spam). The booking link may appear from the second touch on, at most one per text, and never in a text whose job is a question. |
| The ask | Every text ends with one question or one single-word instruction: "Mornings or afternoons?", "Reply YES", "Reply with a day that works." Never two questions. |
| Cadence | Instant, then 20 minutes, then the next day in Speed to Lead. Never more than one text per day in a nurture. Never before 8am or after 8pm local (set the workflow's send window in GHL). |
| Merge fields | `{{contact.first_name}}`, `{{custom_values.business_name}}`, `{{custom_values.owner_first_name}}`, `{{custom_values.booking_link}}`, `{{custom_values.business_phone}}`, and `{{appointment.start_time}}` only inside appointment-triggered workflows. |
| Compliance | Nothing clinical, financial, or embarrassing in a text, ever (a text is read on a lock screen). A2P copy must match the registered use case; the intake's compliance notes win over this guide. |

## 7. Merge fields and custom values

Use these, and only these, so the copy stays correct when details change and the executor can verify each one exists:

| Merge field | Meaning | Where it comes from |
|---|---|---|
| `{{contact.first_name}}` | the reader | GHL contact |
| `{{contact.phone}}`, `{{contact.email}}`, `{{contact.name}}` | internal notes, task bodies, notifications only | GHL contact |
| `{{custom_values.business_name}}` | the client's business name | `customValues` (from `business.name`) |
| `{{custom_values.business_phone}}` | the number to call or text back | `customValues` (filled once a GHL number exists) |
| `{{custom_values.owner_first_name}}` | who every message is signed by | `customValues` (the first name of `team.notifyName`'s user) |
| `{{custom_values.booking_link}}` | the calendar link | `customValues` (filled by the calendar handoff) |
| `{{custom_values.store_link}}`, `{{custom_values.welcome_code}}`, `{{custom_values.code_expiry_days}}` | ecommerce presets only | `customValues` |
| `{{appointment.start_time}}` | the booked time | GHL, only in workflows with an `appointment` trigger |

Preset tokens (`{{offer.leadMagnet || a free consultation}}`, `{{audience.painPoints[0] || ...}}`) are **not** merge fields: the fill step replaces them from the brief before anything is built. The rewrite should leave no preset token behind; every `{{...}}` in a built template must be a GHL merge field from the table.

## 8. Banned openers and phrases

Never: "I hope this email finds you well", "Just checking in", "Just following up", "Touching base", "Per my last email", "Are you tired of…", "In today's fast-paced world", "We're excited to", "As a valued customer", "Don't miss out", "Limited time only", "Act now", "Hi there" (use the name), "Let us know if you have any questions", "Feel free to reach out", "We pride ourselves on", "We're passionate about", "Look no further", "Unlock", "Elevate", "Transform your", "Game-changer".

Replace with a specific: what happened, what we noticed, what we can do, what to reply.

## 9. Cadence the presets ship (and the rewrite keeps)

| Sequence | Touches | Span | Shape |
|---|---|---|---|
| Speed to Lead | 5 (3 texts, 2 emails) | 24 hours | instant text + email, call task, +20 min text (binary question), +3 h email (what happens next), +1 day text (not chasing), then the `nurture-start` hand-off as the LAST action |
| Missed Call Text-Back | 2 texts | 1 hour | instant text-back (how can we help), tag, alert, call-back task, +1 h text (call-back time or booking link) |
| Lead Nurture (30 days) | 11 (6 emails, 5 texts) | 31 days of waits | day 1 reframe, 3 one-word question, 5 how it works + top objection, 8 free tip, 10 method as proof, 14 price/time head-on, 15 midpoint binary, 20 cost of waiting, 23 any question, 27 decision sheet, 30 last direct ask, then `lifecycle-lapsed` + `winback-start` |
| Win-back (30 days) | 5 (3 emails, 2 texts) | 31 days of waits | day 0 one question, 7 binary text, 14 what changed, 22 concrete reason text, 30 the door stays open (says it is the last automatic message), then `lifecycle-lost` |
| Appointment | confirm email + text; 24 h text + prep email; 2 h text | appointment-relative | confirmation restates time, what to bring, what they leave with, how to move it |
| No-Show Rescue | 4 (2 texts, 2 emails) | 7 days | same-day text + email (no guilt), +1 day text, +3 days email (still want this?), then hand-off to Win-back |

Total: 21 customer touches from form to lost, before the appointment sequences. That is the owner's "it takes sometimes 21 points of touch" standard.

## 10. Per-message checklist

Before a template is written to the plan, every line must be true:

- [ ] Addresses `{{contact.first_name}}` and is signed by a named person.
- [ ] Hook → Resonance → Belief → Action, in that order, in the reader's language.
- [ ] Passes all five tests in section 3 (Jab, Value Equation, Says-who, Lock-screen, Thumb).
- [ ] One CTA. One question or one instruction to end a text.
- [ ] Every specific traces to the brief; nothing invented; proof gaps deleted, not filled.
- [ ] Subject 45 characters or fewer, sentence case, no spam words. SMS under 160 rendered (320 hard cap).
- [ ] STOP line where section 6 requires it; no link in an instant text.
- [ ] Only merge fields from section 7; no preset token left behind.
- [ ] Tone matches `voice.threeWords`; `voice.signatureLine` used where section 4 says.
- [ ] Industry compliance honored (clinic: nothing clinical; A2P: matches the registered use case).
- [ ] No banned phrase from section 8. No em-dashes.
- [ ] The `copyDirection` for this slot is honored (the day's job in the sequence).

## 11. Worked email (Nurture 4, "About the price", local service)

Brief facts used: business "Ridgeline Roofing", owner "Marcus", offer "roof repair and replacement", objection "price", no proof points supplied (so none claimed).

```
Subject: About the price

Hi {{contact.first_name}},

Let's talk about the thing most people are too polite to ask: what is this going to cost?

The honest answer is "it depends on what we find", which is why we don't guess over the phone. What we can promise: the quote is itemized, it shows the repair-only option next to the full-replacement option where both exist, and payment terms are on the same page. Nothing is added after the fact unless you change the job, and you'd sign for that first.

If you have a budget in mind, tell us at the estimate. It's easier to design the job to the budget than to argue about it after.

[ Get my written quote ]   ← one button → {{custom_values.booking_link}}

Marcus
Ridgeline Roofing · {{custom_values.business_phone}}
```

Why it passes: hook names the unspoken question (Lock-screen); "it depends" is honest and specific to the trade (Says-who: no invented number); the mechanism is the itemized side-by-side quote (Belief; Value Equation raises likelihood, lowers effort); "tell us your budget" is a jab, not an ask (Jab); one button (Thumb). 118 words.

## 12. Worked SMS (Speed to Lead, instant text, local service)

```
Hi {{contact.first_name}}, it's Marcus at Ridgeline Roofing. Got your quote request. Quick one: is this urgent today, or can it wait for a scheduled visit? Reply STOP to opt out.
```

Rendered with a long name: 158 characters. Why it passes: identifies the person and the business in the first six words (Lock-screen); asks the only question that changes what happens next, as a binary (Thumb); no link in the first text; STOP line present (first text of the workflow). The reply routes the lead: "urgent" gets a call now, anything else gets the +20 minute photo text.

## 13. What to do when the brief is thin

- No pain points or objections: keep the preset's industry defaults (they are written for the vertical) and say so in the plan summary.
- No lead magnet: the CTA is the conversation ("book a time to talk"), never a made-up freebie.
- No staff names: sign with `{{custom_values.owner_first_name}}` and leave the custom value for `handoff.business_details`; never invent a name.
- No proof: delete the proof sentence. A shorter true email beats a longer invented one.
- Clinic with compliance notes: the notes win. Remove anything they forbid, even if this guide would otherwise allow it.
