Before calculating a gap between your Amazon offer price and a Featured Offer price, establish that both observations describe the same product, marketplace and selected customer context. Keep the seller identity and price components attached to each observation. If shipping or the required offer is unknown, hold the comparison.
This is a diagnostic for developers of authorized seller tools. The downloadable model makes that decision explicit before calculating a pre-promotion item-plus-known-shipping subtotal. All example records are synthetic. The fixed scope is US/USD, Consumer, New, one unit; there is no quantity field, so single-unit input is an assumption your adapter must enforce.
A lower item price can produce a higher subtotal
In the first synthetic case, your seller is seller-A. Both records use the same ASIN, NON_PRIME membership, representative location and shipping-service labels, with observation times 30 seconds apart:
| Observation | Item | Known shipping | Subtotal | Seller |
|---|---|---|---|---|
| Your offer | $19.00 | $4.00 | $23.00 | seller-A |
| Selected Featured Offer | $21.00 | $0.00 | $21.00 | seller-B |
The model calculates (19 + 4) - (21 + 0) = +2.00 USD. Your item price is lower, but your defined subtotal is $2 higher. Positive output means your subtotal is higher; negative means lower. Known zero shipping is evidence; missing shipping cannot be replaced with zero.
A second case gives both sellers a $20 item price and known $0 shipping. The gap is 0.00, while featured_is_own_seller is false: the selected Featured Offer still belongs to seller-B. A third case changes that seller to seller-A and returns true. Price equality and seller identity answer separate questions.
These results explain the supplied records. They do not explain why Amazon selected an offer or establish a price that will win.
Select the response that answers your question
The field name “price” is insufficient provenance. Choose the record by the question it answers:
| Question | Appropriate evidence | Comparison role |
|---|---|---|
| What offer does my seller/SKU report? | Requested offers from getListingsItem, scoped to marketplace and offer type | Own-offer observation |
| Which offer is featured for the selected segment? | featuredBuyingOptions from getCompetitiveSummary, scoped to ASIN/marketplace | Featured-offer observation |
| What are the lowest-priced offers? | Separate lowestPricedOffers data in the retrieval guide | Different question; cannot substitute for featured data |
| What external price reference is reported? | CompetitivePrice outside Japan; CompetitivePriceThreshold in Japan | External-retailer reference; see the migration announcement |
| What price might make my offer featured? | Featured Offer Expected Price, or FOEP | Computed guidance, separate from an observed offer |
FOEP describes a computed listing price before promotions. Amazon explicitly withholds a Featured Offer guarantee because competing offers and customer-specific fulfillment capabilities can affect selection.
For the own side, request offers explicitly: getListingsItem defaults to summaries. Validate the seller/SKU request context and map the selected marketplace's SKU to the intended ASIN before joining competitive data. Select the applicable B2C offer and audience. The Listings Items model keeps these offer fields separate from the summary.
That response alone does not supply all the shipping, membership and location context required by this model. Your adapter needs separately evidenced inputs for those fields. Until they are known, retain the own price but leave this subtotal comparison unresolved.
Make comparability an explicit contract
The model accepts normalized records, not raw Amazon responses. Its complete cases file shows the exact shape. Each pair declares an expected_own_seller_id independently of both observations, then supplies source type, seller, ASIN, marketplace, currency, condition, customer type, membership, location, shipping service, timestamp and price components.
Apply these checks before passing real observations into that shape:
- Validate the individual response. A successful batch envelope does not establish every member's success. Check each member's status, body, ASIN, marketplace and requested dataset. Preserve failed, absent and incomplete observations. The Pricing model defines per-member status and optional datasets.
- Select the intended context. Featured offers are segmented by membership and regional context. Optional
sampleLocationrepresents a location within the segment, not an exact delivery quote for every shopper. Retain what the source actually establishes. - Preserve unknown components. Pricing
listingPriceexcludes shipping, Points and promotions; shipping options are optional estimates. The same model therefore cannot justify silently treating missing shipping as free. - Keep the calculation narrow. Amazon warns that returned promotions may omit active promotions. This subtotal excludes taxes, Amazon Points, coupon eligibility, complete promotion coverage and fulfillment quality. It is not a checkout total. Promotion coverage.
The executable checks exact equality of normalized membership, location and service strings. Those are trusted labels, not proof of equivalent Amazon contexts. It also trusts the adapter's source, seller and product labels. Use null when context is unknown; two invented unknown strings would create false confidence. US and STANDARD are lab labels, not a raw marketplace ID or a claimed Amazon shipping-option value.
Run the model and inspect the holds
Extract the complete comparison ZIP, open a terminal in the directory containing compare.py, and run:
python3 -B compare.py
python3 -B compare.py --csv
python3 -B -m unittest -v test_compare.pyNo packages or account credentials are needed. The README documents the contract; compare.py and the test suite are individually inspectable. Compare stdout with the recorded JSON and CSV matrix.
The 14 synthetic cases produce three comparisons and 11 holds under the default policy:
| Cases | Result | Interpretation |
|---|---|---|
| Lower item price, higher subtotal | Compare; +2.00 | Defined own subtotal is higher |
| Equal subtotals, different seller | Compare; 0.00, seller flag false | Matching amount does not identify your seller |
| Equal subtotals, same seller | Compare; 0.00, seller flag true | Selected record identifies your seller |
| Missing shipping; membership/location/currency mismatch; wrong own seller | Five holds | Resolve the missing evidence or incorrect join |
| Failed or missing Featured Offer | Two holds | Preserve unavailable observations |
| External reference, FOEP or lowest-price substitution | Three holds | Select featured-offer evidence |
| Observations 360 seconds apart | One hold | Exceeds the default time-skew policy |
A hold has no calculated subtotals or gap: JSON uses null, CSV uses empty cells. Invalid input instead stops the command with a nonzero exit. To experiment, edit a copy of cases.json and pass --cases your-cases.json; CSV is output, not an input format.
The default maximum skew is 300 seconds, inclusive, configurable with --max-skew-seconds. It checks the distance between observation times. It checks neither absolute age nor Amazon freshness: two equally old records can compare. Choose an evidence-age policy separately before using the result operationally.
Method: ipvolt prepared this analysis with AI assistance, checked the primary sources and ran the offline model plus 14 passing tests on 16 September 2026 using CPython 3.14.7. Python 3.11+ is the source target; 3.11 was not exercised in that recorded run. No seller account, API response mapping or retail price collection was tested.
For a mismatch between a submitted price and your own observed listing, use Amazon listing updates: accepted is not live. To schedule durable refreshes after listing events, use the companion SP-API notification guide. Keep this comparison's result attached to its two observations and stated subtotal basis before making a pricing decision.
ipvolt is in development. Join the early-access list for one email when access opens. Nothing else.