การโอนตัวแทนแบบเรียลไทม์

1. บทนำ

53003251caaf2be5.png 6717b85f57d859d3.png

อัปเดตล่าสุด 23-08-2021

การโอนตัวแทนแบบเรียลไทม์ด้วย Business Messages

ฟีเจอร์การโอนตัวแทนแบบเรียลไทม์ของ Business Messages ช่วยให้ตัวแทนเริ่มการสนทนาในฐานะบ็อตและเปลี่ยนการสนทนาระหว่างการสนทนาเป็นตัวแทนแบบเรียลไทม์ได้ (ตัวแทนที่เป็นมนุษย์) บ็อตสามารถจัดการคำถามที่พบบ่อย เช่น เวลาทำการ ในขณะที่ตัวแทนแบบเรียลไทม์สามารถมอบประสบการณ์การใช้งานที่กำหนดเองพร้อมเข้าถึงบริบทของผู้ใช้ได้มากขึ้น เมื่อการเปลี่ยนผ่านระหว่างประสบการณ์ทั้งสองเป็นไปอย่างราบรื่น ผู้ใช้จะสามารถตอบคำถามได้อย่างรวดเร็วและถูกต้อง ซึ่งส่งผลให้อัตราการมีส่วนร่วมในผลตอบแทนสูงขึ้นและความพึงพอใจของลูกค้าเพิ่มขึ้น

Codelab นี้จะสอนวิธีใช้ฟีเจอร์การโอนตัวแทนแบบเรียลไทม์ให้เกิดประโยชน์สูงสุด

สิ่งที่คุณจะสร้าง

ใน Codelab นี้ คุณจะสร้างเว็บฮุคสำหรับตัวแทนที่ส่งและรับเหตุการณ์การโอนตัวแทนแบบเรียลไทม์ได้ คุณจะต้องใช้ UI พื้นฐานจากรหัสเริ่มต้นเพื่อทดสอบสิ่งที่คุณสร้างขึ้น

49aca3df6b196c50.png

สิ่งที่คุณจะได้เรียนรู้

  • วิธีจัดเก็บและจัดการสถานะการสนทนา
  • วิธีใช้ Business Messages เพื่อส่งกิจกรรมการโอนตัวแทนแบบเรียลไทม์
  • วิธีตั้งค่าเว็บฮุคและ UI พื้นฐานสำหรับการเข้าร่วมการสนทนาในฐานะตัวแทน
  • แนวทางปฏิบัติแนะนำในการใช้ Business Messages API

Codelab นี้มุ่งเน้นการใช้ Business Message API เพื่อติดตั้งใช้งานการโอนตัวแทนแบบสด คุณจะอ่านโค้ดเริ่มต้นสำหรับแต่ละขั้นตอนได้ แต่ต้องติดตั้งใช้งานเฉพาะโค้ดที่เกี่ยวข้องกับ Business Messages เท่านั้น

สิ่งที่คุณต้องมี

  • ตัวแทน Business Messages รวมถึงคีย์บัญชีบริการ คุณสามารถสร้างตัวแทนได้โดยทำตามคู่มือสร้างตัวแทน
  • การกำหนดค่า Cloud Datastore ที่ใช้งานอยู่ซึ่งลิงก์กับโปรเจ็กต์ GCP ของตัวแทน คุณสามารถใช้การเริ่มต้นใช้งาน Cloud Datastore อย่างรวดเร็วเพื่อตั้งค่าได้ คุณไม่จำเป็นต้องทราบวิธีใช้ Cloud Datastore
  • คอมพิวเตอร์ที่ติดตั้ง Google Cloud SDK และ Node.js (เวอร์ชัน 10 ขึ้นไป) แล้ว
  • อุปกรณ์ Android (เวอร์ชัน 5 ขึ้นไป) หรืออุปกรณ์ iOS สำหรับการทดสอบประสบการณ์ของผู้ใช้
  • ประสบการณ์ในการเขียนโปรแกรมเว็บแอปพลิเคชัน คุณจะเขียนโค้ด JavaScript เพียงเล็กน้อยและอาจต้องแก้ไขข้อบกพร่องของสิ่งที่คุณเขียน

2. สร้างบ็อต Echo

ในขั้นตอนนี้ คุณจะต้องทำให้ตัวแทนบ็อตพื้นฐานที่เรียกว่า "บ็อต Echo" ใช้งานได้ บ็อตนี้จะบันทึกข้อความของผู้ใช้ บันทึกไว้ในชุดข้อความการสนทนาใน Cloud Datastore แล้ว "เสียงสะท้อน" ข้อความของผู้ใช้โดยการตอบกลับด้วยเนื้อหาเดียวกัน เมื่อมีบ็อตพื้นฐานและโครงสร้างพื้นฐานการบันทึกแล้ว คุณจะเพิ่มต่อเพื่อสร้างการติดตั้งใช้งาน Agent แบบเรียลไทม์เต็มรูปแบบในขั้นตอนถัดไปได้

รับรหัสเริ่มต้น

โคลนรหัสเริ่มต้นของการโอน Agent สดไปยังไดเรกทอรีที่ใช้งานได้ของโปรเจ็กต์ด้วยคำสั่งต่อไปนี้ในเทอร์มินัล

git clone https://github.com/google-business-communications/bm-nodejs-live-agent-transfer

ทำความเข้าใจโค้ดเริ่มต้น

ลองมาดูโครงสร้างโค้ดเริ่มต้นที่คุณจะร่วมงานด้วยตลอดทั้ง Codelab กัน

ไปที่ไดเรกทอรี step-1 และดูเนื้อหา ซึ่งประกอบด้วยองค์ประกอบต่อไปนี้

  • bin: ไดเรกทอรีนี้มีสคริปต์เริ่มต้น www ซึ่งจะตั้งค่าและกำหนดค่าเซิร์ฟเวอร์
  • libs: ไดเรกทอรีนี้ประกอบด้วย datastore_util.js ซึ่งมีวิธีที่สะดวกสำหรับการอ่านและการเขียนจาก Cloud Datastore คุณไม่จำเป็นต้องเข้าใจวิธีการทำงานของไฟล์นี้ เพียงจดบันทึกวิธีการที่ใช้ได้และสิ่งที่พวกเขาทำ
  • ทรัพยากร: จะมีคีย์บัญชีบริการเป็นไฟล์ชื่อ credentials.json
  • เส้นทาง: ไฟล์ index.js มีเว็บฮุคและวิธีการช่วยเหลือทั้งหมดของเว็บฮุค นี่คือไฟล์หลักที่คุณจะใช้และเพิ่มไฟล์ได้
  • views คือไดเรกทอรีนี้มีไฟล์เทมเพลต EJS สําหรับองค์ประกอบ UI ซึ่งจะมีไฟล์อื่นๆ อีกในขั้นตอนถัดไป
  • app.js, app.yaml, package.json: ไฟล์เหล่านี้จะกำหนดค่าแอปพลิเคชันและทรัพยากร Dependency ของแอป

ก่อนทำให้ใช้งานได้ ให้ดาวน์โหลดคีย์บัญชีบริการ GCP แล้วคัดลอกไฟล์ข้อมูลเข้าสู่ระบบ JSON ไปยังไดเรกทอรีทรัพยากรแต่ละรายการในโค้ดตัวอย่าง ทำขั้นตอนนี้ในทุกขั้นตอนของ Codelab

cp credentials.json bm-nodejs-live-agent-transfer/step-<step number>/resources/credentials.json

การทำให้โค้ดเริ่มต้นใช้งานได้

ในเทอร์มินัล ให้ไปที่ไดเรกทอรี step-1 ของตัวอย่าง จากนั้นตั้งค่าเครื่องมือ gcloud ให้ใช้โปรเจ็กต์ Google Cloud โดยการตั้งค่ารหัสโปรเจ็กต์ที่คุณใช้ลงทะเบียนกับ API

gcloud config set project <PROJECT_ID>

หากต้องการทำให้แอปพลิเคชันใช้งานได้ ให้เรียกใช้คำสั่งต่อไปนี้

gcloud app deploy

จด URL ของแอปพลิเคชันที่ทำให้ใช้งานได้ในเอาต์พุตของคำสั่งล่าสุดแล้ว

Deployed service [default] to [https://PROJECT_ID.appspot.com]

โค้ดเริ่มต้นที่คุณเพิ่งทำให้ใช้งานได้มีเว็บแอปพลิเคชันที่มีเว็บฮุคเพื่อรับข้อความจาก Business Messages แอปพลิเคชันจะสะท้อนข้อความกลับไปยังผู้ใช้และบันทึกชุดข้อความไปยัง Cloud Datastore

กำหนดค่าตัวแทนของคุณ

ไปที่หน้าการตั้งค่าบัญชีใน Business Communications Developer Console และตั้งค่าเว็บฮุคเป็น URL ของแอปพลิเคชันที่ทำให้ใช้งานได้แล้ว เช่น https://PROJECT_ID.appspot.com/callback/

จากนั้นในหน้าข้อมูลตัวแทน ให้กำหนดค่าประเภทการโต้ตอบหลักและรองเป็น "บ็อต" และ "มนุษย์" ตามลำดับ

db0cca5b74f999ad.png

การสนทนากับบ็อตเสียงก้อง

เปิด Agent ใน Developer Console คุณจะเห็นหน้าภาพรวมที่ให้ตรวจสอบรายละเอียดของตัวแทนได้ คัดลอก URL ทดสอบของตัวแทนที่ตรงกับอุปกรณ์ทดสอบสำหรับอุปกรณ์เคลื่อนที่ ใช้ URL นี้ในอุปกรณ์เคลื่อนที่เพื่อเปิดใช้แพลตฟอร์มการสนทนาของตัวแทน

536313929e5c0b3e.png

โต้ตอบกับตัวแทนด้วยการส่งข้อความ 2-3 ข้อความ แพลตฟอร์มการสนทนาคัดลอกเฉพาะสิ่งที่คุณพูดเท่านั้น ไม่ใช่ประสบการณ์ที่มีประโยชน์มากนักของผู้ใช้ ถ้ามีวิธีคุยกับคนจริงๆ ก็พอ

3. การเข้าร่วมการสนทนา

ตอนนี้เราจะมาดูการสนทนาจากมุมมองของตัวแทนแบบเรียลไทม์กัน ในฐานะตัวแทนแบบเรียลไทม์ คุณจำเป็นต้องทราบข้อมูลการสนทนาบางอย่างก่อนเข้าร่วม เช่น รหัสการสนทนา ข้อมูลว่าผู้ใช้ได้ขอพูดคุยกับตัวแทนแบบเรียลไทม์หรือไม่ก็มีประโยชน์เช่นกัน ในขั้นตอนนี้ คุณจะใช้หน้า CRM (การจัดการลูกค้าสัมพันธ์) พื้นฐานเพื่อดูข้อมูลนี้และเข้าร่วมการสนทนาในฐานะตัวแทนแบบเรียลไทม์

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

ไปที่ไดเรกทอรี step-2 แล้วทำให้แอปใช้งานได้อีกครั้งเหมือนที่ทำในขั้นตอนก่อนหน้า

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

8f624e9befb8e827.png

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

Business Messages จะแสดงกิจกรรมที่ขอจากตัวแทนแบบเรียลไทม์ ซึ่งจะระบุเวลาที่ผู้ใช้ต้องการพูดกับตัวแทนแบบเรียลไทม์ คุณต้องติดตามสถานะนั้นเพื่อแสดงใน UI

ดูเมธอด Callback ใน index.js ความคิดเห็น TODO จะระบุตำแหน่งที่คุณจะต้องตรวจจับคำขอของผู้ใช้สำหรับ Agent แบบเรียลไทม์ และอัปเดตสถานะของชุดข้อความ

step-2/Routes/index.js

/**
 * The webhook callback method.
 */
router.post('/callback', async function(req, res, next) {
  ...
    } else if (requestBody.userStatus !== undefined) {
      if (requestBody.userStatus.requestedLiveAgent !== undefined) {
  ...
        // TODO: Update the thread state to QUEUED_THREAD_STATE.
      }
    }
  });
...
});

คุณต้องใช้วิธีการใน libs/datastore_utils.js เพื่อโหลดชุดข้อความการสนทนาปัจจุบันและอัปเดตสถานะเป็น QUEUED_THREAD_STATE

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

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

e58d2b77e9c64492.png

ตอนนี้หากกลับไปที่ CRM คุณจะเห็นหมายเหตุในชุดข้อความการสนทนาที่ระบุว่า "ขอตัวแทนแบบเรียลไทม์แล้ว" ผู้ใช้รายนี้ต้องการความช่วยเหลือจากคน คุณต้องใช้ปลายทาง joinConversation เพื่อให้ปุ่มใช้งานได้

ค้นหาความคิดเห็นอื่นของ TODO ในวิธีการที่ตัดออกสำหรับ /joinConversation

step-2/Routes/index.js

/**
 * Updates the thread state and sends a representative join signal to the user.
 */
router.post('/joinConversation', async function(req, res, next) {
  let conversationId = req.body.conversationId;

  // TODO: Update the thread state to LIVE_AGENT_THREAD_STATE and post a REPRESENTATIVE_JOINED event.

  res.json({
    'result': 'ok',
  });
});

คุณต้องอัปเดตสถานะชุดข้อความอีกครั้ง โดยครั้งนี้เป็น LIVE_AGENT_THREAD_STATE นอกจากนี้ คุณต้องใช้เมธอด conversations.events.create ของ Business Messages API เพื่อโพสต์กิจกรรม REPRESENTATIVE_JOINED ด้วย

หากต้องการสร้างเพย์โหลดคำขอ คุณต้องตั้งค่าช่องที่ระบุไว้ในตารางต่อไปนี้

ชื่อช่อง

คำแนะนำ

parent

ตั้งค่าเป็น "conversations/{conversationId}"

eventId

สร้างรหัสแบบสุ่มของคุณเองสำหรับกิจกรรม

auth

ใช้เมธอด initCredentials ที่ระบุ

resource

ส่วนนี้จะเป็นตัวเนื้อหาของเหตุการณ์ ตั้งค่า eventType และตัวแทน

ดูหน้าข้อมูลอ้างอิงสำหรับวิธีสร้างหรือหน้าข้อมูลอ้างอิงเหตุการณ์สำหรับความช่วยเหลือ

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

ยินดีด้วย ในขั้นตอนถัดไป เราจะมาดูวิธีทำให้ตัวแทนแบบเรียลไทม์พูดคุยกับผู้ใช้

4. การรับส่งข้อความในฐานะตัวแทนแบบเรียลไทม์

เมื่อเข้าร่วมการสนทนาเรียบร้อยแล้ว ก็ถึงเวลาส่งข้อความในฐานะตัวแทนแบบเรียลไทม์

ไปที่ไดเรกทอรี step-3 และทำให้แอปใช้งานได้อีกครั้ง ใน CRM ให้คลิกชุดข้อความการสนทนาจากขั้นตอนก่อนหน้า ตอนนี้คุณควรเห็นอินเทอร์เฟซแชทพื้นฐาน คุณจะดูข้อความของผู้ใช้แบบเรียลไทม์ได้จากที่นี่

46dd083f08f43961.png

แต่การส่งข้อความเนื่องจากตัวแทนยังไม่ได้ใช้งาน คุณต้องทำขั้นตอนนี้ให้เสร็จ

เปิดไฟล์ routes/index.js และดูปลายทาง 3 รายการที่เพิ่มเข้ามาใหม่

  • /messages: รับไฟล์มุมมอง messages.ejs และแสดงผลในเบราว์เซอร์ เมื่อคลิกชุดข้อความการสนทนาจากดัชนี คุณจะไปที่หน้าใดหน้าหนึ่งเหล่านี้ได้
  • /retrieveMessages: รับเนื้อหาข้อความของชุดข้อความและแสดงรายการข้อความทั้งหมดในการสนทนาที่มีการจัดรูปแบบ หน้าข้อความจะเรียกให้ปลายทางนี้แสดงข้อความล่าสุดเป็นระยะๆ
  • /sendMessage: ส่งข้อความจากตัวแทนตัวแทนแบบเรียลไทม์ถึงผู้ใช้ หน้าเว็บข้อความจะเรียกตัวเลือกนี้เมื่อคุณคลิกส่ง ซึ่งขณะนี้ไม่ได้ใช้งาน

ตอนนี้ให้ดูเมธอด storeAndSendResponse ที่มีอยู่

step-3/Routes/index.js

/**
 * Updates the thread, adds a new message and sends a response to the user.
 *
 * @param {string} message The message content that was received.
 * @param {string} conversationId The unique id for this user and agent.
 * @param {string} threadState Represents who is managing the conversation for the CRM.
 * @param {string} representativeType The representative sending the message, BOT or HUMAN.
 */
async function storeAndSendResponse(message, conversationId, threadState, representativeType) {
...
}

เว็บฮุคใช้วิธีนี้เพื่อส่งการตอบกลับจากบ็อตเสียงสะท้อนอยู่แล้ว วิธีแรกคือการจัดเก็บข้อมูลข้อความขาเข้าในออบเจ็กต์ Cloud Datastore สำหรับการสนทนา จากนั้นจึงส่งข้อความตอบกลับ พิจารณาออบเจ็กต์ข้อความที่สร้างอย่างละเอียด โดยเฉพาะที่ประเภทตัวแทน

ติดตั้งใช้งานปลายทาง /sendMessage ด้วยตัวเอง คุณสามารถใช้เมธอด storeAndSendResponse ที่มีอยู่ที่นี่เพื่อทำงานส่วนใหญ่ได้ สิ่งสำคัญคือ โปรดอย่าลืมกำหนดตัวแทนที่ถูกต้อง

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

49aca3df6b196c50.png

ก่อนดำเนินการต่อ โปรดทำความเข้าใจวิธีการทำงานของปลายทางใหม่ ในขั้นตอนถัดไป คุณจะต้องเพิ่มปลายทางของคุณเองเพื่อออกจากการสนทนา

5. กำลังออกจากการสนทนา

หลังจากที่ช่วยเหลือผู้ใช้เมื่อมีข้อสงสัยแล้ว คุณอาจต้องการออกจากการสนทนาและให้ผู้ใช้พูดคุยกับบ็อตอีกครั้ง ใน Business Messages การเปลี่ยนแปลงนี้ส่งสัญญาณจากเหตุการณ์ REPRESENTATIVE_LEFT

ไปที่ไดเรกทอรี step-4 ทำให้แอปใช้งานได้อีกครั้ง แล้วกลับไปที่ชุดข้อความการสนทนา ตอนนี้จะมีลิงก์ปิดและออกจากการสนทนาที่ด้านล่างของชุดข้อความ ลิงก์นี้ไม่ทำงานในขณะนี้เนื่องจากยังไม่ได้ใช้ปลายทาง leaveConversation

ef4ad8107c3fff2.png

ดูไฟล์ index.js มีความคิดเห็นสิ่งที่ต้องทำที่บอกให้สร้างปลายทาง leaveConversation ใหม่

step-4/Routes/index.js

/* 
 * TODO: Create a '/leaveConversation' endpoint that does the following:
 * - Updates the thread to BOT_THREAD_STATE.
 * - Sends a REPRESENTATIVE_LEFT event.
 * - Sends a message to the thread informing the user that they are speaking to the echo bot again.
 * 
 * Hint: You can use the same methods that '/joinConversation' uses.
 */

ในการนำคำแนะนำดังกล่าวมาใช้ คุณต้องรวบรวมทุกอย่างที่ได้เรียนรู้จาก Codelab จนถึงตอนนี้ ปลายทางนี้ควรทำหน้าที่ต่อไปนี้

  • อัปเดตชุดข้อความเป็น BOT_THREAD_STATE
  • ส่งเหตุการณ์ REPRESENTATIVE_LEFT
  • ส่งข้อความในการสนทนาเพื่อแจ้งให้ผู้ใช้ทราบว่ากำลังคุยกับบ็อตเสียงสะท้อน ใช้เมธอด storeAndSendResponse โปรดทราบว่าตัวแทนได้เปลี่ยนกลับเป็น BOT แล้ว

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

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

6. ใกล้จะเสร็จแล้ว

ขอแสดงความยินดีที่ผ่าน Codelab การโอนตัวแทนแบบสดเรียบร้อยแล้ว

คุณได้สร้างตัวแทนที่สามารถจัดการการโอนตัวแทนแบบเรียลไทม์ตั้งแต่เริ่มต้นจนเสร็จ คุณยังจะได้เรียนรู้วิธีหนึ่งในการติดตามสถานะการสนทนาด้วย Cloud Datastore

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

สิ่งที่ต้องทำต่อไป

ลองดู Codelab ต่อไปนี้

อ่านเพิ่มเติม

เอกสารอ้างอิง