| Offer | Model | Payout | GEO |
|---|---|---|---|
| Loading... | |||
| ID | Name | Module | Payout | GEO | Status | Actions |
|---|---|---|---|---|---|---|
| Loading... | ||||||
| Click ID | Offer | Country | Device | OS | Sub1 | Fraud | Converted | Time |
|---|---|---|---|---|---|---|---|---|
| Loading... | ||||||||
| Loading... |
| DAYS | Total Leads | Processing | Cancelled | Accepted | Wrong Number/Did Not Order | Spam | Duplicate | Total AR % | Valid AR % | Total Amount |
|---|---|---|---|---|---|---|---|---|---|---|
| Loading... | ||||||||||
| Lead ID | Offer | Country | Status | My Payout | Date |
|---|---|---|---|---|---|
| Apply filters and run report | |||||
| ID | Amount | Wallet | Status | TX ID | Requested On | Paid On |
|---|---|---|---|---|---|---|
| Loading... | ||||||
{"Authorization": "Bearer <salesrender-plugin-token>"}
Header names are case-insensitive. Host and Content-Length are reserved.
Each mapped variable becomes available as {mapped_<var>} in the body template. Unmapped values fall back to the raw value.
Click to load these into the mappings list (overwrites the status entries):
processing → 1 cancelled → 2 approved → 3 spam → 8 duplicate → 9 wrong_number → 10
{id} Lead ID
{createdAt} Lead creation date
{offer.id} Offer ID
{offer.name} Offer name
{status} New status value
{statusGroup} Status group label
{reward.amount} Publisher payout
{reward.currency} Currency (USD)
{lead.name} Lead full name
{lead.email} Lead email
{lead.phone} Lead phone
{lead.country} Lead country code
{lead.ip} Lead IP address
{click_id} Click ID
{comment} Status comment
Webhooks send real-time HTTP requests to your server whenever a lead status changes (e.g. approved, cancelled, spam). This lets you sync lead data with your tracker, CRM, or notification system automatically.
| Field | Description |
|---|---|
| URI | Your server endpoint URL (must be a valid https:// URL) |
| Content Type | application/json (default) or application/x-www-form-urlencoded |
| Request Method | GET, POST, PUT, or PATCH — choose what your server expects |
| Body Template | JSON template with {variable} placeholders. Replaced with real values at send time. |
| Active | Toggle to enable/disable without deleting the configuration |
| Variable | Example Value | Description |
|---|---|---|
{id} | 12345 | Lead ID |
{createdAt} | 2026-04-05 14:30:00 | Lead creation timestamp |
{offer.id} | 8 | Offer ID |
{offer.name} | Insurance CPL | Offer name |
{status} | approved | New lead status value |
{statusGroup} | accepted | Status group label (accepted/cancelled/spam/processing) |
{reward.amount} | 7.00 | Your payout for this lead |
{reward.currency} | USD | Currency |
{lead.name} | John Smith | Lead full name |
{lead.email} | john@example.com | Lead email |
{lead.phone} | +14155551234 | Lead phone |
{lead.country} | US | Lead country code |
{lead.ip} | 203.0.113.1 | Lead IP address |
{click_id} | CLK7a3f9e001 | Tracking click ID |
{comment} | Payment confirmed | Status change comment (if any) |
{
"lead_id": "{id}",
"offer": "{offer.name}",
"status": "{status}",
"status_group": "{statusGroup}",
"payout": "{reward.amount}",
"currency": "{reward.currency}",
"lead": {
"name": "{lead.name}",
"email": "{lead.email}",
"phone": "{lead.phone}",
"country": "{lead.country}"
},
"click_id": "{click_id}",
"comment": "{comment}",
"created_at": "{createdAt}"
}
For GET requests, if you leave the body template empty, all variables are automatically appended as query parameters:
https://yourserver.com/webhook?id=12345&status=approved&offer.name=Insurance+CPL&reward.amount=7.00&...
Or use a body template with GET to send only specific fields as query params via your URL:
https://yourserver.com/webhook?lid={id}&s={status}&amt={reward.amount}
If your tracker or destination CRM requires an Authorization header (for example SalesRender's Plugin GraphQL API), paste a JSON object into the Custom Headers field on the Webhook form. Each key becomes one outgoing HTTP header.
{"Authorization": "Bearer your-plugin-token"}
Reserved headers (Host, Content-Length) are blocked. Content-Type is set from the dropdown above.
| Actions | ID | Offer | Lead | Request | Response | Error | Attempt | Status | Time |
|---|---|---|---|---|---|---|---|---|---|
| Loading... | |||||||||
Step-by-step guide to earning money on OkNutraLife
OkNutraLife is the platform you send your leads to directly. You get paid for every lead we review and approve. You only earn on real results — there are no payments just for sending clicks.
| Term | Meaning |
|---|---|
| CPL | Cost Per Lead — earn when user submits a form |
| CPA | Cost Per Action — earn when user purchases or deposits |
| Approval Rate (AR) | % of your leads that get approved. Most important quality metric. |
| EPC | Earnings Per Click — your revenue ÷ your total clicks |
| SubID | Custom label you add to your tracking link to identify campaigns |
| Postback | Server notification we send to your tracker when a conversion is approved |
| Pending Balance | Earnings from leads awaiting approval — not guaranteed yet |
| Approved Balance | Confirmed earnings you can withdraw |
Shows your personal performance for the selected period (1 day / 7 days / 30 days). All numbers are specific to your account — you cannot see other publishers' data.
| Card | What it means | When it changes |
|---|---|---|
| Approved Balance | Money you can withdraw now | Increases on approved conversions, decreases on payouts or reversals |
| Pending Balance | Unconfirmed earnings from leads not yet approved | Increases on new leads, converts to Approved or disappears once the lead is decided |
| Total Earned | All-time cumulative approved earnings | Only ever increases |
| Total Paid | Total received in completed payout requests | Increases when admin marks a payout as paid |
| Stat | Good range | If low |
|---|---|---|
| Clicks | Depends on volume | Tracking link broken, or offer is paused |
| Leads | 5–20% CR (leads ÷ clicks) | Landing page not converting, or GEO mismatch |
| My EPC | Varies by vertical | Both CR and approval rate are low |
| Approval Rate | Above 50% (60%+ is excellent) | Traffic quality or GEO mismatch |
Go to Browse Offers in the sidebar. You see all active offers available to your account. Offers marked ⭐ Exclusive Rate have a custom payout set specifically for you — your rate is shown prominently.
| Field | What to look for |
|---|---|
| Offer Model | CPL = user just submits a form (easiest). CPA = user must buy or deposit (higher payout, harder). |
| Payout | Your payout per approved conversion. ⭐ Exclusive Rate badge means the admin set a custom rate just for you — your rate is higher than the default. |
| Landing Price | The actual offer price in local currency (e.g. ₹1,499). Shown on the offer card for reference — it's the price charged to the end user. |
| Vertical | The niche. Your traffic must be interested in this topic or conversions will be near zero. |
| GEO | Countries where the offer accepts traffic. Sending from other countries = clicks recorded, leads rejected, you earn nothing. |
| Description | Lists traffic restrictions. Read every word before running ads. Violations can get your leads reversed and account reviewed. |
| Your traffic source | Best-fit verticals |
|---|---|
| Facebook / Instagram ads | Finance, Health & Beauty, Dating, eCommerce |
| Google Search ads | Finance, Insurance, Legal — high purchase-intent searches |
| Push notifications | Dating, Sweepstakes, Gaming, Crypto |
| Native ads (Taboola, Outbrain) | Health, Finance, News-angle offers |
| SEO / content site | Whatever your content is about — match verticals to your audience |
| Email list | Finance, Insurance, eCommerce — check offer allows email traffic |
Click Preview → on any offer card to see the offer's destination page before promoting it. Check it loads fast, the form is simple, and it renders correctly on mobile.
Browse Offers shows every offer assigned to you, plus public offers the platform has made available to your account. If an offer you were running disappears, it was paused or unshared — contact your manager.
Go to Tracking Links in the sidebar. This is your unique link that records every click to your account. Never share it with another publisher.
On the Browse Offers page, click 🔗 Get Link on any offer card. It auto-generates a link with no SubIDs and navigates you to the Tracking Links tab where you can customise it.
SubIDs are the single most important optimisation tool. Without them you cannot tell which campaigns, ad sets, or creatives are generating your approved conversions — you cannot scale what you cannot measure.
| Parameter | Use for | Example |
|---|---|---|
| sub1 | Traffic source (always fill this in) | fb, google, push_zone1, email_aug |
| sub2 | Campaign name or ID | loan_india_q3, dating_us_retarget |
| sub3 | Ad set or audience | lookalike_1pct, interest_finance, age25_35 |
| sub4 | Creative or ad variant | img_red_v2, video_testimonial, carousel |
| sub5 | Keyword or placement | personal_loan_apply, zone_2847 |
Pass your tracker's click ID in sub1. Your tracker will use this to match conversions when our postback fires back to it.
Go to Reports, run a report for your date range. The conversion table includes sub1–sub5 columns. Sort by sub2 (campaign) and compare:
A postback is a server-to-server request we send to your tracker whenever a conversion is approved. It works even if the user closed their browser days ago, and does not rely on cookies or pixels.
{sub1} in the postback URL — since sub1 is where you pass your tracker's click ID.| Macro | Replaced with | Use case |
|---|---|---|
| {sub1} | Your sub1 value (put tracker click ID here) | Most important — lets tracker match conversion to its click |
| {sub2}–{sub5} | Your other SubID values | Campaign, ad set, creative attribution in your tracker |
| {status} | approved / rejected / reversed | Record rejections and reversals, not just approvals |
| {payout} | Your payout amount (e.g. 12.00) | Record exact revenue for ROI calculation |
| {click_id} | Platform CLK… click ID | For platform-side debugging |
| {offer_id} | Numeric offer ID | Distinguish conversions when running multiple offers |
Every click through your tracking links is recorded here — one row per visitor. Use it to verify tracking is working after a test click, and to diagnose fraud flags.
| Column | What it tells you |
|---|---|
| Click ID | Unique CLKxxx ID. Provide this to support when investigating a missing conversion. |
| Country | Where the visitor was located. If you see many clicks from countries outside the offer's GEO list, fix your ad targeting. |
| Fraud | Clean = tracked normally. 🚨 Fraud = rejected — you earn nothing from this click. |
| Converted | Yes = this click led to an approved conversion (you were paid). |
A lead is created when a user submits your form. Every lead goes through fraud checks, then is submitted to the platform for review.
| Status | Meaning | Effect on your balance |
|---|---|---|
| processing | Submitted for review, awaiting decision | Moves to Pending Balance (not guaranteed) |
| approved | Lead accepted — you earned | Credited to Approved Balance ✅ |
| cancelled | Declined — wrong GEO, invalid data, below quality bar | Removed from Pending Balance ❌ |
| wrong_number | Wrong number or customer did not order — granular cancellation reason | Removed from Pending Balance ❌ |
| spam | Blocked by platform fraud rules before review | Never credited ❌ |
| duplicate | Same phone + offer submitted within the last 30 days. After 30 days the same phone on the same offer counts as a fresh lead again. | Never credited ❌ |
The columns shown in your My Leads table are controlled per offer by the platform admin. Four columns are always visible no matter what: Lead ID, Time, Offer, and Status. Everything else — Full Name, Phone, Email, Address, Country, Push, Comment, and any custom fields — is opt-in on each offer.
—. That dash is not missing data: it means "not shared for this offer".Every row in the Conversions tab is a confirmed, approved conversion — money in your approved balance. Conversions often appear hours or days after the original click, since leads are reviewed on their own schedule.
| Column | Description |
|---|---|
| Your Payout | The exact amount credited to your approved balance for this conversion |
| Status | approved = confirmed. reversed = the conversion was cancelled, your balance was debited. |
| Sub1–Sub5 | Your original campaign tracking values — tells you which campaign generated this conversion |
A reversal happens when a lead is initially approved but later cancelled — usually because the user requested a refund, committed fraud, or was a duplicate from another source. The amount is automatically deducted from your approved balance. A small reversal rate (under 5%) is normal. High reversal rates signal traffic quality issues.
Build custom date-range reports to calculate ROI, identify best campaigns, and prepare data for scaling decisions.
The donut chart shows which offers contribute the most to your total earnings. Concentrate your best traffic on your highest-contributing offers and cut time spent on low-earners.
Go to Withdrawal in the sidebar to see your balance breakdown and submit a withdrawal request.
sum of your payout on all approved conversions, minus any payouts already paid out, minus any pending or processing withdrawal requests. That last subtraction is why your Approved Balance drops the instant you submit a withdrawal — the requested amount is reserved up front so the same money can't be withdrawn twice.| Column | Meaning |
|---|---|
| Wallet | Your submitted wallet address — with a small network badge (TRC-20 / ERC-20 / BEP-20) above it when present |
| Requested On | Date and time you submitted the request (your local timezone) |
| Paid On | Date and time the admin marked it as paid — empty (—) until the status becomes paid |
| Status | Meaning |
|---|---|
| pending | Submitted, admin is reviewing. Funds reserved from your balance. |
| paid | Crypto transfer sent. Check your wallet — crypto payments are typically confirmed within minutes to 1 hour. |
| rejected | Request declined — reason provided. Funds returned to your approved balance, resubmit with corrections. |
These rules protect the platform and honest publishers. Violations result in removal from offers or account suspension.
| Metric | Healthy | Warning | Danger |
|---|---|---|---|
| Fraud Rate (% of clicks) | < 5% | 5–15% | > 15% |
| Approval Rate (% of leads) | > 50% | 30–50% | < 30% |
| Reversal Rate (% of conversions) | < 5% | 5–10% | > 10% |
The platform is built to fit your stack — not the other way around. Connect with whatever you already use; you do not need to write any glue or translator code on your side.
| Method | What it does |
|---|---|
| Real-time outbound webhook | Pushes every lead-status change to your own CRM in real time. With Variable Mappings you map our values to the exact codes and format your system expects, so you receive only supported values — no proxy or translator code needed on your side. |
| Real-time outbound postback | Same purpose as the webhook, using your own tracker's postback URL. Lead-status updates are delivered automatically in real time. |
| API lead submission | Submit leads directly to the platform over a simple API call. |
| Inbound S2S link | Send leads through a plain GET or POST S2S link from any system — no landing page required. |
Webhooks send real-time HTTP requests to your server whenever a lead status changes (e.g. approved, cancelled, spam). This lets you sync lead data with your tracker, CRM, or notification system automatically.
| Field | Description |
|---|---|
| URI | Your server endpoint URL (must be a valid https:// URL) |
| Content Type | application/json (default) or application/x-www-form-urlencoded |
| Request Method | GET, POST, PUT, or PATCH — choose what your server expects |
| Body Template | JSON template with {variable} placeholders. Replaced with real values at send time. |
| Active | Toggle to enable/disable without deleting the configuration |
| Variable | Example Value | Description |
|---|---|---|
{id} | 12345 | Lead ID |
{createdAt} | 2026-04-05 14:30:00 | Lead creation timestamp |
{offer.id} | 8 | Offer ID |
{offer.name} | Insurance CPL | Offer name |
{status} | approved | New lead status value |
{statusGroup} | accepted | Status group label (accepted/cancelled/spam/processing) |
{reward.amount} | 7.00 | Your payout for this lead |
{reward.currency} | USD | Currency |
{lead.name} | John Smith | Lead full name |
{lead.email} | john@example.com | Lead email |
{lead.phone} | +14155551234 | Lead phone |
{lead.country} | US | Lead country code |
{lead.ip} | 203.0.113.1 | Lead IP address |
{click_id} | CLK7a3f9e001 | Tracking click ID |
{comment} | Payment confirmed | Status change comment (if any) |
{
"lead_id": "{id}",
"offer": "{offer.name}",
"status": "{status}",
"status_group": "{statusGroup}",
"payout": "{reward.amount}",
"currency": "{reward.currency}",
"lead": {
"name": "{lead.name}",
"email": "{lead.email}",
"phone": "{lead.phone}",
"country": "{lead.country}"
},
"click_id": "{click_id}",
"comment": "{comment}",
"created_at": "{createdAt}"
}
For GET requests, if you leave the body template empty, all variables are automatically appended as query parameters:
https://yourserver.com/webhook?id=12345&status=approved&offer.name=Insurance+CPL&reward.amount=7.00&...
Or use a body template with GET to send only specific fields as query params via your URL:
https://yourserver.com/webhook?lid={id}&s={status}&amt={reward.amount}
If your tracker or destination CRM requires an Authorization header (for example SalesRender's Plugin GraphQL API), paste a JSON object into the Custom Headers field on the Webhook form. Each key becomes one outgoing HTTP header.
{"Authorization": "Bearer your-plugin-token"}
Reserved headers (Host, Content-Length) are blocked. Content-Type is set from the dropdown above.
The Trigger Logs page has two sub-tabs: Webhook Trigger History and Postback Trigger History. Every webhook and postback the CRM fires to your tracker is logged here — use it to confirm deliveries, debug a tracker that isn't receiving, and replay failed attempts. The columns below apply to both.
| Column | Meaning |
|---|---|
| Time | When the attempt fired |
| Lead | The lead that triggered it (click to open) |
| Status | The lead status that was sent (approved / cancelled / etc.) |
| HTTP Code | 2xx = your tracker accepted it. 0 = timeout or DNS error. 4xx = wrong URL or auth. 5xx = your server failed. |
| Attempts | Total deliveries for this lead (initial + manual retries) |
| Response | First chunk of your tracker's response body — useful for reading error messages |
0, the CRM can't reach your server — verify your tracker URL is publicly reachable and uses HTTPS with a valid certificate.Technical details for publishers who integrate via API or use third-party trackers.
This URL records a click tied to your account and redirects the user to the offer's landing page. The click_id is auto-generated and appended to the landing URL as a query parameter.
| Parameter | Required | Description |
|---|---|---|
| offer_id | Yes | Numeric offer ID (shown on offer card and tracking link generator) |
| pub_id | Yes | Your publisher ID (shown in your profile) |
| sub1–sub5 | No | Custom tracking labels. Pass your tracker's click ID in sub1 for postback matching. |
If you host your own landing page and collect form data, POST the lead directly to the platform API:
| Field | Required | Description |
|---|---|---|
| click_id | Yes | The click ID passed to your landing page via the tracking URL redirect. Capture it from the URL query string. |
| name | Recommended | Lead's full name |
| phone | Recommended | Lead's phone with country code |
| No | Lead's email address |
When a conversion is approved, the platform fires a GET request to your postback URL with these macros replaced:
| Macro | Replaced With | Example |
|---|---|---|
| {click_id} | Platform click ID | CLK1A2B3C4D5E6F |
| {sub1}–{sub5} | Your original SubID values | Your tracker's click ID, campaign name, etc. |
| {status} | Conversion status | approved, rejected, reversed |
| {payout} | Your payout amount | 12.00 |
| {offer_id} | Platform offer ID | 5 |
| {publisher_id} | Your publisher ID | 12 |
/api/lead.click_id was issued by /click (the normal landing-page flow), no api_key is needed — the click row already attributes the lead to your publisher account. If you're calling /api/lead from a server with a hand-crafted click_id (no prior /click), you must send X-Api-Key: YOUR_API_KEY (or ?api_key= / body api_key=) so the lead can be attributed correctly. Without it the endpoint returns 401. For pure server-to-server use, prefer /api/lead/in — it's purpose-built for that.Use this when you have no landing page and no click_id — e.g. you push leads straight from your own CRM, call center, or tracker. The CRM authenticates you with your personal API key and applies the same fraud, duplicate and validation rules as landing-page traffic.
/api/lead/in with api_key + offer_id + phone + name (see examples).Authenticate with your api_key as a query parameter, a body field, or the X-Api-Key HTTP header. click_id is auto-generated when omitted, so duplicate detection still works across re-fires.
| Field | Required | Description |
|---|---|---|
| api_key | Yes | Your personal publisher API key (Integrations → Inbound S2S) |
| offer_id | Yes | Numeric offer ID — must be an offer available to your account |
| phone | Yes | Lead phone number |
| name | Yes | Lead full name |
| No | Lead email address | |
| country | No | 2-letter country code |
| sub1–sub5 | No | Your custom tracking labels |
| click_id | No | Auto-generated if omitted |
| Symptom | Cause / fix |
|---|---|
| 401 Invalid api_key | Wrong key, or your account is not active — contact your manager. |
| 404 Offer not found | offer_id does not exist or is not available to your account. |
| Lead silently flagged duplicate | Same phone + offer within 30 days — expected dedup behaviour. |
| Can't see the request | Check Trigger Logs → Inbound S2S — every attempt is logged with the reject reason. |
Read-only polling endpoints to check the current status of leads you pushed. Same api_key auth as Inbound S2S. Results are strictly scoped to your own leads — IDs that belong to another publisher (or don't exist) return 404 / are silently omitted from bulk responses, so the endpoint cannot be used to probe other publishers.
Authenticate with your api_key as a query parameter, a body field, or the X-Api-Key HTTP header — identical to /api/lead/in.
Provide either lead_id or click_id (lead_id wins on tie).
publisher_payout is null until an approved conversion exists. It is sourced from conversions (snapshot at postback time), not from the lead row.
POST JSON or form-data, or GET with comma-separated lists. All filters are optional; combine them freely. The publisher scope (publisher_id = you) is always pinned.
| Field | Where | Description |
|---|---|---|
| api_key | all | Your personal publisher API key |
| lead_id | single | Internal numeric ID returned by /api/lead/in |
| click_id | single | Tracking click ID (CLK… / your own click_id if you generate it) |
| click_ids | bulk | Array or comma-separated list, up to 200 ids per request |
| lead_ids | bulk | Array or comma-separated list, up to 200 ids per request |
| status | bulk | CSV of: processing, approved, cancelled, duplicate, spam, test, wrong_number |
| updated_after | bulk | ISO-8601 timestamp; returns rows whose updated_at >= this |
| date_from / date_to | bulk | YYYY-MM-DD; filters on created_at |
| page / per_page | bulk | page default 1, per_page default 100 (max 200) |
When you want to sync every lead you own (initial backfill, cron-style reconciliation, or a publisher system that can't host a webhook) use the paginated walk endpoint. No ids required — it returns your leads page-by-page, newest first.
| Field | Description |
|---|---|
| page | 1-based page number; default 1 |
| per_page | Rows per page; default 100, max 200 |
| status | CSV of lead statuses (same enum as bulk endpoint) |
| updated_after | ISO-8601; returns rows whose updated_at >= this |
| created_after | ISO-8601 or YYYY-MM-DD; returns rows whose created_at >= this |
| offer_id | Single numeric offer id; only your own leads for that offer |
/api/lead/status and /status/bulk) is generous for honest pollers; abuse trips 429.| Code | Meaning |
|---|---|
| 401 | Missing or invalid api_key, or account is not active |
| 404 | Lead not found — either it doesn't exist or it isn't yours. Indistinguishable on purpose. |
| 422 | No selector (single), bad timestamp, more than 200 ids, or per_page over the cap |
| 429 | Rate limit exceeded — see below. Response includes Retry-After: 60. |
/api/* endpoint).updated_at you've seen and pass it as updated_after on the next call. Each poll then returns only rows that changed since.When an offer does not provide a landing page, you host your own. Your landing page collects lead data (name, phone, email) and submits it directly to the platform lead API with the tracking parameters.
Go to Tracking Links and generate a link for your offer. Use this link as the destination URL in your ads or traffic source. When a user clicks it, the CRM records the click and redirects to the offer's landing_url.
If the offer has no landing URL configured (no page is provided), ask the admin to set the offer's landing URL to your own landing page URL, for example:
The CRM replaces {click_id}, {offer_id}, and {publisher_id} with real values before redirecting.
Your landing page must extract click_id, offer_id, and publisher_id from the URL query string and include them when submitting the lead.
When the user fills in and submits your form, POST the data to the CRM lead endpoint:
To track which ad or campaign generated each lead, pass SubIDs in your tracking link and forward them through your landing page:
A minimal working landing page. Copy it, change NETWORK_DOMAIN to your CRM URL, and customise the design:
click_id in the URL. Fill in the form and submit. Check the Leads tab — the lead should appear within seconds. If not, open browser DevTools → Network tab and look for errors on the /api/lead POST request.Your account, payout, and UI preferences. Open the Settings tab from the sidebar (or click your avatar in the top-right).
| Field | Rule |
|---|---|
| Must be unique. 409 if another publisher already uses it. Email change does not log you out — your session stays active. | |
| Password | Minimum 8 characters. Existing sessions remain valid until they naturally expire. |
| Preferred Language | One of the supported codes (currently en, ru). Saved to your account and auto-applied at every login. |
The offer is likely paused or the daily cap was reached. Go to Browse Offers — if the offer isn't listed as Active, it is unavailable.
Check: (1) Are most clicks fraud-flagged? (2) Does your traffic GEO match the offer? (3) Test the link manually — is the destination page working? (4) Is the offer still active?
Normal in some cases. Most resolve within 24–48 hours. If leads stay processing over 7 days, contact the admin.
The admin set a custom payout just for your account on that offer. Your rate is higher than the default shown to other publishers.
Check: (1) Are you passing your tracker's click ID in sub1? (2) Is your postback URL saved correctly? (3) Check your tracker's incoming postback logs. (4) Is your tracker URL using HTTPS?
The reason is shown in your notification. Common: incorrect wallet address or wrong network. Funds return to your balance — fix and resubmit.