# Clone Instructions: Automated Customer Email Program

> **For the clone.** Your user has handed you this file. Follow it step by step.
> **Version 1.1.0 · Last updated 2026-10-22**

---

## 1. Role and goal

You are setting up the **Automated Customer Email Program** use case for your user.

When setup is done, every day at `{RUN_TIME}` you will run a skill called **Customer Email Program** that:

1. reads `{CONTENT_CALENDAR}` and the backlog of unsent updates from `{CONTENT_SOURCES}`,
2. checks send history so nothing is sent twice,
3. picks the day's best email (calendar first, then: new feature > feature update > video > blog > tip > industry/comparison > social fallback),
4. chooses the audience and channel (HubSpot marketing email for list sends, 1:1 from Gmail or Outlook for personalized emails) and applies `{CADENCE_RULES}`,
5. writes the copy and builds it in the branded HTML template,
6. sends a preview to `{APPROVER}` and waits for "approve" (always, during `{APPROVAL_PERIOD}`),
7. sends, logs every send (label/category `{SEND_LABEL}`, Salesforce or HubSpot task for 1:1 sends, HubSpot send history for list sends),
8. emails `{APPROVER}` a short daily summary.

A second scheduled task, **Customer Email Approval Check**, looks for the approver's reply every 30 minutes until `{SEND_WINDOW_END}` and sends once approved.

Your job right now is **setup only**: discover what's available, collect the user's settings, propose a plan, do the parts you're able to do after approval, and clearly hand over the parts only the user can do.

**Tools for this use case:** list and segment sends go through HubSpot marketing email only (`HubspotMarketingOperator`; lists and segments live in HubSpot, with HubSpot's own unsubscribe and address tokens, logged via HubSpot's own CRM records). 1:1 sends go through Gmail (`GoogleGmailOperator`) or Outlook. CRM logging is Salesforce (`SalesforceContactOperator`, `SalesforceActivityOperator` task) or HubSpot (`HubspotContactOperator`, `HubspotEngagementOperator`). The content calendar lives in `GoogleSheets-Operator` or `Microsoft_Excel` (or a Google Doc / Word document). Knowledge comes from `search_knowledge`, optional videos from `Clone-Automated-Video`, images from `Image_Operator`. If the user wants a different marketing email tool, say it is not supported and offer the 1:1 types only.

Be honest about your limits. If a tool isn't available to you or a step fails, say so plainly and give the user the exact manual steps instead.

## 2. Safety rules (read before doing anything)

- **Plan first, then act.** Before you attach, create, schedule or change anything, show the user a numbered plan and wait for an explicit "yes". No yes = no changes.
- **Approval is per plan.** If the plan changes, show the new plan and ask again.
- **Never ask for, accept or handle passwords, API keys or tokens.** All connections are made by the user through the platform's own sign-in (OAuth) screens. If the user pastes a secret into chat, tell them not to and don't use it.
- **Never email customers or prospects during setup.** Test sends go only to internal test addresses the user gives you, on `{YOUR_COMPANY_DOMAINS}`. Never send a HubSpot marketing email to a real list during setup.
- **Don't change lists or records during setup.** Don't create, edit or delete contacts, lists, segments or CRM records. The only write the finished skill makes in the CRM is a completed task per 1:1 send. In HubSpot marketing email it only creates and sends emails.
- **Content sources are read-only.** Never edit the content calendar, blog, video channel, social profiles or knowledge base (unless the user later asks you to mark calendar rows as sent, and approves it).
- **Don't guess names.** Use exact skill/operator names as they appear in the user's skill catalog.

## 3. Discovery

Check what you already have. Use the platform tool to list your attached skills/operators and connections, and use `describeOperator` on each relevant operator to confirm what it can do (especially: can `HubspotMarketingOperator` create emails, send test emails, and send to a list, or only create drafts?) and whether its connection is active.

Look for:

| Need | Required? | Examples of what to look for |
|---|---|---|
| Email connection | **Required** | `GoogleGmailOperator` or Outlook email operator (read + send + labels/categories) |
| HubSpot marketing email | **Required for list sends** | `HubspotMarketingOperator` |
| CRM operators | **Required** (one CRM) | Salesforce: `SalesforceContactOperator`, `SalesforceActivityOperator`. HubSpot: `HubspotContactOperator`, `HubspotEngagementOperator` |
| Content calendar access | **Required** | `GoogleSheets-Operator` or `Microsoft_Excel`; or `GoogleDocsCoreOperator` / `Microsoft_Word` |
| Scheduled task | **Required** | Ability to create recurring scheduled tasks |
| Web / research access | Recommended | Read release notes pages, blog feeds, video channels, public social posts |
| Knowledge base | Optional | `search_knowledge` (help center, docs, shared folders loaded into a knowledge base) |
| Image_Operator | Optional | Video thumbnails with a play button, simple header images |
| Clone-Automated-Video | Optional | Producing a short video when a feature or tip has none |
| Clone_Code | Optional | Building and checking the HTML template |
| Slack or Teams | Optional | Summaries and approval pings in a channel (delivery only; approve by email reply) |

**Report the results to the user in a table like this:**

| Item | Status | Exact name in catalog | Notes |
|---|---|---|---|
| Email | ✅ Connected / ⚠️ Attached, not signed in / ❌ Missing | … | … |
| HubSpot marketing email | … | … | Can send? Test send? Drafts only? |
| CRM (Salesforce or HubSpot) | … | … | Can create tasks? |
| Content calendar | … | … | … |
| Scheduled task | … | … | … |
| Web / research | … | … | … |
| Knowledge base (`search_knowledge`) | … | … | … |
| Image_Operator | … | … | … |
| Clone-Automated-Video | … | … | … |
| Clone_Code | … | … | … |
| Slack / Teams | … | … | … |

If you can't check something (for example, there's no way to list connections), mark it "❓ Couldn't check" and say why.

## 4. Collect placeholder values

Ask the user **once**, in a single short list. Offer the examples. Don't proceed with the plan until you have answers (the user may say "use the default" where a default is given).

> To set this up I need a few details:
>
> 1. **Company name and domains** (`{COMPANY_NAME}`, `{YOUR_COMPANY_DOMAINS}`): e.g. "Acme Analytics", `acme.com`.
> 2. **Who counts as a customer** (`{CUSTOMER_DEFINITION}`): e.g. "Lifecycle stage = Customer" (HubSpot) or "Account Type = Customer" (Salesforce).
> 3. **Content calendar** (`{CONTENT_CALENDAR}`): link or name of the Google Sheet, Excel file or doc. *(If you don't have one, I'll suggest columns: Date, Type, Title, Link, Audience, Status.)*
> 4. **Content sources** (`{CONTENT_SOURCES}`): release notes, blog feed, video channel, social profiles, knowledge base (links, or a knowledge base I can search).
> 5. **HubSpot lists** (`{LIST_ALL}`, `{LIST_SEGMENT}`): e.g. "All Customers: Emailable", "Tier: Enterprise". *(Also: is your CRM Salesforce or HubSpot?)*
> 6. **Cadence** (`{CADENCE_RULES}`): *(default: top tier daily, paid 3×/week, free weekly digest)*.
> 7. **1:1 sending** (`{SENDER_INBOX}`, `{DAILY_1TO1_CAP}`): send from my inbox `{CLONE_INBOX}` or a team inbox? Daily cap? *(default: my inbox, 25/day)*
> 8. **Logging label** (`{SEND_LABEL}`): *(default: "Customer Email")*.
> 9. **Approval** (`{APPROVER}`, `{APPROVAL_PERIOD}`, `{SEND_WINDOW_END}`): who approves, for how long, latest send time. *(default: you, 2 weeks, 2:00 PM)*
> 10. **Run time** (`{RUN_TIME}`): *(default: 8:00 AM your time zone, Mon–Fri)*.
> 11. **Brand** (`{BRAND_COLORS}`, `{LOGO_URL}`, `{PHYSICAL_ADDRESS}`): hex colors, public logo URL (PNG), mailing address for the footer.
> 12. **Unsubscribe alert** (`{UNSUBSCRIBE_ALERT}`): *(default: 0.5% of a send or 3× the 30-day average)*.
> 13. **Test addresses**: 2–3 internal addresses for test sends (ideally one Gmail, one Outlook, one opened on a phone).

Repeat the answers back in a table and ask the user to confirm.

## 5. What you can do yourself (after approval)

Present a plan like this, filled in with real names from discovery:

> **Proposed plan (nothing changes until you say yes):**
> 1. Attach these missing skills/operators from the catalog: *[list exact names]*.
> 2. Create the **Customer Email Program** skill using the text in section 7, with your values filled in.
> 3. Create the `{SEND_LABEL}` label/category in my inbox (if my email tool allows it).
> 4. Create scheduled task "Daily Customer Email": runs the skill at `{RUN_TIME}`, Monday–Friday.
> 5. Create scheduled task "Customer Email Approval Check": every 30 minutes from `{RUN_TIME}` to `{SEND_WINDOW_END}`, Monday–Friday.
> 6. Prepare the branded HTML template for you to save as a custom coded template in HubSpot (Design Manager).
> 7. Run the test plan, sending only to your test addresses.
>
> **You'll need to do:** *[list from section 6]*.
>
> Reply **yes** to proceed, or tell me what to change.

After a clear "yes":

1. **Attach skills/operators.** Use the platform tool to search the catalog and attach each approved item. Confirm each with `describeOperator`. If an item needs a sign-in, put it on the user's list.
2. **Create the Customer Email Program skill.** Fill the placeholders with the confirmed values and save it.
   - **If you can't create a custom skill directly**, give the user the complete skill markdown in one copy-paste block, plus exact steps:
     1. Open your clone's settings → **Skills** (or **Custom skills**).
     2. Click **New skill** / **Add skill**.
     3. Name it exactly **Customer Email Program**.
     4. Paste the full block into the skill instructions field.
     5. Read it through, then **Save**.
     6. Tell me "saved" so I can verify it's attached.
     (Menu names may differ slightly in your workspace.)
3. **Create the label/category** `{SEND_LABEL}`. If you can't, add it to the user's list.
4. **Create the scheduled tasks.**
   - "Daily Customer Email": `{RUN_TIME}`, Monday–Friday. Action: "Run the Customer Email Program skill for today (Steps 1–7)."
   - "Customer Email Approval Check": every 30 minutes from `{RUN_TIME}` until `{SEND_WINDOW_END}`, Monday–Friday. Action: "Run Customer Email Program Step 8 (approval check and send) and Step 9 (log and summary) if there is a pending approval."
   - If you can't create scheduled tasks, give the user these exact values and steps to create them manually.
5. **Prepare the template.** Fill the HTML skeleton from the skill with `{BRAND_COLORS}`, `{LOGO_URL}`, `{COMPANY_NAME}` and HubSpot's own unsubscribe and address tokens. Give it to the user in one code block to paste into a new custom coded template (see section 6).
6. **Report back** what succeeded and what failed, honestly.

## 6. What the user must do

Give the user this list, with the how-to steps, and track which ones are done.

1. **Sign in to connections (OAuth).** For each connection marked ⚠️ or ❌ (Gmail or Outlook, HubSpot, Salesforce or HubSpot CRM, content calendar, Slack or Teams): open the clone's **Connections** / **Integrations** page → choose the app → **Connect** / **Sign in** → approve the requested permissions. Minimum permissions are in REQUIREMENTS.md. *I can't do this for you and I never need your password.*
2. **Share content with me.** Share `{CONTENT_CALENDAR}` (edit access only if you want me to mark rows as sent; otherwise view) and any content folders or knowledge base spaces with `{CLONE_INBOX}`.
3. **Give me send access to `{SENDER_INBOX}`** (only if 1:1 emails should come from a team inbox): Gmail: delegate access or "Send mail as"; Microsoft 365: an admin grants "Send As" or "Send on Behalf" on the mailbox.
4. **Create a custom coded template** in HubSpot and paste the HTML I give you: in HubSpot go to Content → Design Manager → File → New file → Coded template (Email), and paste the HTML. Do **not** use the drag-and-drop editor; it will rewrite the HTML. Name it "Customer Email: Branded" and tell me the name.
5. **Host images publicly.** Upload your logo and any thumbnails to HubSpot's file manager (Content → Files), website or CDN. Check that `{LOGO_URL}` opens in a private/incognito browser window. Use PNG, JPG or GIF, not WebP.
6. **Check your lists.** Make sure `{LIST_ALL}` and each `{LIST_SEGMENT}` exist, contain only emailable current customers, and automatically exclude unsubscribes, bounces and do-not-email contacts.
7. **Confirm your sender setup.** Your HubSpot sending domain should be authenticated (SPF, DKIM, DMARC). Your HubSpot admin or IT can confirm.
8. **Confirm compliance.** Check with whoever owns email compliance (CAN-SPAM, GDPR, CASL or local rules) that these customers may receive this kind of email.

## 7. The Customer Email Program skill (save this in full)

Fill in the placeholders, then save as a skill named **Customer Email Program**. Don't shorten it.

~~~~markdown
# Customer Email Program

## Purpose
Every weekday, pick the single best customer email for today, build it in the branded
template, get approval, send it through the right channel, prevent duplicates, log
every send, and send a short daily summary.

## Settings
- Clone name: {CLONE_NAME}
- Clone inbox: {CLONE_INBOX}
- 1:1 sender inbox (optional): {SENDER_INBOX}
- Company: {COMPANY_NAME}; internal domains: {YOUR_COMPANY_DOMAINS}
- Current customer rule: {CUSTOMER_DEFINITION}
- Content calendar: {CONTENT_CALENDAR}
- Content sources: {CONTENT_SOURCES}
- List sends: HubSpot marketing email; template: "Customer Email: Branded"
- Lists: all = {LIST_ALL}; segments = {LIST_SEGMENT}
- Cadence: {CADENCE_RULES}
- 1:1 daily cap: {DAILY_1TO1_CAP}
- Send label/category: {SEND_LABEL}
- Approver: {APPROVER}; approval period: {APPROVAL_PERIOD} (from go-live date); send window ends: {SEND_WINDOW_END}
- Mode: APPROVAL (switch to AUTO-SEND only when the approver says so in writing, after the approval period)
- Run time: {RUN_TIME}
- Brand: colors {BRAND_COLORS}; logo {LOGO_URL}; address {PHYSICAL_ADDRESS}
- Unsubscribe alert: {UNSUBSCRIBE_ALERT}

## Tools
Use the exact names from my skill catalog. Use whatever is connected; skip what isn't. List and segment sends are HubSpot marketing email only. Use ONE CRM (Salesforce or HubSpot) for 1:1 targeting and logging.

| Purpose | Tool (exact catalog name) | Required | Access |
|---|---|---|---|
| Send previews, 1:1 emails, summary; label Sent items; read approval replies | `GoogleGmailOperator` or Outlook email operator | Yes | Read; send; apply labels/categories |
| Build, test-send and send list/segment emails; read send history and unsubscribes | `HubspotMarketingOperator` | Yes (for list sends) | Create/send emails; read lists and history. Never edit lists |
| Find contacts for 1:1 sends; read opt-out flags; log completed tasks; read past [Customer Email] tasks | Salesforce: `SalesforceContactOperator`, `SalesforceActivityOperator`. HubSpot: `HubspotContactOperator`, `HubspotEngagementOperator` | Yes (one CRM) | Read contacts/accounts; create completed tasks only |
| Read today's planned email and status | `GoogleSheets-Operator` or `Microsoft_Excel` (or `GoogleDocsCoreOperator` / `Microsoft_Word`) | Yes | Read (write only the Status column if approved) |
| Read release notes, blog, video, social, docs | Web research, `search_knowledge` | Recommended | Read-only |
| Video thumbnail with play button; header images | `Image_Operator` | Optional | Create image |
| Produce a short video when an item has none | `Clone-Automated-Video` | Optional | Create video; never publish or send without approval |
| Summary / approval ping in chat | Slack or Teams (clone messaging integration) | Optional | Post to one channel (delivery only) |

## Guardrails
- APPROVAL mode: never send anything to customers without an explicit "approve" from {APPROVER} for that specific email on that day. "Skip", silence, or a reply after {SEND_WINDOW_END} = no send.
- Only email current customers on {LIST_ALL} / {LIST_SEGMENT} or contacts matching {CUSTOMER_DEFINITION}. Never email prospects, leads, vendors or {YOUR_COMPANY_DOMAINS} (except previews and tests).
- Never email anyone who is unsubscribed, bounced, marked do-not-email, or opted out by reply. Check before every 1:1 send.
- One item per person, once. If send history can't be checked in at least one source, do not send 1:1 emails that day; for broadcasts, tell the approver which history source was unavailable.
- Customer-safe copy only. Never include: internal tags, deal amounts, pricing not on the public site, health scores, risk flags, "upsell", "expansion", "at-risk", "tier 1", internal names for customers, other customers' data, unreleased features or roadmap dates.
- Never put tags or internal labels in the customer-facing subject line. "[Customer Email]" is for the internal CRM task subject only.
- Only state facts found in a source. Link to the source.
- Respect {CADENCE_RULES} and {DAILY_1TO1_CAP}.
- Never edit lists, segments, contacts or content sources. The only CRM write is a completed task per 1:1 send.
- Retry rule: if a tool call fails, retry ONCE. If it fails again, mark that tool "unavailable" for this run, continue without it if safe, and report it in the summary. If the email connection or HubSpot marketing email is unavailable, do not send; report instead.
- Never ask for or handle passwords or tokens.

## Step 1: Gather candidates
1. Read {CONTENT_CALENDAR}. Note any row planned for today (Date = today, Status not "Sent" or "Skipped").
2. Read {CONTENT_SOURCES} for items published in the last 30 days: release notes (new features, feature updates), blog posts, videos, social posts, knowledge base articles. Build a candidate list: type, title, link, publish date, short summary, intended audience.
3. Add backlog items from the calendar marked "Ready" with no date.

## Step 2: Check send history (duplicate prevention)
For each candidate, check all three:
- HubSpot marketing email: emails sent in the last 90 days with the same link or title.
- My Sent folder (and {SENDER_INBOX} if used): items labeled {SEND_LABEL} with the same link or title.
- CRM: completed tasks whose subject starts with "[Customer Email]" and contains the title.
Drop any candidate already sent to the same audience. For 1:1 types, check per contact. Record which history sources worked.

## Step 3: Pick today's email
1. If the calendar has a row for today, use it.
2. Otherwise pick the first available in this order:
   new feature > feature update > video (relevant to the audience, not yet sent) > blog > "Did you know?" tip > industry/comparison > social post highlight (fallback).
3. If nothing passes Step 2, or the best option is weak (old, off-topic, thin), skip today and say why in the summary.

## Step 4: Audience, channel and cadence
- Same message for everyone → HubSpot marketing email → {LIST_ALL}.
- Same message for one group (product, tier, role) → HubSpot marketing email → the matching {LIST_SEGMENT}.
- Personalized (role/use-case highlight, or a feature targeted at specific contacts) → 1:1 from {CLONE_INBOX} or {SENDER_INBOX}, up to {DAILY_1TO1_CAP} contacts, chosen from the CRM (Salesforce or HubSpot) by {CUSTOMER_DEFINITION} plus the role/use case.
- Apply {CADENCE_RULES}: exclude groups not due today. Groups on a weekly digest get items bundled into one digest on their digest day.
- Check unsubscribes from the last 7 days. If any recent send exceeded {UNSUBSCRIBE_ALERT}, lighten today (smaller audience or skip) and flag it.

## Step 5: Write the email
Subject: plain, specific, under 60 characters, no tags, no all-caps, no clickbait. Add a preheader (under 100 characters).
Body by type (keep it short; one main button):
1. Video highlight: 1–2 sentence intro; thumbnail image with a play button overlay linking to the video (never embed video); 2–3 bullets on what they'll learn; button "Watch the video".
2. Blog / long-form: rewrite the article for email (headline, 3–5 short paragraphs or bullets with the key points); button "Read the full article".
3. "Did you know?" tip: the tip in one sentence; why it helps; 3 numbered steps; button "Try it now".
4. Role / use-case highlight (1:1): greet by first name; one line on their role or use case from the CRM; how teams like theirs use the feature; one concrete example; soft question inviting a reply. Plain, personal tone; minimal styling.
5. Skill / feature highlight: what's new or changed; who it's for; why it matters; how to start (2–3 steps); button "See how it works".
6. Industry / comparison: the trend or comparison in 2–3 sentences; 3 takeaways; how {COMPANY_NAME} helps (factual, no attacks on competitors); button "Read more".
Fallback, social post highlight: one line of context; the post quote or image; button "See the post".
Tone: helpful, clear, customer-first. No internal or sales language.

## Step 6: Build the HTML
Use the branded template ("Customer Email: Branded" in HubSpot). For 1:1 emails use the same HTML, or light styling for role highlights so they read like a personal note.
Rules: table-based layout; inline CSS only; 600px max width; web-safe fonts with fallbacks (Arial, Helvetica, sans-serif); alt text on every image; images hosted publicly as PNG/JPG/GIF (never WebP, never behind a login or Drive link); bulletproof buttons (table cell with background color, not an image); full direct URLs; unsubscribe and physical address in the footer.
For HubSpot list sends, replace [[UNSUBSCRIBE_LINK]] and [[PHYSICAL_ADDRESS]] with HubSpot's own unsubscribe link and company address tokens (insert them from HubSpot's personalization token menu so the syntax is exact). For 1:1 emails, use {PHYSICAL_ADDRESS} and the line "Prefer fewer emails like this? Just reply 'unsubscribe'."

```html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>[[SUBJECT]]</title>
</head>
<body style="margin:0;padding:0;background-color:#F4F4F4;">
  <!-- Preheader (hidden preview text) -->
  <div style="display:none;max-height:0;overflow:hidden;">[[PREHEADER]]</div>
  <table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="background-color:#F4F4F4;">
    <tr>
      <td align="center" style="padding:24px 12px;">
        <table role="presentation" width="600" cellpadding="0" cellspacing="0" border="0" style="width:100%;max-width:600px;background-color:#FFFFFF;">
          <!-- Header -->
          <tr>
            <td style="padding:24px;background-color:[[PRIMARY_COLOR]];" align="left">
              <img src="{LOGO_URL}" width="140" alt="{COMPANY_NAME}" style="display:block;border:0;">
            </td>
          </tr>
          <!-- Optional hero image (e.g. video thumbnail with play button) -->
          <tr>
            <td>
              <a href="[[MAIN_LINK]]"><img src="[[HERO_IMAGE_URL]]" width="600" alt="[[HERO_ALT_TEXT]]" style="display:block;width:100%;max-width:600px;height:auto;border:0;"></a>
            </td>
          </tr>
          <!-- Body -->
          <tr>
            <td style="padding:32px 24px;font-family:Arial,Helvetica,sans-serif;font-size:16px;line-height:24px;color:[[TEXT_COLOR]];">
              <h1 style="margin:0 0 16px;font-size:24px;line-height:30px;font-family:Arial,Helvetica,sans-serif;">[[HEADLINE]]</h1>
              [[BODY_HTML]]
            </td>
          </tr>
          <!-- Bulletproof button -->
          <tr>
            <td align="center" style="padding:0 24px 32px;">
              <table role="presentation" cellpadding="0" cellspacing="0" border="0">
                <tr>
                  <td align="center" bgcolor="[[ACCENT_COLOR]]" style="border-radius:4px;">
                    <a href="[[MAIN_LINK]]" style="display:inline-block;padding:14px 28px;font-family:Arial,Helvetica,sans-serif;font-size:16px;font-weight:bold;color:#FFFFFF;text-decoration:none;">[[BUTTON_TEXT]]</a>
                  </td>
                </tr>
              </table>
            </td>
          </tr>
          <!-- Footer -->
          <tr>
            <td style="padding:24px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;color:#777777;background-color:#FAFAFA;" align="center">
              {COMPANY_NAME} · [[PHYSICAL_ADDRESS]]<br>
              You're receiving this because you're a {COMPANY_NAME} customer.
              <a href="[[UNSUBSCRIBE_LINK]]" style="color:#777777;">Unsubscribe</a>
            </td>
          </tr>
        </table>
      </td>
    </tr>
  </table>
</body>
</html>
```
Colors come from {BRAND_COLORS}. If an item has no video and the user asks for one, `Clone-Automated-Video` can produce it (user approves before it is used). For a video thumbnail, use Image_Operator (if available) to add a clear play button over the video's thumbnail, export as PNG or JPG, and host it publicly; otherwise use a plain thumbnail plus "▶ Watch" in the alt text and button.

## Step 7: Request approval
1. Final checks: no internal language, no tags in subject, all links work, all images load from public URLs, alt text present, unsubscribe and address present, audience excludes opted-out contacts.
2. List send: create the email in HubSpot (not scheduled) and send a test to {APPROVER}. 1:1: email {APPROVER} a preview of one fully rendered example plus the list of recipients (names, companies, the personalized line for each).
3. Email {APPROVER} with subject "[Approval needed] Customer email for {date}: {Type}: {Title}". Include: type, why it was picked, channel, audience/list, recipient count, cadence groups excluded, history sources checked, and: "Reply approve, skip, or tell me what to change. Send window ends {SEND_WINDOW_END}."
4. If the approver asks for changes, revise and send a new preview. Each new version needs its own "approve".
5. AUTO-SEND mode (only after {APPROVAL_PERIOD} and only if the approver switched it on in writing): skip the wait and go to Step 8; still do the final checks.

## Step 8: Approval check and send
Runs every 30 minutes until {SEND_WINDOW_END}.
1. Look for a reply from {APPROVER} to today's approval email (or a chat message to me) for the latest version.
2. "approve" → send:
   - List send: send the approved email from HubSpot to the approved list/segment.
   - 1:1: re-check each contact's opt-out status and send history, then send each email from {CLONE_INBOX} or {SENDER_INBOX}, one at a time, up to {DAILY_1TO1_CAP}. Stop and report if the inbox hits a sending limit.
3. "skip" → mark today skipped; nothing is sent.
4. No reply by {SEND_WINDOW_END} → nothing is sent; keep the item in the backlog for a future day.

## Step 9: Log and summarize
Logging:
- 1:1 sends: apply label/category {SEND_LABEL} to each sent email (never add tags to the subject). In the CRM (Salesforce task via `SalesforceActivityOperator`, or HubSpot task via `HubspotEngagementOperator`), create a COMPLETED task on the contact with subject "[Customer Email] {Type} – {Title}", today's date, and the email body or link in the description.
- List sends: HubSpot logs them in its own CRM records; note the email name and send ID in the summary. (If the CRM is Salesforce, list sends are not logged in Salesforce; say so in the summary.)
- Calendar: if approved by the user, set the row's Status to "Sent" with the date.
Daily summary to {APPROVER} (subject "Customer email summary: {date}"):
1. Today: sent / skipped / waiting, with type, title, channel, audience and recipient count.
2. Why this item was chosen; what's next in the backlog.
3. Yesterday's results if available: opens, clicks, replies, bounces, unsubscribes.
4. Unsubscribe check vs {UNSUBSCRIBE_ALERT}; any cadence change recommended.
5. Replies from customers that need a human (listed, not answered).
6. Tool status: each tool as worked / no data / unavailable (after retry), including which history sources were checked.
~~~~

## 8. Test plan

Run this before going live. Ask the user to approve the test first. **Use internal test addresses only. Never real customers or prospects.**

1. **User sets up test data:**
   - A test list in HubSpot (e.g. "TEST: Customer Email") containing only the internal test addresses.
   - One test contact in the CRM with an internal test address, marked as a customer per `{CUSTOMER_DEFINITION}` (or tell me to treat it as a customer for this test only), with a role filled in.
   - One test row in `{CONTENT_CALENDAR}` for today, or pick a real recent item.
2. **Run the skill in test mode** ("Run Customer Email Program now, test list only, test contact only").
3. **Approve the preview**, then let me send to the test list and the test contact.
4. **Open the emails in real inboxes:** Gmail (web and app), Outlook desktop, Apple Mail, a phone.
5. **Verify the checklist together:**

| Check | Pass? |
|---|---|
| Today's pick follows the calendar / priority order, and the reason is stated | ☐ |
| Send history was checked in all three sources (or the unavailable one is reported) | ☐ |
| Preview arrived at `{APPROVER}` only, with audience and count | ☐ |
| Nothing was sent before "approve" | ☐ |
| Layout looks right in Gmail, Outlook desktop, Apple Mail and mobile | ☐ |
| Logo and images load (no broken boxes); alt text shows with images off | ☐ |
| Button is clickable everywhere; all links go to the right place | ☐ |
| Unsubscribe link and physical address are present and work | ☐ |
| Subject has no tags; copy has no internal or sales language | ☐ |
| 1:1 test email has `{SEND_LABEL}` label/category | ☐ |
| CRM test contact has a completed task "[Customer Email] {Type} – {Title}" | ☐ |
| Running again does not resend the same item (duplicate check works) | ☐ |
| Daily summary arrived with tool status | ☐ |
| **No email went to any real customer or prospect** | ☐ |

6. Fix anything that failed, re-run, then the user **deletes the test list, test contact and test task** (and the test calendar row). Point the skill back at the real lists before go-live.

## 9. Final status checklist

When you finish, send the user a status summary in this format:

**✅ Done by me**
- [ ] Discovery table shared
- [ ] Placeholder values confirmed
- [ ] Required skills/operators attached: …
- [ ] Optional add-ons attached: …
- [ ] Customer Email Program skill created (or full text handed over for copy-paste)
- [ ] `{SEND_LABEL}` label/category created
- [ ] Scheduled task "Daily Customer Email" created for `{RUN_TIME}`, Mon–Fri
- [ ] Scheduled task "Customer Email Approval Check" created (every 30 min until `{SEND_WINDOW_END}`)
- [ ] Branded HTML template prepared
- [ ] Test run completed; results: …

**⏳ Waiting on you**
- [ ] Sign in to: …
- [ ] Share `{CONTENT_CALENDAR}` and content folders with `{CLONE_INBOX}`
- [ ] Give send access to `{SENDER_INBOX}` (if used)
- [ ] Save the custom coded template in HubSpot and tell me its name
- [ ] Host logo and images publicly (PNG/JPG/GIF)
- [ ] Confirm lists exclude unsubscribes, bounces and do-not-email
- [ ] Confirm sender authentication and compliance
- [ ] Save the Customer Email Program skill (if I handed it over)
- [ ] Delete test list, test contact and test task
- [ ] Approve each day's email during `{APPROVAL_PERIOD}`

**💡 Optional next steps**
- [ ] Switch some email types to auto-send after `{APPROVAL_PERIOD}`
- [ ] Add a weekly digest template for lighter cadence groups
- [ ] Post daily summaries to Slack or Teams
- [ ] Add Image_Operator for video thumbnails with play buttons, and Clone-Automated-Video for short videos
- [ ] Review the first two weeks of results and tune cadence and priority
