Destination'lar
Audience'larını Meta Ads, Google Ads ve custom webhook'a tek tuşla push et. Credential'lar KMS envelope ile şifreli.
3 kanal
Meta CAPI · Google Ads · Webhook
Üç tip destination. Hepsi audience-binding + dispatch log + dedup ile aynı altyapıyı paylaşır.
Meta CAPI
Meta CAPICustom Audience'a hashed email + phone push. SHA-256 lowercase trim + E.164 spec — Meta'nın resmi şemasıyla aynı.
Google Ads Customer Match
Google AdsOAuth 2.0 flow + platform-wide developer_token. Customer Match API üzerinden hashed user list yönetimi.
Webhook (custom)
Custom webhookKendi sistemine push et. HMAC-SHA256 signature header + JSON body + retry/dedup desteği.
Meta CAPI setup
Adım adım kurulum
Facebook Business Manager'dan Pixel ID + Access Token + Test Event Code — 4 adımda canlıya alın.
- 01
Pixel + Business Manager hazırla
Facebook Business Manager → Events Manager → Pixel ID'yi kopyala. Custom Audience oluşturma yetkisinin sende olduğundan emin ol.
- 02
System User Access Token üret
Business Settings → Users → System Users → 'Generate Token' → ads_management + business_management scope. Token'ı bir kerelik kopyala.
- 03
Gurulu'da credential ekle
/app/destinations → 'New Meta CAPI' → Pixel ID + Access Token + (opsiyonel) Test Event Code. Gurulu credentials KMS envelope ile saklar; UI'da last-4 char mask gösterilir.
- 04
Audience bind + dispatch
Destination + audience eşle. İlk dispatch'te Custom Audience yoksa otomatik açılır; sonra hourly delta push devreye girer.
// Hash format: lowercase, trim, SHA-256
// E.164 phone: '+901234567890' → sha256 hex
import { createHash } from 'node:crypto';
function hashPii(value: string): string {
return createHash('sha256').update(value.trim().toLowerCase()).digest('hex');
}
// Audience üye listesi push
await fetch('https://graph.facebook.com/v18.0/{pixel_id}/users', {
method: 'POST',
headers: { Authorization: 'Bearer ' + ACCESS_TOKEN },
body: JSON.stringify({
payload: {
schema: ['EMAIL_SHA256', 'PHONE_SHA256'],
data: members.map((m) => [hashPii(m.email), hashPii(m.phone)]),
},
}),
});Google Ads OAuth
OAuth flow + developer token
Google Cloud Console'da OAuth Client + developer_token başvurusu — Customer Match API erişimi açılır.
- 01
Google Cloud Console — OAuth Client
APIs & Services → Credentials → 'Create OAuth Client ID' → Application type: Web. Redirect URI'yi tam olarak Gurulu callback'i yap.
- 02
Developer Token başvurusu
Google Ads → Tools → API Center → Developer Token başvur. Standart Access'e geçiş 2-3 gün sürebilir.
- 03
Gurulu'dan OAuth'u başlat
/app/destinations → 'New Google Ads' → 'Connect with Google' → izin ekranı → callback'te refresh_token KMS envelope ile saklanır.
# OAuth callback URI (Google Cloud Console'a kayıtla):
https://api.gurulu.io/v1/destinations/oauth/google/callback
# Developer token başvurusu — Google Ads API erişimi için
# https://developers.google.com/google-ads/api/docs/first-call/dev-tokenWebhook integration
HMAC-SHA256 verify + retry
Kendi sunucunda doğrula, dedup'la, ack döndür. Gurulu retry'ı yönetir.
Node.js / Bun / TypeScript
// Node.js — HMAC-SHA256 verify
import { createHmac, timingSafeEqual } from 'node:crypto';
export function verifyGuruluSignature(
rawBody: string,
header: string | undefined,
secret: string,
): boolean {
if (!header?.startsWith('sha256=')) return false;
const expected = createHmac('sha256', secret).update(rawBody).digest('hex');
const received = header.slice(7);
return (
expected.length === received.length &&
timingSafeEqual(Buffer.from(expected), Buffer.from(received))
);
}Python 3.10+
# Python — HMAC-SHA256 verify
import hmac, hashlib
def verify_gurulu_signature(raw_body: bytes, header: str | None, secret: str) -> bool:
if not header or not header.startswith("sha256="):
return False
expected = hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
received = header[7:]
return hmac.compare_digest(expected, received)Payload örneği
{
"audience_id": "aud_01H8XYZ",
"tenant_id": "tnt_01H8ABC",
"members": [
{ "person_id": "per_01H8DEF", "email_sha256": "…", "joined_at": "2026-05-29T06:00:00Z" }
],
"delta": "joined",
"dispatched_at": "2026-05-29T07:00:00Z"
}KMS encryption
Credentials transparency
Meta access token, Google refresh token, webhook secret — hepsi KMS envelope ile şifreli saklanır.
Nasıl saklanıyor?
Her credential AES-GCM data encryption key (DEK) ile şifrelenir; DEK ana KMS key ile sarılır. Sadece worker decrypt eder, UI ham veriye dokunmaz.
- docsModules.destinations.kms.how.bullets.envelope
- Sadece worker server-side decrypt — UI ve API plain text görmez
- UI'da credential listesi last-4 char mask gösterir (ör. '••••••a8f3')
{
"kid": "kms_2026_q2_primary",
"encrypted_dek": "AQEDAH4...",
"iv": "5b9e8c7a4f3d2e1b6c0a9d8e",
"tag": "a1b2c3d4...",
"ciphertext": "f7e8d9..."
}Dispatch + dedup
24h dedup + exp backoff retry
Aynı (audience, member, payload) 24 saat içinde tekrar dispatch edilmez. Hata durumunda exp backoff retry.
Payload-hash dedup
Her dispatch için payload_hash hesaplanır + 24h dedup penceresi tutulur. Aynı hash → skip (idempotent).
Exp backoff retry
30s → 2m → 10m → 1h → 6h. 5 deneme sonrası DLQ. dispatches tablosunda her deneme + error code görünür.
İlgili dokümanlar
Devamında oku
Önce audience oluştur, sonra destination'a bağla. API reference ile derinleş.