On Day 6, we’ll generate AI-powered follow-up emails based on the sales meeting notes and send them via HubSpot or Salesforce. This feature ensures that sales reps never forget to follow up after a meeting.
1. Why Automate Follow-Up Emails?
✅ Saves Time → No need to manually write follow-up emails after every meeting.
✅ Ensures Consistency → AI maintains a professional and engaging tone.
✅ Boosts Conversions → Personalized follow-ups improve client engagement and deal closures.
2. Generating AI-Powered Follow-Up Emails Using GPT-4
We’ll pass the CRM meeting notes into GPT and instruct it to format a sales follow-up email.
✅ Step 1: Update gptService.js
to Generate Emails
Modify src/api/gptService.js
:
export const generateFollowUpEmail = async (meetingNotes, recipientName) => {
try {
const response = await axios.post(
'https://api.openai.com/v1/chat/completions',
{
model: 'gpt-4',
messages: [
{
role: 'system',
content: "You are an AI assistant that generates professional sales follow-up emails.",
},
{
role: 'user',
content: `Based on the following sales meeting notes, generate a polite, engaging, and professional follow-up email:
Meeting Notes:
${meetingNotes}
The recipient's name is: ${recipientName}.
The email should include:
- A greeting using the recipient's name
- A brief summary of the meeting
- Next steps and action items
- A closing statement with a request to follow up`,
},
],
},
{
headers: { Authorization: `Bearer ${OPENAI_API_KEY}` },
}
);
return response.data.choices[0].message.content;
} catch (error) {
console.error('GPT API Error:', error);
return 'Error generating email. Please try again.';
}
};
3. Sending AI Emails via HubSpot & Salesforce
Now that we have GPT-generated emails, we’ll send them through the CRM APIs.
✅ Step 1: Create emailService.js
Create src/api/emailService.js
:
import axios from 'axios';
import { HUBSPOT_API_KEY, SALESFORCE_INSTANCE_URL } from '@env';
import { getAccessToken } from './salesforceService';
// Send email via HubSpot
export const sendHubSpotEmail = async (recipientEmail, subject, body) => {
try {
const response = await axios.post(
'https://api.hubapi.com/marketing-emails/v1/emails/send',
{
email: recipientEmail,
subject: subject,
html: `<p>${body.replace(/\n/g, '<br>')}</p>`,
},
{
headers: {
Authorization: `Bearer ${HUBSPOT_API_KEY}`,
'Content-Type': 'application/json',
},
}
);
return response.data;
} catch (error) {
console.error('HubSpot Email Error:', error);
return null;
}
};
// Send email via Salesforce
export const sendSalesforceEmail = async (recipientEmail, subject, body) => {
const accessToken = await getAccessToken();
if (!accessToken) return null;
try {
const response = await axios.post(
`${SALESFORCE_INSTANCE_URL}/services/data/v57.0/actions/standard/emailSimpleSend`,
{
inputs: [
{
subject: subject,
plainTextBody: body,
recipients: [{ emailAddress: recipientEmail }],
},
],
},
{
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json',
},
}
);
return response.data;
} catch (error) {
console.error('Salesforce Email Error:', error);
return null;
}
};
4. Updating the App to Send Emails
✅ Step 1: Modify HomeScreen.js
import React, { useState } from 'react';
import { View, Text, TextInput, Button, StyleSheet, ActivityIndicator, Alert } from 'react-native';
import VoiceRecorder from '../components/VoiceRecorder';
import { uploadAudio, transcribeAudio, getTranscriptionResult } from '../api/transcriptionService';
import { generateCRMNotes, generateFollowUpEmail } from '../api/gptService';
import { createHubSpotNote } from '../api/hubspotService';
import { createSalesforceNote } from '../api/salesforceService';
import { sendHubSpotEmail, sendSalesforceEmail } from '../api/emailService';
export default function HomeScreen() {
const [recordingUri, setRecordingUri] = useState(null);
const [transcription, setTranscription] = useState('');
const [crmNotes, setCrmNotes] = useState('');
const [recipientEmail, setRecipientEmail] = useState('');
const [generatedEmail, setGeneratedEmail] = useState('');
const [isLoading, setIsLoading] = useState(false);
const handleRecordingComplete = (uri) => {
setRecordingUri(uri);
Alert.alert('Recording Saved', `Saved to: ${uri}`);
};
const handleGenerateFollowUpEmail = async () => {
if (!crmNotes || !recipientEmail) {
Alert.alert('Missing Data', 'Please provide CRM notes and a recipient email.');
return;
}
try {
setIsLoading(true);
const emailContent = await generateFollowUpEmail(crmNotes, recipientEmail);
setGeneratedEmail(emailContent);
} catch (error) {
Alert.alert('Error', 'Failed to generate follow-up email.');
} finally {
setIsLoading(false);
}
};
const handleSendEmail = async (platform) => {
if (!generatedEmail || !recipientEmail) {
Alert.alert('Missing Data', 'Generate an email before sending.');
return;
}
try {
setIsLoading(true);
let result = null;
if (platform === 'hubspot') {
result = await sendHubSpotEmail(recipientEmail, 'Follow-up on Our Meeting', generatedEmail);
} else if (platform === 'salesforce') {
result = await sendSalesforceEmail(recipientEmail, 'Follow-up on Our Meeting', generatedEmail);
}
if (result) {
Alert.alert('Success', `Email sent via ${platform}!`);
} else {
Alert.alert('Error', `Failed to send email via ${platform}.`);
}
} catch (error) {
Alert.alert('Error', 'Email sending failed.');
} finally {
setIsLoading(false);
}
};
return (
<View style={styles.container}>
<Text style={styles.title}>AI Sales Assistant</Text>
<VoiceRecorder onRecordingComplete={handleRecordingComplete} />
{crmNotes && (
<>
<TextInput
style={styles.input}
placeholder="Recipient Email"
value={recipientEmail}
onChangeText={setRecipientEmail}
/>
<Button title="Generate Follow-Up Email" onPress={handleGenerateFollowUpEmail} />
{generatedEmail ? <Text>{generatedEmail}</Text> : null}
<Button title="Send via HubSpot" onPress={() => handleSendEmail('hubspot')} />
<Button title="Send via Salesforce" onPress={() => handleSendEmail('salesforce')} />
</>
)}
{isLoading && <ActivityIndicator size="large" color="#0000ff" />}
</View>
);
}
const styles = StyleSheet.create({
container: { flex: 1, justifyContent: 'center', alignItems: 'center', padding: 10 },
title: { fontSize: 24, fontWeight: 'bold', marginBottom: 20 },
input: { width: '80%', padding: 10, margin: 10, borderWidth: 1, borderRadius: 5 },
});
5. Next Steps: AI-Driven Sales Analytics & Lead Scoring
Tomorrow, we’ll:
- Analyze sales meetings using AI.
- Implement AI-driven lead scoring & opportunity tracking.
6. SEO Keywords:
AI-powered sales emails, HubSpot email automation, Salesforce AI email generator, GPT for sales follow-ups, CRM email integration.