> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nekt.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Amazon Vendor as a data source

> Bring data from Amazon Vendor Central to Nekt.

Amazon Vendor Central is the platform used by first-party vendors, the brands that sell their products *to* Amazon, which then resells them. Its retail analytics reports are exposed through the Amazon Selling Partner API (SP-API) and cover sales, traffic, inventory health, product margin, and Amazon's own demand forecast, all broken down by ASIN.

<Note>
  Vendor Central and Seller Central are different programs. If you sell directly to customers on the Amazon marketplace, you are a seller: use the [Amazon Selling Partner](/sources/amazon-sp) source instead. A vendor account has no seller orders, merchant listings, or FBA inventory, and a seller account has none of the vendor reports below.
</Note>

## Configuring Amazon Vendor as a Source

In the [Sources](https://app.nekt.ai/sources) tab, click on the "Add source" button located on the top right of your screen. Then, select the Amazon Vendor option from the list of connectors.

Click **Next** and you'll be prompted to add your access.

### 1. Add account access

You'll need to authorize Nekt to access your Amazon Vendor Central data. Click on the **Amazon Authorization** button and log in with your **Vendor Central** account. The authorization grants access to the vendor group tied to those credentials, and therefore to every vendor code in that group.

<Warning>
  The authorization must be granted from Vendor Central, not from Seller Central. A Seller Central authorization is accepted by Amazon but returns no vendor data, and every stream will fail as unauthorized.
</Warning>

The following configurations are available:

* **Region**: Select the region where your vendor account is registered:
  * North America (US, Canada, Mexico, Brazil)
  * Europe (UK, France, Germany, Italy, Spain, Netherlands, etc.)
  * Far East (Japan, Australia, Singapore)

* **Marketplace ID**: The Amazon marketplace your vendor account belongs to (e.g., `ATVPDKIKX0DER` for Amazon US, `A2Q3Y263D00KWC` for Amazon Brazil). A vendor account belongs to a single marketplace.

<Accordion title="Marketplace IDs">
  Find the complete list of marketplace IDs on this link: [https://developer-docs.amazon.com/sp-api/docs/marketplace-ids](https://developer-docs.amazon.com/sp-api/docs/marketplace-ids)

  | Region        | Country              | Marketplace Name | Marketplace ID |
  | :------------ | :------------------- | :--------------- | :------------- |
  | North America | United States        | Amazon.com       | ATVPDKIKX0DER  |
  | North America | Canada               | Amazon.ca        | A2EUQ1WTGCTBG2 |
  | North America | Mexico               | Amazon.com.mx    | A1AM78C64UM0Y8 |
  | North America | Brazil               | Amazon.com.br    | A2Q3Y263D00KWC |
  | Europe        | United Kingdom       | Amazon.co.uk     | A1F83G8C2ARO7P |
  | Europe        | Germany              | Amazon.de        | A1PA6795UKMFR9 |
  | Europe        | France               | Amazon.fr        | A13V1IB3VIYZZH |
  | Europe        | Italy                | Amazon.it        | APJ6JRA9NG5V4  |
  | Europe        | Spain                | Amazon.es        | A1RKKUPIHCS9HS |
  | Europe        | Netherlands          | Amazon.nl        | A1805IZSGTT6HS |
  | Europe        | Sweden               | Amazon.se        | A2NODRKZP88ZB9 |
  | Europe        | Poland               | Amazon.pl        | A1C3SOZRARQ6R3 |
  | Europe        | Belgium              | Amazon.com.be    | AMEN7PMS3EDWL  |
  | Far East      | Japan                | Amazon.co.jp     | A1VC38T7YXB528 |
  | Far East      | Singapore            | Amazon.sg        | A19VAU5U5O7RUS |
  | Far East      | Australia            | Amazon.com.au    | A39IBJ37TRP1C6 |
  | Far East      | India                | Amazon.in        | A21TJRUUN4KGV  |
  | Middle East   | United Arab Emirates | Amazon.ae        | A2VIGQ35RCS4UG |
  | Middle East   | Turkey               | Amazon.com.tr    | A33AVAJ2PDY3EV |
  | Middle East   | Saudi Arabia         | Amazon.sa        | A17E79C6D8DWNP |
  | Other         | Egypt                | Amazon.eg        | ARBP9OOSHTCHU  |
</Accordion>

* **Distributor view**: Which side of the business the sales and inventory numbers describe.
  * **Manufacturing**: your view as the manufacturer, including what Amazon ordered from you. This is the usual choice.
  * **Sourcing**: Amazon's view of what it sourced from you. Ordered revenue and ordered units are not reported in this view.

* **Selling program**: The Amazon program your vendor account participates in: **Retail**, **Business**, or **Fresh**. Amazon publishes the inventory and forecasting reports for Retail and Fresh only, so those two streams fall back to Retail when Business is selected. The run log records it when that happens.

* **Start Date**: The earliest date from which records will be synced. Amazon keeps roughly 4 years of daily vendor data, so earlier dates are automatically adjusted to the oldest date Amazon still serves.

Once you're done, click **Next**.

### 2. Select streams

Choose which data streams you want to sync. For faster extractions, select only the streams that are relevant to your analysis. You can select entire groups of streams or pick specific ones.

> Tip: The stream can be found more easily by typing its name.

Select the streams and click **Next**.

### 3. Configure data streams

Customize how you want your data to appear in your catalog. Select the desired layer where the data will be placed, a folder to organize it inside the layer, a name for each table (which will effectively contain the fetched data) and the type of sync.

* **Layer**: choose between the existing layers on your catalog. This is where you will find your new extracted tables as the extraction runs successfully.
* **Folder**: a folder can be created inside the selected layer to group all tables being created from this new data source.
* **Table name**: we suggest a name, but feel free to customize it. You have the option to add a **prefix** to all tables at once and make this process faster!
* **Sync Type**: you can choose between INCREMENTAL and FULL\_TABLE.
  * Incremental: every time the extraction happens, we'll get only the new data - which is good if, for example, you want to keep every record ever fetched.
  * Full table: every time the extraction happens, we'll get the current state of the data - which is good if, for example, you don't want to have deleted data in your catalog.

Once you are done configuring, click **Next**.

### 4. Configure data source

Describe your data source for easy identification within your organization, not exceeding 140 characters.

To define your [Trigger](https://docs.nekt.com/runs/scheduling-and-triggers), consider how often you want data to be extracted from this source. Amazon publishes vendor metrics with up to 72 hours of delay, so a daily trigger is usually enough.

Optionally, you can define some additional settings:

* Configure Delta Log Retention and determine for how long we should store old states of this table as it gets updated. Read more about this resource [here](https://docs.nekt.com/get-started/core-concepts/resource-control).
* Determine when to execute an **Additional [Full Sync](https://docs.nekt.com/get-started/core-concepts/types-of-sync#additional-full-sync)**. This will complement the incremental data extractions, ensuring that your data is completely synchronized with your source every once in a while.

Once you are ready, click **Next** to finalize the setup.

### 5. Check your new source

You can view your new source on the [Sources](https://app.nekt.ai/sources) page. If needed, manually trigger the source extraction by clicking on the arrow button. Once executed, your data will appear in your Catalog.

<Warning>For you to be able to see it on your [Catalog](https://app.nekt.ai/catalog), you need at least one successful source run.</Warning>

# Streams and Fields

All streams carry one record per ASIN per period. Amazon also returns account-wide totals in each report; those are not extracted, since they are the sum of the per-ASIN rows and can be recomputed with a `GROUP BY`.

<AccordionGroup>
  <Accordion title="Sales Report">
    Daily sales performance per ASIN, from the `GET_VENDOR_SALES_REPORT` report. Primary key is the composite `(asin, startDate)`.

    Which metrics Amazon fills in depends on your configuration: ordered revenue and ordered units are only reported for the Manufacturing distributor view, and customer returns only for the Retail and Business selling programs.

    | Field                        | Type    | Description                                                        |
    | :--------------------------- | :------ | :----------------------------------------------------------------- |
    | `startDate`                  | Date    | First day of the reported period (replication key)                 |
    | `endDate`                    | Date    | Last day of the reported period                                    |
    | `asin`                       | String  | Amazon Standard Identification Number                              |
    | `customerReturns`            | Integer | Quantity of units returned by customers                            |
    | `orderedRevenueAmount`       | Number  | Ordered product sales in the period, adjusted for returns          |
    | `orderedRevenueCurrencyCode` | String  | Currency of the ordered revenue                                    |
    | `orderedUnits`               | Integer | Number of units ordered by Amazon customers                        |
    | `shippedCogsAmount`          | Number  | Revenue based on the cost of goods sold, adjusted for returns      |
    | `shippedCogsCurrencyCode`    | String  | Currency of the shipped cost of goods sold                         |
    | `shippedRevenueAmount`       | Number  | Revenue based on units shipped in the period, adjusted for returns |
    | `shippedRevenueCurrencyCode` | String  | Currency of the shipped revenue                                    |
    | `shippedUnits`               | Integer | Number of units shipped to Amazon customers                        |
  </Accordion>

  <Accordion title="Traffic Report">
    Daily detail page traffic per ASIN, from the `GET_VENDOR_TRAFFIC_REPORT` report. Combined with the Sales Report, this is what makes conversion rate computable. Primary key is the composite `(asin, startDate)`.

    | Field         | Type    | Description                                         |
    | :------------ | :------ | :-------------------------------------------------- |
    | `startDate`   | Date    | First day of the reported period (replication key)  |
    | `endDate`     | Date    | Last day of the reported period                     |
    | `asin`        | String  | Amazon Standard Identification Number               |
    | `glanceViews` | Integer | Number of customer views of the product detail page |
  </Accordion>

  <Accordion title="Inventory Report">
    Daily inventory health per ASIN, from the `GET_VENDOR_INVENTORY_REPORT` report: what Amazon received from you, what it still holds, and how healthy that stock is. Primary key is the composite `(asin, startDate)`.

    | Field                                             | Type    | Description                                                                                 |
    | :------------------------------------------------ | :------ | :------------------------------------------------------------------------------------------ |
    | `startDate`                                       | Date    | First day of the reported period (replication key)                                          |
    | `endDate`                                         | Date    | Last day of the reported period                                                             |
    | `asin`                                            | String  | Amazon Standard Identification Number                                                       |
    | `vendorConfirmationRate`                          | Number  | Units confirmed by the vendor divided by the units Amazon asked for                         |
    | `netReceivedInventoryCostAmount`                  | Number  | Cost of inventory received, minus the cost of inventory returned to the vendor              |
    | `netReceivedInventoryCostCurrencyCode`            | String  | Currency of the net received inventory cost                                                 |
    | `netReceivedInventoryUnits`                       | Integer | Units received minus units returned to the vendor                                           |
    | `openPurchaseOrderUnits`                          | Integer | Units in confirmed purchase orders that Amazon has not received yet                         |
    | `averageVendorLeadTimeDays`                       | Number  | Average days between purchase order submission and receipt at a fulfillment center          |
    | `sellThroughRate`                                 | Number  | Units shipped (less returns) over units held at the start of the period plus units received |
    | `unfilledCustomerOrderedUnits`                    | Integer | Units ordered or pre-ordered by customers that have not shipped                             |
    | `sellableOnHandInventoryCostAmount`               | Number  | Cost of the sellable inventory on the last day of the period                                |
    | `sellableOnHandInventoryCostCurrencyCode`         | String  | Currency of the sellable on-hand inventory cost                                             |
    | `sellableOnHandInventoryUnits`                    | Integer | Sellable units on the last day of the period                                                |
    | `unsellableOnHandInventoryCostAmount`             | Number  | Cost of the unsellable inventory on the last day of the period                              |
    | `unsellableOnHandInventoryCostCurrencyCode`       | String  | Currency of the unsellable on-hand inventory cost                                           |
    | `unsellableOnHandInventoryUnits`                  | Integer | Unsellable units on the last day of the period                                              |
    | `aged90PlusDaysSellableInventoryCostAmount`       | Number  | Cost of sellable inventory at least 90 days old                                             |
    | `aged90PlusDaysSellableInventoryCostCurrencyCode` | String  | Currency of the aged 90+ days sellable inventory cost                                       |
    | `aged90PlusDaysSellableInventoryUnits`            | Integer | Sellable units at least 90 days old                                                         |
    | `unhealthyInventoryCostAmount`                    | Number  | Cost of the excess inventory, based on forecasted demand                                    |
    | `unhealthyInventoryCostCurrencyCode`              | String  | Currency of the unhealthy inventory cost                                                    |
    | `unhealthyInventoryUnits`                         | Integer | Excess inventory units, based on forecasted demand                                          |
  </Accordion>

  <Accordion title="Net Pure Product Margin Report">
    Daily net pure product margin per ASIN, from the `GET_VENDOR_NET_PURE_PRODUCT_MARGIN_REPORT` report. Primary key is the composite `(asin, startDate)`.

    | Field                  | Type   | Description                                                                                                              |
    | :--------------------- | :----- | :----------------------------------------------------------------------------------------------------------------------- |
    | `startDate`            | Date   | First day of the reported period (replication key)                                                                       |
    | `endDate`              | Date   | Last day of the reported period                                                                                          |
    | `asin`                 | String | Amazon Standard Identification Number                                                                                    |
    | `netPureProductMargin` | Number | Amazon's profitability on the product: (product revenue - product cost of goods sold - vendor funding) / product revenue |
  </Accordion>

  <Accordion title="Forecasting Report">
    Amazon's demand forecast per ASIN, from the `GET_VENDOR_FORECASTING_REPORT` report. Unlike the other reports this one looks forward, so each run pulls the current snapshot, covering several future periods per ASIN. Snapshots are kept side by side (keyed by `forecastGenerationDate`), so you can compare what Amazon predicted against what actually happened. Primary key is the composite `(asin, forecastGenerationDate, startDate)`.

    | Field                    | Type   | Description                                             |
    | :----------------------- | :----- | :------------------------------------------------------ |
    | `forecastGenerationDate` | Date   | Date on which Amazon generated this forecast            |
    | `asin`                   | String | Amazon Standard Identification Number                   |
    | `startDate`              | Date   | First day of the forecasted period                      |
    | `endDate`                | Date   | Last day of the forecasted period                       |
    | `meanForecastUnits`      | Number | Average number of units Amazon predicts will be ordered |
    | `p70ForecastUnits`       | Number | Units forecast with 70% probability of being ordered    |
    | `p80ForecastUnits`       | Number | Units forecast with 80% probability of being ordered    |
    | `p90ForecastUnits`       | Number | Units forecast with 90% probability of being ordered    |
  </Accordion>
</AccordionGroup>

# Use Cases for Data Analysis

This guide outlines valuable business intelligence use cases when consolidating Amazon Vendor data, along with ready-to-use SQL queries that you can run on [Explorer](https://app.nekt.ai/explorer).

### 1. Shipped Revenue and Margin by ASIN

Rank your catalog by what Amazon actually shipped, and check the margin Amazon makes on each product.

**Business Value:**

* Identify the products driving revenue
* Spot ASINs where Amazon's margin is thin, which is what buyers cite in cost negotiations
* Track customer returns against shipped units

<Accordion title="SQL query">
  <Tabs>
    <Tab title="AWS">
      ```sql theme={null}
      SELECT
         s.asin,
         SUM(s.shippedUnits) AS shipped_units,
         ROUND(SUM(s.shippedRevenueAmount), 2) AS shipped_revenue,
         ROUND(SUM(s.shippedCogsAmount), 2) AS shipped_cogs,
         SUM(s.customerReturns) AS customer_returns,
         ROUND(AVG(m.netPureProductMargin), 4) AS avg_net_pure_product_margin
      FROM
         nekt_raw.amazon_vendor_sales_report s
         LEFT JOIN nekt_raw.amazon_vendor_net_pure_product_margin_report m
            ON m.asin = s.asin AND m.startDate = s.startDate
      WHERE
         s.startDate >= CURRENT_DATE - INTERVAL '30' DAY
      GROUP BY
         s.asin
      ORDER BY
         shipped_revenue DESC
      ```
    </Tab>

    <Tab title="GCP">
      ```sql theme={null}
      SELECT
         s.asin,
         SUM(s.shippedUnits) AS shipped_units,
         ROUND(SUM(s.shippedRevenueAmount), 2) AS shipped_revenue,
         ROUND(SUM(s.shippedCogsAmount), 2) AS shipped_cogs,
         SUM(s.customerReturns) AS customer_returns,
         ROUND(AVG(m.netPureProductMargin), 4) AS avg_net_pure_product_margin
      FROM
         `nekt_raw.amazon_vendor_sales_report` s
         LEFT JOIN `nekt_raw.amazon_vendor_net_pure_product_margin_report` m
            ON m.asin = s.asin AND m.startDate = s.startDate
      WHERE
         s.startDate >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
      GROUP BY
         s.asin
      ORDER BY
         shipped_revenue DESC
      ```
    </Tab>
  </Tabs>
</Accordion>

<Accordion title="Sample Result">
  | asin       | shipped\_units | shipped\_revenue | shipped\_cogs | customer\_returns | avg\_net\_pure\_product\_margin |
  | ---------- | -------------- | ---------------- | ------------- | ----------------- | ------------------------------- |
  | B123456789 | 4,210          | 189,450.00       | 121,300.00    | 63                | 0.3120                          |
  | B987654321 | 2,980          | 96,120.50        | 70,880.00     | 41                | 0.2140                          |
  | B456789012 | 1,455          | 54,300.00        | 33,900.00     | 12                | 0.3760                          |
</Accordion>

### 2. Detail Page Conversion by ASIN

Combine traffic and sales to see which product pages convert the views they get.

**Business Value:**

* Find high-traffic, low-conversion pages where content or pricing is the bottleneck
* Prioritize A+ content and imagery work by potential impact
* Measure the effect of a listing change on conversion

<Accordion title="SQL query">
  <Tabs>
    <Tab title="AWS">
      ```sql theme={null}
      SELECT
         t.asin,
         SUM(t.glanceViews) AS glance_views,
         SUM(s.orderedUnits) AS ordered_units,
         CASE
            WHEN SUM(t.glanceViews) > 0
               THEN ROUND(SUM(s.orderedUnits) * 100.0 / SUM(t.glanceViews), 2)
            ELSE 0
         END AS conversion_rate_pct
      FROM
         nekt_raw.amazon_vendor_traffic_report t
         LEFT JOIN nekt_raw.amazon_vendor_sales_report s
            ON s.asin = t.asin AND s.startDate = t.startDate
      WHERE
         t.startDate >= CURRENT_DATE - INTERVAL '30' DAY
      GROUP BY
         t.asin
      HAVING
         SUM(t.glanceViews) > 100
      ORDER BY
         glance_views DESC
      ```
    </Tab>

    <Tab title="GCP">
      ```sql theme={null}
      SELECT
         t.asin,
         SUM(t.glanceViews) AS glance_views,
         SUM(s.orderedUnits) AS ordered_units,
         ROUND(SAFE_DIVIDE(SUM(s.orderedUnits) * 100.0, SUM(t.glanceViews)), 2) AS conversion_rate_pct
      FROM
         `nekt_raw.amazon_vendor_traffic_report` t
         LEFT JOIN `nekt_raw.amazon_vendor_sales_report` s
            ON s.asin = t.asin AND s.startDate = t.startDate
      WHERE
         t.startDate >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
      GROUP BY
         t.asin
      HAVING
         SUM(t.glanceViews) > 100
      ORDER BY
         glance_views DESC
      ```
    </Tab>
  </Tabs>
</Accordion>

<Accordion title="Sample Result">
  | asin       | glance\_views | ordered\_units | conversion\_rate\_pct |
  | ---------- | ------------- | -------------- | --------------------- |
  | B123456789 | 84,320        | 4,560          | 5.41                  |
  | B987654321 | 51,780        | 3,020          | 5.83                  |
  | B456789012 | 22,140        | 640            | 2.89                  |
</Accordion>

### 3. Stock Risk Against Amazon's Forecast

Compare the stock Amazon holds today with what it forecasts it will sell, to anticipate stockouts and excess.

**Business Value:**

* Flag ASINs whose on-hand cover is below Amazon's own demand forecast
* Catch aging and unhealthy inventory before it turns into chargebacks
* Bring an objective number to purchase order negotiations

<Accordion title="SQL query">
  <Tabs>
    <Tab title="AWS">
      ```sql theme={null}
      WITH latest_inventory AS (
         SELECT
            asin,
            sellableOnHandInventoryUnits,
            openPurchaseOrderUnits,
            unhealthyInventoryUnits,
            aged90PlusDaysSellableInventoryUnits,
            ROW_NUMBER() OVER (PARTITION BY asin ORDER BY startDate DESC) AS rn
         FROM
            nekt_raw.amazon_vendor_inventory_report
      ),
      next_4_weeks AS (
         SELECT
            asin,
            SUM(meanForecastUnits) AS forecast_units
         FROM
            nekt_raw.amazon_vendor_forecasting_report
         WHERE
            forecastGenerationDate = (SELECT MAX(forecastGenerationDate) FROM nekt_raw.amazon_vendor_forecasting_report)
            AND startDate <= CURRENT_DATE + INTERVAL '28' DAY
         GROUP BY
            asin
      )
      SELECT
         i.asin,
         i.sellableOnHandInventoryUnits,
         i.openPurchaseOrderUnits,
         f.forecast_units,
         i.sellableOnHandInventoryUnits + i.openPurchaseOrderUnits - f.forecast_units AS projected_gap,
         i.aged90PlusDaysSellableInventoryUnits,
         i.unhealthyInventoryUnits
      FROM
         latest_inventory i
         JOIN next_4_weeks f ON f.asin = i.asin
      WHERE
         i.rn = 1
      ORDER BY
         projected_gap ASC
      ```
    </Tab>

    <Tab title="GCP">
      ```sql theme={null}
      WITH latest_inventory AS (
         SELECT
            asin,
            sellableOnHandInventoryUnits,
            openPurchaseOrderUnits,
            unhealthyInventoryUnits,
            aged90PlusDaysSellableInventoryUnits,
            ROW_NUMBER() OVER (PARTITION BY asin ORDER BY startDate DESC) AS rn
         FROM
            `nekt_raw.amazon_vendor_inventory_report`
      ),
      next_4_weeks AS (
         SELECT
            asin,
            SUM(meanForecastUnits) AS forecast_units
         FROM
            `nekt_raw.amazon_vendor_forecasting_report`
         WHERE
            forecastGenerationDate = (SELECT MAX(forecastGenerationDate) FROM `nekt_raw.amazon_vendor_forecasting_report`)
            AND startDate <= DATE_ADD(CURRENT_DATE(), INTERVAL 28 DAY)
         GROUP BY
            asin
      )
      SELECT
         i.asin,
         i.sellableOnHandInventoryUnits,
         i.openPurchaseOrderUnits,
         f.forecast_units,
         i.sellableOnHandInventoryUnits + i.openPurchaseOrderUnits - f.forecast_units AS projected_gap,
         i.aged90PlusDaysSellableInventoryUnits,
         i.unhealthyInventoryUnits
      FROM
         latest_inventory i
         JOIN next_4_weeks f ON f.asin = i.asin
      WHERE
         i.rn = 1
      ORDER BY
         projected_gap ASC
      ```
    </Tab>
  </Tabs>
</Accordion>

<Accordion title="Sample Result">
  | asin       | sellableOnHandInventoryUnits | openPurchaseOrderUnits | forecast\_units | projected\_gap | aged90PlusDaysSellableInventoryUnits | unhealthyInventoryUnits |
  | ---------- | ---------------------------- | ---------------------- | --------------- | -------------- | ------------------------------------ | ----------------------- |
  | B456789012 | 120                          | 300                    | 980             | -560           | 0                                    | 0                       |
  | B987654321 | 1,540                        | 0                      | 1,700           | -160           | 210                                  | 0                       |
  | B123456789 | 4,300                        | 1,200                  | 2,900           | 2,600          | 890                                  | 640                     |
</Accordion>

## Implementation Notes

<AccordionGroup>
  <Accordion title="Vendor is not Seller">
    Vendor Central and Seller Central data both live on the Amazon Selling Partner API, but on disjoint endpoints. A vendor sells to Amazon, so it has no seller orders, no merchant listings, and no FBA inventory; those are covered by the [Amazon Selling Partner](/sources/amazon-sp) source. The authorization is separate as well: this connector requires consent granted from Vendor Central, and a seller refresh token will be rejected by every stream.
  </Accordion>

  <Accordion title="Report-Based Extraction">
    All streams use the SP-API Reports API. Reports are generated asynchronously: the connector submits a report request, polls until it's ready (up to 30 minutes per window: 60 attempts × 30 seconds), then downloads and parses the JSON document, decompressing it when Amazon returns GZIP.

    Amazon caps how much a single daily report may span at 15 days, so each sync walks the requested range in 14-day windows. Requesting a long history therefore creates many reports, and the first sync of several years of data takes a while.
  </Accordion>

  <Accordion title="Incremental Sync and Restatement">
    The Sales, Traffic, Inventory, and Net Pure Product Margin streams use `startDate` as the replication key.

    Amazon revises recent vendor metrics after the fact, as returns are processed and costs adjusted. To keep already-loaded rows in sync instead of freezing them at their first value, every incremental run rewinds its bookmark by 30 days and re-reads that window. Re-extracted rows carry the same primary key, so they update in place rather than duplicating.

    The Forecasting Report is a forward-looking snapshot with no date range, so it is always a full extraction. Each run's snapshot is preserved through the `forecastGenerationDate` in its primary key.
  </Accordion>

  <Accordion title="Data Availability and Retention">
    * **Publication lag**: Amazon takes up to 72 hours to publish a day's metrics, so extraction windows stop one day short of today. Recent days are filled in by later runs through the 30-day rewind above.
    * **Retention**: roughly 4 years (1460 days) of daily data. A `Start Date` earlier than that is automatically clamped, and the run log states the adjusted date.
    * **Selling program**: the Inventory and Forecasting reports exist for Retail and Fresh only. When the source is configured as Business, those two streams are extracted for Retail and the run log records the fallback.
  </Accordion>

  <Accordion title="Rate Limit and Retry Handling">
    Amazon refills the report creation quota roughly once per minute, so long backfills are throttled by design. The connector handles this automatically:

    * **429 QuotaExceeded**: retried up to 5 times. The `Retry-After` header is respected when present, otherwise exponential backoff is used, starting at 60 seconds and doubling each attempt. Waits are reported in the run log, which is why a large first sync may look slow.
    * **Stale connections**: if the server closes an idle connection during a long polling sleep, the connector reopens the session and retries transparently.
    * **Access tokens** are refreshed 15 minutes before expiration to avoid failures in the middle of a long extraction.
  </Accordion>
</AccordionGroup>

## Skills for agents

<Snippet file="agent-skills-intro.mdx" />

<Card title="Download Amazon Vendor skills file" icon="wand-magic-sparkles" href="/sources/amazon-vendor.md">
  Amazon Vendor connector documentation as plain markdown, for use in AI agent contexts.
</Card>
