คู่มือการเชื่อมต่อ Tajo กับ Brevo
คู่มือฉบับสมบูรณ์นี้จะพาคุณเชื่อมต่อแพลตฟอร์มสะสมคะแนน Tajo เข้ากับ Brevo ทีละขั้นตอน เพื่อสร้างแคมเปญสร้างการมีส่วนร่วมกับลูกค้าแบบอัตโนมัติที่ทรงพลัง
ภาพรวม
การเชื่อมต่อ Tajo กับ Brevo ช่วยให้คุณ
- ซิงค์ข้อมูลลูกค้า ระหว่างสองแพลตฟอร์มแบบเรียลไทม์
- ทำแคมเปญสะสมคะแนนอัตโนมัติ ตามพฤติกรรมของลูกค้า
- ติดตามการมีส่วนร่วม ทั้งทางอีเมล SMS และ WhatsApp
- แบ่งกลุ่มลูกค้า ตามระดับสมาชิกและพฤติกรรมการซื้อ
- ส่งข้อความเฉพาะบุคคล เมื่อเกิดเหตุการณ์สำคัญของโปรแกรมสะสมคะแนน
สิ่งที่ต้องเตรียม
ก่อนเริ่มเชื่อมต่อ ตรวจสอบให้แน่ใจว่าคุณมีสิ่งเหล่านี้
- บัญชี Tajo ที่ตั้งค่าโปรแกรมสะสมคะแนนไว้แล้ว
- บัญชี Brevo ที่เข้าถึง API ได้
- API key ที่ใช้งานได้ ของทั้งสองแพลตฟอร์ม
- Webhook endpoint ที่ตั้งค่าไว้สำหรับการซิงค์แบบเรียลไทม์
- ใบรับรอง SSL สำหรับการรับส่งข้อมูลอย่างปลอดภัย
ขั้นตอนที่ 1: ตั้งค่าการยืนยันตัวตน
สร้าง Brevo API key
- เข้าสู่ระบบบัญชี Brevo ของคุณ
- ไปที่ Account & Plan > API Keys
- คลิก Generate a new API key
- ตั้งชื่อว่า “Tajo Integration”
- คัดลอกและเก็บคีย์ไว้อย่างปลอดภัย
# Store in environment variablesexport BREVO_API_KEY="xkeysib-your-api-key-here"export TAJO_WEBHOOK_SECRET="your-webhook-secret"ตั้งค่าการเชื่อมต่อใน Tajo
ในแดชบอร์ด Tajo ของคุณ
- ไปที่ Settings > Integrations
- เลือก Brevo จากรายการ
- กรอก Brevo API key ของคุณ
- ตั้งค่าการซิงค์ข้อมูล
{ "brevo_api_key": "xkeysib-your-api-key-here", "sync_frequency": "real-time", "sync_contacts": true, "sync_orders": true, "sync_events": true, "loyalty_attributes": [ "LOYALTY_POINTS", "LOYALTY_TIER", "TOTAL_SPENT", "LAST_PURCHASE" ]}ขั้นตอนที่ 2: การซิงค์ข้อมูลลูกค้า
ตั้งค่าการซิงค์ผู้ติดต่อ
ตั้งค่าการซิงค์ผู้ติดต่อโดยอัตโนมัติ เพื่อให้ข้อมูลลูกค้าเป็นปัจจุบันอยู่เสมอ
// Sync customer on registrationasync function syncCustomerToBrevo(customer) { const brevoData = { email: customer.email, attributes: { FIRSTNAME: customer.firstName, LASTNAME: customer.lastName, PHONE: customer.phone, LOYALTY_ID: customer.loyaltyId, LOYALTY_POINTS: customer.points, LOYALTY_TIER: customer.tier, SIGNUP_DATE: customer.createdAt, TOTAL_SPENT: customer.totalSpent, PREFERRED_CATEGORIES: customer.categories, BIRTHDAY: customer.birthday }, listIds: [getListForTier(customer.tier)] };
const response = await fetch('https://api.brevo.com/v3/contacts', { method: 'POST', headers: { 'Content-Type': 'application/json', 'api-key': process.env.BREVO_API_KEY }, body: JSON.stringify(brevoData) });
return response.json();}การซิงค์อีเวนต์การซื้อ
ซิงค์การซื้อโดยอัตโนมัติเพื่อกระตุ้นแคมเปญสะสมคะแนน
// Sync order completionasync function syncOrderToBrevo(order, customer) { // Create order in Brevo const orderData = { id: order.id, email: customer.email, products: order.items.map(item => ({ id: item.productId, name: item.name, quantity: item.quantity, price: item.price, category: item.category })), revenue: order.total, date: order.createdAt };
await fetch('https://api.brevo.com/v3/ecommerce/orders', { method: 'POST', headers: { 'Content-Type': 'application/json', 'api-key': process.env.BREVO_API_KEY }, body: JSON.stringify(orderData) });
// Create loyalty event const eventData = { email: customer.email, event: 'Purchase Completed', properties: { order_id: order.id, amount: order.total, points_earned: order.pointsEarned, loyalty_tier: customer.tier, tier_upgraded: order.tierUpgraded, products: order.items.map(i => i.name).join(', ') } };
await fetch('https://api.brevo.com/v3/events', { method: 'POST', headers: { 'Content-Type': 'application/json', 'api-key': process.env.BREVO_API_KEY }, body: JSON.stringify(eventData) });}ขั้นตอนที่ 3: ตั้งค่าแคมเปญอัตโนมัติ
แคมเปญต้อนรับลูกค้าใหม่
สร้างลำดับอีเมลต้อนรับอัตโนมัติสำหรับสมาชิกโปรแกรมสะสมคะแนนรายใหม่
{ "campaign_name": "Tajo Loyalty Welcome Series", "trigger": { "event": "Contact Created", "conditions": { "LOYALTY_ID": "exists", "SIGNUP_DATE": "today" } }, "emails": [ { "delay": "immediate", "template_id": 101, "subject": "Welcome to Tajo Loyalty! Here's your {{params.welcome_bonus}} points bonus", "params": { "welcome_bonus": "500", "loyalty_tier": "Bronze", "next_tier_points": "1000" } }, { "delay": "3 days", "template_id": 102, "subject": "Don't forget to use your {{params.welcome_bonus}} bonus points!" }, { "delay": "1 week", "template_id": 103, "subject": "Here's how to earn points faster with Tajo" } ]}แคมเปญเลื่อนระดับสมาชิก
แสดงความยินดีกับการเลื่อนระดับสมาชิกโดยอัตโนมัติ
// Webhook handler for tier upgradesapp.post('/webhook/tier-upgrade', (req, res) => { const { customer, previousTier, newTier } = req.body;
const campaignData = { email: customer.email, template_id: getTierUpgradeTemplate(newTier), params: { customer_name: customer.firstName, new_tier: newTier, previous_tier: previousTier, new_benefits: getTierBenefits(newTier), points_balance: customer.points } };
// Send congratulations email sendBrevoEmail(campaignData);
// Add to tier-specific list addToBrevoList(customer.email, getTierListId(newTier));
res.status(200).json({ success: true });});ขั้นตอนที่ 4: ติดตามอีเวนต์ของโปรแกรมสะสมคะแนน
อีเวนต์สำคัญที่ควรติดตาม
ตั้งค่าการติดตามอีเวนต์สำคัญของโปรแกรมสะสมคะแนนเหล่านี้
const loyaltyEvents = { // Account Events 'Account Created': { properties: ['signup_source', 'referral_code', 'welcome_bonus'] }, 'Profile Updated': { properties: ['updated_fields', 'marketing_consent'] },
// Purchase Events 'Purchase Completed': { properties: ['order_total', 'points_earned', 'loyalty_tier', 'products'] }, 'Product Returned': { properties: ['return_reason', 'points_deducted', 'refund_amount'] },
// Loyalty Events 'Points Earned': { properties: ['points_amount', 'earning_reason', 'total_balance'] }, 'Points Redeemed': { properties: ['points_used', 'reward_type', 'remaining_balance'] }, 'Tier Upgraded': { properties: ['previous_tier', 'new_tier', 'upgrade_benefits'] },
// Engagement Events 'Email Opened': { properties: ['campaign_type', 'subject_line', 'device'] }, 'Reward Browsed': { properties: ['reward_category', 'reward_name', 'points_required'] }, 'Referral Made': { properties: ['referral_method', 'referee_email', 'referral_bonus'] }};การนำการติดตามอีเวนต์ไปใช้งาน
class TajoBrevoEventTracker { constructor(apiKey) { this.apiKey = apiKey; this.baseUrl = 'https://api.brevo.com/v3'; }
async trackEvent(customerEmail, eventName, properties = {}) { const eventData = { email: customerEmail, event: eventName, properties: { timestamp: new Date().toISOString(), source: 'tajo_platform', ...properties } };
try { const response = await fetch(`${this.baseUrl}/events`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'api-key': this.apiKey }, body: JSON.stringify(eventData) });
if (!response.ok) { throw new Error(`Event tracking failed: ${response.statusText}`); }
return await response.json(); } catch (error) { console.error('Brevo event tracking error:', error); throw error; } }
// Convenience methods for common events async trackPurchase(customer, order) { return this.trackEvent(customer.email, 'Purchase Completed', { order_id: order.id, order_total: order.total, currency: order.currency, points_earned: order.pointsEarned, loyalty_tier: customer.tier, items_count: order.items.length, first_purchase: customer.orderCount === 1 }); }
async trackTierUpgrade(customer, previousTier) { return this.trackEvent(customer.email, 'Tier Upgraded', { previous_tier: previousTier, new_tier: customer.tier, points_balance: customer.points, benefits_unlocked: getTierBenefits(customer.tier), upgrade_date: new Date().toISOString() }); }}ขั้นตอนที่ 5: กลยุทธ์การแบ่งกลุ่มลูกค้า
กลุ่มลูกค้า
สร้างเซกเมนต์แบบเจาะจงใน Brevo สำหรับแคมเปญเฉพาะบุคคล
const loyaltySegments = [ // Tier-based segments { name: "Bronze Members", conditions: { LOYALTY_TIER: "Bronze" }, campaigns: ["tier_upgrade_promotion", "engagement_boost"] }, { name: "Silver Members", conditions: { LOYALTY_TIER: "Silver" }, campaigns: ["premium_offers", "early_access"] }, { name: "Gold Members", conditions: { LOYALTY_TIER: "Gold" }, campaigns: ["vip_treatment", "exclusive_rewards"] }, { name: "Platinum Members", conditions: { LOYALTY_TIER: "Platinum" }, campaigns: ["luxury_experiences", "personal_offers"] },
// Behavior-based segments { name: "High Spenders", conditions: { TOTAL_SPENT: ">1000" }, campaigns: ["luxury_catalog", "big_spender_rewards"] }, { name: "Frequent Shoppers", conditions: { PURCHASE_FREQUENCY: "weekly" }, campaigns: ["convenience_offers", "bulk_discounts"] }, { name: "At-Risk Customers", conditions: { LAST_PURCHASE: ">90 days" }, campaigns: ["win_back", "special_incentives"] }, { name: "Birthday Month", conditions: { BIRTHDAY: "this_month" }, campaigns: ["birthday_specials", "bonus_points"] }];ขั้นตอนที่ 6: การทดสอบและการเฝ้าติดตาม
รายการตรวจสอบการทดสอบการเชื่อมต่อ
- การซิงค์ผู้ติดต่อ: ลูกค้าใหม่ปรากฏใน Brevo
- การซิงค์คำสั่งซื้อ: การซื้อกระตุ้นอีเวนต์ได้อย่างถูกต้อง
- การติดตามอีเวนต์: อีเวนต์ของโปรแกรมสะสมคะแนนถูกบันทึกครบทุกรายการ
- ทริกเกอร์แคมเปญ: อีเมลอัตโนมัติถูกส่งอย่างถูกต้อง
- การแบ่งกลุ่ม: ลูกค้าย้ายระหว่างลิสต์ได้อย่างถูกต้อง
- การส่ง Webhook: การซิงค์แบบเรียลไทม์ทำงานได้อย่างเสถียร
การตั้งค่าการเฝ้าติดตาม
// Health check endpointapp.get('/integration/health', async (req, res) => { const checks = { brevo_api: await checkBrevoConnection(), webhook_delivery: await checkWebhookDelivery(), event_tracking: await checkEventTracking(), campaign_triggers: await checkCampaignTriggers() };
const allHealthy = Object.values(checks).every(check => check.status === 'ok');
res.status(allHealthy ? 200 : 503).json({ status: allHealthy ? 'healthy' : 'degraded', checks, timestamp: new Date().toISOString() });});การแก้ปัญหาที่พบบ่อย
ขีดจำกัดอัตราการเรียกใช้ API
Brevo มีขีดจำกัดอัตราการเรียกใช้ ให้เพิ่มตรรกะสำหรับลองส่งคำขอใหม่
async function makeBrevoRequest(url, options, retries = 3) { try { const response = await fetch(url, options);
if (response.status === 429) { const retryAfter = response.headers.get('Retry-After') || 60; await new Promise(resolve => setTimeout(resolve, retryAfter * 1000)); return makeBrevoRequest(url, options, retries - 1); }
return response; } catch (error) { if (retries > 0) { await new Promise(resolve => setTimeout(resolve, 5000)); return makeBrevoRequest(url, options, retries - 1); } throw error; }}ปัญหาการซิงค์ข้อมูล
เฝ้าติดตามและแก้ไขความขัดแย้งของการซิงค์
// Sync conflict resolutionasync function resolveSyncConflict(tajoData, brevoData) { // Use most recent timestamp as source of truth const tajoUpdated = new Date(tajoData.updatedAt); const brevoUpdated = new Date(brevoData.modifiedAt);
if (tajoUpdated > brevoUpdated) { // Update Brevo with Tajo data await updateBrevoContact(brevoData.id, tajoData); } else { // Update Tajo with Brevo data await updateTajoCustomer(tajoData.id, brevoData); }}ขั้นตอนถัดไป
- ตั้งค่า Webhook สำหรับการซิงค์แบบเรียลไทม์
- สร้างเทมเพลตอีเมล สำหรับแคมเปญสะสมคะแนน
- ตั้งค่าระบบอัตโนมัติของ SMS สำหรับการแจ้งเตือนเร่งด่วน
- ตั้งค่าการวิเคราะห์ข้อมูล เพื่อติดตามประสิทธิภาพ
การสนับสนุนและแหล่งข้อมูล
- ฝ่ายสนับสนุนด้านการเชื่อมต่อ: [email protected]
- เอกสาร Brevo API: api.brevo.com
- คลังโค้ดตัวอย่าง: github.com/tajo/brevo-integration
- ติดต่อฝ่ายสนับสนุน: /th/contact