When AI agents generate customer-facing communications—outreach emails, follow-up messages, meeting summaries, proposals—consistency is critical. Without centralized style guides, each generation request produces output in a slightly different voice, formality level, and structure. Sales Style Guides and Prompt Templates solve this by codifying tone rules, message structures, and reusable prompt fragments into version-controlled files that agents load before generating any content.
A style guide defines the “how” of communication: preferred tone (professional but approachable), forbidden phrases (no “circle back” or “synergy”), sentence length targets, personalization requirements, and channel-specific adaptations (LinkedIn messages are shorter than emails). Prompt templates define the “what”: structured prompts with placeholders for client name, industry, pain points, and call-to-action that agents fill in from CRM data.
The agent platform stores these guides and templates as markdown and YAML files alongside CRM records. Analyst prompts—higher-level instructions that tell an LLM how to research a prospect or summarize a meeting—are stored as separate template files. This separation of concerns means updating the tone for all outreach is a single file edit, not a code change.
A style guide is a document (typically markdown) that defines communication standards. It covers voice and tone (authoritative, friendly, technical), formatting rules (max paragraph length, bullet point usage, greeting/closing conventions), vocabulary (preferred terms, banned words), and channel-specific overrides. The guide is loaded into the LLM’s system prompt or prepended to every generation request.
By storing style rules in files rather than hardcoding them in prompt strings, you decouple communication policy from application logic. A marketing manager can update the tone guide without touching code. A/B testing different styles means swapping file references, not deploying new code. Version control shows exactly when and why the voice changed.
A prompt template is a structured text file with placeholder variables that get filled at generation time. Templates typically have three sections: a system instruction (role and constraints), context injection points (where CRM data is inserted), and output format requirements (what the response should look like). Variables use a consistent syntax like {{company_name}} or ${industry}.
Complex prompts are assembled from multiple templates: a base style guide, a channel-specific template (email vs LinkedIn vs Slack), a vertical-specific context block (fintech terminology vs healthcare terminology), and a task-specific instruction (cold outreach vs follow-up vs re-engagement). This compositional approach avoids duplicating shared rules across templates.
Analyst prompts are a special category of templates designed for research and analysis tasks rather than outreach. They instruct an LLM to analyze a prospect’s website, summarize their tech stack, identify pain points, or draft competitive positioning. These prompts are more complex than message templates because they require multi-step reasoning and often include few-shot examples of good analysis output.
The most effective analyst prompts include 2–3 examples of ideal output. These examples are stored in the template file itself or in a companion examples directory. The examples serve as implicit style guides: the LLM infers formatting, depth, and analytical angle from the examples rather than from explicit rules. Updating the examples changes the output style without modifying any instructions.
Different industries and communication channels require different approaches. A fintech prospect expects regulatory awareness and compliance language. A healthcare prospect needs HIPAA sensitivity. LinkedIn messages must be under 300 characters for connection requests. Email subject lines need to be under 60 characters. These constraints are encoded as channel-specific template variants and vertical-specific context blocks.
The template system operates as a pipeline: load the base style guide, select the appropriate channel and vertical templates, merge them into a composite prompt, inject CRM data into placeholders, and send the assembled prompt to the LLM. The output is then validated against style rules before delivery.
# style-guides/base-tone.md
# Sales Voice Guide
## Tone
- Professional but conversational — not stiff, not casual
- Confident without being pushy
- Show genuine curiosity about the prospect's challenges
## Rules
- First sentence must reference something specific to the prospect
- Never open with "I hope this finds you well"
- Avoid jargon: no "synergy", "leverage", "circle back", "touch base"
- Keep paragraphs to 2-3 sentences max
- Always end with a specific, low-commitment ask
- Use the prospect's first name, never "Dear Sir/Madam"
## Channel Overrides
### Email
- Subject line: under 60 characters, no ALL CAPS
- Body: 3-5 short paragraphs
- Include one concrete data point or observation
### LinkedIn
- Connection request: under 300 characters
- InMail: under 150 words
- Reference a shared connection or recent post if possible
// TypeScript: Template composition and variable injection
import * as fs from "fs";
import * as path from "path";
import Mustache from "mustache";
interface TemplateContext {
company_name: string;
contact_first_name: string;
industry: string;
pain_points: string[];
tech_stack: string[];
recent_news?: string;
}
function loadTemplate(templatePath: string): string {
return fs.readFileSync(templatePath, "utf-8");
}
function composePrompt(
styleGuide: string,
channelTemplate: string,
verticalContext: string,
data: TemplateContext
): string {
// Merge templates into a composite prompt
const composite = [
"## Style Guide\n" + styleGuide,
"\n## Message Template\n" + channelTemplate,
"\n## Industry Context\n" + verticalContext,
].join("\n---\n");
// Inject CRM data into placeholders
return Mustache.render(composite, {
...data,
pain_points_list: data.pain_points.join(", "),
tech_stack_list: data.tech_stack.join(", "),
});
}
// Usage
const styleGuide = loadTemplate("style-guides/base-tone.md");
const emailTemplate = loadTemplate("templates/cold-outreach-email.md");
const fintechContext = loadTemplate("verticals/fintech.md");
const prompt = composePrompt(styleGuide, emailTemplate, fintechContext, {
company_name: "Acme Payments",
contact_first_name: "Sarah",
industry: "fintech",
pain_points: ["PCI compliance overhead", "slow onboarding"],
tech_stack: ["React", "Node.js", "PostgreSQL"],
recent_news: "Series B funding announced last week",
});
The agent platform uses prompt templates to generate personalized outreach at scale. An agent iterates over a filtered segment from the CRM summary index (e.g., “mid-market fintech companies not contacted in 60 days”), loads each record’s data, composes a personalized prompt using the appropriate templates, generates the message, and queues it for human review before sending.
After a sales call, an analyst prompt instructs the LLM to extract key information from meeting notes or transcripts: decision makers mentioned, pain points discussed, next steps agreed, and competitive mentions. The template ensures every summary follows the same structure, making it easy to scan across dozens of client interactions.
Analyst prompts guide LLMs through structured research: “Visit the prospect’s website, identify their current tech stack, find their job postings for clues about technical challenges, and draft three talking points that position our product against their likely alternatives.” The few-shot examples in the template show the expected depth and format.
Style guides and templates improve consistency, but AI-generated customer communications should always pass through human review before sending. The template system makes review efficient: reviewers know the expected format and can quickly spot deviations. Over time, reviewers’ corrections feed back into template refinements.
Organize templates by function, channel, and vertical:
crm-data/
style-guides/
base-tone.md # Core voice and tone rules
formal-override.md # For enterprise/regulated prospects
templates/
cold-outreach/
email.md # Cold email template
linkedin.md # LinkedIn InMail template
follow-up/
post-meeting.md # Post-meeting follow-up
re-engagement.md # Re-engagement after silence
verticals/
fintech.md # Fintech-specific context and terms
healthcare.md # Healthcare/HIPAA awareness context
saas.md # General SaaS context
analyst-prompts/
prospect-research.md # Research a new prospect
competitive-analysis.md # Competitive positioning
meeting-debrief.md # Summarize meeting transcript
After generation, validate the output programmatically: check word count against channel limits, scan for banned words from the style guide, verify that required elements (personalization, CTA) are present, and flag outputs that need human attention. This catches the majority of style violations before review.
// TypeScript: Post-generation style validation
interface ValidationResult {
passed: boolean;
violations: string[];
}
function validateOutput(
output: string,
channel: "email" | "linkedin" | "slack"
): ValidationResult {
const violations: string[] = [];
const bannedWords = [
"synergy", "leverage", "circle back",
"touch base", "ping", "no-brainer"
];
const wordCount = output.split(/\s+/).length;
// Channel-specific length checks
const limits = { email: 300, linkedin: 150, slack: 100 };
if (wordCount > limits[channel]) {
violations.push(
`Word count ${wordCount} exceeds ${channel} limit of ${limits[channel]}`
);
}
// Banned word check
for (const word of bannedWords) {
if (output.toLowerCase().includes(word)) {
violations.push(`Contains banned phrase: "${word}"`);
}
}
// Must include personalization (not generic)
if (output.includes("Dear Sir") || output.includes("To Whom")) {
violations.push("Contains generic salutation — must personalize");
}
return { passed: violations.length === 0, violations };
}
Because templates live in Git, every change is tracked. When A/B testing different outreach styles, create a branch with the variant template. Measure response rates, then merge the winner. The Git history shows exactly which template version produced which results, enabling data-driven style evolution.