
Amazon wants 200 characters. eBay allows 80. It’s the same product.
“Publish once” is the promise everyone in this category makes. What actually happens is that you publish five times, in five incompatible dialects, and hope the versions do not drift apart.
They do drift apart. Not because anyone is careless, but because each channel is a lossy compression of your product — and hand-authoring per channel hides exactly which parts got lost.
Plus any endpoint reachable by file, webhook or API.
Reservation-based, so the last unit sells once.
Validation runs before submission, not after.
A diff before anything reaches a live listing.
Every channel is a lossy compression of your product.
One master record. Six attributes. Below is what each of them becomes on five channels — and the cells worth reading are the ones where the channel simply cannot hold the value.
eBay turns 42 dB of noise cancellation into the string "Active". Etsy has nowhere to put an FCC certification, and demands to know who made it. Neither is a bug — it is what the schema permits. The failure is not noticing.
| Master record | AmazonSP-API Listings 2024 | eBaySell Inventory API v1 | EtsyOpen API v3 | ShopifyGraphQL Admin | WooCommerceREST API v3 |
|---|---|---|---|---|---|
Title SonicPro X7 Wireless Noise Cancelling Headphones | item_name · ≤200 chars · brand first · no promotional language | product.title · ≤80 chars · hard truncation, not a warning lossy | title · ≤140 chars · natural phrasing favoured by Etsy search | title · clean · brand moves to the vendor field | name · unconstrained · the theme decides where it truncates |
ANC depth 42 dB | noise_control · "Active Noise Cancellation (42dB)" | aspects["Noise Cancellation"] = ["Active"] · the number is lost lossy | no structured specification fields — description prose only lossy | metafield custom.anc_depth · single_line_text_field | attributes[] · options: ["42 dB"] · untyped string |
Battery life 48 hours | battery_life · { value: 48, unit: "hours" } · typed | aspects["Battery Life"] = ["48 hours"] · unit typing lost lossy | description prose only lossy | metafield custom.battery_life_hours · number_integer | attributes[] · options: ["48 hours"] · untyped string |
Provenance — no equivalent concept in any supplier feed | not applicable | not applicable | who_made · when_made · is_supply · all three REQUIRED demands | not applicable | not applicable |
Compliance FCC Part 15 Class B | compliance_certification · FCC_PART_15_CLASS_B · enum | aspects["Certification"] · free text, unvalidated | no field in the listing schema lossy | metafield custom.compliance · single_line_text_field | meta_data · _compliance_cert · unvalidated key/value |
Primary image 2000 × 2000 px · white background | 1:1 · ≥1600 px · pure white RGB 255,255,255 required | ≥500 px longest side · no borders, watermarks or added text | 2000 × 2000 recommended · first image drives the search thumbnail | any ratio · 4:5 recommended for the mobile grid | theme-dependent · no platform-level enforcement at all |
When a channel cannot carry an attribute, Aonex relocates it rather than dropping it — into description prose, a metafield, or a structured bullet — and records that it did. You get a per-channel completeness score instead of the comfortable illusion that all five listings say the same thing.
One record in. Native payloads out.
Not a generic export with a mapping sheet bolted on. The actual request body each channel expects, validated against its live specification before it is sent.
Title ≤200 chars · no "best", "sale", "free shipping"
Browse node must resolve to a valid leaf category
Main image 1:1, pure white, product ≥85% of frame
Compliance enums must match the SP-API controlled list exactly
0
Every source attribute maps to a typed field on this channel.
{
"productType": "HEADPHONES",
"requirements": "LISTING_OFFER_ONLY",
"attributes": {
"item_name": [{ "value": "SonicPro X7 Wireless Noise Cancelling Over-Ear Headphones" }],
"brand": [{ "value": "SonicPro" }],
"standard_price": [{ "value": 299.00, "currency": "USD" }],
"noise_control": [{ "value": "Active Noise Cancellation (42dB)" }],
"battery_life": [{ "value": 48, "unit": "hours" }],
"compliance_certification": [{ "value": "FCC_PART_15_CLASS_B" }]
}
}
Connecting a channel takes an afternoon. Keeping five channels agreeing with each other, at 3am, on a Sunday, is the actual product.
Six failures you only meet in production.
None of these appear in a pilot on one channel. All of them appear in month four across five, and every one of them is silent until it is expensive.
The double sell
Two channels sell the last unit inside the same sync window. Both orders confirm. One customer receives a cancellation, your defect rate rises, and on Amazon a high enough rate suspends the listing entirely.
Reservation-based inventory with sub-second delta propagation
Buy Box suppression
Your own price differs by eleven cents between two of your channels after a rounding difference in tax handling. Amazon reads this as an uncompetitive offer and quietly suppresses the Buy Box. Nothing errors.
Cross-channel price reconciliation before publish
The forbidden word
A phrase that is perfectly fine on your own storefront — "clinically proven", a competitor's trademark, "cures" — triggers a policy action on a marketplace. Enforcement is account-level, not listing-level.
Per-channel policy linting on every copy field
Rate limit starvation
A full catalog rebuild consumes the day's API quota. The genuinely urgent update — a price correction, a stock-out — queues behind forty thousand unchanged records and lands four hours later.
Delta-only writes; unchanged records are never re-sent
Silent unit drift
Your master record is metric. A channel requires imperial and accepts the number without the unit. 2.5 kg is published as 2.5 lb. Shipping quotes, carrier surcharges and returns all inherit the error.
Unit-typed attributes; conversion at the channel boundary
Ratio rejection
The same asset is compliant on one channel and rejected on another because the primary image is 4:5 rather than 1:1. The listing publishes without imagery and converts at a fraction of the rate.
Per-channel asset derivatives generated automatically
Never re-send a record that did not change.
Most syndication problems at scale are quota problems wearing a costume. Channel APIs are rate limited, and a nightly full-catalog rebuild spends the entire day’s budget re-stating forty thousand facts that were already true.
The cost is not the wasted calls. It is that the one update which genuinely mattered — a price correction, a stock-out, a compliance fix — is queued behind them.
Aonex writes deltas. A changed field on one SKU is one small write, landing in under a second, regardless of whether your catalog holds four thousand SKUs or four hundred thousand.
Inventory is reserved rather than broadcast, so two channels cannot both sell the final unit while a sync window is open — the failure that quietly drives Amazon defect rates and account suspensions.
Field change to live on every channel.
Median daily write volume against catalog size.
Reservation model, not broadcast inventory.
Payload sent and response received, per call.
The questions you’re about to ask.
We already have a feed management tool. What is different here?
Feed tools map fields you already have onto fields a channel wants. That works precisely until the channel requires an attribute your master record does not contain — at which point the tool reports a mapping gap and hands it back to you. Most enterprise feed backlogs are made of exactly those gaps. Aonex resolves the missing attribute from source documents first, then maps. The mapping was rarely the hard part.
Only five connectors? We sell on more channels than that.
Five are natively supported today — Amazon, eBay, Etsy, Shopify and WooCommerce — and we would rather name them than quote a number that includes connectors nobody has run in production. Everything upstream of the final mapping is channel-agnostic, so any destination that accepts a scheduled file, a webhook or a REST endpoint can be targeted now without a bespoke connector. Tell us which channels matter to you and we will be direct about which are native, which are file-based today, and which are genuinely not yet built.
Do you take over our channel accounts?
No. You keep ownership of every seller account, every API credential and every commercial relationship. Aonex writes through your credentials with scoped permissions, and every write is logged with the payload sent and the response received. You can revoke access at any time and your listings remain exactly as they are — nothing is held hostage inside the platform.
What about channels you do not support?
Any channel that accepts a file drop, a webhook or a scheduled export can be targeted without a bespoke connector, because the enrichment and validation layers are channel-agnostic — only the final mapping is channel-specific. For genuinely novel APIs, a new connector is typically a few weeks. The attribute work you have already done carries over untouched.
How do we trust it not to publish something wrong at scale?
Every publish runs in dry-run first and produces a diff: which SKUs change, which fields change, which channels receive them, and which records failed validation and why. Most teams run dry-run only for the first few cycles, then enable automatic publish for low-risk field classes — price and inventory usually first — while keeping copy and compliance changes behind approval.

See what your channels disagree about.
Point us at two channels where you sell the same products. We will diff them — title, price, imagery, attributes, availability — and hand you the list of SKUs that are currently telling two different stories to two different sets of customers.
Read-only access · Nothing is written · Diff in five working days