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.
| Entity | Typical tracker / network | Feedico |
|---|---|---|
| Inbound conversion postback | HTTP callback with click id + order id | Not stored (use tracker) |
| Outbound webhook / delta | Optional network hooks | affiliate.delta on catalogue changes |
| Webhook subscription | Per advertiser URL config | Dashboard webhook settings |
| Event payload | transaction_id, commission, status | upserted/inactivated firm & coupon ids |
| Product feed change | SKU upsert / price change (rare as push) | Pull /me/products or catalog |
| Creative asset update | New banner in library | Network UI only |
| Click / tracking ledger | Immutable click events | Not modeled in catalogue API |
| Payout / settlement | Commission batches | Not 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
{
"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
}{
"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.
| Field | Role | Notes |
|---|---|---|
| click_id / transaction_id | Join to click ledger | Required for attribution |
| order_id | Merchant order identity | Dedup key with click_id |
| order_value / currency | GMV reporting | Normalize currency codes |
| commission | Publisher earnings | May change on lock |
| status | pending / approved / rejected | Mutable lifecycle |
| sub_id / sid / clickref | Publisher campaign tag | Name varies by network |
| occurred_at | Event time | Prefer 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.
| Field | Role | Notes |
|---|---|---|
| webhook_version | Payload contract version | Reject unknown majors |
| event | affiliate.delta | Catalogue change only |
| provider | Upstream network slug | Scope cache bust |
| property_id | Publisher property | Multi-site accounts |
| networks.upserted / inactivated | Firm ids | Pull or mark inactive |
| coupons.upserted / inactivated | Coupon ids | Idempotent upsert |
| truncated | Id list incomplete | Trigger 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.
| Surface | System | Owner |
|---|---|---|
| Conversion postback endpoint | Your tracker / network config | You |
| Click and commission ledger | Tracker or network reporting | You |
| affiliate.delta delivery | Feedico webhook worker | Feedico |
| Firm / Coupon / Product rows | Feedico catalogue API | Feedico |
| Creative banner binaries | Network creative library | Network |
| Warehouse ETL jobs | Your workers + cron | You |
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.
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.
- Refresh SKUs via Product Data API after catalogue sync or on a poll cadence.
- Pull banner sizes and creatives from the network UI/API; see product feed, SKU deep links & banner sizes.
- Use the full platform entity map when you need payout and tracking tables too.
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
- Wire HMAC-verified workers for delta sync; keep a daily reconcile job.
- Keep postback endpoints on your tracker; do not expect commission payloads from Feedico.
- Poll or webhook-trigger product and coupon list pulls for catalogue freshness (warehouse ETL guide).
- 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.