---
title: "Konektor Mailgun"
description: "Panduan integrasi Mailgun lengkap untuk menyinkronkan data pengiriman email, metrik keterlibatan, dan event email transaksional dengan Brevo melalui Tajo."
url: https://tajo.io/in/docs/connectors/marketing/mailgun/
markdown: https://tajo.io/in/docs/connectors/marketing/mailgun.md
lang: id-ID
robots: noindex
---

Ajukan akses awal

Masukkan nama depan dan alamat email kerja Anda. Kami akan mengirim tautan untuk mengonfirmasi permintaan akses Tajo.

# Konektor Mailgun

Status konektor: Direncanakan Belum dibangun. Tajo belum menjalankan konektor ini.

| Field sumber | Field tujuan | Nilai contoh |
| --- | --- | --- |
| `record.id` | `source_id` | `record_1042` |
| `record.updated_at` | `updated_at` | `2026-10-18T08:00:00Z` |
| `record.value` | `value` | `sample_value` |

Hubungkan Mailgun ke Brevo melalui Tajo untuk menyatukan data email transaksional dan marketing Anda, menyinkronkan event pengiriman serta metrik keterlibatan, dan mengonsolidasikan infrastruktur email Anda ke dalam satu tampilan pelanggan.

## Ikhtisar

| Properti | Nilai |
| --- | --- |
| **Platform** | Mailgun (dari Sinch) |
| **Kategori** | Email marketing |
| **Kompleksitas setup** | Mudah |
| **Integrasi resmi** | Tidak |
| **Data yang disinkronkan** | Event, kontak, deliverability, kampanye |
| **Metode autentikasi** | API key (HTTP Basic Auth) |

## Fitur

- **Sinkronisasi event pengiriman** - Lacak event delivered, bounced, opened, dan clicked
- **Metrik keterlibatan** - Sinkronkan open rate dan click rate ke atribut kontak Brevo
- **Pengelolaan bounce** - Otomatis menekan alamat yang bounce di Brevo
- **Penanganan keluhan** - Sinkronkan keluhan spam untuk menjaga higienitas daftar
- **Reputasi domain** - Pantau kesehatan domain pengirim dan deliverability
- **Pelacakan email transaksional** - Korelasikan pengiriman transaksional dengan data marketing

## Prasyarat

Sebelum memulai, pastikan Anda memiliki:

1. Akun Mailgun dengan domain pengirim yang terverifikasi
2. API key Mailgun dari [Mailgun Dashboard](https://app.mailgun.com/settings/api_security)
3. Akun Brevo dengan akses API
4. Akun Tajo dengan izin konektor

## Autentikasi

### Autentikasi API key

Mailgun memakai HTTP Basic Authentication dengan `api` sebagai username dan API key Anda sebagai password:

```bash
# Get your API key from https://app.mailgun.com/settings/api_security
export MAILGUN_API_KEY=key-your-api-key
export MAILGUN_DOMAIN=your-domain.com
export TAJO_API_KEY=your_tajo_api_key
export BREVO_API_KEY=your_brevo_api_key
```

```javascript
// HTTP Basic Auth format
const headers = {
  'Authorization': `Basic ${Buffer.from(
    `api:${process.env.MAILGUN_API_KEY}`
  ).toString('base64')}`
};

// Or using curl
// curl -s --user 'api:YOUR_API_KEY' ...
```

Tipe API key

Mailgun menyediakan sending key khusus domain dan API key tingkat akun. Gunakan sending key domain untuk operasi pesan dan API key akun untuk operasi pengelolaan.

## Konfigurasi

### Setup dasar

```yaml
connectors:
  mailgun:
    enabled: true
    api_key: "${MAILGUN_API_KEY}"
    domain: "${MAILGUN_DOMAIN}"
    region: "us"  # or "eu" for EU region

    sync:
      events: true
      contacts: true
      bounces: true
      complaints: true
      schedule: "*/15 * * * *"  # Every 15 minutes

    webhook:
      signing_key: "${MAILGUN_WEBHOOK_SIGNING_KEY}"

    lists:
      engaged: 30
      bounced: 31
      complained: 32
```

### Pemetaan field

```yaml
field_mapping:
  email: email
  first_name: FIRSTNAME
  last_name: LASTNAME
  open_rate: MG_OPEN_RATE
  click_rate: MG_CLICK_RATE
  last_delivered: MG_LAST_DELIVERED
  bounce_type: MG_BOUNCE_TYPE
  engagement_score: MG_ENGAGEMENT
  unsubscribed: MG_UNSUBSCRIBED
```

## Endpoint API

| Endpoint | Method | Deskripsi |
| --- | --- | --- |
| `https://api.mailgun.net/v3/{domain}/messages` | POST | Mengirim pesan email |
| `https://api.mailgun.net/v3/{domain}/events` | GET | Mengueri log event |
| `https://api.mailgun.net/v3/{domain}/bounces` | GET | Menampilkan bounce |
| `https://api.mailgun.net/v3/{domain}/complaints` | GET | Menampilkan keluhan |
| `https://api.mailgun.net/v3/{domain}/unsubscribes` | GET | Menampilkan unsubscribe |
| `https://api.mailgun.net/v3/{domain}/tags` | GET | Menampilkan tag |
| `https://api.mailgun.net/v3/{domain}/tags/{tag}/stats` | GET | Mengambil statistik tag |
| `https://api.mailgun.net/v3/lists` | GET | Menampilkan mailing list |
| `https://api.mailgun.net/v3/domains` | GET | Menampilkan domain |
| `https://api.mailgun.net/v4/address/validate` | POST | Memvalidasi alamat email |

Region EU

Untuk akun Mailgun yang berbasis di EU, gunakan `https://api.eu.mailgun.net` alih-alih `https://api.mailgun.net` untuk seluruh endpoint API.

## Contoh kode

### Inisialisasi konektor

```javascript
import { TajoClient } from '@tajo/sdk';

const tajo = new TajoClient({
  apiKey: process.env.TAJO_API_KEY,
  brevoApiKey: process.env.BREVO_API_KEY
});

await tajo.connectors.connect('mailgun', {
  apiKey: process.env.MAILGUN_API_KEY,
  domain: process.env.MAILGUN_DOMAIN,
  region: 'us'
});
```

### Mengirim pesan melalui API Mailgun

```javascript
// Send an email using Mailgun's Messages API
const formData = new URLSearchParams();
formData.append('from', `Your App <noreply@${domain}>`);
formData.append('to', 'recipient@example.com');
formData.append('subject', 'Welcome to our platform');
formData.append('html', '<h1>Welcome!</h1><p>Thanks for signing up.</p>');
formData.append('o:tag', 'welcome-email');
formData.append('o:tracking', 'yes');

const response = await fetch(
  `https://api.mailgun.net/v3/${domain}/messages`,
  {
    method: 'POST',
    headers: {
      'Authorization': `Basic ${Buffer.from(`api:${apiKey}`).toString('base64')}`
    },
    body: formData
  }
);

const result = await response.json();
// { id: '<message-id@domain.com>', message: 'Queued. Thank you.' }
```

### Sinkronisasi event email ke Brevo

```javascript
// Query Mailgun events and sync engagement data
const eventsResponse = await fetch(
  `https://api.mailgun.net/v3/${domain}/events?` +
    new URLSearchParams({
      begin: lastSyncDate,
      ascending: 'yes',
      limit: 300,
      event: 'delivered OR opened OR clicked'
    }),
  {
    headers: {
      'Authorization': `Basic ${Buffer.from(`api:${apiKey}`).toString('base64')}`
    }
  }
);

const { items, paging } = await eventsResponse.json();

for (const event of items) {
  const email = event.recipient;

  switch (event.event) {
    case 'delivered':
      await tajo.contacts.update(email, {
        attributes: { MG_LAST_DELIVERED: event.timestamp }
      });
      break;
    case 'opened':
      await tajo.events.track({
        email,
        event: 'email_opened',
        properties: { subject: event.message.headers.subject }
      });
      break;
    case 'clicked':
      await tajo.events.track({
        email,
        event: 'email_clicked',
        properties: { url: event.url }
      });
      break;
  }
}

// Follow pagination for more events
if (paging.next) {
  // Fetch next page using paging.next URL
}
```

### Menangani webhook Mailgun

```javascript
const crypto = require('crypto');

app.post('/webhooks/mailgun', async (req, res) => {
  // Verify webhook signature
  const { timestamp, token, signature } = req.body.signature;
  const encodedToken = crypto
    .createHmac('sha256', process.env.MAILGUN_WEBHOOK_SIGNING_KEY)
    .update(timestamp.concat(token))
    .digest('hex');

  if (encodedToken !== signature) {
    return res.status(401).send('Unauthorized');
  }

  const eventData = req.body['event-data'];
  const event = eventData.event;
  const email = eventData.recipient;

  await tajo.connectors.handleWebhook('mailgun', {
    topic: event,
    payload: eventData
  });

  // Handle bounce suppression
  if (event === 'failed' && eventData.severity === 'permanent') {
    await tajo.contacts.update(email, {
      attributes: { MG_BOUNCE_TYPE: 'hard_bounce' },
      emailBlacklisted: true
    });
  }

  res.status(200).send('OK');
});
```

### Sinkronisasi bounce dan keluhan

```javascript
// Sync bounced addresses for list hygiene
const bouncesResponse = await fetch(
  `https://api.mailgun.net/v3/${domain}/bounces?limit=100`,
  {
    headers: {
      'Authorization': `Basic ${Buffer.from(`api:${apiKey}`).toString('base64')}`
    }
  }
);

const { items: bounces } = await bouncesResponse.json();

for (const bounce of bounces) {
  await tajo.contacts.update(bounce.address, {
    attributes: {
      MG_BOUNCE_TYPE: bounce.error.includes('550') ? 'hard_bounce' : 'soft_bounce',
      MG_BOUNCE_DATE: bounce.created_at
    },
    emailBlacklisted: bounce.error.includes('550')
  });
}
```

## Batas rate

| Endpoint | Batas | Catatan |
| --- | --- | --- |
| Messages API | Bergantung paket | 100/jam (gratis), tanpa batas (berbayar) |
| Events API | Tidak ada batas eksplisit | Gunakan paginasi dengan maksimum 300 item |
| Validation API | Bergantung paket | Bayar per validasi |
| Webhook | Real-time | Tidak ada batas rate pada pengiriman |
| Suppressions API | Tidak ada batas eksplisit | Berlaku pembatasan rate standar |

Batas pengiriman

Mailgun menerapkan batas pengiriman berdasarkan paket dan reputasi domain Anda. Domain baru dimulai dengan batas yang lebih rendah dan meningkat seiring membaiknya reputasi pengirim Anda. Pantau statistik domain Anda di dashboard Mailgun.

## Pemecahan masalah

| Masalah | Penyebab | Solusi |
| --- | --- | --- |
| 401 Unauthorized | API key tidak valid | Periksa API key di dashboard Mailgun |
| Domain belum terverifikasi | Record DNS belum ada | Tambahkan record TXT, CNAME, dan MX yang dibutuhkan |
| Webhook tidak diterima | URL tidak dapat diakses | Pastikan URL webhook dapat dijangkau publik |
| Event hilang | Rentang waktu terlalu sempit | Perlebar parameter `begin`/`end` |
| Deliverability rendah | Reputasi domain | Periksa statistik domain dan autentikasinya |

### Mode debug

```yaml
connectors:
  mailgun:
    debug: true
    log_level: verbose
    log_webhooks: true
    log_events: true
```

## Praktik terbaik

1. **Verifikasi domain pengirim** - Selesaikan verifikasi DNS demi deliverability optimal
2. **Gunakan webhook untuk event** - Pengiriman webhook real-time lebih baik daripada polling Events API
3. **Tangani bounce secara proaktif** - Tekan hard bounce segera di Brevo
4. **Beri tag pada pesan Anda** - Gunakan tag untuk mengategorikan dan menganalisis performa email
5. **Pantau reputasi domain** - Lacak metrik deliverability di dashboard Mailgun
6. **Gunakan validasi email** - Validasi alamat sebelum menambahkannya ke daftar Brevo

## Keamanan

- **HTTP Basic Auth** - API key dikirim melalui header Authorization
- **Tanda tangan webhook** - Verifikasi tanda tangan HMAC-SHA256
- **Verifikasi domain** - Autentikasi DNS SPF, DKIM, dan DMARC
- **Whitelist IP** - Tersedia untuk paket dedicated IP
- **Enkripsi TLS** - Seluruh endpoint API mewajibkan HTTPS
- **Rotasi key** - Rotasikan API key secara berkala melalui dashboard Mailgun

## Sumber daya terkait

- [Konektor Brevo](https://tajo.io/in/docs/connectors/marketing/brevo)
- [Konektor Segment](https://tajo.io/in/docs/connectors/custom/segment)
- [Skill Sinkronisasi Pelanggan](https://tajo.io/in/docs/skills/data-sync/customer-sync)
- [Dokumentasi API Mailgun](https://documentation.mailgun.com/)
