Postback hash checker

Paste a postback your server received and your postback secret key, and see whether the HMAC-SHA256 signature matches, and why not if it does not. Everything runs in your browser.

The postback you received

Paste it from your server log to fill the fields below.

Apps, your app, Integration. Not the link hash salt.

Computed in your browser with Web Crypto. Nothing is sent.

Result

Add the hash you receivedThe expected hash is shown below.
String that is signed
-
Expected hash
-
Read the guide: Prevent duplicate reward credits

How to use the postback hash checker

Paste the full postback URL from your server log, and the checker fills in the transaction ID, user ID, reward, status, and hash when your parameters use common names. Otherwise, type the four values yourself. Add your postback secret key from your dashboard under Apps, your app, Integration, and the checker shows the exact string that is signed, the hash you should get, and whether it matches. Nothing leaves your browser.

How the postback hash is built

string = transaction_id:user_id:reward:status
hash   = HMAC-SHA256(string, postback_secret_key), as lowercase hex

Use the four values exactly as they arrive. The reward is sent without trailing zeros, for example 1500 or 0.5. The postback docs show the check in PHP, Node.js, and Python, with a constant-time comparison.

Why a postback hash does not match

  • Wrong key. The postback secret key is not the link hash salt. They are two different secrets.
  • Reformatted reward. Parsing the reward into a number and printing it again turns 1500 into 1500.00 or 1500.0. Hash the original string.
  • Wrong order or separator. The order is transaction ID, user ID, reward, status, joined with single colons.
  • Encoding. Use the URL-decoded values your framework gives you, not the raw query string.
  • Uppercase hex. The hash is lowercase. Compare it as it arrives.

Once the hash matches, credit each transaction once: how to prevent duplicate credits. To send yourself a real signed postback, use Send a test postback on the Integration tab of your app.

Frequently asked questions

Which values are in the Moonetix postback hash?

The transaction ID, user ID, reward, and status, joined with colons, signed with HMAC-SHA256 and your postback secret key.

Is the reversal postback signed the same way?

Yes. A reversal has status 2 and the same transaction ID as the credit, and its hash is built the same way.

Why does my code fail while this checker matches?

Your code changes one of the values before hashing, usually the reward format or the key. Print the exact string your code signs and compare it with the one shown here.

Is it safe to paste my secret key?

The page never sends it anywhere, but use a test app or rotate the key afterwards if you are unsure.

Turn your traffic into earnings.

Create a free publisher account and earn from every offer your users complete on your website, app, game, or community.

Worldwide targeting