Home
Advertiser Management
Advanced Tracking Options
Reversal Postback Setup For Processing Canceled Transactions
Reversal Postback Setup For Processing Canceled Transactions

SERIES:

Reversal Postback Setup For Processing Canceled Transactions

Learn how to automatically reverse conversions for refunds, chargebacks, cancellations, and fraud using reversal postbacks.

Overview

A Reversal Postback is an automated server-to-server notification that allows you to reverse (reject) previously approved conversions when products are refunded, orders are canceled, chargebacks occur, or fraud is detected.

This guide walks you through implementing reversal postbacks safely, selecting the right identifier method, and integrating with common e-commerce platforms.

CRITICAL: Read This Before Setup Reversal postbacks can accidentally reverse ALL conversions if configured incorrectly. Understanding identifier scope is essential.

DANGER: "Nuclear Option" Identifiers

Using transaction_id WITHOUT event_id: Reverses ALL events for that session (install + purchase + upsell = ALL reversed)

Using email alone: Reverses ALL conversions ever associated with that email address

Using order_id alone: Reverses ALL conversions linked to that order (multiple items, multi-step checkout)

SAFE Methods:

conversion_id - Reverses ONE specific conversion only

transaction_id + event_id=0 - Reverses ONE specific base conversion

email + event_id - Reverses specific event for that email

Real Impact: One customer reversed 100+ conversions accidentally by using email without event_id, thinking they were reversing just one recent order.

When Do You Need Reversal Postbacks?

Before setting up reversals, identify your specific use case. Here are the 7 most common scenarios:

🔄

Product Refunds

Customer returns product or requests refund. Affiliate commission must be reversed to match actual revenue.
Example: Weight Loss Clinic Medical weight loss clinic - patients pay upfront but must be approved by provider. If provider rejects, refund is issued and affiliate commission reversed.
Identifier: order_id or conversion_id
💳

Chargebacks

Credit card chargeback filed weeks or months after initial sale. Merchant loses revenue and affiliate payout must be clawed back.
Example: Home Improvement Brand High-ticket water filtration ($850 AOV) - fraudulent orders flagged by Kount tool result in chargebacks. Merchant loses product + affiliate payout = "double whammy."
Identifier: order_id or transaction_id + event_id
🎫

Coupon Code Leaks

Partner's exclusive coupon code leaked to public coupon sites. Invalid traffic using stolen code needs bulk reversal.
Example: E-commerce Brand Discount code leaked to coupon scraping sites. Partner showed 100% conversion rate despite not actively promoting. Batch-rejected these stolen conversions.
Identifier: Bulk CSV or API with conversion_id list

Subscription Cancellations

Customer cancels subscription during trial or shortly after first payment. Original referral commission reversed.
Example: Subscription Service Pay affiliates weekly but issue clawbacks later when subscriptions cancel, creating reconciliation issues between bank transfers and Everflow reporting.
Identifier: email + event_id or order_id
🚨

Fraud Detection

Automated fraud tools (Kount, Anura, MMP fraud flags) identify suspicious conversion patterns requiring reversal.
Example: Home Improvement Brand Low-value orders ($40-$125) flagged as fraud by Kount tool after approval. Automatically reverse these via Stripe webhook integration.
Identifier: conversion_id (from fraud tool response)
📞

Lead Quality Issues

Lead submitted but sales team discovers later that contact info is invalid (disconnected phone, fake email).
Example: Financial Services Company Leads sent to HubSpot - sales team discovers phone numbers are disconnected. Better solution: Use On Hold Conversions (7-day pending) so partners never get paid if lead isn't verified.
Identifier: conversion_id or email
🏥

Qualification Failures

Customer pays but fails verification process (medical qualification, credit check, background check). Refund + reversal needed.
Example: Weight Loss Clinic Weight loss clinic - patients pay upfront but medical provider must approve. If provider rejects for health reasons, refund issued and affiliate commission reversed.
Identifier: order_id or conversion_id

Check Your Platform Integration First

Before manually setting up reversal postbacks, check if your e-commerce platform already handles this automatically:

Platform Auto-Reversal Support Check if your platform already handles reversals automatically before manual setup

Shopify: Official Everflow app handles refunds automatically via refunds/create webhook - no manual setup needed

Stripe: Requires "Read" permission for Refunds in integration settings - can auto-fire reversals

WooCommerce: Requires full API integration (not manual script) for auto-reversal

Custom Cart / CRM: Manual reversal postback setup required (follow guide below)

Note: If your platform integration already handles refunds, you don't need to set up manual reversal postbacks. Check your integration documentation first.

Choosing The Right Identifier

Reversal postbacks require an identifier to locate which conversion(s) to reverse. Use this decision tree to select the safest method:

Identifier Selection Decision Tree
Do you have the Conversion ID from Everflow?
Use: conversion_id
Reverses: ONE specific conversion only
When to use: You exported conversion report and have the specific ID
Safety: SAFEST - No risk of mass reversal
Do you have Order ID from your e-commerce system?
⚠️
Use: order_id
Reverses: ALL conversions linked to this order
When to use: E-commerce refund with order number (Shopify Order #1234)
Warning: Multi-item orders or multi-step checkout = multiple conversions reversed
Do you have Transaction ID and know the specific event?
Use: transaction_id + event_id=0 (for base conversion)
Reverses: Base conversion(s) only — upsells and renewals stay approved
How it works: event_id is a type filter — it reverses all conversions matching that event type for the transaction. Most transactions have only one base conversion, so this typically targets one record.
When to use: You want to reverse the initial sale but keep upsell/renewal events
Safety: SAFE when event_id specified
DANGER - Do NOT Use: transaction_id alone (without event_id)
Reverses: ALL EVENTS for that session (install + purchase + upsell + renewal = ALL reversed)
Real Impact: One click = 4 conversions? All 4 reversed. Partner loses entire commission history for that customer.
Do you only have customer email address?
⚠️
Use with caution: email + event_id
Reverses: All conversions for that email matching the event_id
When to use: Subscription cancellation where you need to reverse specific event type
Safety: MEDIUM - Always include event_id or adv_event_id
DANGER - Do NOT Use: email alone
Reverses: EVERY CONVERSION EVER for that email address
Real Impact: Customer placed 10 orders over 3 months? All 10 reversed. Partner loses all commissions for that customer lifetime.
Special Case: On Hold Conversions
🕐
Problem: On-hold conversions don't have conversion_id yet (only placeholder)
Solution: Must use transaction_id + event_id
Example: 7-day hold period for lead verification - to reject during hold, use transaction_id since conversion_id doesn't exist yet

Available Tracking Methods

Once you've selected the appropriate identifier, construct your reversal postback URL using one of these methods:

1 By Conversion ID (Safest)

Reverses: ONE specific conversion only

URL Format:

Example:

When to use: You have the specific conversion ID from the conversion report (most accurate method)

How to get conversion_id: Navigate to Conversions Report, find the conversion, copy Conversion ID from the row

2 By Order ID

Reverses: ALL conversions linked to this order ID

URL Format:

Example:

Scope Warning

All conversions with this order_id will be reversed, even if they were fired separately. If you passed the same order_id for multiple events (base sale + upsell), both will be reversed.

When to use: E-commerce refund scenarios where you have order number from Shopify/WooCommerce/etc.

3 By Transaction ID (With event_id)

Three options with different scope:

Option A - Base Conversion Only (Recommended):

Reverses: All base conversions (event_id=0) for that transaction. Upsells and renewals remain approved. Most transactions have only one base conversion, so this typically targets one record. If you need to reverse one specific conversion out of many, use conversion_id instead (Method 1 above).

Option B - ALL Events for Transaction (DANGER):

DANGER: Nuclear Option

Without event_id parameter, this reverses ALL conversions linked to this transaction_id: base sale, upsells, renewals, everything. Use only if you are 100% certain you want to reverse the entire session.

Option C - Specific Event by ID:

Reverses: Only conversions matching both transaction_id AND that specific event_id

Option D - Specific Event by Name:

Reverses: Only conversions matching both transaction_id AND that advertiser event name (e.g., "upsell", "renewal")

4 By Email (With event_id)

Three options with different scope:

Option A - ALL Conversions for Email (DANGER):

DANGER: Mass Reversal

This reverses EVERY conversion ever associated with this email address across all time. If customer placed 10 orders over 3 months, all 10 orders reversed. Use ONLY if this is your intent.

Option B - Specific Event by ID (Recommended):

Reverses: All conversions for this email matching the specific event_id

Option C - Specific Event by Name:

Reverses: All conversions for this email matching the advertiser event name

verification_token Requirement

If you are using verification_token in your conversion postback, you MUST also add it to your reversal postback: &verification_token=[YOUR_TOKEN]

Without this, your reversal postback will silently fail with no error message.

Platform Integration Examples

Implementation varies by platform. Here are setup guides for the most common integrations:

Shopify (Auto) Stripe Webhook WooCommerce Custom API

Shopify - Automatic Refund Handling

Setup:

Install official Everflow Shopify app from Shopify App Store App automatically subscribes to refunds/create webhook When merchant clicks "Refund" in Shopify Admin, reversal fires automatically

Identifier Used: order_id (Shopify Order Number)

Advantages:

Zero-touch automation No manual URL construction Partial refunds supported

Limitations:

Only works with official Shopify app (not custom integration) Must process refund through Shopify Admin (can't bulk reverse)

Customer Example: An e-commerce brand uses Shopify auto-reversal for product returns

Stripe - Chargeback Webhook Integration

Setup:

Navigate to Stripe Dashboard, then Developers, then Webhooks Create endpoint for charge.refunded and charge.dispute.created events Endpoint URL: Your server that constructs and fires reversal postback to Everflow Include "Read" permission for Refunds in Stripe integration settings

Identifier Strategy:

Store Everflow conversion_id or transaction_id in Stripe metadata during initial conversion When webhook fires, read metadata and construct reversal URL

Example Webhook Handler (Pseudocode):

Customer Example: A home improvement brand uses Stripe webhooks to auto-reverse fraudulent chargebacks

WooCommerce - API Integration

Setup:

WooCommerce requires full API integration (not manual script) Use WooCommerce webhook system: woocommerce_order_refunded action hook Create custom plugin or add to functions.php

Example PHP Hook:

Identifier Strategy:

Store Everflow conversion_id in WooCommerce order meta during conversion tracking Retrieve from order meta when refund hook fires

Custom CRM / API Integration

Common Patterns:

Pattern 1: Negative Event Postback (Recommended for Historical Data)

Instead of reversing original conversion, fire NEW event with negative revenue Preserves historical data (shows original sale + later chargeback) Adjusts current month only, doesn't change past reports

Pattern 2: Bulk API Reversal (CSV Upload)

For batch operations (coupon leaks, fraud detection) Export list of conversion IDs to reverse Use Everflow API /conversions/update endpoint Set status to "Rejected"

Pattern 3: On Hold Prevention (Alternative to Reversal)

Use On Hold Conversions feature instead of reversal Hold conversions for 7 days (configurable) before approval Sales team verifies lead quality during hold period Partners never get paid if lead is rejected - no clawback needed

Customer Example: A subscription service uses negative event postbacks for chargebacks months after enrollment to preserve historical data

Testing Your Reversal Setup

ALWAYS test reversal postbacks before deploying to production. Use this checklist:

Pre-Launch Testing Checklist
ALWAYS test before deploying to production
Use test affiliate link to generate a sample conversion
Record the conversion_id, transaction_id, and order_id from conversion report
Verify conversion shows as "Approved" in reporting
Construct reversal URL with test conversion identifiers
Fire URL using Postman GET request or paste into browser
Navigate to Conversions Report and filter by Status = "Rejected"
Confirm test conversion now shows "Rejected" status
Check conversion history (three vertical dots → History) to see reversal timestamp
Confirm ONLY the intended conversion was reversed
If you used transaction_id, verify other events (upsells) are still approved
If you used email, verify only target event was reversed (not all email conversions)
If using Shopify/WooCommerce, test partial refund
Verify conversion revenue adjusts proportionally
Test reversal WITH token — should succeed
Test reversal WITHOUT token — should fail silently
Confirm token is required for reversal to work
DO NOT Test On: Live affiliate data (use test affiliates only), production conversions with real commissions, or customer email addresses (create test@example.com instead).
0 / 17

On Hold vs Reversal: When To Use Each

Before implementing reversal postbacks, consider if On Hold Conversions might be a better solution:

🕐
On Hold Conversions
Prevention: Hold before approval
When To Use
Lead quality verification (7-14 day hold)
Trial period validation (30 days)
Payment processing delays
Fraud review period
Medical qualification review
Advantages
Partners NEVER get paid if rejected
No clawbacks needed
No invoice reconciliation issues
Easier to manage
Limitations
Requires setup BEFORE conversion fires
Can't use for existing approved conversions
Partners see "pending" status (may cause confusion)
Customer Example
Company A: Holds leads 7 days for sales team verification. If phone number invalid, conversion never approved. Partners never paid = no clawback.
🔄
Reversal Postbacks
Correction: Undo after approval
When To Use
Product refunds (already shipped)
Chargebacks (weeks/months later)
Coupon code leaks (bulk reversal)
Fraud detected after approval
Subscription cancellations (post-trial)
Advantages
Works on existing approved conversions
Can reverse historical data
Platform integration (Shopify auto-refund)
Bulk operations (API/CSV)
Limitations
Partner already paid → clawback needed
Invoice reconciliation complexity
Risk of accidental mass reversal
More setup complexity
Customer Example
Company B: Chargebacks occur weeks after order ships. Can't prevent with On Hold. Must reverse after-the-fact and issue clawback to affiliate.
💡
Recommendation

If you can predict the verification timing (7-day trial, 14-day payment processing, 30-day return window), use On Hold Conversions instead. It's simpler, eliminates clawbacks, and prevents invoice reconciliation headaches.

If issues occur unpredictably (chargebacks, fraud discovered months later, customer requests refund), use Reversal Postbacks.

Troubleshooting

Use this guide to diagnose common reversal postback issues:

Issue: Reversal Didn't Work (Conversion Still Approved)

Most Common Causes:

1. Missing verification_token

Symptom: Reversal postback fires but conversion stays approved with no error message Cause: Advertiser has verification_token enabled on conversion postbacks but you didn't include it on reversal Solution: Add &verification_token=[YOUR_TOKEN] to reversal URL How to check: Review advertiser's conversion pixel setup - if it includes verification_token parameter, you must add it to reversal

2. Wrong Identifier Value

Symptom: Reversal fires but nothing changes Cause: conversion_id, order_id, or transaction_id doesn't match any existing conversion Solution: Export conversion report and verify identifier matches exactly (case-sensitive) Common mistake: Using Shopify Order #1234 when Everflow has "SHOP-1234" stored

3. Identifier Mapping Mismatch

Symptom: Data points don't map between systems (e.g., Stripe IDs vs Everflow IDs) Cause: External system (Stripe, Shopify) uses different ID format than what Everflow stored Solution: Must store Everflow conversion_id or transaction_id in external system during initial conversion for later retrieval

4. Conversion Already Rejected

Symptom: Reversal fires but no change in reporting Cause: Conversion was already rejected (can't reject twice) Solution: Check conversion status before firing reversal
Issue: Wrong Conversion Reversed (Or Too Many Reversed)

Most Common Causes:

1. Used transaction_id WITHOUT event_id

Symptom: Wanted to reverse just the base sale, but upsell, renewal, and install ALL reversed Cause: transaction_id without event_id parameter reverses ALL events for that session Solution: Always include &event_id=0 for base conversion or specific event_id for target event Prevention: Test on sample conversion first, verify scope before production use

2. Used email WITHOUT event_id

Symptom: Wanted to reverse recent order, but ALL 10 orders for that customer over 3 months reversed Cause: email alone reverses every conversion ever associated with that email address Solution: Use conversion_id instead (safest) or add &event_id=[SPECIFIC_EVENT] Real Impact: Partner loses ALL commissions for that customer lifetime

3. order_id Linked to Multiple Conversions

Symptom: Reversed one order but 3 conversions rejected Cause: Same order_id was passed for multiple events (base sale + 2 upsells in multi-step checkout) Solution: Use conversion_id for precise targeting or accept that all events with that order_id will reverse
Issue: Can't Find The Right Identifier

Problem: You have order info from external system but can't match to Everflow conversion

Solution Steps:

Step 1: Navigate to Conversions Report in Everflow Step 2: Filter by date range when order occurred Step 3: Search by customer email or approximate revenue amount Step 4: Export report to CSV with all columns Step 5: Use Excel/Google Sheets to match external order ID against adv1-5/sub1-5 columns (wherever your order ID is passed) Step 6: Once matched, grab the Conversion ID or Transaction ID from that row

Prevention: During initial integration, store Everflow conversion_id or transaction_id in your external system (Shopify order notes, Stripe metadata, CRM custom field) for easy retrieval later.

Issue: Reversal Shows in Wrong Month (Timestamp Mismatch)

Problem: November conversion reversed in December, causing partner reporting mismatch

Cause: When uploading conversions via API or CSV, Everflow uses upload date (not original date) unless timestamp specified

Customer Example: Company A - CMS error in late November, uploaded corrections in mid-December. Partner reports showed revenue in December but partners already paid sub-affiliates for November.

Solution: Use &unix_timestamp= parameter to backdate

When to use: Make-good reconciliations, correcting historical data, bulk reversals that need to appear in original time period

Issue: Can't See Which Rule Rejected Conversion

Problem: Conversion shows as "Rejected" but don't know if it was manual reversal or automatic postback control

Solution:

Check Error Code: Navigate to Conversions Report, then filter Status = Rejected Manual Reversal: No error code, or generic rejection message Postback Control: Error Code 26 + Error Message "Blocked_Postback_Control" View History: Click three vertical dots at row end, then History to see timestamp and user who made change

Reporting Visibility:

E-commerce integrations: Check "Refund Report" for auto-reversed transactions All conversions: Conversion Report, then filter by Status = "Rejected" Product Report caveat: Shows both approved AND rejected without breakout (known limitation)
Issue: Need To Undo An Accidental Reversal

Problem: Accidentally reversed wrong conversion or too many conversions

Solution Options:

Option 1: Manual Re-Approval (Small Scale)

Navigate to Conversions Report Find the rejected conversion(s) Click three vertical dots, then Change Status, then Approved Add note explaining accidental reversal

Option 2: CSV Bulk Update (Large Scale)

Export list of accidentally rejected conversions Create CSV with conversion_id column + status="approved" Upload via CSV import tool

Option 3: API Batch Update

Use Everflow API /conversions/update endpoint Loop through conversion IDs, set status back to approved

Prevention: Always test on sample conversion first before bulk operations

Reporting & Visibility

After firing reversal postbacks, verify they processed correctly and track reversed conversions:

Conversion Report: Navigate to Reports > Conversions. Filter by Status = "Rejected" to view all reversed conversions. Click the three vertical dots at row end, then History to see when the reversal occurred. Refund Report (E-Commerce Only): Navigate to Reports > Refunds if using Shopify or WooCommerce integration. Shows auto-reversed transactions from platform webhooks, including partial refund amounts. Partner View: Partners see reversed conversions in their reporting with a status change. Appears on invoices as a deduction (if already paid, shows as clawback). Error Code 26: If a conversion shows Error Code: 26 + Error Message: Blocked_Postback_Control, it was rejected by automatic Postback Control (not a manual reversal). Manual reversals typically do not have error code 26.
Important: Product Report currently shows both approved AND rejected conversions without breakout. For accurate reversed conversion counts, use Conversion Report filtered by Status = Rejected.