0Pricing
AI Agents · Pelajaran

Integrasi CRM: Salesforce dan HubSpot

Mengambil riwayat pelanggan, mencatat interaksi, dan memperbarui catatan CRM.

Integrasi CRM: Salesforce dan HubSpot adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.

Mengapa Integrasi CRM Penting

Agen layanan pelanggan yang tidak dapat melihat riwayat pelanggan bekerja tanpa informasi yang memadai. Sistem CRM seperti Salesforce dan HubSpot menyimpan catatan pelanggan lengkap: tiket sebelumnya, pembelian, tingkatan langganan, dan catatan akun.

Mengintegrasikan CRM memungkinkan agen mempersonalisasi respons dan menyelesaikan masalah dengan lebih cepat.

Menghubungkan ke Salesforce dengan simple-salesforce

simple-salesforce adalah pustaka Python paling populer untuk REST API Salesforce. Hubungkan dengan nama pengguna/kata sandi/token keamanan atau melalui alur aplikasi terhubung OAuth.

from simple_salesforce import Salesforce

sf = Salesforce(
    username='agent@company.com',
    password='YOUR_SF_PASSWORD',
    security_token='YOUR_SF_TOKEN',
    domain='login'   # use 'test' for sandbox
)
print('Connected to Salesforce org:', sf.base_url)

Kueri SOQL: Mengambil Catatan Pelanggan

Salesforce Object Query Language (SOQL) mirip SQL, tetapi beroperasi pada objek Salesforce. Gunakan bahasa ini untuk mencari kontak berdasarkan email dan mengambil detail akunnya.

def get_customer_by_email(sf, email: str) -> dict | None:
    query = (
        f"SELECT Id, FirstName, LastName, Email, AccountId, "
        f"Account.Name, Account.Type "
        f"FROM Contact "
        f"WHERE Email = '{email}' "
        f"LIMIT 1"
    )
    result = sf.query(query)
    if result['totalSize'] == 0:
        return None
    record = result['records'][0]
    return {
        'contact_id': record['Id'],
        'name': f"{record['FirstName']} {record['LastName']}",
        'account_id': record['AccountId'],
        'account_name': record['Account']['Name']
    }

if __name__ == '__main__':
    class FakeSF:
        def query(self, query):
            return {
                'totalSize': 1,
                'records': [{
                    'Id': '003ABC', 'FirstName': 'Jane', 'LastName': 'Doe',
                    'AccountId': '001XYZ',
                    'Account': {'Name': 'Acme Corp', 'Type': 'Customer'},
                }],
            }
    customer = get_customer_by_email(FakeSF(), 'jane@acme.com')
    print(f"Found customer: {customer['name']} at {customer['account_name']}")

Mengambil Riwayat Kasus Dukungan dari Salesforce

Jalankan kueri pada objek Case untuk mengambil tiket dukungan pelanggan sebelumnya. Sertakan status kasus dan penyelesaiannya agar agen tidak menanyakan hal yang sama dua kali.

def get_case_history(sf, contact_id: str, limit: int = 10) -> list:
    query = (
        f"SELECT Id, CaseNumber, Subject, Status, "
        f"CreatedDate, ClosedDate, Resolution__c "
        f"FROM Case "
        f"WHERE ContactId = '{contact_id}' "
        f"ORDER BY CreatedDate DESC "
        f"LIMIT {limit}"
    )
    result = sf.query(query)
    return [
        {
            'case_number': r['CaseNumber'],
            'subject': r['Subject'],
            'status': r['Status'],
            'created': r['CreatedDate'][:10],
            'resolution': r.get('Resolution__c')
        }
        for r in result['records']
    ]

if __name__ == '__main__':
    class FakeSF:
        def query(self, query):
            return {'records': [{
                'Id': '500A', 'CaseNumber': '00001234', 'Subject': 'Login issue',
                'Status': 'Closed', 'CreatedDate': '2026-07-01T10:00:00Z',
                'ClosedDate': '2026-07-02T09:00:00Z', 'Resolution__c': 'Reset password',
            }]}
    for case in get_case_history(FakeSF(), '003ABC'):
        print(f"Case {case['case_number']}: {case['subject']} ({case['status']})")

Membuat Kasus Baru di Salesforce

Saat agen membuat tiket dukungan baru dari sebuah percakapan, masukkan catatan Case baru. Tautkan catatan tersebut ke kontak dan akun agar muncul di linimasa pelanggan.

def create_case(sf, contact_id: str, account_id: str,
                subject: str, description: str, priority: str = 'Medium') -> str:
    result = sf.Case.create({
        'ContactId': contact_id,
        'AccountId': account_id,
        'Subject': subject,
        'Description': description,
        'Priority': priority,
        'Status': 'New',
        'Origin': 'AI Agent'
    })
    case_id = result['id']
    print(f'Created Case: {case_id}')
    return case_id

if __name__ == '__main__':
    class FakeCase:
        def create(self, data):
            return {'id': '500NEW01'}
    class FakeSF:
        Case = FakeCase()

    create_case(FakeSF(), '003ABC', '001XYZ', 'Cannot reset password', 'Customer locked out after 3 attempts')

Menghubungkan ke HubSpot

Pustaka hubspot-api-client membungkus REST API HubSpot. Lakukan autentikasi dengan token akses aplikasi privat (OAuth tidak diperlukan untuk integrasi ant server).

from hubspot import HubSpot
from hubspot.crm.contacts import SimplePublicObjectInput

client = HubSpot(access_token='YOUR_HUBSPOT_PRIVATE_APP_TOKEN')
print('HubSpot client ready')

Mencari Kontak di HubSpot

Gunakan API pencarian kontak untuk menemukan pelanggan berdasarkan email. Responsnya mencakup semua properti kontak, termasuk tahap siklus hidup, asosiasi kesepakatan, dan kolom khusus.

from hubspot.crm.contacts import PublicObjectSearchRequest

def get_hubspot_contact(client, email: str) -> dict | None:
    search_request = PublicObjectSearchRequest(
        filter_groups=[{
            'filters': [{
                'propertyName': 'email',
                'operator': 'EQ',
                'value': email
            }]
        }],
        properties=['firstname', 'lastname', 'email',
                    'lifecyclestage', 'hs_object_id']
    )
    response = client.crm.contacts.search_api.do_search(
        public_object_search_request=search_request
    )
    if response.total == 0:
        return None
    contact = response.results[0]
    return {'id': contact.id, **contact.properties}

Mengambil Riwayat Tiket HubSpot

HubSpot menyimpan tiket dukungan dalam objek tickets. Ambil tiket yang terkait dengan kontak menggunakan API asosiasi.

def get_hubspot_tickets(client, contact_id: str) -> list:
    assoc = client.crm.contacts.associations_api.get_all(
        contact_id,
        to_object_type='tickets'
    )
    ticket_ids = [r.id for r in assoc.results]
    if not ticket_ids:
        return []

    tickets = []
    for tid in ticket_ids[:10]:  # limit to 10 most recent
        ticket = client.crm.tickets.basic_api.get_by_id(
            tid,
            properties=['subject', 'hs_ticket_priority',
                        'hs_pipeline_stage', 'createdate']
        )
        tickets.append({
            'id': tid,
            'subject': ticket.properties.get('subject'),
            'priority': ticket.properties.get('hs_ticket_priority'),
            'stage': ticket.properties.get('hs_pipeline_stage')
        })
    return tickets

if __name__ == '__main__':
    from types import SimpleNamespace

    class AssocApi:
        def get_all(self, contact_id, to_object_type):
            return SimpleNamespace(results=[SimpleNamespace(id='t1'), SimpleNamespace(id='t2')])

    class TicketsBasicApi:
        _data = {
            't1': {'subject': 'Cannot login', 'hs_ticket_priority': 'HIGH', 'hs_pipeline_stage': '1'},
            't2': {'subject': 'Refund request', 'hs_ticket_priority': 'MEDIUM', 'hs_pipeline_stage': '2'},
        }
        def get_by_id(self, tid, properties):
            return SimpleNamespace(properties=self._data[tid])

    fake_client = SimpleNamespace(crm=SimpleNamespace(
        contacts=SimpleNamespace(associations_api=AssocApi()),
        tickets=SimpleNamespace(basic_api=TicketsBasicApi()),
    ))

    for t in get_hubspot_tickets(fake_client, 'contact_1'):
        print(f"Ticket {t['id']}: {t['subject']} [{t['priority']}]")

Membuat Tiket HubSpot

Masukkan tiket baru dan kaitkan tiket tersebut dengan kontak dalam satu alur kerja. Dengan demikian, catatan CRM pelanggan tetap diperbarui secara otomatis saat agen menangani permintaan.

from hubspot.crm.tickets import SimplePublicObjectInputForCreate
from hubspot.crm.associations.v4.models import AssociationSpec

def create_hubspot_ticket(client, contact_id: str,
                          subject: str, description: str) -> str:
    ticket_input = SimplePublicObjectInputForCreate(
        properties={
            'subject': subject,
            'content': description,
            'hs_ticket_priority': 'MEDIUM',
            'hs_pipeline': 'support_pipeline',
            'hs_pipeline_stage': 'new'
        },
        associations=[{
            'types': [AssociationSpec(association_category='HUBSPOT_DEFINED',
                                     association_type_id=16)],
            'to': {'id': contact_id}
        }]
    )
    ticket = client.crm.tickets.basic_api.create(
        simple_public_object_input_for_create=ticket_input
    )
    return ticket.id

Memperbarui Catatan Kontak

Setelah penyelesaian berhasil, perbarui catatan kontak dengan perubahan catatan dan tahap siklus hidup. Dengan demikian, CRM tetap mutakhir tanpa pekerjaan manual dari agen.

def update_hubspot_contact(client, contact_id: str, updates: dict) -> None:
    client.crm.contacts.basic_api.update(
        contact_id=contact_id,
        simple_public_object_input=SimplePublicObjectInput(
            properties=updates
        )
    )

# After resolving a billing issue:
update_hubspot_contact(client, 'CONTACT_123', {
    'hs_lead_status': 'CONNECTED',
    'notes_last_contacted': 'Resolved billing duplicate charge issue via AI agent.'
})

Konteks CRM Terpadu untuk Agen

Buat satu fungsi yang mengambil konteks pelanggan dari CRM mana pun yang dikonfigurasi. Agen memanggil fungsi ini di awal setiap percakapan untuk mempersonalisasi responsnya.

def get_customer_context(email: str, crm: str = 'salesforce') -> dict:
    if crm == 'salesforce':
        customer = get_customer_by_email(sf, email)
        if not customer:
            return {'found': False}
        cases = get_case_history(sf, customer['contact_id'])
        return {'found': True, 'customer': customer, 'history': cases}
    elif crm == 'hubspot':
        customer = get_hubspot_contact(client, email)
        if not customer:
            return {'found': False}
        tickets = get_hubspot_tickets(client, customer['id'])
        return {'found': True, 'customer': customer, 'history': tickets}
    return {'found': False, 'error': 'Unknown CRM'}

Bahasa kueri Salesforce apa yang digunakan untuk mengambil catatan melalui pustaka simple-salesforce?

Salesforce menggunakan bahasa kuerinya sendiri untuk mengambil catatan. Pengetahuan ini penting untuk membangun alat agen yang mencari riwayat pelanggan.

Ringkasan Integrasi CRM

Mengintegrasikan Salesforce (simple-salesforce + SOQL) atau HubSpot (hubspot-api-client) memberikan konteks pelanggan lengkap kepada agen layanan pelanggan: riwayat, kasus, tiket, dan data akun.

Selalu buat fungsi get_customer_context() terpadu agar perintah agen diperkaya dengan riwayat yang relevan sebelum menghasilkan respons.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Integrasi CRM: Salesforce dan HubSpot” gratis?

Ya — teks lengkap “Integrasi CRM: Salesforce dan HubSpot” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Integrasi CRM: Salesforce dan HubSpot”?

Mengambil riwayat pelanggan, mencatat interaksi, dan memperbarui catatan CRM. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai AI Agents?

Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Integrasi CRM: Salesforce dan HubSpot” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?

Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Perutean Tiket dan Logika Eskalasi
  2. Integrasi CRM: Salesforce dan HubSpot
  3. Protokol Pengalihan ke Manusia
  4. Pengelolaan Konteks dan Riwayat Pelanggan
← Kembali ke AI Agents