Key takeaways

  • Open Reports, Postbacks, set Result to Not delivered, fix the cause, and click Resend at the end of the row.
  • Resend shows only for real events that were never delivered, not for tests and not when a later attempt already got through.
  • A resent postback has the same transaction ID and uses the postback URL and secret key saved now, so fix your server first and skip repeats.

How do I resend a failed postback?

In the sidebar under Reports, click Postbacks, set Result to Not delivered, fix what made your server fail, and click Resend at the end of the row. A message confirms that the postback was sent again, and the new attempt appears at the top of the list a few seconds later. A 2xx answer in that new row means your server got the reward.

Postbacks start once a live app has a postback URL in its Postback tab. If you are new to them, What is a postback URL? explains the basics.

How automatic retries work before you need Resend

Moonetix counts a postback as delivered when your server answers with any 2xx status code within 6 seconds. It does not read the response body and does not follow redirects. When a call fails or times out, Moonetix tries again by itself up to 5 times:

TryWhen
First callRight after the credit or reversal
Retry 1After about 1 minute
Retry 2After about 5 minutes
Retry 3After about 30 minutes
Retry 4After about 2 hours
Retry 5After about 6 hours

Each try is its own row in the report, and Export CSV adds an Attempt column with the number of each try. If the last retry fails too, Moonetix emails you, at most once a day per app, with the subject “A postback to your server failed”. Resend is for those events, or for any event you want to send again now that your server is fixed. The full rules are on the Postbacks page of the docs.

Step by step: find and resend a failed postback

  1. In the sidebar under Reports, click Postbacks. You can also click the postback report link in the Postback tab of your app, which opens the failed ones directly. When an app’s postback status shows Failing on its page, View failed postbacks takes you there too.
  2. Set Result to Not delivered, or click the Not delivered total at the top. Use App and the date menu at the top right to narrow the list.
  3. Look at the Event column (Credited or Reversed) and the Result column, which shows the HTTP code your server sent, such as HTTP 403, or No answer.
  4. Click the URL under Details to see the full URL we called and the Response from your server.
  5. Fix the cause on your side. If the postback URL was wrong, correct it in the Postback tab and click Save changes.
  6. Back in the report, click Resend at the end of the row. A message confirms: “Postback sent again. The result appears at the top of this list in a few seconds.”
  7. Check the new row at the top. A 2xx code means your server got it, and the old failed row now says Delivered later.

Tip: one transaction, one reward

A resent postback has the same {transaction_id} as the original; only the {event_id} is new. Store the last status you processed for each transaction ID and skip repeats, so a user is never credited twice. How to prevent duplicate reward credits shows the pattern in several languages.

That rule makes your handler idempotent. MDN’s glossary defines idempotent as a request whose intended effect is the same whether it is made once or several times, which is exactly what you want when retries and resends can deliver one event more than once.

What the Postbacks report shows

ItemWhat it tells you
Sent, Delivered, Delivered later, Not deliveredTotals for your filters. Click one to show only those rows.
EventCredited, Reversed, or Test for a test postback
ResultThe HTTP code your server returned, or No answer on a timeout or connection error
DetailsThe exact URL we called and the first part of your server’s Response
Last columnResend, or Delivered later if another attempt already got through

When the Resend button shows

  • Only for failed rows of real conversions. Test postbacks, marked Test in the Event column, cannot be resent. Use Send a test postback in Integration status on the Integration tab instead.
  • Not if the event got through later. If a retry or an earlier resend was delivered, the row says Delivered later instead. If it was delivered in the meantime, you see “This event was already delivered to your server.”
  • Not for an outdated event. If the result changed since then, for example a credited event whose result was later reversed, you see “This result has changed since then, so this older event is not sent again.”
  • Not if the event is no longer sent. If the postback URL is now empty, you see “This event is not sent to your server any more. Check the postback URL of the app.” Add the URL again in the Postback tab first.

Resend uses the postback URL and postback secret key saved for the app now. If you changed your secret key since the first try, your server must check the hash with the new key. See How to rotate your keys and link salt.

Common causes of failed postbacks

The code in the Result column points to the cause. MDN’s list of HTTP status codes groups them into five classes: only 2xx counts as delivered, 3xx is a redirect, 4xx means your server refused the request, and 5xx means it failed while handling it.

ResultLikely causeFix
HTTP 403Your hash check failed, or a firewall refused the callHash transaction ID, user ID, reward, and status exactly as received, with the postback secret key, not the link hash salt
HTTP 404Wrong path in the postback URLOpen the URL from Details and correct it in the Postback tab
HTTP 301, 302, 307, 308Your URL redirects, for example http to https or a trailing slashEnter the final URL, because we do not follow redirects
HTTP 500 to 599Your script crashed or the database was downCheck your server error log, then Resend
No answerTimeout over 6 seconds, DNS, TLS, or a blocked connectionAnswer 200 first and do slow work in the background; allow our requests

Redirects catch people out most often, because a browser follows them silently. MDN’s guide to HTTP redirections explains that a redirect is a 3xx code plus a Location header; Moonetix stops at the 3xx and records it as not delivered.

If your server only accepts known addresses, add the IPv4 and IPv6 addresses from the Postbacks docs, as shown in Postback IP allowlist. Bot protection and firewalls that block server requests are a frequent cause of No answer. Always keep the hash check as well; Postback security shows a handler that does both.

After the fix: confirm before you resend

  1. Use Send a test postback in Integration status on the Integration tab. It shows exactly what your server answered. Test transaction IDs start with test_, so your handler can tell them apart.
  2. Once the test gets a 2xx, resend the real failed events one by one. Resend works one row at a time, with a short pause between clicks.
  3. Check the user’s balance on your side. If a user already wrote in about the missing reward, Handling missing reward tickets has reply templates.

A full launch checklist is in How to test your app before launch, and every error with its fix is on the Testing and troubleshooting page.

On a phone

Tap Reports in the bottom tab bar, then the Postbacks tab at the top of the report. Tap Filters to set Result. Or open your app from Apps, go to the Postback tab, and tap the postback report link. Each row shows as a card, with Resend at the bottom.

To check your handler, paste a postback it received into the postback hash checker: it shows the exact string that is signed and why a hash does not match.

Still failing?

Moonetix sends a signed postback for every credit and reversal, and keeps every attempt in your report. If you cannot find the cause, click Chat with us under Need help? in the dashboard and send the time of the failed postback and the response shown under Details. How to contact Moonetix support explains what to include.

Frequently asked questions

Can I resend many failed postbacks at once?

No. Resend works one row at a time, with a short pause between clicks.

Does a resend count as a new conversion?

No. It is the same event with the same transaction ID. Only the event ID is new.

Can I resend a postback that was already delivered?

No. If any attempt of that event was delivered, it is not sent again. To check your records, use the Reporting API or Export CSV in Reports.

Why does a failed row say Delivered later?

One of our automatic retries, or an earlier resend, reached your server after this attempt failed. Nothing is missing.

How long does Moonetix keep retrying a failed postback?

Up to 5 retries after the first call, spread over about 9 hours. After the last one fails, you get an email at most once a day per app, and the event waits for a manual Resend.

Why can I not resend a test postback?

Tests are not real conversions, so there is nothing to deliver. Send a new one with Send a test postback in Integration status.