Skip to Content
CoursesSyncGTM 10115 Writing copy from data

Writing Copy From Your Data

Outcome: an opening-line column that produces a specific, checkable sentence per row, with a fallback for rows that lack evidence and a quality gate before anything is exported.

Surface
Sync GTM app
Level
Beginner
Uses
AI copy column
Credits
~1 per row
Prerequisite
Lessons 09, 12 and 14

Personalization is an evidence problem

“Hi {{first_name}}, I noticed {{company}} is doing great things” is not personalization. It is a merge field, every prospect has seen a thousand of them, and it signals a template as clearly as no personalization at all.

Real personalization needs a fact that could only be true of this account. You spent lessons 09 to 12 collecting exactly those. This lesson turns them into a sentence.

If a row has no evidence, no prompt will save it. The fix is upstream, not in the copy.


Rank your evidence

Not every fact is equally usable. Roughly, best first:

EvidenceWhy it works
A recent event — funding, launch, hire, job postTimely, specific, gives a reason for the timing of your message
Something they published — a blog post, a talk, a page claimShows you read their material
A stack fact with a consequence”You run X, which usually means Y is manual” — demonstrates understanding
A research answer about their modelShows you understood the business, not just the logo
Firmographics — size, industry, locationWeakest. Everyone has this. Use it as context, never as the hook.

Build the opening line from the highest-ranked evidence a row actually has, and fall back down the list.


The prompt

Feed it only the evidence columns

Not the whole row. A prompt with twenty fields produces a sentence that name-drops four of them.

Ask for one sentence

Specify a length in words. “Under 25 words” produces a usable line; “keep it brief” does not.

Ban the openers

“I noticed”, “I came across”, “I was impressed by”, “As a fellow”. These are the phrases prospects pattern-match as automated. List them explicitly as forbidden.

Require the specific fact

“The sentence must reference {{evidence}} explicitly. Do not generalize it.”

Provide the abstain path

“If the evidence field is empty or vague, return exactly: SKIP.” Then filter on SKIP rather than shipping a generic line.

A prompt that works:

Write the opening line of a cold email to {{first_name}}, {{title}} at {{company}}. Use only this evidence: {{evidence}} Rules: - One sentence, under 25 words. - Reference the evidence specifically. Do not generalize. - Do not open with "I noticed", "I came across", "I was impressed by", or "As a fellow". - Do not compliment the company. - Do not mention our product. - If the evidence is empty or vague, return exactly: SKIP Return the sentence only.

“Do not mention our product” is deliberate. The opening line’s only job is to prove the message was written for this person. The pitch is the next sentence, and it is the same for everyone — which means a human should write it once rather than an AI writing it 500 times.


Gate the output

AI copy needs a quality gate before export. Four automatic checks, as formula columns:

CheckRejects
Length between 8 and 30 wordsTruncated output and paragraphs
Does not contain a banned phrasePrompt drift
Contains a distinctive token from the evidenceGeneric lines that ignored the evidence
Is not SKIPRows with no usable evidence

Then read 20 rows by hand. The automatic checks catch shape; only reading catches tone.

The test for a line: could this sentence have been sent to a different company? If yes, it failed, regardless of how well it reads.


The fallback

Rows that fail the gate are not lost. Two options:

  1. A safe non-personalized line built from a firmographic — weaker, but honest and sendable. Route these to a separate, lower-volume sequence so you can measure the difference.
  2. Hold them out and re-run once a signal fires and evidence exists. Often the better call: a row with no reason to be contacted this week probably should not be.

Do this now

Build the evidence column

A formula that picks the best available fact per row, falling down the ranking. This does most of the work.

Write the prompt

Use the template. Adjust the banned phrases to whatever you personally find grating.

Run on five rows

Read all five aloud. Aloud matters — bad AI copy reads fine and sounds wrong.

Apply the “could this go to anyone else” test

Rewrite the prompt, not the output, for any line that fails.

Add the four gate columns

Length, banned phrases, evidence token, SKIP.

Widen to qualified rows

Then read 20 outputs by hand before exporting anything.

Decide the fallback

Safe line or hold out.


Check your work

  • Every line references a fact specific to that account
  • No line contains a banned opener
  • SKIP appears for rows without evidence — if it never does, the abstain path is not working
  • You read at least 20 lines by hand
  • A fallback route exists for failed rows

Where this breaks

Generating copy for rows that have no evidence is how a personalized campaign becomes a worse version of a generic one. The model will always produce a fluent sentence — asked to personalize with nothing to work from, it invents plausible-sounding padding, and a prospect reading a compliment about a project they never ran notices immediately. The abstain path is not optional; check that it fires.


Further automation

The strongest version regenerates copy when the evidence changes rather than on a schedule: a new funding round or a new job post produces a new line, and that row re-enters the queue. That is the loop Automated Outbound and Signals & ABM build.


Next lesson

16 — Exporting to your stack, getting the finished table into the tool that actually sends.

Reference for this lesson: AI agents, AI integrations, Outreach integrations, Automated Outbound.