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.
Getting an Account
Publisher accounts are created by the Komorebi Media team. To request access:
- Contact your Komorebi account manager and provide your company name, traffic sources, and expected volume.
- Once approved, you'll receive an email with a link to set your password.
- Log in to the publisher portal, where you'll find your tracking links, earnings dashboard, and API key.
Tracking Links
Use these links in your campaigns. Each click is assigned a unique click_id that ties the eventual conversion back to your account.
Link Format
https://track.komorebimedia.com/track/{advertiser}?pub={your_username}
| Parameter | Description | Required |
|---|---|---|
{advertiser} | The advertiser slug (provided by your account manager, e.g. your-advertiser) | Yes |
pub | Your publisher username — used to attribute clicks and conversions to your account | Yes |
Example
For a publisher with username your_username promoting the advertiser your-advertiser:
https://track.komorebimedia.com/track/your-advertiser?pub=your_username
When a user clicks this link, they are immediately redirected to the advertiser's offer page with a unique click_id appended:
https://advertiser.example/landing?click_id=4a7f2e1c-...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.
{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.
slug, your partner-link template (provided by your account manager — see AppsFlyer onboarding), and AppsFlyer admin access to the relevant app.
- 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.
- 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.
- 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_idintocustomer_user_idand mapsaf_siteid,af_sub1–5, andaf_c_id. - 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. - 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). - 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.
- 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.
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).
| Field | Value |
|---|---|
| Base string | click_id + ":" + event + ":" + payout (payout empty string if omitted) |
| Algorithm | HMAC-SHA256(secret, base) → lowercase hex digest |
| Parameter | append &sig=<hex digest> to the postback URL |
https://track.komorebimedia.com/postback/{advertiser}?click_id={click_id}&event={event}&payout={payout}&sig={hmac_sha256_hex}
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.
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.
- Drive traffic with your Komorebi tracking link — it appends a unique
click_idto the redirect automatically. - Capture that
click_idon the landing page (query parameter / deep link) and carry it into the app install flow. - In the AppsFlyer SDK, call
setCustomerUserId(<click_id>)before logging events — or sendcustomer_user_id=<click_id>on the server-to-server call — so AppsFlyer stores Komorebi'sclick_idagainst that user. - On each sync, Komorebi pulls the AppsFlyer in-app-events export and matches the
Customer User IDcolumn back to theclick_idto approve or flag the conversion.
| Komorebi value | AppsFlyer 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.
To configure a custom postback in Adjust:
- Log in to your Adjust dashboard and open the app.
- Go to Settings → Partner Setup and click Add Partner.
- Select Custom Partner and enter the postback URL below.
- Map the
click_idquery parameter to Adjust's click ID placeholder{click_id}, andpayoutto{revenue}. - Configure the event tokens you want to track (e.g. install, purchase) and assign them to the
eventparameter.
https://track.komorebimedia.com/postback/{advertiser}?click_id={click_id}&payout={revenue}&event={event_token}
Supported Macros
| Macro | Description | Notes |
|---|---|---|
{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 |
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.
X-API-Key: kom_live_a1b2c3d4e5f6...| Code | Meaning |
|---|---|
200 OK | Request succeeded. |
401 Unauthorized | Missing, invalid, or revoked API key. |
429 Too Many Requests | Rate 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.
curl https://track.komorebimedia.com/api/v1/stats \
-H "X-API-Key: kom_live_your_key_here"{
"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
}
]
}| Field | Type | Description |
|---|---|---|
stats.clicks | number | Total click volume across all advertisers |
stats.conversions.approved | number | Conversions confirmed via reconciliation |
stats.conversions.pending | number | Conversions awaiting reconciliation |
stats.conversions.rejected | number | Conversions rejected during reconciliation |
stats.earnings.approved | number | Total approved payout (all time, USD) |
stats.earnings.this_month_approved | number | Approved payout for the current calendar month |
by_advertiser | array | Per-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.
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"| Param | Type | Description |
|---|---|---|
limit | number | Rows per page (default 100, max 500) |
page | number | Page number, 1-based (default 1) |
advertiser | string | Filter by advertiser slug |
sub_id | string | Filter by your sub-affiliate id (af_sub1) |
status | string | Filter: approved | pending | rejected | duplicate |
from, to | date | Inclusive date range, YYYY-MM-DD, matched on conversion time in UTC |
{
"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"
}
]
}| Field | Type | Description |
|---|---|---|
click_id | string | The click this conversion attributed to (Komorebi internal id — attribution key) |
external_click_id | string | Your own click id as sent on the tracking link (for reconciliation). Null if not provided. |
status | string | approved | pending | rejected | duplicate (duplicate = a repeat postback for a click+event already counted) |
payout | number | Payout for this conversion in currency |
sub_id / af_sub1…af_sub5 | string | Your sub-affiliate / source identifiers as sent on the click |
postback_delivery_status | string | delivered | failed | null (null = no outbound postback attempted) |
postback_attempts | number | Number of outbound delivery attempts (null if none) |
rejection_reason | string | null unless the row is rejected. Operational reasons are shown (e.g. duplicate, not_activated); internal adjustments appear as "Attribution adjustment" |
timestamp | string | When the conversion was recorded (UTC) |
paging.has_more | boolean | True when further pages are available |
| Code | Meaning |
|---|---|
401 | Missing, invalid, or revoked API key. Send a valid X-API-Key: kom_live_... |
429 | Rate 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
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.
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.
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.
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.
| Komorebi param | AppsFlyer | Adjust macro |
|---|---|---|
click_id | customer_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.