Skip to main content

Tracking, Tag, and S2S

Affiliate projects support redirect tracking, browser tag conversion tracking, and server-to-server postbacks.

Partner Tracking URL

Partners receive a URL in this format:

https://ads.mcv.network/aff/{trackingCode}

When opened, MCV records an AffiliateClick and redirects to the advertiser destination URL with UTM parameters plus:

mcv_aff={trackingCode}
mcv_click_id={clickId}

Advertisers should store mcv_click_id when possible. It gives stronger attribution than tracking code alone.

Browser Tag Endpoint

Use the browser tag endpoint for simple client-side conversion reporting:

https://ads.mcv.network/affiliate/tag/{projectSlug}?tracking_code={trackingCode}&event_type=qualified_lead&external_id=lead_123

Accepted parameters:

ParameterRequiredDescription
tracking_codeRequired unless click_id is sentPartner tracking code.
click_idRequired unless tracking_code is sentClick ID from mcv_click_id.
event_typeYesqualified_lead or sale.
external_idRecommendedAdvertiser-side lead/order ID for idempotency.
order_idRequired for sale S2SAdvertiser order ID for reconciliation.
sale_amountSale onlySale amount in project currency.
currencySale onlyThree-letter currency code. Defaults to project currency.
customer_hashOptionalHashed customer identifier for fraud review without exposing PII.

The tag endpoint returns a 1x1 GIF by default. Add format=json to receive a JSON response.

Server-to-Server Postback

Use S2S when the advertiser backend can report conversions directly.

POST https://ads.mcv.network/affiliate/s2s/{projectSlug}

Payload:

{
"tracking_code": "aff_1_2_partner",
"click_id": "clk_...",
"event_type": "sale",
"order_id": "ORDER-1001",
"external_id": "checkout_1001",
"sale_amount": "100.00",
"currency": "USD",
"customer_hash": "sha256_customer_identifier",
"signature": "..."
}

S2S Signature

Build the signature payload in this exact order:

tracking_code|click_id|event_type|order_id|sale_amount|currency

Then sign it with the affiliate project postback secret:

signature = HMAC_SHA256(payload, postback_secret)

Requests with invalid signatures return 403.

Response Body

Successful postbacks return order-level reconciliation data:

{
"ok": true,
"response_code": "000000",
"message": "Conversion accepted.",
"project": "q3-partner-program",
"conversion_id": 123,
"order_id": "ORDER-1001",
"external_id": "checkout_1001",
"event_type": "sale",
"status": "pending",
"deduped": false,
"sale_amount_cents": 10000,
"commission_cents": 3500,
"currency": "USD",
"occurred_at": "2026-07-09T10:30:00+07:00"
}

Idempotency and Reconciliation

Send a stable order_id for each sale. MCV stores one conversion per project and order ID, preventing duplicate payouts for repeated postbacks.

Conversions enter pending status first. The advertiser that owns the project can approve a valid order and then pay the commission from their wallet to the partner wallet. Operations can still approve, reject, or settle conversions from the affiliate reconciliation console when support or dispute handling is needed.

When a commission is paid, MCV sends the partner a wallet credit email immediately. At the end of each day, MCV sends each advertiser a digest of affiliate conversions paid that day plus the advertiser wallet ending balance. The digest command is php artisan affiliate:send-daily-paid-digest and is scheduled daily at 23:55 Asia/Ho_Chi_Minh.