Copy skill

Merge variable render check

Paste your template and your lead file header with sample rows, and the assistant maps each variable to a column, flags casing mismatches and bad values, and renders five real leads before you activate.

Works with

One Markdown file, free to use and change. It reads only what you paste into the chat.

What it does

What the skill checks

  • Maps every {{variable}} in subjects, bodies and signatures to a column
  • Flags camelCase vs snake_case mismatches that silently produce "Hi there"
  • Finds empty values, N/A, job titles in the company column and ALL CAPS names
  • Suggests fixes to apply before import, since many tools cannot edit contacts
  • Reports the fill rate of each field used in the template
  • Renders five real leads, including the emptiest and the longest

Use it when

  • Before uploading a new lead file or activating a campaign
  • When sent emails show "Hi there", empty names or raw {{tags}}
  • When you move a template to a tool with different variable names

Example

What you paste and what you get back

You
Template: Hi {{firstName}}, ... {{companyName}}
CSV header: first_name,last_name,company,email (500 rows)
Assistant, with the skill
ERROR firstName: no such column, file has first_name (case mismatch). Every lead would get the fallback.
ERROR companyName: no such column, file has company.
ERROR 14 rows: company = "Owner" (job title). Suppress or fix.
WARN 61 rows: company in ALL CAPS. Convert to title case.
Fix: use {{first_name}} and {{company}}, then render 5 leads.
No-go until the 5 renders read correctly.

Install

Install it in your assistant

The same file works everywhere. Claude and Claude Code load it as a skill; the other assistants follow it as instructions.

Claude Code

  1. Run the command below. It saves the skill to your personal skills folder, available in every project. For one project only, use .claude/skills in the project instead.
  2. Start a new Claude Code session. Claude uses the skill when your request matches its description, or when you name it.
Terminal
mkdir -p ~/.claude/skills/merge-variable-render-check
curl -fsSL https://outreach2day.com/skills/merge-variable-render-check/SKILL.md -o ~/.claude/skills/merge-variable-render-check/SKILL.md

Claude (web and desktop)

  1. Download the ZIP file.
  2. In Claude, open Settings, find Skills under Capabilities and upload the ZIP. Skills need code execution to be turned on for your account.
  3. Ask for the task in any chat. Claude loads the skill when the request matches.

ChatGPT

  1. Download SKILL.md.
  2. Paste its text into a Project's instructions or a custom GPT's instructions. For a single chat, attach the file and write: follow the instructions in this file.

Gemini

  1. Download SKILL.md.
  2. Create a Gem and paste the file's text into its instructions, or attach the file to a chat and ask Gemini to follow it.

Grok

  1. Download SKILL.md.
  2. Paste its text into a Project's instructions, or attach the file to a chat and ask Grok to follow it.

Cursor and other coding agents

  1. Save the file as a project rule with the command below. Cursor reads the description to decide when to apply it.
  2. Agents that read AGENTS.md (Codex and others): paste the text into AGENTS.md or reference the file from it.
Terminal, in your project
mkdir -p .cursor/rules
curl -fsSL https://outreach2day.com/skills/merge-variable-render-check/SKILL.md -o .cursor/rules/merge-variable-render-check.mdc

Source

The full SKILL.md

Read it before you install it. Change the rules to match your own setup.

merge-variable-render-check/SKILL.md
---
name: merge-variable-render-check
description: Checks that every merge variable in a cold email (subject, body, signature) matches a column in the lead file with the exact name and casing, finds empty and junk values that will render badly, and renders the template for real leads before activation. Catches the classic "Hi there" at scale caused by camelCase vs snake_case mismatches, job titles in the company column, N/A values and ALL CAPS names. Use when the user is about to upload leads or activate a campaign, pastes a template plus a CSV header or sample rows, or sees wrong names or raw {{tags}} in sent emails.
---

# Merge variable render check

You make sure the email each lead receives reads correctly. You compare the template's variables with the lead file, clean the values that will render badly, and show real renders before the campaign starts.

## Step 1. Collect inputs

Ask for:

- Every subject, body and signature in the sequence, as entered in the tool.
- The lead file header row and 20 or more sample rows (or the whole file).
- The sending tool, and how leads get in (CSV upload, API, integration).

## Step 2. Match variables to columns (ERROR)

1. List every `{{variable}}` in subjects, bodies and signature.
2. For each, find the column with the **exact** name. `firstName`, `first_name` and `FirstName` are three different fields. Many importers and APIs silently drop fields whose name does not match what they expect, so a whole campaign renders the fallback ("Hi there") or an empty string.
3. Check which naming the import path expects. A tool's CSV upload and its API can expect different casing. If unknown, test with one lead (step 4).
4. Variables the tool fills from the sending mailbox (sender first name, signature) are allowed without a column. They are often empty in the preview and filled at send time; that is normal.
5. Any variable with no column and no sender source is an ERROR.

## Step 3. Check the values (ERROR / WARN)

Scan every row used by a variable:

- ERROR: empty value where the template has no fallback. Suppress those leads or add a fallback.
- ERROR: junk values: `N/A`, `-`, `null`, `test`, a job title or number in the company column, an email address in the name column.
- WARN: ALL CAPS or all lowercase names and companies. Convert to title case, keeping known acronyms.
- WARN: legal suffixes in company names (`Inc.`, `LLC`, `Ltd`, `GmbH`). Strip them for the email: "Northwind" reads better than "NORTHWIND IT SERVICES LLC".
- WARN: first name that is an initial or includes a title ("Dr. J.").
- WARN: encoding errors (`Müller`), stray spaces, emojis.

Fix values before import. Many sequencers cannot edit a contact after import, so a fix after upload means delete and re-upload.

## Step 4. Render real leads

Pick 5 real rows: 3 typical, 1 with the most empty fields, 1 with the longest values. Render subject and body for each exactly as the tool will (resolve spintax on one path). Show them. Check subjects as well as bodies: subject bugs are the ones readers see first.

Then ask the user to upload those 5 leads to a test copy of the campaign, send to a mailbox they own, and compare with your renders. The tool's actual sent email is the ground truth; its preview screen may differ.

## Output format

1. Variable map: variable, column found, match (exact / case mismatch / missing), fill rate.
2. Value problems: column, issue, count of rows, fix.
3. Cleaned sample rows.
4. Five renders.
5. Go / no-go line.

## Rules

- Never activate on a template whose renders you have not read.
- A fallback like "there" hides a data problem. Report the fill rate of each field so the user sees how many leads get the fallback.

## Example

Input: template `Hi {{firstName}}, ... {{companyName}}`, CSV header `first_name,last_name,company,email`.

Output: `firstName` not found (column is `first_name`: case mismatch, will render empty or the fallback for every lead). `companyName` not found (column is `company`). 14 of 500 rows have `company` = "Owner" (job title): suppress or fix. Rename the template variables to `{{first_name}}` and `{{company}}`, or rename the columns, then render 5 leads.

Download SKILL.md · Download ZIP

FAQ

Questions

Why do my cold emails say "Hi there" instead of the name?

The template's variable name does not match the field the tool stored. firstName and first_name are different fields, and some importers silently drop fields they do not recognise, so every lead gets the fallback.

How do I test merge fields before launching a campaign?

Upload five real leads to a test copy of the campaign, including one with empty fields and one with long values, send to a mailbox you own and read the subject and body. The sent email is the ground truth, not the preview.

Should I use a fallback like "there" for empty names?

Only as a safety net. A fallback hides how many leads are missing data. Check the fill rate and suppress or fix leads with empty or junk values before import.

Mailboxes, warm-up and sending in one place

$2.50 a mailbox a month. DNS records are set for you, and every mailbox shows its warm-up numbers from day one.