On Day 5, we’ll integrate HubSpot and Salesforce APIs to automate CRM note entry. After generating GPT-powered summaries, the app will push meeting notes directly into the CRM.
1. Why Sync AI Notes to CRM?
✅ Eliminates Manual Data Entry – AI-generated notes are automatically stored in CRM.
✅ Ensures Follow-Ups – No missed action items; everything is logged and trackable.
✅ Saves Time for Sales Teams – Salespeople focus on closing deals, not updating records.
2. Choosing HubSpot vs. Salesforce
Feature | HubSpot API | Salesforce API |
---|---|---|
Free CRM Support | ✅ Yes | ❌ No (Paid CRM Required) |
Authentication | API Key / OAuth | OAuth 2.0 Required |
Notes/Activities API | ✅ Yes | ✅ Yes |
Sales Pipelines | ✅ Yes | ✅ Yes |
For this tutorial, we’ll cover both APIs, and you can choose based on your needs.
3. Setting Up HubSpot API Integration
✅ Step 1: Get Your HubSpot API Key
- Go to HubSpot Developer Account → HubSpot API Keys.
- Copy your API key.
✅ Step 2: Install Axios for API Calls
npm install axios
✅ Step 3: Create hubspotService.js
Create src/api/hubspotService.js
:
import axios from 'axios';
import { HUBSPOT_API_KEY } from '@env';
const HUBSPOT_BASE_URL = 'https://api.hubapi.com/crm/v3/objects/notes';
export const createHubSpotNote = async (title, content) => {
try {
const response = await axios.post(
HUBSPOT_BASE_URL,
{
properties: {
hs_note_body: content,
hs_note_title: title,
},
},
{
headers: {
Authorization: `Bearer ${HUBSPOT_API_KEY}`,
'Content-Type': 'application/json',
},
}
);
return response.data;
} catch (error) {
console.error('HubSpot API Error:', error);
return null;
}
};
4. Setting Up Salesforce API Integration
✅ Step 1: Get Salesforce API Credentials
- Go to Salesforce Developer Account → Salesforce API Docs.
- Get Client ID, Client Secret, and Instance URL.
✅ Step 2: Create salesforceService.js
Create src/api/salesforceService.js
:
import axios from 'axios';
import { SALESFORCE_CLIENT_ID, SALESFORCE_CLIENT_SECRET, SALESFORCE_REFRESH_TOKEN, SALESFORCE_INSTANCE_URL } from '@env';
const getAccessToken = async () => {
try {
const response = await axios.post(
`${SALESFORCE_INSTANCE_URL}/services/oauth2/token`,
new URLSearchParams({
grant_type: 'refresh_token',
client_id: SALESFORCE_CLIENT_ID,
client_secret: SALESFORCE_CLIENT_SECRET,
refresh_token: SALESFORCE_REFRESH_TOKEN,
})
);
return response.data.access_token;
} catch (error) {
console.error('Salesforce Auth Error:', error);
return null;
}
};
export const createSalesforceNote = async (title, content) => {
const accessToken = await getAccessToken();
if (!accessToken) return null;
try {
const response = await axios.post(
`${SALESFORCE_INSTANCE_URL}/services/data/v57.0/sobjects/Note`,
{
Title: title,
Body: content,
},
{
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json',
},
}
);
return response.data;
} catch (error) {
console.error('Salesforce API Error:', error);
return null;
}
};
5. Updating the App to Sync AI Notes to CRM
✅ Step 1: Modify HomeScreen.js
import React, { useState } from 'react';
import { View, Text, Button, StyleSheet, ActivityIndicator, Alert } from 'react-native';
import VoiceRecorder from '../components/VoiceRecorder';
import { uploadAudio, transcribeAudio, getTranscriptionResult } from '../api/transcriptionService';
import { generateCRMNotes } from '../api/gptService';
import { createHubSpotNote } from '../api/hubspotService';
import { createSalesforceNote } from '../api/salesforceService';
export default function HomeScreen() {
const [recordingUri, setRecordingUri] = useState(null);
const [transcription, setTranscription] = useState('');
const [crmNotes, setCrmNotes] = useState('');
const [isLoading, setIsLoading] = useState(false);
const handleRecordingComplete = (uri) => {
setRecordingUri(uri);
Alert.alert('Recording Saved', `Saved to: ${uri}`);
};
const handleTranscribe = async () => {
try {
setIsLoading(true);
const audioUrl = await uploadAudio(recordingUri);
const transcriptId = await transcribeAudio(audioUrl);
let status = 'processing';
let transcriptData = null;
while (status === 'processing' || status === 'queued') {
transcriptData = await getTranscriptionResult(transcriptId);
status = transcriptData.status;
if (status === 'completed') {
setTranscription(transcriptData.text);
break;
} else if (status === 'failed') {
Alert.alert('Transcription Failed');
break;
}
await new Promise((resolve) => setTimeout(resolve, 3000));
}
} catch (error) {
Alert.alert('Error', 'Failed to transcribe audio');
} finally {
setIsLoading(false);
}
};
const handleGenerateCRMNotes = async () => {
if (!transcription) {
Alert.alert('No Transcription', 'Please transcribe a voice memo first.');
return;
}
try {
setIsLoading(true);
const formattedNotes = await generateCRMNotes(transcription);
setCrmNotes(formattedNotes);
} catch (error) {
Alert.alert('Error', 'Failed to generate CRM notes');
} finally {
setIsLoading(false);
}
};
const handleSyncToCRM = async (platform) => {
if (!crmNotes) {
Alert.alert('No Notes', 'Generate CRM notes before syncing.');
return;
}
try {
setIsLoading(true);
let result = null;
if (platform === 'hubspot') {
result = await createHubSpotNote('Sales Meeting Notes', crmNotes);
} else if (platform === 'salesforce') {
result = await createSalesforceNote('Sales Meeting Notes', crmNotes);
}
if (result) {
Alert.alert('Success', `CRM Notes synced to ${platform}!`);
} else {
Alert.alert('Error', `Failed to sync notes to ${platform}.`);
}
} catch (error) {
Alert.alert('Error', 'CRM sync failed.');
} finally {
setIsLoading(false);
}
};
return (
<View style={styles.container}>
<Text style={styles.title}>AI Sales Assistant</Text>
<VoiceRecorder onRecordingComplete={handleRecordingComplete} />
{recordingUri && <Button title="Transcribe Memo" onPress={handleTranscribe} />}
{transcription && <Button title="Generate CRM Notes" onPress={handleGenerateCRMNotes} />}
{crmNotes && (
<>
<Button title="Sync to HubSpot" onPress={() => handleSyncToCRM('hubspot')} />
<Button title="Sync to Salesforce" onPress={() => handleSyncToCRM('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 },
});
6. Next Steps: AI-Driven Follow-Up Emails
Tomorrow, we’ll:
- Generate AI-powered follow-up emails.
- Auto-send emails via CRM APIs.
7. SEO Keywords:
GPT sales CRM automation, HubSpot API integration, Salesforce API for sales AI, AI-powered sales automation.