> AffiliateOS Help Center. Index of every article for AI tools: https://www.affiliateos.ai/help/llms.txt

# A user says they weren't paid

Troubleshooting · For publishers · Updated 30 October 2026
Web version: https://www.affiliateos.ai/help/troubleshooting/user-not-paid

Look the user up by their ID in **Flight Recorder**. Each conversion shows whether we recorded the step, what it paid you and the player, and whether your server got the postback, so you know what happened before you credit anything.

**Players:** contact the app where you found the offer. That app credits your reward, so only its team can check your balance.

## What you see

| What you see | What it means | What to do |
|---|---|---|
| No row for the step the user describes | The step was never reported to us | First check below |
| **Transaction** `completed`, **Delivery** `sent` | We sent it and your server accepted it | Check your crediting code |
| **Delivery** `failed` or `skipped_no_url` | Your server didn't get it | Fix it, then ask us to resend |
| **Your payout** $0.00 with a **User reward** | A later step of an install-paid game | Credit the user reward as sent |
| **Transaction** `rejected` | Our traffic checks rejected this user | Don't credit it |
| **Transaction** `reversed` | The step was taken back | Deduct it |

To look someone up, open **Reporting**, then **Flight Recorder**, type their ID into **Sub ID** and widen the date range. Choose a row for the full trace.

Hosted Offerwall users are different: **Flight Recorder** files their conversions under the wall's own click token, not your `uid`. Open **Conversions** instead, set **From** and **To**, choose **Apply** and find the `uid` in the **Sub ID** column (or **Download CSV** and search it). Then paste the row's **Action ID** into **Flight Recorder** for the delivery details.

## Checks, most likely first

### The step was never reported to us

**How to confirm:** No row for that offer and step under the user's **Sub ID**.

**Fix:** There was nothing to send. Ask the user which step and when, then work through [An install wasn't tracked](https://www.affiliateos.ai/help/troubleshooting/install-not-tracked). Steps that take days, such as reaching a level, post back when the player gets there, not when they install.

### Your server didn't get the postback

**How to confirm:** **Delivery** reads `failed`, with an **HTTP status** or an **Error**, or `skipped_no_url`.

**Fix:** Fix the cause ([Postback not firing or never arrives](https://www.affiliateos.ai/help/troubleshooting/postback-never-arrives)), then send us the action IDs. Our team can send failed credits from the Offer API and links again, under the same `action_id`, so your dedupe holds.

### We sent it, and your crediting missed it

**How to confirm:** **Transaction** reads `completed` and **Delivery** `sent`, with a 2xx **HTTP status**.

**Fix:** Search your logs for the `action_id`. The usual causes: crediting `payout` instead of `user_payout`, matching the user by something other than `sub_id` or deduping on `action_id` alone.

### The step pays you $0

**How to confirm:** The row reads **Your payout** $0.00 and shows a **User reward**, on a step after the install.

**Fix:** That's how [install-paid offers](https://www.affiliateos.ai/glossary#install-paid-offer) work. The postback still came, with the player's reward in `user_payout`. Credit that amount as sent.

> **Install-paid games pay you once, at install.** Later steps reward the player, not you. Through the Offer API or a link they post back with `payout=0` and `user_payout` set to the player's reward; on the Hosted Offerwall, `revenue=0` and `payout` equals the player's reward.

### The user was rejected

**How to confirm:** **Transaction** reads `rejected`, and the user is listed under **Reporting**, then **Traffic Quality**, with a reason.

**Fix:** A rejected conversion pays $0 and sends no postback, so don't credit it from your own records. If we clear the user later, we may pay it: the same `action_id` then turns `completed` and its normal postback comes then. A rejection expires 30 days after it was set.

### The step was reversed

**How to confirm:** **Transaction** reads `reversed`, with **Reversed because** when we have a reason. You'll have had a postback with `status=reversed` and the same `action_id`.

**Fix:** Deduct it. Dedupe on `action_id` and `status` together, or the reversal of a step you credited gets dropped.

### The user was already credited for this offer

**How to confirm:** An earlier row for the same offer and **Sub ID**.

**Fix:** Nothing to pay twice. A repeat tap on an offer they were credited for goes to the app's store page, not to a link that could credit them again.

## Send us this

- The email you sign in with.
- The user's ID (`sub_id`, or the wall's `uid`) and the offer ID.
- The `action_id`, if there is a row.
- Which step the user completed and when, with your time zone.
- What **Flight Recorder** shows for it: **Transaction**, **Delivery** and any **Error**.
