Offerwall
HTML (iframe version)
API
Accessing the API API Parameters API Response
Postbacks
Reward Apps
Addons
Content Locker Link Locker

Reward Apps Postback

Configure app-specific postback URLs to receive conversion notifications.

Overview

App-level postbacks allow you to set a unique postback URL for each of your apps or websites. When a user completes an offer, we'll send a server-to-server notification to your specified URL with conversion details.

Configuration

To set up app postback:

  1. Go to your Publisher Dashboard
  2. Select your app/website
  3. Edit app settings
  4. Enter your postback URL in the "Postback URL" field
  5. Save changes

Postback URL Format

Your postback URL should accept GET requests with the following parameters as macros:

https://yourdomain.com/postback?user_id={user_id}&payout={payout}&status={status}&txn_id={transaction_id}

Available Macros

Macro Description Example Value
{user_id} Your user ID that was passed to the offerwall USER123
{payout} Reward amount in USD 0.50
{status} Conversion status (1, 0) approved : 1 reversed : 0
{transaction_id} Unique transaction identifier TXN_abc123def456

Example Postback URLs

Basic Example

https://yourdomain.com/postback?user_id={user_id}&payout={payout}&status={status}&txn_id={transaction_id}

Response Requirements

Your server should respond with:

Security

IP Whitelist
For added security, you can whitelist our server IPs: 1.2.3.4, 5.6.7.8

Testing Your Postback

You can test your postback URL directly from your app's integration page using the "Test Postback" button. This sends a test conversion with sample data.

Note: A postback is a server-to-server request, so it must be received by a backend endpoint. If you're building with React, Vue, or another frontend-only framework, you'll need a small backend service (Express, Next.js API route, or a serverless function) to receive and process the postback.

Example Server Implementations

PHP

        
<?php
// postback.php

$user_id = $_GET['user_id'] ?? null;
$transaction_id = $_GET['txn_id'] ?? null;
$payout = $_GET['payout'] ?? 0;
$status = $_GET['status'] ?? null;

if ($user_id && $transaction_id) {

    // status: 1 = approved, 0 = reversed
    if ($status === '1') {

        // Credit user account
        creditUserBalance($user_id, $payout);

        // Log transaction
        logTransaction($user_id, $transaction_id, $payout, $status);

        http_response_code(200);
        echo "OK";
    } else {
        http_response_code(200);
        echo "Ignored";
    }

} else {
    http_response_code(400);
    echo "Missing parameters";
}
?>
        
        

Node.js (Express)

        
app.get('/postback', (req, res) => {
    const { user_id, txn_id, payout, status } = req.query;

    if (user_id && txn_id) {
        // status: 1 = approved, 0 = reversed
        if (status === '1') {
            // Credit user account
            creditUserBalance(user_id, payout);

            // Log transaction
            logTransaction(user_id, txn_id, payout, status);

            return res.status(200).send('OK');
        }
        return res.status(200).send('Ignored');
    }

    return res.status(400).send('Missing parameters');
});
        
        

Next.js (API Route)

        
// pages/api/postback.js

export default function handler(req, res) {
    const { user_id, txn_id, payout, status } = req.query;

    if (!user_id || !txn_id) {
        return res.status(400).send('Missing parameters');
    }

    // status: 1 = approved, 0 = reversed
    if (status === '1') {
        // Credit user account
        creditUserBalance(user_id, payout);

        // Log transaction
        logTransaction(user_id, txn_id, payout, status);

        return res.status(200).send('OK');
    }

    return res.status(200).send('Ignored');
}
        
        

Python (Flask)

        
from flask import Flask, request

app = Flask(__name__)

@app.route('/postback', methods=['GET'])
def postback():
    user_id = request.args.get('user_id')
    transaction_id = request.args.get('txn_id')
    payout = request.args.get('payout', 0)
    status = request.args.get('status')

    if user_id and transaction_id:
        # status: 1 = approved, 0 = reversed
        if status == '1':
            # Credit user account
            credit_user_balance(user_id, payout)

            # Log transaction
            log_transaction(user_id, transaction_id, payout, status)

            return 'OK', 200
        return 'Ignored', 200

    return 'Missing parameters', 400