Use case

Global affiliate payments: settle publishers in any country without bank rails

The publisher who sends you the most traffic this month may live in a country your bank quietly refuses to wire money to. A correspondent-banking hop drops the payment, a card network blocks the merchant category, or PayPal isn't available in their market at all — and your highest-earning affiliate is the one you can't pay. That's the specific failure crypto was first adopted to solve in affiliate marketing. halfin handles the cross-border leg directly: a publisher gives you a wallet address, you settle their commission in USDT or USDC on a chain they already use, and the payment clears in minutes against a real transaction hash — no SWIFT route, no intermediary bank, no per-country rail to maintain.

01

Bank rails don't reach the affiliates who earn the most

Affiliate traffic is global by default. A program that converts well attracts publishers from wherever the offer performs — and that distribution rarely matches the map of countries your bank is willing to send money to. The result is a structural mismatch: the more international your publisher base, the larger the slice of it you literally cannot pay through traditional rails. Bank wires depend on a correspondent chain that thins out or disappears for many regions; card-based payouts hit merchant-category blocks and reversals; PayPal and similar wallets aren't available, or not for receiving payouts, in a long list of markets.

Every workaround a finance team invents here is fragile. You collect local bank details that your own bank then rejects. You ask a publisher to open an account on a third payout platform they don't trust, and they churn instead. You route through a partner in their region and inherit that partner's float, fees, and failure modes. None of these is a payment rail you control, and each adds a counterparty between you and the publisher you're trying to keep loyal. The whole point of an affiliate relationship is that paying on time builds trust — and a rail that works for some countries and silently fails for others erodes exactly that.

A crypto wallet address sidesteps the correspondent-banking problem entirely. It isn't tied to a national banking system, it doesn't depend on a route your bank maintains, and it's the same kind of destination whether the publisher is in a market with deep banking infrastructure or none at all. That uniformity is the value: one payout mechanism that reaches the whole base, instead of a patchwork of rails each covering part of it.

02

Stablecoins are the unit publishers actually want abroad

Reaching a country is only half the problem; the payment also has to hold its value between the moment you send it and the moment the publisher spends or converts it. For a cross-border affiliate payout, a stablecoin is usually the right unit. USDT and USDC are dollar-denominated, so a publisher in a high-inflation or thin-banking market receives something whose worth they can reason about, rather than a volatile asset they have to time. halfin settles these directly: you pick the asset and network per payout, and the publisher receives the exact stablecoin amount on the chain they nominated.

Which network matters as much as which asset, because the practical experience of receiving a payout — the fee the recipient pays to move it, the speed it confirms — is a property of the chain. USDT on Tron is widely held precisely because its network cost is low and predictable, which makes it a common default for international publishers. USDC on Ethereum or Base suits affiliates who reconcile against that stablecoin for their own accounting. USDT or USDC on Solana fits high-frequency, small-value runs where fast, cheap confirmation matters more than anything. halfin lets each publisher line carry its own asset-and-network pair, so one global run lands each payment on the rail that recipient prefers.

Publisher situationCommon settlementWhy it fits cross-border
Thin local banking, wants a low, predictable receive feeUSDT on Tron (TRC-20)Widely held internationally; low, stable network cost to receive and move.
Reconciles in USD-stablecoin for their own booksUSDC on Ethereum (ERC-20) or BaseDollar-denominated stablecoin many publishers settle against directly.
High-frequency, small-value payoutsUSDT or USDC on SolanaFast, low-cost confirmation for frequent international runs.
Holds a base asset and wants it nativelyBTC, ETH, XRP, or an EVM L2 / BSC native tokenReaches publishers who prefer the chain's own asset over a stablecoin.
03

One global run, paid line by line

A cross-border affiliate payout isn't one wire to one country — it's a list of publishers spread across many markets, each wanting a particular asset on a particular chain. halfin treats that list as a mass payout: a fan-out over the single-payout API where every line stands on its own. Each line names a currency, an amount as a string, and the publisher's destination address, plus its own idempotency key. Because the lines are independent, a payout to a publisher in one country settling USDT on Tron sits in the same run as one settling USDC on Base for an affiliate elsewhere — no need to split the file by region or rail.

Independence is what makes a global run survivable. Some lines will reject up front — a publisher pasted an address for the wrong network, an amount falls below a chain's dust threshold, a destination can't receive the asset chosen. Those are reported per line, and the rest of the run still goes through. You correct the rejected rows and re-submit the whole file; the lines that already settled are no-ops, and only the fixed ones execute. There's no point where one bad row in one country blocks every good payment in all the others.

Settlement is reorg-aware and uses per-chain confirmation thresholds, so a payout reported complete has actually settled to the depth that chain requires — not merely been broadcast into the network. For a cross-border run that matters at the tail of the list, where you want each publisher's status to mean their money has truly landed. Every line resolves to a transaction hash, which is the cross-border equivalent of a wire reference: a concrete artifact your support team can hand to a publisher in any country who asks where their payment is.

  • Pay publishers in any market from one list — no per-country rail to set up or maintain.
  • Each line carries its own asset, network, amount, destination, and idempotency key.
  • Per-line rejections (bad address, dust amount, unsupported asset) don't block the rest of the run.
  • Reorg-aware crediting with per-chain confirmations before a payout reports complete.
  • Every settled line resolves to a transaction hash a publisher anywhere can verify.
04

A retry across a flaky international run never double-pays

Cross-border runs are exactly where ambiguous network calls bite. You're submitting hundreds of payouts, your connection isn't perfect, and a request times out without telling you whether it landed — the kind of uncertainty that's worse, not better, when the recipient is in a market you can't easily claw a mistaken payment back from. A naive retry treats the timeout as a fresh send and pushes a second payout. On-chain payments are final, so a double-pay to an overseas publisher is money you simply don't recover.

halfin removes the ambiguity with the idempotency key on every payout line. Submit the same key again — after a timeout, a worker restart, or a manual re-run of the file — and halfin returns the payout it already created instead of making a new one. Derive each key deterministically from your own records, typically the publisher's account id joined with the payout period, so the same affiliate in the same cycle always maps to the same key. That makes re-running the entire global run from the top the correct recovery move rather than a dangerous one: the run converges on exactly one payout per publisher, no matter how many times the network made you retry.

# Settle a global publisher list; each line is idempotent, so re-running is safe.
while IFS=, read -r account currency amount destination; do
  curl -sS -X POST https://api.thehalfin.com/api/v1/payouts \
    -H "Content-Type: application/json" \
    -H "X-API-Key: $HALFIN_API_KEY" \
    -d "{
      \"currency\": \"$currency\",
      \"amount\": \"$amount\",
      \"destination\": \"$destination\",
      \"idempotency_key\": \"affiliate-2026-06-$account\"
    }"
done < publishers.csv
# Re-run the same file after a dropped connection: keys collide, nobody is paid twice.
05

Approval, evidence, and the compliance boundary stay yours

Settling money internationally raises the stakes on control, and halfin keeps the human checkpoint and the programmatic path separate. A payout doesn't move funds the instant the API is called — each one enters a pending-approval state and is released from the dashboard. So the global run your platform stages is a proposal: your integration can queue thousands of cross-border payouts unattended, and whoever owns the treasury still signs off before anything leaves the balance. That separation is the safeguard you want most when the recipients are spread across markets you can't easily reverse a payment in.

It also leaves a real audit trail, which cross-border payouts otherwise lack. A bank statement weeks later doesn't tie a line back to a specific publisher and period; halfin does. Every payout maps to an idempotency key from your ledger, a dashboard record, an HMAC-signed webhook your platform should verify before marking the payout complete, and an on-chain transaction hash. When finance closes an international period or a publisher disputes a payment, the evidence is concrete in every country at once.

Compliance stays the program's responsibility, and halfin is deliberate about not overstating its role. halfin supports KYB onboarding when you become a merchant, applies AML awareness to the payment rail, and treats travel-rule considerations as a process to understand — none of which is a certification or license halfin holds or grants. Knowing your publishers, screening wallets and counterparties before funds move, and meeting the obligations of each market you pay into remain the program's job. halfin receives the approved instruction and provides the settlement evidence; the decision about who to pay, in which country, stays inside your platform.

  • Programmatic staging and human release stay separate — nothing leaves the balance unapproved.
  • Every cross-border payout maps to a key, a dashboard record, a signed webhook, and a transaction hash.
  • Verify the webhook HMAC signature before you mark an international payout complete.
  • KYB, AML awareness, and travel-rule are process — never a license or certification claim.
  • Screen publisher wallets and counterparties per market before funds move.
06

Wiring a global payout run

Start by mapping your existing cross-border problem onto the batch primitive. Take the publisher list your tracker already approves, attach to each line the asset and network that publisher nominated, derive a deterministic idempotency key per publisher and period, and submit each line through the payouts API — the same call backs a one-off settlement to a single overseas publisher and a full global run. Because each call is idempotent, wrapping the loop in a retry is correct rather than risky, which is the property a flaky international connection demands.

Point a webhook at your platform so settlement state arrives independently of any API response a dropped connection might have eaten, verify the signature before you reconcile, and tie each payout to its transaction hash. The payout request fields and the webhook envelope are published at docs.thehalfin.com — build your reconciler against those schemas, not against a response shape you inferred from one successful call. The dashboard gives partner-ops and finance the place to review and release runs without touching code. Begin in the sandbox with a small slice of publishers from a couple of hard-to-reach markets, confirm the reconciliation loop end to end, then scale the same flow to the whole global base.