AI Agents · บทเรียน

การผสาน CRM: Salesforce และ HubSpot

ดึงประวัติลูกค้า บันทึกการโต้ตอบ และอัปเดตระเบียน CRM

บทเรียน 2 จาก 413 ขั้นตอน

การผสาน CRM: Salesforce และ HubSpot เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดการผสานรวม CRM จึงสำคัญ

เจ้าหน้าที่บริการลูกค้าที่มองไม่เห็นประวัติของลูกค้ากำลังทำงานโดยไม่มีข้อมูล ระบบ CRM เช่น Salesforce และ HubSpot เก็บระเบียนลูกค้าไว้อย่างครบถ้วน ทั้งรายการแจ้งปัญหาในอดีต การซื้อ ระดับการสมัครสมาชิก และบันทึกบัญชี

การผสานรวมกับ CRM ช่วยให้เจ้าหน้าที่ปรับคำตอบให้เหมาะกับลูกค้าแต่ละรายและแก้ไขปัญหาได้เร็วขึ้น

การเชื่อมต่อ Salesforce ด้วย simple-salesforce

simple-salesforce เป็นไลบรารี Python ยอดนิยมสำหรับ Salesforce REST API เชื่อมต่อโดยใช้ชื่อผู้ใช้/รหัสผ่าน/โทเค็นความปลอดภัย หรือโฟลว์แอปที่เชื่อมต่อผ่าน 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)

คิวรี SOQL: การดึงระเบียนลูกค้า

Salesforce Object Query Language (SOQL) คล้าย SQL แต่ทำงานกับอ็อบเจ็กต์ของ Salesforce ใช้ค้นหาผู้ติดต่อด้วยอีเมลและดึงรายละเอียดบัญชีของผู้ติดต่อได้

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']}")

การดึงประวัติรายการแจ้งปัญหาจาก Salesforce

คิวรีอ็อบเจ็กต์ Case เพื่อดึงรายการแจ้งปัญหาการสนับสนุนก่อนหน้าของลูกค้า รวมสถานะและวิธีแก้ไขของรายการไว้ด้วย เพื่อให้เจ้าหน้าที่ไม่ต้องถามคำถามเดิมซ้ำสองครั้ง

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']})")

การสร้างเคสใหม่ใน Salesforce

เมื่อเจ้าหน้าที่สร้างรายการแจ้งปัญหาการสนับสนุนใหม่จากบทสนทนา ให้แทรกระเบียน Case ใหม่ เชื่อมโยงกับผู้ติดต่อและบัญชี เพื่อให้รายการดังกล่าวปรากฏในไทม์ไลน์ของลูกค้า

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')

การเชื่อมต่อ HubSpot

ไลบรารี hubspot-api-client ทำหน้าที่ห่อหุ้ม REST API ของ HubSpot ตรวจสอบสิทธิ์ด้วยโทเค็นการเข้าถึงจากแอปส่วนตัว (ไม่จำเป็นต้องใช้ OAuth สำหรับการผสานรวมระหว่างเซิร์ฟเวอร์)

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

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

การค้นหาผู้ติดต่อใน HubSpot

ใช้ API ค้นหาผู้ติดต่อเพื่อค้นหาลูกค้าด้วยอีเมล ผลลัพธ์จะมีคุณสมบัติของผู้ติดต่อทั้งหมด รวมถึงระยะวงจรชีวิต การเชื่อมโยงดีล และฟิลด์กำหนดเอง

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}

การดึงประวัติรายการแจ้งปัญหาจาก HubSpot

HubSpot เก็บรายการแจ้งปัญหาการสนับสนุนไว้ในอ็อบเจ็กต์ tickets ดึงรายการแจ้งปัญหาที่เชื่อมโยงกับผู้ติดต่อได้โดยใช้ API การเชื่อมโยง

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']}]")

การสร้างรายการแจ้งปัญหาใน HubSpot

แทรกรายการแจ้งปัญหาใหม่และเชื่อมโยงกับผู้ติดต่อในกระบวนการทำงานเดียว วิธีนี้ช่วยให้ระเบียน CRM ของลูกค้าเป็นปัจจุบันโดยอัตโนมัติขณะที่เจ้าหน้าที่จัดการคำขอต่าง ๆ

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

การอัปเดตระเบียนผู้ติดต่อ

หลังจากแก้ไขปัญหาได้สำเร็จ ให้อัปเดตระเบียนของผู้ติดต่อด้วยบันทึกและการเปลี่ยนแปลงระยะวงจรชีวิต วิธีนี้ช่วยให้ CRM เป็นปัจจุบันโดยไม่ต้องให้เจ้าหน้าที่ดำเนินการด้วยตนเอง

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.'
})

บริบท CRM แบบรวมสำหรับเอเจนต์

สร้างฟังก์ชันเดียวที่ดึงบริบทลูกค้าจาก CRM ที่กำหนดค่าไว้ ไม่ว่าจะเป็นระบบใด เอเจนต์จะเรียกใช้ฟังก์ชันนี้เมื่อเริ่มต้นทุกบทสนทนาเพื่อปรับคำตอบให้เหมาะกับลูกค้า

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'}

Salesforce ใช้ภาษาคิวรีใดในการดึงระเบียนผ่านไลบรารี simple-salesforce

Salesforce ใช้ภาษาคิวรีของตนเองในการดึงระเบียน การรู้เรื่องนี้เป็นสิ่งจำเป็นสำหรับการสร้างเครื่องมือของเอเจนต์ที่ใช้ค้นหาประวัติลูกค้า

สรุปการผสานรวม CRM

การผสานรวมกับ Salesforce (simple-salesforce + SOQL) หรือ HubSpot (hubspot-api-client) ช่วยให้เอเจนต์บริการลูกค้ามีบริบทลูกค้าอย่างครบถ้วน ทั้งประวัติ เคส รายการแจ้งปัญหา และข้อมูลบัญชี

ควรสร้างฟังก์ชัน get_customer_context() แบบรวมเป็นหนึ่งเสมอ เพื่อเติมประวัติที่เกี่ยวข้องลงในพรอมต์ของเอเจนต์ก่อนสร้างคำตอบ

เริ่มต้นได้ฟรี

เรียนรู้ AI Agents ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
60
บทเรียน
239

คำถามที่พบบ่อย

บทเรียน “การผสาน CRM: Salesforce และ HubSpot” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การผสาน CRM: Salesforce และ HubSpot” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การผสาน CRM: Salesforce และ HubSpot”

ดึงประวัติลูกค้า บันทึกการโต้ตอบ และอัปเดตระเบียน CRM คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การผสาน CRM: Salesforce และ HubSpot” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม

ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ตรรกะการจัดเส้นทางและยกระดับทิกเก็ต
  2. การผสาน CRM: Salesforce และ HubSpot
  3. โพรโทคอลการส่งต่องานให้มนุษย์
  4. การจัดการบริบทและประวัติลูกค้า
← กลับไปที่ AI Agents