Sales
The sales list view, statuses, refund flow, and external event IDs.
A sale is any natively-tracked processor event (Stripe, Paddle, or Braintree) or S2S event that produces a commission. The sales list at /dashboard/sales is the source-of-truth view for everything that has been credited to an affiliate. (Internally the backend entity is still called Conversion since the same record covers CPS, CPL, CPA, and other commission models; user-facing language uses "Sales" to match the SaaS-CPS dominant case.)
What you see
The sales table has these columns:
- Date: when the sale was created
- Affiliate and Campaign: who earned it and the campaign it belongs to
- Type: Sale, Recurring, or Lead
- Source: how the sale was attributed (see below)
- Amount: the underlying Stripe invoice amount (or S2S
amountCents) - Commission: the calculated commission in your currency
- Status: Pending, Approved, Paid, Refunded, or Denied
- Stripe metadata: subscription ID, customer ID, external event ID (where applicable)
Filter by type with the All / Sales / Leads chips at the top.
Source (how a sale was attributed)
The Source column makes it obvious how each sale was credited, so a coupon redemption is as visible as a link click. No setup is required; the tag is derived automatically from how Rekomi attributed the sale:
- Coupon: a redeemed affiliate coupon code. The code is shown inline (for example "Coupon · SARAH20").
- Link: a tracked click or referral metadata on the processor (Stripe/Paddle/Braintree).
- Customer match: a returning customer or a prior lead matched to an affiliate.
- Click: a pay-per-click reward rollup.
- Lead: a zero-commission lead or signup capture.
- Override: a sub-affiliate recruiter override row.
- Server: a server-to-server (S2S) postback.
- Imported: migrated from another platform.
Status meanings
- Pending: in the refund-hold window. Commission is calculated but not yet payable. Default hold is 30 days from invoice paid date.
- Approved: refund window passed. Commission is locked in. Eligible for the next payout batch.
- Paid: included in a payout that has settled to the affiliate's Stripe Connect account.
- Refunded: Stripe refunded the customer; commission was clawed back.
- Denied: manually denied by you. Rare. Typically only used for disputed sales where you have evidence the affiliate did not actually drive the customer.
How sales are created
Sale creation paths:
- Native processor webhook. Most sales. Stripe, Paddle, and Braintree all connect natively: when a paid event fires (for Stripe,
invoice.paid) for a customer referred by an affiliate within the cookie window, Rekomi creates aConversionrow automatically. - S2S API. For any other payment gateway, or events that do not flow through a connected processor. Your backend POSTs to
/api/tracking/s2swith anexternalEventId(for de-dup),affiliateSlug,amountCents,currency. See S2S tracking. - Manual (planned). A manual sale entry UI is not shipped today.
Not every signup is a paid sale on day one. Free signups are captured as leads (automatic for Stripe and Paddle, one line of code otherwise), so a later paid upgrade is still credited to the affiliate by email. See Track leads and signups.
External event IDs
externalEventId is the de-dup key. For Stripe webhooks it is the Stripe invoice ID. For S2S it is whatever you supply. Within an organization, the same externalEventId will never create two sales; the second call returns the first sale (with deduped = true in the response). This makes retried webhooks and replayed S2S calls safe.
Refunds
When Stripe sends a refund webhook (charge.refunded or customer.subscription.deleted within the refund-hold window), Rekomi flips the sale status to Refunded. The affiliate's pending balance drops by the clawed-back amount. If the commission had already been paid out (rare with default 30-day hold), the next payout batch debits the overpayment.
This happens automatically. There is no manual refund button in the dashboard because Stripe is the source of truth.
Inspecting Stripe metadata
Each sale row exposes the underlying Stripe identifiers (subscription ID, customer ID, invoice ID) so you can cross-reference in your Stripe dashboard. Useful for debugging "why was this affiliate credited" questions or for audit trails.
Export
The sales table has a CSV export button in the top-right that downloads the current filtered view. The CSV includes attribution_method and coupon_code as the last two columns, so coupon attribution survives the export. For programmatic exports, use the Sales read API: GET /api/conversions?affiliateId=...&status=Approved&since=2026-01-01 returns paginated rows including attributionMethod and couponCode. Pagination cursor take maxes at 200. (The endpoint path keeps /conversions so existing integrations don't break; the UI is at /dashboard/sales.)
Reporting view
For aggregate metrics (clicks, sales, conversion rate, top affiliates), see Reports. The sales list is the raw event log; reports is the rollup.