Feedico

Engineering · Events & attribution

Webhook, conversion postback, and feed data model

Updated September 14, 2026 · ~13 min read · Reference guide

One search often bundles three different systems: conversion postbacks (commission events), catalogue webhooks (merchant/coupon deltas), and product/creative feeds (SKU or banner assets). This guide maps entities, field checklists, ownership, and worker patterns so your warehouse and tracker stay clean.

Three systems in one production stack

1 · Attribution

Clicks, conversion postbacks, commission status, payouts. Lived in trackers and network reporting.

2 · Catalogue sync

Firms, coupons, optional products, outbound affiliate.delta when rows change after sync.

3 · Media assets

Creative libraries and banner sizes. Rarely pushed as webhooks; pull from network UI/API.

Event and feed entity map

Start here when someone asks for a single “webhook + postback + product feed data model.” Split the tables first; then wire APIs.

EntityTypical tracker / networkFeedico
Inbound conversion postbackHTTP callback with click id + order idNot stored (use tracker)
Outbound webhook / deltaOptional network hooksaffiliate.delta on catalogue changes
Webhook subscriptionPer advertiser URL configDashboard webhook settings
Event payloadtransaction_id, commission, statusupserted/inactivated firm & coupon ids
Product feed changeSKU upsert / price change (rare as push)Pull /me/products or catalog
Creative asset updateNew banner in libraryNetwork UI only
Click / tracking ledgerImmutable click eventsNot modeled in catalogue API
Payout / settlementCommission batchesNot modeled in catalogue API

Postback vs catalogue delta (do not merge tables)

Inbound conversion postback

  • Triggered by a sale or lead
  • Keyed by click_id / order_id
  • Drives commission and payout ledgers
  • Owned by tracker or network reporting

Outbound affiliate.delta

  • Triggered after catalogue sync
  • Keyed by firm/coupon ids
  • Drives cache bust and warehouse upserts
  • Owned by Feedico webhook delivery
affiliate.delta payload (example)
{
  "webhook_version": 1,
  "event": "affiliate.delta",
  "occurred_at": "2026-06-20T14:22:11.000Z",
  "provider": "cj_affiliate",
  "property_id": "12844",
  "networks": {
    "upserted": ["88341", "88342"],
    "inactivated": ["88101"]
  },
  "coupons": {
    "upserted": ["1849201", "1849202", "1849203"],
    "inactivated": ["1840001"]
  },
  "truncated": false
}
Conversion postback (illustrative)
{
  "event": "conversion",
  "click_id": "clk_8f2a1c",
  "order_id": "ORD-100294",
  "order_value": 149.00,
  "currency": "USD",
  "commission": 12.45,
  "status": "pending",
  "sub_id": "pub_campaign_42",
  "occurred_at": "2026-09-14T16:02:11.000Z"
}

Conversion postback field checklist

Exact parameter names differ by network (CJ, Awin, Impact, Admitad, Takeads, and peers). Normalize into your own columns once at the tracker edge.

FieldRoleNotes
click_id / transaction_idJoin to click ledgerRequired for attribution
order_idMerchant order identityDedup key with click_id
order_value / currencyGMV reportingNormalize currency codes
commissionPublisher earningsMay change on lock
statuspending / approved / rejectedMutable lifecycle
sub_id / sid / clickrefPublisher campaign tagName varies by network
occurred_atEvent timePrefer network timestamp

affiliate.delta field checklist

Catalogue deltas never carry order value or commission. They tell you which firm and coupon ids to refresh from the REST API.

FieldRoleNotes
webhook_versionPayload contract versionReject unknown majors
eventaffiliate.deltaCatalogue change only
providerUpstream network slugScope cache bust
property_idPublisher propertyMulti-site accounts
networks.upserted / inactivatedFirm idsPull or mark inactive
coupons.upserted / inactivatedCoupon idsIdempotent upsert
truncatedId list incompleteTrigger list pull

Architecture deep dive: webhooks & delta sync.

Ownership matrix

Ambiguous ownership is the usual reason teams merge postback and delta tables. Assign each surface explicitly.

SurfaceSystemOwner
Conversion postback endpointYour tracker / network configYou
Click and commission ledgerTracker or network reportingYou
affiliate.delta deliveryFeedico webhook workerFeedico
Firm / Coupon / Product rowsFeedico catalogue APIFeedico
Creative banner binariesNetwork creative libraryNetwork
Warehouse ETL jobsYour workers + cronYou

Worker sketch: keep handlers separate

Two entrypoints, two persistence paths. Share logging and alerting, not a single polymorphic events table unless you add a hard event_family discriminator and never mix write paths.

Separate handlers (pseudocode)
async function handleAffiliateDelta(payload) {
  // 1. Verify HMAC signature before this function runs
  for (const networkId of payload.networks.upserted) {
    await upsertNetworkFromApi(networkId);
  }
  for (const couponId of payload.coupons.upserted) {
    await upsertCouponFromApi(couponId);
  }
  for (const couponId of payload.coupons.inactivated) {
    await markCouponInactive(couponId);
  }
  if (payload.truncated) {
    await paginateProviderDelta(payload.provider, payload.property_id);
  }
  await bustCacheTags(payload.provider);
}

async function handleConversionPostback(payload) {
  // Separate table from catalogue deltas
  await upsertConversion({
    clickId: payload.click_id,
    orderId: payload.order_id,
    status: payload.status,
    commission: payload.commission,
  });
}

Product feeds and creative assets in the same stack

Product feed and creative library rows are not conversion events. SKUs belong next to Firm/Coupon catalogue tables; banner assets stay in the network creative library. Price changes and new banners are almost never delivered inside a conversion postback.

Anti-patterns to avoid

  • Writing commission rows into the same table as firm/coupon upserts from affiliate.delta
  • Treating truncated: true as success without a follow-up list pull
  • Skipping HMAC verification because the endpoint is behind a VPN
  • Expecting product price changes or banner uploads inside conversion postbacks
  • Deleting historical conversions when status flips from pending to rejected

Implementation next steps

  1. Wire HMAC-verified workers for delta sync; keep a daily reconcile job.
  2. Keep postback endpoints on your tracker; do not expect commission payloads from Feedico.
  3. Poll or webhook-trigger product and coupon list pulls for catalogue freshness (warehouse ETL guide).
  4. Confirm webhook and product feed entitlements on pricing.

Frequently asked questions

What is the difference between a conversion postback and a catalogue webhook?
A conversion postback is an inbound HTTP callback when a sale or lead attributes to a click id (commission event). A catalogue webhook (Feedico affiliate.delta) is an outbound notice that merchant or coupon rows changed after sync. Different owners, payloads, and idempotency rules.
Where do product feeds and creatives fit in this data model?
Product feed SKUs are catalogue entities (optional Product rows). Creative banner assets are network marketing media, usually outside both postback and delta webhook payloads. Model them separately from conversion events.
Does Feedico store inbound conversion postbacks?
No. Commission and click ledgers stay in your tracker or network reporting APIs. Feedico emits outbound affiliate.delta events when catalogue rows upsert or inactivate.
What fields appear on a typical conversion postback?
Common fields: click_id / transaction_id, order_id, order_value, currency, commission, status (pending/approved/rejected), and optional sub_id parameters. Exact names vary by network.
How should I implement Feedico webhooks?
Verify HMAC signatures, upsert by id idempotently, and treat truncated: true as a signal to pull a targeted list. Full architecture: Webhooks & delta sync for affiliate APIs.
Should webhooks replace polling entirely?
No. Use webhooks as an acceleration layer. Keep a scheduled reconcile (daily or weekly) to catch missed deliveries, truncated payloads, or endpoint downtime.
What are webhook resource units?
Each changed entity id referenced in a delivered webhook payload counts as one resource unit against your plan monthly cap. Large syncs may truncate id lists; truncated: true means run a targeted list pull.
How do pending vs approved conversions affect the ledger?
Trackers usually insert a pending conversion on postback, then update status when the network locks or rejects the sale. Keep status as a mutable column; do not create a new conversion row for every status change unless your audit model requires it.

Affiliate disclosure: some links on Feedico are affiliate links. We may earn a commission when you buy through them, at no extra cost to you. Publishers still need programme approval and compliant use at each affiliate network. Feedico provides the integration layer, not a substitute for network terms.

Related pages

Ready to try it on your own networks?

Free plan, no credit card. Or start from the ready catalog with the Partner Program.