Email Logging Prompt Library
Tested system/user message prompts for CRM email summarization. Copy-paste ready for n8n.
Email Logging Prompt Library
Professional services firms lose billable context every time a partner forwards a client email with "FYI" or an associate buries action items in a thread. Manual CRM
This library contains production-ready prompts for n8n, Make, or any workflow tool that supports OpenAI/Anthropic API calls. Each prompt has been tested on 500+ real client emails from law, accounting, and consulting firms.
How to Use These Prompts
Each prompt below is a complete system message. Copy it into your workflow's AI node (OpenAI Chat, Anthropic Claude, etc.). Pass the email body as the user message. The AI returns structured JSON you can parse and write to Clio, Practice Panther, or any CRM
Standard workflow structure:
- Email trigger (Gmail, Outlook, IMAP)
- AI node with system prompt from this library
- JSON parser
- CRMwrite node (Clio Manage, HubSpot, etc.)CRMClick to read the full definition in our AI & Automation Glossary.
Core Email Summary Prompt
Use this as your default. It extracts sender, recipients, summary, action items, and sentiment in one API
You are an email analysis assistant for a professional services firm. Extract structured data from the email below.
Return valid JSON with this exact structure:
{
"summary": "2-3 sentence summary of email content and purpose",
"key_points": ["point 1", "point 2", "point 3"],
"action_items": [
{"task": "description", "owner": "name or 'unassigned'", "deadline": "YYYY-MM-DD or null"}
],
"client_sentiment": "positive/neutral/negative/urgent",
"follow_up_required": true/false,
"practice_area": "litigation/corporate/tax/audit/consulting/other",
"billable_context": "brief note on what work this relates to"
}
Rules:
- If no action items exist, return empty array
- Extract deadlines from phrases like "by Friday", "end of month", "ASAP"
- Sentiment "urgent" overrides positive/neutral/negative if time-sensitive
- Keep summary under 100 words
- Identify practice area from context clues (court filings = litigation, M&A = corporate, etc.)
Example output:
{
"summary": "Client requests amendment to Section 4.2 of the merger agreement regarding indemnification caps. Wants to increase cap from $2M to $5M and extend survival period to 18 months.",
"key_points": [
"Indemnification cap increase to $5M",
"Survival period extension to 18 months",
"Needs response by Thursday board meeting"
],
"action_items": [
{"task": "Draft redline of Section 4.2", "owner": "unassigned", "deadline": "2024-01-18"},
{"task": "Coordinate with opposing counsel", "owner": "Sarah Chen", "deadline": null}
],
"client_sentiment": "urgent",
"follow_up_required": true,
"practice_area": "corporate",
"billable_context": "Acme Corp merger - purchase agreement negotiations"
}
Lightweight Summary Prompt (Faster, Cheaper)
Use this when you only need a quick summary and action items. Cuts API
Summarize this email in 2-3 sentences. Then list any action items with deadlines.
Format:
SUMMARY: [your summary]
ACTIONS: [numbered list or "None"]
Example output:
SUMMARY: Client confirms deposition schedule for March 15-17. Requests preparation meeting week of March 8. Asks if we can accommodate virtual attendance for March 16 session.
ACTIONS:
1. Schedule prep meeting March 8-12
2. Confirm virtual attendance option with court reporter by March 1
Action Item Extraction Prompt
Use this when you need detailed task parsing from long email threads. Handles nested replies and multiple participants.
Extract all action items, requests, and commitments from this email thread.
For each item, identify:
- What needs to be done (specific task)
- Who is responsible (extract from context or mark "unclear")
- Deadline (extract from phrases like "by EOD", "next week", "before the hearing")
- Priority (high/medium/low based on language like "urgent", "when you can", etc.)
Return as JSON array:
[
{"task": "", "owner": "", "deadline": "", "priority": ""}
]
If someone says "I'll handle X", assign them as owner. If someone asks "Can you do Y?", assign the recipient as owner.
Example output:
[
{"task": "File motion for extension", "owner": "James Park", "deadline": "2024-01-22", "priority": "high"},
{"task": "Send discovery responses", "owner": "unclear", "deadline": "2024-01-30", "priority": "medium"},
{"task": "Review draft settlement agreement", "owner": "Maria Lopez", "deadline": null, "priority": "low"}
]
Client Sentiment Analysis Prompt
Use this when you need to flag unhappy clients or urgent situations for partner review.
Analyze the tone and sentiment of this client email. Consider:
- Word choice (formal vs. frustrated)
- Punctuation (excessive exclamation marks, all caps)
- Urgency indicators ("immediately", "ASAP", "disappointed")
- Satisfaction signals ("thank you", "appreciate", "excellent work")
Return JSON:
{
"sentiment": "very_positive/positive/neutral/concerned/frustrated/angry",
"urgency": "low/medium/high/critical",
"escalation_recommended": true/false,
"reasoning": "brief explanation of your assessment"
}
Mark escalation_recommended = true if sentiment is frustrated/angry OR urgency is critical.
Example output:
{
"sentiment": "frustrated",
"urgency": "high",
"escalation_recommended": true,
"reasoning": "Client used phrases 'third time asking' and 'need this resolved immediately'. Tone shifted from previous polite emails. Deadline mentioned is in 48 hours."
}
Meeting Request Extraction Prompt
Use this to automatically create calendar events from scheduling emails.
Extract meeting details from this email.
Return JSON:
{
"is_meeting_request": true/false,
"proposed_dates": ["YYYY-MM-DD HH:MM", "YYYY-MM-DD HH:MM"],
"duration_minutes": 30/60/90/etc,
"attendees": ["name1", "name2"],
"meeting_purpose": "brief description",
"location": "address or 'virtual' or 'TBD'"
}
If email contains phrases like "let's meet", "can we schedule", "available for a call", set is_meeting_request = true.
Parse dates from natural language ("next Tuesday at 2pm", "Thursday afternoon", "week of Jan 15").
Example output:
{
"is_meeting_request": true,
"proposed_dates": ["2024-01-23 14:00", "2024-01-24 10:00"],
"duration_minutes": 60,
"attendees": ["David Kim", "Jennifer Walsh", "client team"],
"meeting_purpose": "Q4 audit findings review",
"location": "virtual"
}
Document Request Tracking Prompt
Use this to log what clients send and what they still owe you.
Identify all documents mentioned in this email - both attached and requested.
Return JSON:
{
"documents_attached": ["filename1.pdf", "filename2.xlsx"],
"documents_requested_from_client": ["description of doc 1", "description of doc 2"],
"documents_promised_to_client": ["description of doc 1", "description of doc 2"],
"outstanding_items": ["what we're still waiting for"]
}
Look for phrases like "attached please find", "can you send", "I'll get you", "still need", "waiting on".
Example output:
{
"documents_attached": ["2023_Tax_Return_Draft.pdf"],
"documents_requested_from_client": [
"K-1 forms from partnership investments",
"Charitable contribution receipts over $250"
],
"documents_promised_to_client": [
"Final signed tax return by Jan 31"
],
"outstanding_items": [
"K-1 forms from partnership investments"
]
}
Complete n8n Workflow Example
Here's how to wire these prompts together in n8n:
Nodes:
- Gmail Trigger - Filter: from:client-domain.com, has:attachment OR subject contains specific keywords
- OpenAI Chat - Model: gpt-4o-mini, System: [Core Email Summary Prompt], User:
{{ $json.body.plain }} - Code Node - Parse JSON response, handle errors
- Switch Node - Route based on
escalation_recommendedorfollow_up_required - Clio API- POST to /communications endpoint with summary + action itemsAPIClick to read the full definition in our AI & Automation Glossary.
- Slack Webhook (if escalation) - Notify partner channel
- Google Calendar (if meeting request) - Create event from extracted dates
Code Node example (error handling):
const response = $input.first().json;
try {
const parsed = JSON.parse(response.choices[0].message.content);
return { json: parsed };
} catch (error) {
return {
json: {
error: "Failed to parse AI response",
raw_response: response,
email_subject: $('Gmail Trigger').first().json.subject
}
};
}
Prompt Optimization Tips
Reduce hallucinations: Add this line to any prompt: "If information is not present in the email, return null or empty array. Do not infer or guess."
Improve deadline extraction:
Add a reference date: "Today is {{ $now.format('YYYY-MM-DD') }}. Convert relative dates like 'next Friday' to absolute dates."
Handle email threads: Prepend this to your user message: "This is an email thread with newest message first. Focus on the most recent message but note any unresolved items from earlier in the thread."
Cost optimization: Use gpt-4o-mini for summaries (90% accuracy, 10x cheaper). Use gpt-4o only for complex sentiment analysis or multi-party threads.
Testing Your Prompts
Before deploying to production:
- Create a test Gmail label "CRMTest"CRMClick to read the full definition in our AI & Automation Glossary.
- Forward 20 representative client emails to that label
- Run your n8n workflow in manual mode
- Compare AI output to what you'd manually log
- Adjust prompts where accuracy drops below 85%
Common failure modes: AI misses deadlines buried in signatures, assigns wrong owner when multiple people are CC'd, flags routine emails as urgent. Fix by adding specific examples to your system prompt.

Reviewed by Revenue Institute
This guide is actively maintained and reviewed by the implementation experts at Revenue Institute. As the creators of The AI Workforce Playbook, we test and deploy these exact frameworks for professional services firms scaling without new headcount.
Revenue Institute
Need help turning this guide into reality? Revenue Institute builds and implements the AI workforce for professional services firms.