Dokumentasyon sa Postback
Mga Pahibalo sa Ganti sa Publisher sa Tinuod nga Oras
Gamita ang postback sa publisher kon gusto nimo nga pahibaw-an sa CPAlead ang imong server sa tinuod nga oras human sa usa ka nakompletong tanyag. Kasagaran kini gamiton aron i-credito ang mga puntos o kwarta, ablihan ang sulod, i-update ang imong kaugalingong pagreport, o i-sink ang mga konbersiyon ngadto sa usa ka eksternal nga plataporma. Idugang ang imong endpoint ilalom sa "Postback" -> "Configuration", ug ang CPAlead mopadala niini og hangyo nga HTTP GET matag higayon nga maitala ang usa ka kwalipikadong konbersiyon.
What This Postback Is For
Use a publisher postback when you want CPAlead to notify your server each time a user completes an offer. Most publishers use it to reward users, unlock content, keep an internal conversion ledger, or sync their own analytics and reporting.
The safest starting pattern is to pass your own reference in {subid}, store {lead_id} for idempotency, and reward based on {payout}. Expand from there only if your workflow actually needs more fields.
Common Uses
Credit points, cash, or in-app rewards to your users after a completed offer.
Unlock premium content, gated files, or paid features inside your own product.
Write each conversion into your own ledger so finance or support can reconcile payouts later.
Forward conversion data into your own tracker, CRM, analytics stack, or BI pipeline.
Quick Start
Pass your own user ID, wallet ID, or click reference in {subid}.
Save a postback URL that includes {lead_id} so you can ignore duplicates safely.
Reward from {payout} first. For event-based offers, {event_name} and {event_payout} can help you reconcile the completed event.
Test the URL, confirm a fast HTTP 2xx response, then review Postback Logs.
Recommended starter macros: {subid}, {lead_id}, {campaign_id}, {campaign_name}, {payout}, {password}.
Pag-setup sa Tracking URL
Ipasa ang imong kaugalingong user ID, wallet ID, transaction ID, o click reference ngadto sa among tracking URL aron ang parehas nga bili mobalik kanimo sa ulahi sa postback..
Alang sa mga agos sa mobile app, mahimo usab nimo ipasa ang IDFA (Apple) o GAID (Google) kauban sa imong mga subid:
Pag-setup sa Postback URL
Sulod sa Configuration sa Postback, i-save ang URL nga modawat sa imong mga pahibalo sa konbersiyon. Sugdi sa pinakagamay nga mga macro nga tinuod nimo kinahanglan, unya idugang ang dugang nga mga kapatagan kung gigamit kini sa imong sistema.:
Kung gusto nimo ang tanang kasamtangang gisuportahang kanonikal nga kapatagan, ang imong postback URL mahimong motan-aw sama niini:
Makapadala ang CPAlead og mga postback sa publisher ngadto sa parehong mga endpoint nga HTTP ug HTTPS.
Start with {subid}, {lead_id}, {campaign_id}, {campaign_name}, and {payout}. For event-based offers, add {event_key}, {event_name}, and {event_payout} only if your system needs event details. In the current publisher postback flow, {virtual_currency} is typically 0.
Mga Parameter sa Macro
Kini ang panguna nga mga macro sa CPAlead nga mahimo nimong ibutang sa imong URL. Ilisan kini sa buhing mga bili sa konbersiyon kon ipadala na ang imong postback:
| Parameter sa Macro | Deskripsiyon |
|---|---|
{campaign_id} |
CPAlead campaign or offer ID for the conversion. |
{campaign_name} |
CPAlead campaign or offer name. |
{subid} |
Your primary user ID or click/reference ID passed on the tracking URL. |
{subid2} |
Optional secondary tracking value passed on the tracking URL. |
{subid3} |
Optional tertiary tracking value passed on the tracking URL. |
{idfa} |
iOS advertising ID if you passed it on the tracking URL. |
{gaid} |
Android advertising ID if you passed it on the tracking URL. |
{payout} |
CPAlead payout amount for the conversion. |
{ip_address} |
Visitor IP captured on the converting click. |
{gateway_id} |
Locker or offer-wall tool ID when a CPAlead tool generated the conversion. |
{lead_id} |
Unique CPAlead lead/conversion ID. Best macro for deduping retries. |
{country_iso} |
Two-letter country code such as US. |
{event_key} |
Safe event key such as event_1 for event-based offers. Blank for non-event conversions. |
{event_name} |
Publisher-safe event name such as Event 1 or a manually reviewed event label. Blank for non-event conversions. |
{event_payout} |
Publisher payout amount for the completed event. For event-based offers this matches {payout}. Blank for non-event conversions. |
{password} |
Your saved postback password, if you include {password} in the URL. |
{virtual_currency} |
Virtual-currency amount from the event. In the standard publisher flow this is typically 0. |
Helpful Compatibility Aliases
{offer_id} Alias of {campaign_id}.
{offer_name} Alias of {campaign_name}.
{amount} Alias of {payout}.
{transaction_id} Alias of {lead_id}.
{ip} Alias of {ip_address}.
{country_code} Alias of {country_iso}.
{event_label} Alias of {event_name}.
{event_amount} Alias of {event_payout}.
Pag-setup sa Whitelisting URL
Kung ang imong endpoint naglimitar sa inbound nga trapiko, i-whitelist ang CPAlead relay IP nga gipakita sa ubos aron dawaton sa imong server ang paghatod sa postback.
Pananglitan nga Script
Kini nga sampol nagpakita og mas luwas nga sinugdanan para sa usa ka custom nga integrasyon: beripikaha ang password, gamita ang lead_id alang sa idempotency, tipigi ang hilaw nga payload, ug rewardahi lang ang tiggamit usa lang ka higayon.
<?php
declare(strict_types=1);
/*
* CPAlead publisher postback example.
*
* Recommended CPAlead URL:
* https://example.com/postback/cpalead.php?subid={subid}&lead_id={lead_id}&campaign_id={campaign_id}&campaign_name={campaign_name}&payout={payout}&password={password}
*
* Notes:
* - {subid} should usually be your internal user ID or click/reference ID.
* - {lead_id} should be stored uniquely so retries do not double-credit a user.
* - {payout} is the most reliable reward input in the current publisher flow.
* - {virtual_currency} is currently sent as 0 in the standard publisher postback flow.
*/
const DB_HOST = '127.0.0.1';
const DB_PORT = '3306';
const DB_NAME = 'your_database';
const DB_USER = 'your_user';
const DB_PASS = 'your_password';
const POSTBACK_PASSWORD = 'replace_with_your_secret';
$subid = trim((string) ($_GET['subid'] ?? ''));
$leadId = (int) ($_GET['lead_id'] ?? 0);
$campaignId = (int) ($_GET['campaign_id'] ?? 0);
$campaignName = trim((string) ($_GET['campaign_name'] ?? ''));
$payout = (float) ($_GET['payout'] ?? 0);
$countryIso = strtoupper(substr((string) ($_GET['country_iso'] ?? ''), 0, 2));
$ipAddress = trim((string) ($_GET['ip_address'] ?? ''));
$password = (string) ($_GET['password'] ?? '');
if (POSTBACK_PASSWORD !== '' && !hash_equals(POSTBACK_PASSWORD, $password)) {
http_response_code(403);
exit('Invalid postback password.');
}
if ($subid === '' || $leadId <= 0) {
http_response_code(400);
exit('Missing subid or lead_id.');
}
$dsn = sprintf('mysql:host=%s;port=%s;dbname=%s;charset=utf8mb4', DB_HOST, DB_PORT, DB_NAME);
$pdo = new PDO($dsn, DB_USER, DB_PASS, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
$pdo->beginTransaction();
try {
/*
* Create a table like:
* CREATE TABLE cpalead_postbacks (
* id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
* lead_id BIGINT UNSIGNED NOT NULL UNIQUE,
* user_id VARCHAR(100) NOT NULL,
* campaign_id BIGINT UNSIGNED NOT NULL,
* campaign_name VARCHAR(255) NOT NULL,
* payout DECIMAL(10,4) NOT NULL DEFAULT 0,
* country_iso CHAR(2) NULL,
* ip_address VARCHAR(45) NULL,
* raw_query TEXT NULL,
* created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
* );
*/
$insert = $pdo->prepare(
'INSERT INTO cpalead_postbacks
(lead_id, user_id, campaign_id, campaign_name, payout, country_iso, ip_address, raw_query, created_at)
VALUES
(:lead_id, :user_id, :campaign_id, :campaign_name, :payout, :country_iso, :ip_address, :raw_query, NOW())'
);
$insert->execute([
':lead_id' => $leadId,
':user_id' => $subid,
':campaign_id' => $campaignId,
':campaign_name' => $campaignName,
':payout' => $payout,
':country_iso' => $countryIso ?: null,
':ip_address' => $ipAddress ?: null,
':raw_query' => json_encode($_GET, JSON_UNESCAPED_SLASHES),
]);
} catch (PDOException $e) {
// MySQL duplicate-key error: the lead was already processed.
if (($e->errorInfo[1] ?? null) === 1062) {
$pdo->rollBack();
http_response_code(200);
exit('Duplicate lead ignored.');
}
$pdo->rollBack();
throw $e;
}
/*
* Example reward logic:
* - If you run a cash-back system, you may choose to credit $payout directly.
* - If you run a points system, convert $payout to your own point value here.
*/
$rewardAmount = $payout;
$updateUser = $pdo->prepare('UPDATE users SET balance = balance + :amount WHERE id = :user_id');
$updateUser->execute([
':amount' => $rewardAmount,
':user_id' => $subid,
]);
if ($updateUser->rowCount() !== 1) {
$pdo->rollBack();
http_response_code(404);
exit('User not found.');
}
$pdo->commit();
http_response_code(200);
echo sprintf(
'OK lead_id=%d user=%s campaign_id=%d payout=%.4f',
$leadId,
$subid,
$campaignId,
$payout
);