Konektor SendGrid
Hubungkan akun SendGrid Anda ke Brevo melalui Tajo untuk migrasi infrastruktur email, sinkronisasi kontak, transfer data kampanye, dan analitik keterlibatan terpadu di kedua platform.
Ikhtisar
| Properti | Nilai |
|---|---|
| Platform | SendGrid (Twilio) |
| Kategori | Marketing |
| Kompleksitas setup | Mudah |
| Integrasi resmi | Ya |
| Data yang disinkronkan | Kontak, kampanye, email transaksional, event |
| Base URL API | https://api.sendgrid.com/v3 |
Fitur
- Migrasi kontak - Migrasikan kontak SendGrid Marketing ke Brevo beserta field kustomnya
- Sinkronisasi email transaksional - Lacak event email transaksional untuk pelaporan terpadu
- Data kampanye - Sinkronkan data performa kampanye Single Send dan Automation
- Webhook event - Teruskan event email (delivered, opened, clicked, bounced) ke Brevo
- Sinkronisasi suppression - Migrasikan daftar bounce, block, dan unsubscribe demi kepatuhan
- Migrasi template - Ekspor Dynamic Transactional Template untuk dipakai di Brevo
- Verifikasi pengirim - Sinkronkan identitas pengirim terverifikasi dan autentikasi domain
- Sinkronisasi statistik - Impor statistik keterlibatan historis ke atribut Brevo
Prasyarat
Sebelum memulai, pastikan Anda memiliki:
- Akun SendGrid (Free, Essentials, Pro, atau Premier)
- API key SendGrid dengan izin yang dibutuhkan
- Akun Brevo dengan akses API
- Akun Tajo
Autentikasi
Autentikasi API key
SendGrid memakai autentikasi bearer token.
curl https://api.sendgrid.com/v3/marketing/contacts \ -H "Authorization: Bearer SG.YOUR_API_KEY" \ -H "Content-Type: application/json"Buat API key di SendGrid Settings > API Keys dengan tingkat izin tertentu:
- Full Access - Akses API sepenuhnya
- Restricted Access - Kontrol izin secara granular
- Billing Access - Operasi penagihan saja
Izin yang dibutuhkan
Marketing: Full Access - Contacts (read) - Single Sends (read) - Automations (read)Mail Send: Full Access - Mail Send (read)Stats: Read AccessSuppressions: Read AccessTracking: Read AccessKeamanan API key
API key SendGrid hanya ditampilkan sekali saat dibuat. Simpan dengan aman. Jika hilang, Anda harus membuat key baru.
Konfigurasi
Setup dasar
connectors: sendgrid: enabled: true api_key: "${SENDGRID_API_KEY}"
# Data sync options sync: contacts: true campaigns: true transactional: true suppressions: true statistics: true
# List mapping to Brevo list_mapping: "All Contacts": 60 "Newsletter": 61 "Transactional": 62Pemetaan field
Petakan field kontak SendGrid ke atribut kontak Brevo:
Pemetaan default
| Parameter | Type | Description |
|---|---|---|
email required | string | Alamat email kontak (identifier unik) |
first_name optional | string | Dipetakan ke atribut FIRSTNAME |
last_name optional | string | Dipetakan ke atribut LASTNAME |
phone_number optional | string | Dipetakan ke atribut SMS |
city optional | string | Kota kontak |
country optional | string | Negara kontak |
custom_fields optional | object | Pasangan key-value field kustom |
list_ids optional | array | Keanggotaan daftar SendGrid |
Pemetaan field kustom
field_mapping: # Standard fields email: email first_name: FIRSTNAME last_name: LASTNAME phone_number: SMS
# Location fields city: CITY state_province_region: STATE country: COUNTRY postal_code: POSTAL_CODE
# Engagement metrics avg_open_rate: AVG_OPEN_RATE avg_click_rate: AVG_CLICK_RATE
# Custom fields custom_fields.company: COMPANY_NAME custom_fields.plan: PLAN_TYPEEndpoint API
Marketing Contacts
| Method | Endpoint | Deskripsi |
|---|---|---|
PUT | /v3/marketing/contacts | Menambahkan atau memperbarui kontak |
POST | /v3/marketing/contacts/search | Mencari kontak |
GET | /v3/marketing/contacts/count | Mengambil jumlah kontak |
POST | /v3/marketing/contacts/exports | Mengekspor kontak |
DELETE | /v3/marketing/contacts | Menghapus kontak |
GET | /v3/marketing/lists | Menampilkan seluruh daftar kontak |
Email transaksional (Mail Send)
| Method | Endpoint | Deskripsi |
|---|---|---|
POST | /v3/mail/send | Mengirim sebuah email |
GET | /v3/templates | Menampilkan Dynamic Template |
GET | /v3/templates/{id} | Mengambil detail template |
Kampanye (Single Send)
| Method | Endpoint | Deskripsi |
|---|---|---|
GET | /v3/marketing/singlesends | Menampilkan Single Send |
GET | /v3/marketing/singlesends/{id} | Mengambil detail Single Send |
GET | /v3/marketing/automations | Menampilkan Automation |
Statistik
| Method | Endpoint | Deskripsi |
|---|---|---|
GET | /v3/stats | Mengambil statistik email global |
GET | /v3/categories/stats | Mengambil statistik kategori |
GET | /v3/marketing/stats/singlesends | Mengambil statistik Single Send |
Suppression
| Method | Endpoint | Deskripsi |
|---|---|---|
GET | /v3/suppression/bounces | Menampilkan email yang bounce |
GET | /v3/suppression/blocks | Menampilkan email yang diblokir |
GET | /v3/suppression/spam_reports | Menampilkan laporan spam |
GET | /v3/suppression/unsubscribes | Menampilkan unsubscribe global |
Event
Event email (melalui Event Webhook)
| Event | Pemicu | Kasus penggunaan |
|---|---|---|
processed | Email diterima SendGrid | Konfirmasi pengiriman |
delivered | Email sampai ke penerima | Pelacakan pengiriman |
open | Email dibuka | Skoring keterlibatan |
click | Tautan diklik | Pelacakan minat |
bounce | Email bounce | Higienitas daftar |
dropped | Email ditekan | Peninjauan kepatuhan |
deferred | Pengiriman ditunda | Pemantauan retry |
spam_report | Ditandai sebagai spam | Pengelolaan reputasi |
unsubscribe | Berhenti berlangganan lewat tautan | Sinkronisasi preferensi |
Contoh kode
Inisialisasi konektor
import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY, brevoApiKey: process.env.BREVO_API_KEY});
// Connect SendGridawait tajo.connectors.connect('sendgrid', { apiKey: process.env.SENDGRID_API_KEY});Migrasi kontak ke Brevo
// Full contact migration from SendGrid to Brevoawait tajo.connectors.sync('sendgrid', { type: 'full', resources: ['contacts', 'suppressions'], options: { includeCustomFields: true, migrateListMemberships: true, migrateSuppressions: true }});
// Check migration statusconst status = await tajo.connectors.status('sendgrid');console.log(status);// {// connected: true,// lastSync: '2024-01-15T10:30:00Z',// contactsMigrated: 45000,// suppressionsSynced: 3200,// listsMapped: 8// }Meneruskan event email
// Handle SendGrid Event Webhookapp.post('/webhooks/sendgrid', async (req, res) => { const signature = req.get('X-Twilio-Email-Event-Webhook-Signature');
// Verify webhook signature (ECDSA) if (!verifySendGridSignature(req.body, signature)) { return res.status(401).send('Unauthorized'); }
// Process batch of events for (const event of req.body) { await tajo.connectors.handleWebhook('sendgrid', { type: event.event, email: event.email, timestamp: event.timestamp, payload: event }); }
res.status(200).send('OK');});Batas rate
Batas rate API SendGrid:
| Endpoint | Batas | Detail |
|---|---|---|
Mail Send (/v3/mail/send) | Bergantung paket | Free: 100/hari, Essentials: sesuai paket |
| PUT Marketing Contacts | 3 permintaan/detik | Batch hingga 30.000 kontak |
| Search Marketing Contacts | 50 permintaan/detik | Per API key |
| API umum | 1.000 permintaan/detik | Per API key |
| Event Webhook | Pengiriman batch | Hingga 1.000 event per POST |
Batas Mail Send
Batas Mail Send bergantung pada paket SendGrid Anda. Akun gratis dibatasi 100 email/hari. Periksa detail paket Anda untuk batas pengiriman yang persis.
Pemecahan masalah
Masalah umum
| Masalah | Penyebab | Solusi |
|---|---|---|
| 401 Unauthorized | API key tidak valid | Periksa API key di SendGrid Settings |
| 403 Forbidden | Izin API key tidak mencukupi | Buat key baru dengan scope yang dibutuhkan |
| Ekspor kontak tertunda | Pemrosesan dataset besar | Polling endpoint status ekspor sampai selesai |
| Sinkronisasi suppression tidak lengkap | Perlu paginasi | Terapkan paginasi dengan parameter offset |
| Event webhook tidak diterima | URL belum terverifikasi | Selesaikan verifikasi URL webhook di SendGrid |
Mode debug
Aktifkan logging verbose:
connectors: sendgrid: debug: true log_level: verbose log_webhooks: trueMenguji koneksi
tajo connectors test sendgrid# ✓ API connection successful# ✓ Contacts readable# ✓ Lists accessible# ✓ Statistics readable# ✓ Suppressions accessiblePraktik terbaik
- Migrasikan suppression lebih dulu - Pastikan bounce, block, dan unsubscribe sudah ada di Brevo sebelum mengirim
- Gunakan unggahan kontak batch - Kirim PUT hingga 30.000 kontak per permintaan agar efisien
- Verifikasi Event Webhook - Aktifkan webhook bertanda tangan dengan verifikasi ECDSA
- Petakan field kustom - Buat atribut Brevo yang setara sebelum migrasi kontak
- Sinkronkan data keterlibatan - Impor statistik historis untuk segmentasi di Brevo
- Tangani ekspor asinkron - Ekspor kontak bersifat asinkron, lakukan polling sampai selesai
Keamanan
- Autentikasi API key - Bearer token dengan tingkat izin granular
- Penandatanganan Event Webhook - Verifikasi tanda tangan ECDSA untuk payload webhook
- Enkripsi TLS - Seluruh komunikasi API dienkripsi melalui HTTPS
- IP Access Management - Batasi akses Dashboard dan API berdasarkan IP
- Autentikasi dua faktor - 2FA tersedia untuk akses akun