Publisher Integration Guide

Everything you need to start sending traffic and tracking conversions on the Komorebi Affiliate Network.

What is Komorebi Network?

Komorebi Media operates a cost-per-sale (CPS) affiliate network connecting publishers with financial product advertisers across Vietnam and Southeast Asia. When an end user completes a qualifying action — such as opening a bank account or applying for a loan — through your traffic, you earn a commission.

The platform tracks every click with a unique click_id, records conversions via a server-to-server postback, and provides real-time reporting in your publisher portal.

How it works: User clicks your tracking link → lands on advertiser's offer page → completes a conversion → advertiser's MMP fires a postback to Komorebi → you see the conversion in your dashboard.

Getting an Account

Publisher accounts are created by the Komorebi Media team. To request access:

  1. Contact your Komorebi account manager and provide your company name, traffic sources, and expected volume.
  2. Once approved, you'll receive an email with a link to set your password.
  3. Log in to the publisher portal, where you'll find your tracking links, earnings dashboard, and API key.

Postback Setup

Conversions are tracked via a server-to-server (S2S) postback fired by the advertiser's mobile measurement partner (MMP) — typically AppsFlyer or Adjust — when a qualifying event occurs.

Important: The {click_id} macro must be passed through from the tracking link click to the postback. Your account manager will confirm which advertiser slug to use in the postback URL.

AppsFlyer Onboarding Walkthrough

Komorebi integrates with AppsFlyer as an Agency partner. Follow these steps in your AppsFlyer dashboard to grant Komorebi the access it needs and start sending attributed conversions. This mirrors AppsFlyer's exact permission and event-selection flow.

Before you start: have your Komorebi advertiser slug, your partner-link template (provided by your account manager — see AppsFlyer onboarding), and AppsFlyer admin access to the relevant app.
  1. Add Komorebi as an Agency partner. In AppsFlyer, go to Configuration → Partner Marketplace (or Active Integrations → Add Partner), search for your agency/partner entry, and enable it for the app. If Komorebi is set up as a custom partner, use Configuration → Integrated Partners → Add a dedicated partner and enter the Komorebi partner ID supplied to you.
  2. Set the attribution / click-through lookback window to match the value configured on the Komorebi advertiser (default 90 days). A mismatch causes valid postbacks to be rejected. See AppsFlyer Integration.
  3. Configure the tracking link. Paste Komorebi's partner-link template into the partner's Attribution Link / Click-through URL. The template injects Komorebi's click_id into customer_user_id and maps af_siteid, af_sub1–5, and af_c_id.
  4. Grant event postbacks. Open the partner's Integration → In-app events tab. Toggle "Send in-app events to this partner" on, then select "Events attributed to this partner only" (recommended) and map each in-app event (e.g. af_purchase, deposit_Trade_succeeded) you want Komorebi to receive. Map those names to the matching Komorebi event under AppsFlyer on the advertiser.
  5. Configure the postback URL. For real-time postbacks, set the partner's Postback URL to Komorebi's endpoint: https://track.komorebimedia.com/postback/<slug>?click_id={click_id}&event={event_name}. For pull-based reconciliation, grant Komorebi Raw Data / Pull API access and an API token (entered in the advertiser's MMP section).
  6. Grant raw-data access (for reconciliation). Under Configuration → Permissions, enable raw-data report access so Komorebi's MMP sync can pull the in-app-events export and reconcile each event against the originating click.
  7. Verify. Use the postback test or your account manager's test tool to fire a sample conversion and confirm it appears as attributed in Komorebi.
The single most important step: Komorebi's click_id must be carried into AppsFlyer as customer_user_id — it is the reconciliation match key. If it is empty, conversions cannot be attributed to your traffic.

HMAC Postback Signing

Komorebi supports optional per-advertiser HMAC-SHA256 signing on inbound postbacks. When a postback secret is configured for an advertiser, every postback must include a valid sig parameter or it is rejected (HTTP 403). Leave the secret blank to accept unsigned postbacks (backward compatible).

Signature formula
FieldValue
Base stringclick_id + ":" + event + ":" + payout (payout empty string if omitted)
AlgorithmHMAC-SHA256(secret, base) → lowercase hex digest
Parameterappend &sig=<hex digest> to the postback URL
Signed postback URL
https://track.komorebimedia.com/postback/{advertiser}?click_id={click_id}&event={event}&payout={payout}&sig={hmac_sha256_hex}
Example (pseudocode): sig = hex(hmac_sha256("mysecret", "abc-123:sale:15.00")). Admins can verify the exact signed URL using the Postback Test Tool on the advertiser edit page, which signs automatically when a secret is set.

AppsFlyer Integration

AppsFlyer conversions are reconciled by Komorebi's MMP sync: Komorebi pulls AppsFlyer's raw in-app-events export and matches each event back to the originating click. The match key is AppsFlyer's Customer User ID — so Komorebi's auto-generated click_id must be passed into AppsFlyer as the customer_user_id.

Key requirement: Komorebi's tracking link generates a unique click_id on every click — you do not create it yourself. Set that value as AppsFlyer's customer_user_id (the SDK setCustomerUserId() call, or the customer_user_id field on a server-to-server install/event). Komorebi's sync reads the Customer User ID column of the AppsFlyer export and matches it back to the click — if it is empty, the conversion cannot be attributed to your traffic.
  1. Drive traffic with your Komorebi tracking link — it appends a unique click_id to the redirect automatically.
  2. Capture that click_id on the landing page (query parameter / deep link) and carry it into the app install flow.
  3. In the AppsFlyer SDK, call setCustomerUserId(<click_id>) before logging events — or send customer_user_id=<click_id> on the server-to-server call — so AppsFlyer stores Komorebi's click_id against that user.
  4. On each sync, Komorebi pulls the AppsFlyer in-app-events export and matches the Customer User ID column back to the click_id to approve or flag the conversion.
Komorebi → AppsFlyer field mapping
Komorebi valueAppsFlyer field (export column)How to set it
click_id — auto-generated by the tracking link customer_user_id — the “Customer User ID” export column AppsFlyer SDK setCustomerUserId() or the S2S customer_user_id field

Adjust Integration

Adjust is push-based: unlike AppsFlyer, there is no CSV export and no pull sync. Adjust fires a server-to-server (S2S) postback to Komorebi in real time the moment a conversion is attributed, and the click_id is carried back via Adjust's {click_id} macro. Conversions are recorded the instant the postback arrives — no reconciliation pull is required.

No export needed: Set MMP Type to Adjust on the advertiser and configure the postback URL below — you do not need an App ID or API token, and the Sync Dashboard / pull export (used for AppsFlyer) does not apply.

To configure a custom postback in Adjust:

  1. Log in to your Adjust dashboard and open the app.
  2. Go to Settings → Partner Setup and click Add Partner.
  3. Select Custom Partner and enter the postback URL below.
  4. Map the click_id query parameter to Adjust's click ID placeholder {click_id}, and payout to {revenue}.
  5. Configure the event tokens you want to track (e.g. install, purchase) and assign them to the event parameter.
Adjust postback URL
https://track.komorebimedia.com/postback/{advertiser}?click_id={click_id}&payout={revenue}&event={event_token}

Supported Macros

MacroDescriptionNotes
{click_id} Unique identifier for the click Required — maps conversion back to the original click
{payout} Revenue amount for this conversion Optional — overrides the advertiser default payout
{event} Event name (e.g. sale, lead, install) Optional — defaults to sale if omitted
{loan_amount} Disbursed / approved loan amount (lending offers) Optional — required when the payout is a percentage of the loan
{transaction_id} Your own transaction or order id Optional — alternative match / dedup key when click_id is unavailable
{revenue} Advertiser revenue for this conversion Optional — reporting only; never shown to publishers
{advertiser} Advertiser slug (in URL path) Set in the postback URL path, not a query macro
Deduplication: Komorebi deduplicates postbacks by click_id + event pair. A second postback with the same combination returns HTTP 409 and is not recorded — this is expected behaviour, not an error.

REST API

Publishers can query their own performance data programmatically using the Komorebi REST API.

Authentication

All API requests must include your API key in the X-API-Key header. Your key is available in the publisher portal under the "API Access" section.

Header
X-API-Key: kom_live_a1b2c3d4e5f6...
CodeMeaning
200 OKRequest succeeded.
401 UnauthorizedMissing, invalid, or revoked API key.
429 Too Many RequestsRate limit exceeded — max 100 requests per minute.

GET /api/v1/stats

Returns your current performance statistics: click volume, conversions by status, earnings by approval state, and a per-advertiser breakdown.

Request
curl https://track.komorebimedia.com/api/v1/stats \
  -H "X-API-Key: kom_live_your_key_here"
Response (200 OK)
{
  "publisher": "your-username",
  "status":    "active",
  "stats": {
    "clicks": 142,
    "conversions": {
      "total":    38,
      "approved": 31,
      "pending":  5,
      "rejected": 2
    },
    "earnings": {
      "approved":            465.00,
      "pending":             75.00,
      "this_month_approved": 120.00
    }
  },
  "by_advertiser": [
    {
      "advertiser":      "Your Advertiser",
      "advertiser_slug": "your-advertiser",
      "clicks":          98,
      "conversions":     26,
      "approved_payout": 390.00,
      "pending_payout":  60.00
    }
  ]
}
FieldTypeDescription
stats.clicksnumberTotal click volume across all advertisers
stats.conversions.approvednumberConversions confirmed via reconciliation
stats.conversions.pendingnumberConversions awaiting reconciliation
stats.conversions.rejectednumberConversions rejected during reconciliation
stats.earnings.approvednumberTotal approved payout (all time, USD)
stats.earnings.this_month_approvednumberApproved payout for the current calendar month
by_advertiserarrayPer-advertiser breakdown with individual click and payout totals

GET /api/v1/conversions

Returns conversion-level detail — one row per conversion — for programmatic reconciliation and optimization. Results are scoped to your account only, ordered newest-first, and paginated.

Request
curl "https://track.komorebimedia.com/api/v1/conversions?limit=100&page=1&from=2026-07-01&to=2026-07-31" \
  -H "X-API-Key: kom_live_your_key_here"
Query parameters (all optional)
ParamTypeDescription
limitnumberRows per page (default 100, max 500)
pagenumberPage number, 1-based (default 1)
advertiserstringFilter by advertiser slug
sub_idstringFilter by your sub-affiliate id (af_sub1)
statusstringFilter: approved | pending | rejected | duplicate
from, todateInclusive date range, YYYY-MM-DD, matched on conversion time in UTC
Response (200 OK)
{
  "publisher": "your_username",
  "paging": { "page": 1, "limit": 100, "total": 240, "total_pages": 3, "has_more": true },
  "conversions": [
    {
      "click_id": "…", "advertiser_slug": "tambadana", "event": "install",
      "status": "approved", "payout": 11.00, "currency": "USD",
      "sub_id": "yourSubId", "af_sub1": "yourSubId", "af_sub2": null,
      "rejection_reason": null, "timestamp": "2026-07-15 10:22:04"
    }
  ]
}
FieldTypeDescription
click_idstringThe click this conversion attributed to (Komorebi internal id — attribution key)
external_click_idstringYour own click id as sent on the tracking link (for reconciliation). Null if not provided.
statusstringapproved | pending | rejected | duplicate (duplicate = a repeat postback for a click+event already counted)
payoutnumberPayout for this conversion in currency
sub_id / af_sub1…af_sub5stringYour sub-affiliate / source identifiers as sent on the click
postback_delivery_statusstringdelivered | failed | null (null = no outbound postback attempted)
postback_attemptsnumberNumber of outbound delivery attempts (null if none)
rejection_reasonstringnull unless the row is rejected. Operational reasons are shown (e.g. duplicate, not_activated); internal adjustments appear as "Attribution adjustment"
timestampstringWhen the conversion was recorded (UTC)
paging.has_morebooleanTrue when further pages are available
Errors & rate limit
CodeMeaning
401Missing, invalid, or revoked API key. Send a valid X-API-Key: kom_live_...
429Rate limit exceeded. The API is limited to 100 requests/minute per IP. When paginating large result sets, space out requests or reduce page frequency.

FAQ

How are conversions validated?

Every postback is validated against three criteria: (1) the click_id must exist in our system — if it does not match a known click, the postback is rejected; (2) the click_id + event pair must be unique — duplicate postbacks are deduplicated and return HTTP 409; (3) the postback must be authorized — either it comes from a current AppsFlyer/Adjust source IP range, or it carries a valid per-advertiser HMAC signature (&sig=). The signature path lets advertisers and test tools send from any IP.

Conversions recorded via postback initially enter a pending status. They move to approved or rejected only after the monthly reconciliation process.

What is the reconciliation process?

At the end of each reporting period (typically monthly), the advertiser provides a CSV file listing each click_id with a status of approved or rejected and optionally a final payout amount. Our team uploads this file, and your dashboard is updated immediately.

Approved conversions count toward your confirmed earnings. Rejected conversions (e.g. duplicate applications, fraud flags, cancelled orders) are marked accordingly and excluded from your payout calculation.

You will see the status of each conversion in the Recent Conversions table in your publisher portal.

How often are S2S postbacks fired back to my system?

If you have configured a publisher-side postback URL in your account settings, Komorebi fires it in real time — within seconds of recording the conversion. If the initial request fails (non-2xx response or timeout), the system will automatically retry up to 3 times, with a 5-minute delay between each attempt.

Delivery status for each conversion is available via the API: the postback_delivery_status and postback_attempts fields on GET /api/v1/conversions. For the full delivery log (HTTP status codes and error messages) or to configure your postback URL, contact your account manager.

What happens if my API key is lost or compromised?

API keys can be regenerated at any time by the Komorebi admin team. Regenerating a key immediately invalidates the old one — any requests using the old key will return HTTP 401. Contact your account manager to request a key regeneration. Your username/password portal access is not affected.

Which MMP macros map to the Komorebi postback parameters?
Komorebi paramAppsFlyerAdjust macro
click_idcustomer_user_id (matched via sync — not a postback macro){click_id}
payout{revenue}{revenue}
event{event_name}{event_token}

AppsFlyer click matching is reconciled by Komorebi's sync via the Customer User ID field (set Komorebi's click_id as customer_user_id) — see AppsFlyer Integration. The payout/event macros apply to postback-based MMPs such as Adjust.