Skip to main content

Migrating from SellerBoard

SellerBoard (opens in a new tab) is an Amazon profit analytics tool. It connects to Seller Central and imports orders, fees, advertising costs, and refunds. It applies your product costs and shows profit and loss (P&L) by day, product, and marketplace.

DataDoe is an Amazon data layer. It stores Seller Central, Vendor Central, and Amazon Ads data in a documented schema. You can access the data through the app, exports, BigQuery, the DataDoe application programming interface (API), and Model Context Protocol (MCP). P&L is one of many available datasets. You can also analyze sales, advertising, inventory, and settlements from the same source, as well as manage your sales and ads with Actions.

What is different from SellerBoard?

The main differences are:

  • Sales tax is shown separately: When Amazon prices include sales tax, the P&L shows the reported tax in its own row and subtracts it from profit and estimated payout. If an order report omits item or shipping tax, DataDoe can recover it from the matching Amazon Finances order item when currency, quantity, and totals reconcile. US and Canada prices exclude sales tax, so the report does not add a separate tax row there. Tax that cannot be reconciled remains missing and is flagged.
  • Different cost of goods sold (COGS) engine: DataDoe uses dated unit costs instead of SellerBoard's batch, period, or first-in, first-out costs. You can upload your COGS export CSV from SellerBoard to DataDoe to match the costs. Learn more about uploading COGS to DataDoe.

How to view the Profit and Loss report in the browser

Open the Profit & Loss tab in Reports (opens in a new tab). The tab opens by default. Choose a Seller and a date range. You can also compare the result with the preceding period of the same length.

Set an interval to split the report into daily, weekly, or monthly columns.

The report follows the SellerBoard parent-row structure. Expand a row to see more detail where available.

Parent rowWhat the report shows
SalesShipped item price plus buyer-paid shipping, minus shipping promotions. Child rows: Shipped Sales (same as the total) and Unshipped Sales (not included in Sales)
Sales taxTax included in shipped item and gift-wrap prices, shown as a cost and deducted from profit where Amazon prices include tax. Buyer-paid shipping tax is offset in Shipping costs. Missing tax amounts are flagged
UnitsShipped units
RefundsNumber of REFUND finance events on the marketplace-local release date (settlements date). This is not the earlier transaction date/time.
Advertising costReported ad spend, shown as a cost. The report does not apply a blanket VAT uplift; the tax charged and whether it is recoverable depend on the advertising account
Shipping costsBuyer-paid shipping on shipped orders, minus shipping promotions, shown as a cost. The child row is labeled Fulfillment by Amazon (FBA) shipping chargeback
GiftwrapGift wrap charged on the order item
Refund costMoney returned on refunds, including refunded fees and shipping, plus the product cost of returns when Amazon received them. Sellable returns add the cost back. Unsellable returns reduce it
Amazon feesAmazon selling and account fees, shown as a cost. Advertising is under Advertising cost. Inventory Amazon lost or that went missing is under Cost of goods
Cost of goodsProduct cost for shipped units, plus inventory Amazon lost or damaged and inbound units that never arrived
Gross profit / Net profitSame total today; sales tax is deducted where Amazon prices include it. The report has no separate overhead line
Estimated payoutSales plus sales tax, fees, refund cost, advertising, shipping, gift wrap and promo
TACOS, % Refunds, Margin, ROITotal advertising cost of sales, refund rate, margin, and return on investment
Sessions and unit session percentageTraffic

Profit by Date and Profit by SKU & Date tables use the same calculation rules with different advertising scopes. Use Profit by Date through MCP to recreate the account Total for a Seller and date range. Summing Profit by SKU & Date does not recreate account profit.

How advertising affects product profit

Profit by Date includes Sponsored Products, Sponsored Brands, Sponsored Display, Sponsored Television, and Amazon DSP. Its sponsored_tv_ad_spend column shows the Television cost already included in ad_spend. Do not add it to advertising cost or subtract it from profit again.

Profit by SKU & Date includes reported Products and Display spend, plus estimated Brands and DSP spend. Television stays in account totals because its campaign report has no product attribution. Brands campaigns with no known ASIN and DSP line items with no ASIN conversion rows also stay in account totals.

Brands spend uses eligible ASINs in ad creatives, with daily ad cost rescaled to campaign cost. Remaining spend uses purchased-product shares. When purchase data is missing, it uses seller sales, orders and sessions, or splits evenly among known campaign ASINs. DSP spend uses each ASIN's share of line item sales, including brand halo; purchases or an even split are fallbacks. Both split ASIN spend across available SKUs using same-day order sales, or evenly when the sales total is zero. An ASIN with no available SKU rows keeps a null SKU.

These allocations support product cost analysis, but they do not prove which product caused an ad purchase. Brands same-SKU conversions are unavailable. Display units include all click-attributed purchases, so they can include other products. Ad-attributed sales overlap shipped sales and must not be added to total_sales.

Compare recent product profit with account profit before changing a budget. Campaign reports and product estimates can refresh at different times, and Amazon can revise conversions during the attribution window. Missing or delayed estimates can understate product ad spend and overstate product profit.

How to create a profit and loss summary with an AI agent

You can just paste the following prompt into your AI agent and let it do the work.

First, connect DataDoe MCP. To recreate the report Total, list the Seller and find the Profit by Date source (amazon_profit_by_date). Then create an export for the required dates with sum aggregations and no groupBy.

Use amazon_profit_by_date, not amazon_profit_by_sku_and_date. Calculate total advertising cost of sales (TACOS) from the date-range totals instead of adding daily values.

Sales tax, Shipping costs, Giftwrap, and Estimated payout appear in the app report but are not separate Profit by Date columns. Buyer-paid shipping, minus shipping promotions, is included in total_sales. The sales_tax column reports tax on shipped item and shipping prices as a positive cost amount; the P&L row displays it as a negative cost and offsets shipping tax in Shipping costs. The table's profit already subtracts sales tax, so do not subtract it again. The table does not apply a blanket VAT uplift to ad_spend; advertising VAT depends on the account. Report Refund cost also includes the product cost of returns Amazon received. The refund_cost column is settlement refund money only.

Paste the following prompt into your AI agent and replace the three placeholders. The prompt includes exact MCP tool names, argument names, limits, and call order. The agent must copy sourceId from exports_sources_get and columns from exports_source_get instead of guessing them.

Prompt for a SellerBoard-style profit and loss report generated with DataDoe MCP

You are using DataDoe MCP. Produce a SellerBoard-style P&L summary.
Include parent rows only and one Total for the date range.
Match Reports → Profit & Loss for the Seller and dates below.
Do not include daily, weekly, monthly, or comparison columns.

Inputs:
- seller name: {{seller_name}}
- from: {{from}}   (YYYY-MM-DD, inclusive)
- to: {{to}}       (YYYY-MM-DD, inclusive)

Do not use SQL, BigQuery, or the DataDoe web app.
Use only the tools named below.
Follow this order.

1) Tool: sellers_and_vendors_list
   Arguments (exact keys):
   {
     "query": "{{seller_name}}",
     "page": 1,
     "pageSize": 10
   }
   Pick the Seller Central row whose display name matches {{seller_name}}.
   Save its id as sellerOrVendorId (UUID).

2) Tool: exports_sources_get
   Arguments (exact keys):
   {
     "sellerOrVendorIds": ["<sellerOrVendorId from step 1>"],
     "query": "Profit by Date",
     "page": 1,
     "pageSize": 8
   }
   Select the source where table is amazon_profit_by_date and the user-facing name is "Profit by Date".
   Save sourceId from that object.
   If enabled is false, stop and tell the user to enable the table.

3) Tool: exports_source_get
   Arguments (exact keys):
   {
     "sellerOrVendorIds": ["<sellerOrVendorId from step 1>"],
     "sourceId": "<sourceId from step 2>",
     "page": 1,
     "pageSize": 40
   }
   This returns at most 40 columns. If columnsMeta.hasNextPage is true, the column list is incomplete. Call the same tool again with page 2, then further pages, until hasNextPage is false. Confirm columns such as total_sales, total_units_sold, ad_spend, profit, and total_sessions exist across those pages.

4) Tool: exports_create
   Create one total for {{from}} to {{to}} on amazon_profit_by_date.
   Use the exact argument keys below.
   Values for aggregations.column must be source columns.
   Values for columns must be the aliases:
   {
     "sellerOrVendorIds": ["<sellerOrVendorId from step 1>"],
     "sourceId": "<sourceId from step 2>",
     "from": "{{from}}",
     "to": "{{to}}",
     "outputType": "JSON",
     "limit": 1,
     "columns": [
       "sales",
       "sales_tax",
       "sales_tax_missing_items",
       "units",
       "refunds",
       "advertising_cost",
       "refund_cost",
       "amazon_fees",
       "cost_of_goods",
       "net_profit",
       "sessions"
     ],
     "aggregations": [
       { "column": "total_sales", "aggregation": "sum", "alias": "sales" },
       { "column": "sales_tax", "aggregation": "sum", "alias": "sales_tax" },
       { "column": "sales_tax_missing_items", "aggregation": "sum", "alias": "sales_tax_missing_items" },
       { "column": "total_units_sold", "aggregation": "sum", "alias": "units" },
       { "column": "refund_count", "aggregation": "sum", "alias": "refunds" },
       { "column": "ad_spend", "aggregation": "sum", "alias": "advertising_cost" },
       { "column": "refund_cost", "aggregation": "sum", "alias": "refund_cost" },
       { "column": "total_fees", "aggregation": "sum", "alias": "amazon_fees" },
       { "column": "cogs_total", "aggregation": "sum", "alias": "cost_of_goods" },
       { "column": "profit", "aggregation": "sum", "alias": "net_profit" },
       { "column": "total_sessions", "aggregation": "sum", "alias": "sessions" }
     ]
   }
   Do not set groupBy, dateInterval, filters, skip, or orderByColumn.

   Report row → export field:
   Sales → sales (UI: shipped item price plus buyer-paid shipping, minus shipping promotions; unshipped orders are excluded)
   Sales tax → sales_tax (show as a negative cost; profit already subtracts this positive cost once)
   Items missing tax data → sales_tax_missing_items
   Units → units
   Refunds → refunds
   Promo → always 0 (not in this table)
   Advertising cost → advertising_cost (reported ad spend; no blanket VAT uplift is applied)
   Shipping costs → n/a (buyer-paid shipping, minus shipping promotions, stays inside sales)
   Giftwrap → n/a (not on Profit by Date)
   Refund cost → refund_cost (settlement refund money, already signed; the report also includes the product cost of returns Amazon received)
   Amazon fees → amazon_fees
   Cost of goods → cost_of_goods
   Gross profit / Net profit → net_profit
   Estimated payout → n/a
   Sessions → sessions

5) If the status from step 4 is not already COMPLETED, tool: exports_get
   Arguments:
   { "exportId": "<id from step 4>" }
   Poll every 5 seconds until status is COMPLETED. Stop on ERROR or BLOCKED_NO_TOKENS.

6) Tool: exports_raw_download
   Arguments:
   { "exportId": "<same id>" }

Present the parent rows in the following report order.
Do not add other rows.
Show costs as negative values.
Show sales, units, and sessions as positive values.

- Sales = sales
- Units = units
- Refunds = refunds
- Promo = 0
- Advertising cost = if advertising_cost > 0 then -advertising_cost else advertising_cost
- Shipping costs = n/a
- Giftwrap = n/a
- Refund cost = refund_cost (already signed)
- Amazon fees = if amazon_fees > 0 then -amazon_fees else amazon_fees
- Cost of goods = if cost_of_goods > 0 then -cost_of_goods else cost_of_goods
- Sales tax = if sales_tax > 0 then -sales_tax else sales_tax
- Items missing tax data = sales_tax_missing_items
- Gross profit = net_profit
- Net profit = net_profit
- Estimated payout = n/a
- TACOS = abs(Advertising cost) / Sales   (if Sales is 0, null)
- % Refunds = Refunds / Units   (if Units is 0, null)
- Margin = Net profit / Sales   (if Sales is 0, null)
- ROI = Net profit / abs(Cost of goods)   (if Cost of goods is 0, null)
- Active subscriptions = 0
- Sessions = sessions
- Unit session percentage = Units / Sessions   (if Sessions is 0, null)

State that this is the Profit by Date total for {{from}} to {{to}}.
Explain that sales tax is shown as a separate cost where Amazon prices include it, that the profit field already subtracts it, and that cost of goods sold (COGS) uses unit costs uploaded to DataDoe.