Skip to main content

Hightouch (as a reverse-ETL source)

Sync audiences and traits from your warehouse into Hober with Hightouch's HTTP Request destination. Each synced row becomes a subscriber create-or- update against Hober's documented upsert API — no custom connector required, and because the endpoint is an upsert, Hightouch retries and re-syncs are naturally idempotent.

Setup

  1. In Hober, copy your publishable SDK key from Settings → API keys.
  2. In Hightouch, create an HTTP Request destination and configure the sync:
    • URL: https://api.hober.io/api/v1/subscribers/upsert
    • Method: POST
    • Headers: X-SDK-Key: <your SDK key> and Content-Type: application/json
    • Rate limit: start at ≤ 10 requests/second.
  3. Template the request body from your model's columns (one request per row):
{
"external_id": "{{ row.user_id }}",
"email": "{{ row.email }}",
"attributes": {
"plan": "{{ row.plan }}",
"ltv_band": "{{ row.ltv_band }}"
}
}

Mapping

Warehouse columnHober fieldNotes
Your primary user keyexternal_idRequired. The same identifier your SDKs and server events use — this is what makes warehouse traits, product events, and message engagement land on one profile.
EmailemailOptional; becomes the subscriber's email identifier
Anything elseattributes.*Schemaless; usable in segments and {{ subscriber.* }} personalization immediately

A 200 returns the stored subscriber; 401 means a missing/invalid SDK key; 422 names the failing field (external_id is the only required one).

Syncing warehouse-computed events

To push model-derived events (not traits) — churn-risk transitions, LTV milestones — target the Events API instead: POST https://api.hober.io/v1/events with your hober_srv_ server key as a Bearer token, batching up to 1,000 events per request. Set an idempotency_key per row so re-syncs never double-fire journey triggers.

Reverse-ETL syncs attributes, not permission. Upserting a subscriber does not grant marketing consent — sends still pass Hober's consent and suppression checks. If your warehouse holds an express opt-in you want recorded, include the consent assertion field documented in the subscribers API; never sync around a suppression.