Day 5: Syncing AI-Generated Notes to HubSpot & Salesforce #CRMIntegration #AIforSales

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

FeatureHubSpot APISalesforce API
Free CRM Support✅ Yes❌ No (Paid CRM Required)
AuthenticationAPI Key / OAuthOAuth 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

  1. Go to HubSpot Developer AccountHubSpot API Keys.
  2. 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

  1. Go to Salesforce Developer AccountSalesforce API Docs.
  2. Get Client ID, Client Secret, and Instance URL.
See also  Day 10: Deploying Your App to the Google Play Store and Apple App Store

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.
See also  Custom Directives in Alpine.js

7. SEO Keywords:

GPT sales CRM automation, HubSpot API integration, Salesforce API for sales AI, AI-powered sales automation.

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.