B2B Worker
B2B Worker Docs

CRM Integration App

Schema-driven paket bağlama: CRM kullanıcısı JSON/workflow key ezberlemeden paketi seçer, alan hazırlığını görür ve tetikler.

Golden path: partner-logistics-v1 → event LOGISTICS_STARTED.

4 adım

1. Bağlantı          API key + webhook secret
2. Paket bağla       GET /packages/<key>/bind-kit/
3. Alan hazırlığı    project (domain → payload) + readiness
4. Tetikle / dinle   validate → POST /events/ → outbound webhook

1) Bağlantı

  • base_url — örn. https://app.b2bworker.com
  • API key (b2b_…) — Auth & API Keys
  • Webhook secret — CRM inbound URL’inizi Webhooks veya POST /api/v1/packages/sync-webhook/ ile kaydedin

2) Paket bağla (tek istek)

GET /api/v1/packages/partner-logistics-v1/bind-kit/
Authorization: Bearer b2b_…

Yanıt özeti:

AlanNe işe yarar
event_mapCRM event → { workflow, event } (Medicalepus convention)
default_workflowİlk inbound workflow key
inbound[].fieldspath / level / label / example
inbound[].sample_payloadÖrnek gövde
inbound[].aliasesContract path → CRM domain adayları
setup_stepsWizard metinleri

event_map örneği:

{
  "LOGISTICS_STARTED": {
    "workflow": "partner-logistics-v1",
    "event": "LOGISTICS_STARTED"
  }
}

Contract-only (bind-kit’siz): testcrm ↔ app — GET …/contract/.

3) Alan hazırlığı

CRM domain JSON’unu contract path’lerine projekte edin:

POST /api/v1/packages/partner-logistics-v1/bind-kit/project/
Authorization: Bearer b2b_…
Content-Type: application/json

{
  "crm_event": "LOGISTICS_STARTED",
  "domain": {
    "journey_id": "11111111-1111-1111-1111-111111111111",
    "patient": { "name": "Jane Doe", "phone": "+905551112233" },
    "flight": { "flight_number": "TK123" }
  }
}

Yanıt:

  • payload — b2bworker’a gidecek gövde (patient.name → patient.display_name, phone → whatsapp)
  • readiness — ok | warn | blocked
  • missing_required / missing_warnings
  • event / workflow — fire için hazır

UI kuralı: blocked → CTA kapalı; warn → sarı uyarıyla devam edilebilir.

İsteğe bağlı field_map ile alias override:

{ "patient.display_name": "guest.full_name" }

4) Tetikle + dinle

Dry-run (Event/Execution oluşturulmaz):

POST /api/v1/events/validate/
Authorization: Bearer b2b_…
Content-Type: application/json

{
  "event": "LOGISTICS_STARTED",
  "workflow": "partner-logistics-v1",
  "payload": {
    "journey_id": "11111111-1111-1111-1111-111111111111",
    "patient": { "display_name": "Jane Doe" }
  }
}

ok: false ise errors / missing_required / workflow_match ile düzeltin.

Fire:

POST /api/v1/events/
Authorization: Bearer b2b_…
Idempotency-Key: crm-journey-1111-leg-1
Content-Type: application/json

{
  "event": "LOGISTICS_STARTED",
  "workflow": "partner-logistics-v1",
  "payload": { ... }
}

Outbound: PARTNER_APPROVED, PARTNER_REJECTED, EXECUTION_SUCCESS, EXECUTION_FAILED — journey/trip status’una yazın. İmza: Webhooks.

Panel referansı

Uygulama içinde deneme: /integrations/crm — paket seç → domain yapıştır → project → validate → fire.

CRM veri modeli (öneri)

Paketi CRM’de kopyalamayın. Tutulacaklar:

  • AutomationConnection — provider, credentials, webhook
  • PackageBinding — package_key, event_map, field_map, contract_snapshot
  • AutomationRun — journey/leg, execution_id, status

Domain (Patient, Journey, Leg) sabit kalır; projection binding üzerinden gider.

Yaygın hatalar

BelirtiNeden
validate ok ama fire’da execution yokWorkflow active değil veya trigger ≠ event
patient.display_name eksikDomain’de yalnızca patient.name yoksa alias da boş — isim alanını doldurun
201 ama WhatsApp yokExecution / Meta ayrı adım — testcrm ↔ app