Seller Profit Doctor
Server Details
Free profit check-up for Etsy, Shopify and Amazon sellers: fees, sales, ads, shipping, plans, rates.
- Status
- Healthy
- Uptime
- 100.0% over 23 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- FelixNovaNexus/sellerprofitdoctor-mcp
- GitHub Stars
- 0
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 16 tools
The tools are exceptionally well-differentiated by platform (Etsy, Shopify, Amazon) and by specific function (e.g., fee calculation vs. shipping calculation vs. plan optimization). Even conceptually similar tasks are separated into highly specific, distinct functions.
The naming convention is flawlessly consistent, adhering to the structure 'sellerprofit_domain_action' throughout. This predictable pattern makes the tools highly discoverable and easy to grasp at a glance.
With 16 tools, the server provides a remarkably comprehensive and granular view of e-commerce profitability across multiple platforms. Each tool performs a highly specific, complex calculation, justifying its inclusion in the toolset.
The tool set covers the entire financial lifecycle of a seller, including ad ROI (ACoS/ROAS), platform fees, shipping costs, pricing for margin, and platform-specific optimizations (like Shopify plan fit). It is a complete financial modeling suite.
Available Tools
16 toolssellerprofit_ads_breakevenBreak-even ROAS for Etsy AdsARead-onlyIdempotentInspect
Works out the ROAS at which an Etsy shop's Etsy Ads pay for themselves (break-even ROAS = order ÷ what an ad order keeps after Etsy's fees and costs), the most an ad can cost per sale, and, with the shop's ROAS, what the ads gain or lose a month. It fits a seller who asks whether Etsy Ads are worth it, what ROAS they need, or whether to turn ads off. Takes the item price, shipping charged, materials, label cost, and the daily budget or exact monthly spend; packaging is optional ($1 typical, flagged) and ROAS from the Etsy Ads page adds the monthly gain or loss and the fix. Returns the margin, break-even ROAS, ad sales and earnings, the monthly gain or loss and, when the ads lose money, the fix and what it's worth. US dollars; dated Etsy rules with sources. Free, no sign-in. Takes numbers only; nothing is stored.
| Name | Required | Description | Default |
|---|---|---|---|
| roas | No | Return on ad spend, last 30 days (Etsy Ads page): ad revenue ÷ ad spend, such as 1.5. Left out: only the break-even is returned. | |
| itemPrice | Yes | Typical item price, US dollars, before shipping. | |
| labelCost | Yes | The shipping label, US dollars. | |
| materials | Yes | Materials and supplies per item, US dollars. | |
| packaging | No | Packaging per order in US dollars, or mailer (about $1), box (about $3) or not-sure. Left out: $1, a weakly sourced typical figure, flagged as a default. | |
| adsDailyBudget | No | Etsy Ads daily budget, US dollars, $1 or more (Etsy's smallest; assumed fully spent, 30 days a month). Or send adsMonthlySpend. | |
| adsMonthlySpend | No | Exact Etsy Ads spend last 30 days, US dollars. Or send adsDailyBudget. | |
| shippingCharged | No | What the buyer pays for shipping, US dollars (0 if free). |
Output Schema
| Name | Required | Description |
|---|---|---|
| fix | Yes | |
| link | Yes | Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent. |
| roas | Yes | |
| text | Yes | |
| rates | Yes | Which rules the numbers use, as of when, and where they come from. |
| status | Yes | |
| adSales | Yes | ROAS × spend, a month. |
| platform | Yes | |
| orderTotal | Yes | |
| assumptions | Yes | |
| marginForAds | Yes | profitPerAdOrder ÷ order total. |
| breakEvenRoas | Yes | 1 ÷ margin: ads pay back at this ROAS or more. Null when each order loses money before the ad. |
| adSpendMonthly | Yes | |
| earnedAfterCosts | Yes | Ad sales × margin, a month. |
| profitPerAdOrder | Yes | What an order an ad brought keeps before the ad: order − Etsy fees − materials − packaging − label (no Offsite fee on it). Also the most an ad can cost per sale. |
| monthlyGainOrLoss | Yes | earnedAfterCosts − spend: negative means the ads cost more than they bring in. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, and the description corroborates with "Free, no sign-in. Takes numbers only; nothing is stored." It adds useful behavioral context—dated Etsy rules with sources, the flagged $1 packaging default, and the fully-spent 30-day budget assumption—but does not discuss rate limits, error behavior, or precision/rounding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The computation is front-loaded, which is good, but the prose is dense and parenthetical-heavy, with a long run-on opening clause and a return-values sentence that partially duplicates what the output schema already conveys. Some of that length does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter calculation tool with an output schema, the description covers units (US dollars), input dependencies (daily budget vs. monthly spend), the optional packaging default, and sourcing/currency assumptions. Return values are largely covered by the output schema, so this is close to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents each parameter thoroughly, making 3 the baseline. The description restates the inputs and adds a little framing (ROAS from the Etsy Ads page unlocks the monthly gain/loss; packaging defaults to $1 and is flagged), but mostly echoes the schema rather than adding new semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource—computing the ROAS at which Etsy Ads pay for themselves—and enumerates the concrete outputs (break-even ROAS, max cost per sale, monthly gain/loss). It also implicitly scopes to Etsy versus the amazon_ads_breakeven sibling by naming Etsy fees and rules. It does not, however, distinguish itself from the near-identically named sellerprofit_ads_roas_breakeven sibling, leaving ambiguity about which to choose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"It fits a seller who asks whether Etsy Ads are worth it, what ROAS they need, or whether to turn ads off" gives clear situational triggers for use. There are no explicit exclusions or named alternatives (e.g., when to prefer the ROAS-only sibling), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sellerprofit_ads_roas_breakevenBreak-even ROAS for Facebook, Instagram and Google adsARead-onlyIdempotentInspect
Works out the ROAS (ad revenue ÷ ad spend, as Meta or Google reports it) at which Facebook, Instagram or Google ads pay for themselves, when the ad sends buyers to a Shopify store, an Etsy listing or an Amazon listing, with that platform's own fees on the order. Break-even ROAS = order ÷ what one ad order keeps after the platform's fees, product, label, packaging and refunds; that amount is also the most an ad can cost per order. It fits a seller who asks what ROAS they need, why ads with a ROAS of 3 still lose money, or whether to pause Meta or Google ads. Takes the item price, product cost and label; optionally the platform (shopify default), shipping charged, packaging ($1 typical, flagged), the refund share, and the platform's own field (Shopify plan, Amazon category and fulfillment fee). The monthly ad spend with the reported ROAS or ad revenue adds the monthly gain or loss and the fix; all orders a month check the ad platform's count against the seller's own orders. Returns the order line by line, what an ad order keeps, the margin, the break-even ROAS, and with spend the monthly gain or loss. Says that Meta and Google count purchases with their own attribution windows, so their ROAS can differ from the store's own orders. US dollars; dated rates with sources. Free, no sign-in. Takes numbers only; nothing is stored.
| Name | Required | Description | Default |
|---|---|---|---|
| roas | No | The ROAS the ad platform reports (Meta Ads Manager or Google Ads, last 30 days): ad revenue ÷ ad spend, as a plain number such as 2.5. Google shows ROAS as a percent: 250% is 2.5. Or send adRevenue with adSpendMonthly. Left out: only the break-even is returned. | |
| category | No | Amazon only: the referral category, or not-sure. Left out: Everything Else (15%), flagged. | |
| platform | No | Where the ad sends buyers: shopify (the store), etsy (an Etsy listing) or amazon (an Amazon listing). Left out: shopify, flagged. | |
| adRevenue | No | Optional: the purchase value the ad platform reports for the last 30 days, US dollars. Send with adSpendMonthly; ROAS = adRevenue ÷ adSpendMonthly. | |
| itemPrice | Yes | The average order before shipping, US dollars: what the buyer pays for the item (one item an order). | |
| labelCost | Yes | The shipping label per order, US dollars (0 if Amazon ships it). | |
| packaging | No | Packaging per order in US dollars, or mailer (about $1), box (about $3) or not-sure. Left out: $1, a weakly sourced typical figure, flagged as a default. | |
| productCost | Yes | Product or materials cost per order, US dollars (Amazon: landed cost). | |
| refundShare | No | Optional: the share of orders refunded in full, a fraction from 0 to 0.9 (0.05 is 5%). A refunded order is counted as: the item comes back and can be sold again, the buyer pays the return label, and the seller loses the label, packaging and the fees the platform doesn't return. Left out: no refunds, flagged. | |
| shopifyPlan | No | Shopify only: the plan, which sets the Shopify Payments card rate. Left out: basic, flagged. | |
| adSpendMonthly | No | Optional: ad spend in the last 30 days on Meta (Facebook, Instagram) or Google, US dollars. With roas or adRevenue it gives the monthly gain or loss. | |
| fulfillmentFee | No | Amazon only: the FBA fee per unit (Fee Preview) when Amazon ships it, US dollars. Left out: 0 (the seller ships), flagged. | |
| ordersPerMonth | No | Optional: all the orders the store or shop had in the last 30 days, from every source, a whole number. Send with adSpendMonthly: checks the ad platform's count against your own orders. | |
| shippingCharged | No | What the buyer pays for shipping on that order, US dollars (0 if free). Left out: 0, flagged. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fix | Yes | |
| fees | Yes | |
| link | Yes | Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent. |
| roas | Yes | The ROAS used: as typed, or adRevenue ÷ adSpendMonthly. |
| text | Yes | |
| label | Yes | |
| notes | Yes | What the math counts, assumes and leaves out, in plain words. |
| rates | Yes | Which rules the numbers use, as of when, and where they come from. |
| status | Yes | |
| adSales | Yes | ROAS × spend, a month: the sales the ad platform credits to the ads. |
| platform | Yes | |
| roasFrom | Yes | |
| itemPrice | Yes | |
| packaging | Yes | |
| totalFees | Yes | |
| orderTotal | Yes | Item + shipping the buyer pays. |
| assumptions | Yes | |
| keptPerSale | Yes | Order − fees − product − label − packaging, on an order that isn't refunded. Negative is a loss. |
| productCost | Yes | |
| refundShare | Yes | The share of counted orders refunded in full (0 when left out). |
| marginForAds | Yes | keptPerAdOrder ÷ order total. |
| ownOrdersCap | Yes | When the ad platform counts more orders than the store had all month: all orders × keptPerAdOrder − spend, the most the ads can earn a month even if every order came from them. Negative means the ads can't pay back at the seller's own orders. Use it instead of monthlyGainOrLoss then. Null otherwise. |
| allOrdersRoas | Yes | All orders × order total ÷ spend: the ROAS if every order of the month had come from the ads. Under the break-even, the ads can't pay back whatever the ad platform counts. |
| breakEvenRoas | Yes | 1 ÷ margin: ads pay back at this ROAS or more (Google's percent is this × 100). Null when each order loses money before the ad. |
| lostPerRefund | Yes | What one refunded order loses: the fees not returned + label + packaging (the item comes back). Null with no refunds. |
| adCostPerOrder | Yes | Spend ÷ adOrdersCounted (= order ÷ ROAS): what each counted order cost in ads. |
| adSpendMonthly | Yes | |
| keptPerAdOrder | Yes | What one order an ad brought keeps before the ad, on average: (1 − refund share) × keptPerSale − refund share × lostPerRefund. Also the most an ad can cost per order. Negative is a loss. |
| ordersPerMonth | Yes | |
| adOrdersCounted | Yes | adSales ÷ order total: the orders the ad platform credits to the ads, a month (not rounded). |
| shippingCharged | Yes | |
| earnedAfterCosts | Yes | adSales × margin, a month. |
| lostPerRefundHow | Yes | |
| monthlyGainOrLoss | Yes | earnedAfterCosts − spend: negative means the ads cost more than they bring in. |
| referralOtherReading | Yes | Amazon stepped categories (Beauty, Baby, Grocery, Clothing, Lawn Mowers) above a price line: the fee is read on the whole price, which a public Amazon page doesn't confirm; this is the other reading. Null otherwise. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, idempotent, closed-world), and the description adds genuinely new behavior: free, no sign-in, numbers only and nothing stored, USD with dated sourced rates, and flagged weakly-sourced defaults such as the $1 packaging figure. It also discloses the attribution-window caveat explaining why platform-reported ROAS can diverge from the store's own order count — non-obvious information no structured field carries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the opening clause, which is correct, but the body is three packed, semi-colon-heavy sentences that are hard to parse and partly redundant ('that amount is also the most an ad can cost per order'). For a 14-parameter tool the length is defensible, yet the dense run-on formulation costs readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 14 parameters, three enums, an output schema and existing annotations, the description still covers what is computed, which inputs are required vs optional, how the optional spend path changes the result, and the attribution caveat. Nothing an agent needs in order to call this correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter including enum meanings and defaults. The description restates the same knobs (platform default shopify, packaging ~$1, refund share, Shopify plan, Amazon category/fulfillment fee) and the roas-or-adRevenue+adSpendMonthly coupling without adding new syntax or format detail. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource: computes the break-even ROAS at which Meta/Google ads pay for themselves when traffic goes to Shopify, Etsy or Amazon. The platform scope (Meta/Google ads, not Amazon ads) implicitly separates it from sellerprofit_amazon_ads_breakeven, but no sibling is named explicitly, so an agent must infer the routing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggering questions: 'what ROAS they need, why ads with a ROAS of 3 still lose money, or whether to pause Meta or Google ads.' That is clear when-to-use guidance. There are no explicit exclusions or named alternatives (e.g. sellerprofit_sale_breakeven, sellerprofit_offsite_ads) for an agent choosing between near-neighbours.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sellerprofit_amazon_ads_breakevenBreak-even ACoS for Amazon adsARead-onlyIdempotentInspect
Works out the ACoS (ad spend ÷ the sales the ads bring) at which Amazon Sponsored Products pay for themselves: what a unit an ad brings keeps before the ad (after the referral fee, the FBA fee estimate or the label and packaging, storage and the landed cost) as a share of what the buyer pays. Gives it outside peak season and in peak (October 15 to January 14), when the FBA peak fee lowers it. It fits a seller who asks what ACoS they need, whether their Amazon ads pay, or what to bid. Takes the price, category, fba or fbm, the packed size and weight bands or the packed dimensions (FBA) or shipping charged (FBM), and the landed cost. Optional: the monthly ad spend with the ACoS (or the ad sales) for the monthly gain or loss and the fix, and the conversion rate for the highest cost per click that pays. Amazon publishes no ACoS benchmark: the seller's own break-even is the test. The FBA fee and storage are estimates (estimate: true); Amazon's Fee Preview shows a seller's real fee. Assumes the Professional plan. Dated rates with sources. Free, no sign-in. Takes numbers only; nothing is stored.
| Name | Required | Description | Default |
|---|---|---|---|
| acos | No | ACoS, last 30 days (Campaign Manager): ad spend ÷ the sales the ads brought, as a fraction (0.3 is 30%). Or send adSales with adSpend. | |
| price | Yes | The selling price on Amazon, US dollars. | |
| packed | No | The packed size and weight, as Amazon measures it: makes the FBA estimate and the size and weight checks exact to the rate card. | |
| adSales | No | Sales the ads brought, last 30 days, US dollars (Campaign Manager). Send with adSpend; the ACoS is adSpend ÷ adSales. | |
| adSpend | No | Sponsored Products spend, last 30 days, US dollars (Campaign Manager). With acos or adSales it gives the monthly gain or loss. | |
| category | Yes | The Amazon category, which sets the referral fee, or not-sure (Everything Else, 15%, flagged). | |
| sizeBand | No | FBA: small-flat (fits 15 × 12 × 0.75 in), standard-box (up to 18 × 14 × 8 in) or bigger. Send with weightBand, or send packed. | |
| labelCost | No | FBM: what the shipping label costs, US dollars. Left out: shipping is treated as breaking even (label = shipping charged − packaging), flagged. | |
| packaging | No | FBM: packaging per order, US dollars. Left out: $1, a weakly sourced typical figure, flagged. | |
| landedCost | Yes | What one unit costs the seller, delivered: product, freight, duties and prep, to Amazon's door (FBA) or the seller's (FBM). US dollars. | |
| weightBand | No | FBA: the packed weight band (the top of the band is used; over-3lb has no top, so it is billed from 3 lb and heavier items cost more: send packed for a closer number). Send with sizeBand. | |
| fulfillment | Yes | fba (Amazon ships; adds the FBA fee estimate) or fbm (the seller ships). | |
| conversionRate | No | Orders ÷ clicks on the ads, last 30 days (Campaign Manager), as a fraction (0.1 is 10%). Adds the highest cost per click that still pays. | |
| shippingCharged | No | FBM: what the buyer pays for shipping, US dollars (0 if free). The referral fee is charged on price + shipping. Default 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fba | Yes | FBA only: an estimate from Amazon's 2026 rate cards for the size given. Fee Preview in Seller Central shows the real fee. |
| acos | Yes | The ACoS used, as a fraction. |
| link | Yes | Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent. |
| peak | Yes | |
| text | Yes | |
| notes | Yes | What the break-even leaves out or assumes, whatever was sent. |
| price | Yes | |
| rates | Yes | Which rules the numbers use, as of when, and where they come from. |
| adSpend | Yes | |
| offPeak | Yes | |
| acosFrom | Yes | typed: the acos sent; ad_sales: adSpend ÷ adSales. |
| category | Yes | |
| fbmLabel | Yes | FBM only: the label and packaging counted per order. |
| platform | Yes | |
| referral | Yes | The referral fee's working and whether its reading is confirmed. |
| peakWindow | Yes | |
| assumptions | Yes | |
| fulfillment | Yes | |
| conversionRate | Yes | |
| shippingCharged | Yes | |
| storageCubicFeet | Yes | Cubic feet per packed unit, when storage is counted (FBA with a packed size). |
| vendorMedianAcos | Yes | Context only, a third-party figure: Amazon publishes no ACoS benchmark. Never call it a good ACoS; the seller's own break-even is the test. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only/idempotent annotations, the description discloses that FBA fee and storage are estimates (flagged estimate: true), that Amazon's Fee Preview shows real fees, that results assume the Professional plan, and that rates are dated with sources. It also explains the peak-season fee window (Oct 15–Jan 14) that lowers the break-even — meaningful behavioral context the annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core definition and formula come first, followed by optional-input behavior and caveats, so it is well front-loaded. It is dense and a couple of sentences are overlong (the parenthetical fee list), but nearly every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 14 parameters, nested objects, an output schema, and rich annotations, the description covers what is missing from structured data: assumptions (Professional plan), estimate flags, seasonality, and the no-benchmark caveat. It also states free/no sign-in/nothing stored, which matters for an agent assessing invocation safety.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage the baseline is 3, but the description adds cross-parameter relationships the schema does not: adSpend paired with acos/adSales yields the monthly gain/loss and 'the fix', and conversionRate yields the highest cost per click that pays. It also frames the FBA vs FBM parameter branches (packed/weightBand vs shippingCharged/labelCost/packaging).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Works out the ACoS ... at which Amazon Sponsored Products pay for themselves,' and defines the formula in plain terms. It anchors the tool to the Amazon Sponsored Products context, which distinguishes it from generic sibling tools like sellerprofit_ads_breakeven and sellerprofit_offsite_ads.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names the seller questions that select this tool ('what ACoS they need, whether their Amazon ads pay, or what to bid'), giving clear usage context. However, it never names an alternative sibling tool or states when NOT to use it — notably it does not tell the agent to prefer sellerprofit_ads_roas_breakeven when ROAS is the target.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sellerprofit_amazon_feesFees on one Amazon unitARead-onlyIdempotentInspect
Works out Amazon's fees on one unit at a price: the referral fee for the category (official, with the $0.30 minimum where the category has one), the $1.80 media closing fee (official), and for FBA an estimate of the fulfillment fee from Amazon's 2026 rate cards by size tier and weight, with the 3.5% fuel and logistics surcharge, and the peak-season fee from October 15 to January 14. It fits a seller who asks what Amazon takes on a sale, what FBA costs for an item, whether a price sits just over a fee line, or whether FBA or shipping it themselves costs less. Takes the price, category, fba or fbm, and for FBA the packed size and weight bands (or the packed dimensions); for FBM, the shipping the buyer pays. Or takes both (with packed, labelCost and, optionally, packaging, minutesPerOrder with hourlyValue, unitsPerMonth, inboundSplit and freightToAmazon) and compares Amazon shipping it with the seller shipping it for the same item, outside peak and from October 15 to December 31: each side's costs and what's left per unit, storage from the packed size, monthly totals, and the label + packaging + time where the answer flips. Assumes the Professional selling plan (the Individual plan adds $0.99 an item). Returns each fee, the total outside and in peak, what's left, and the price lines where a fee steps; a line whose reading Amazon doesn't confirm is marked verified: false. The FBA figure is estimate: true; Amazon's Fee Preview shows a seller's real fee. Dated rates with sources. Free, no sign-in. Takes numbers only; nothing is stored.
| Name | Required | Description | Default |
|---|---|---|---|
| price | Yes | The selling price on Amazon, US dollars. | |
| packed | No | The packed size and weight, as Amazon measures it: makes the FBA estimate exact to the rate card (with dimensional weight). Required with both: it can change which side leaves more, and gives the storage (cubic feet). | |
| category | Yes | The Amazon category, which sets the referral fee, or not-sure (Everything Else, 15%, flagged). | |
| sizeBand | No | FBA only (both needs packed): small-flat (fits 15 × 12 × 0.75 in), standard-box (up to 18 × 14 × 8 in) or bigger. Send with weightBand, or send packed. | |
| labelCost | No | both (required): what the seller's shipping label costs per order, US dollars. | |
| packaging | No | both: packaging per order, US dollars. Left out: $1, a weakly sourced typical figure, flagged. | |
| weightBand | No | FBA only (both needs packed): the packed weight band (the top of the band is used; over-3lb has no top, so it is billed from 3 lb and heavier items cost more: send packed for a closer number). Send with sizeBand. | |
| fulfillment | Yes | fba (Amazon ships; adds the FBA fee estimate), fbm (the seller ships), or both (the two side by side for the same item: send packed and labelCost). | |
| hourlyValue | No | both: what an hour of the seller's time is worth, US dollars. Send with minutesPerOrder. | |
| inboundSplit | No | both: how stock goes to Amazon: minimal (one location; Amazon charges a placement fee), partial (2–3 locations, offered only for bulky sizes; a standard-size unit is priced as minimal), or optimized (Amazon's split, no placement fee). Extra-large pays none. Left out: placement isn't counted (said). | |
| unitsPerMonth | No | both: units sold a month; adds monthly totals. | |
| freightToAmazon | No | both: the seller's own freight per unit to send stock to Amazon, US dollars. Left out: not counted (said). | |
| minutesPerOrder | No | both: minutes the seller spends packing and shipping one order. Send with hourlyValue. Left out: the seller's time isn't counted (said). | |
| shippingCharged | No | FBM or both: what the buyer pays for shipping when the seller ships, US dollars (0 if free). The referral fee is charged on price + shipping. Default 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fba | Yes | FBA only. An estimate from Amazon's 2026 rate cards for the size given: Amazon measures the unit itself; Fee Preview shows the real fee. |
| link | Yes | Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent. |
| plan | Yes | The fees assume the Professional selling plan. |
| text | Yes | |
| price | Yes | |
| rates | Yes | Which rules the numbers use, as of when, and where they come from. |
| compare | No | fulfillment both only: Amazon shipping it and the seller shipping it, side by side. The top-level fees are the FBA side's. |
| category | Yes | |
| platform | Yes | |
| referral | Yes | |
| afterFees | Yes | Price + shipping − fees outside peak: what's left per unit before landed cost, ads, storage and (FBM) the label. |
| totalFees | Yes | Referral + closing + FBA, per unit, US dollars. |
| closingFee | Yes | |
| priceLines | Yes | Prices where a fee steps: referral steps in this category and, for FBA, the $10 and $50 price bands of the fee card. |
| assumptions | Yes | |
| fulfillment | Yes | With both, the top-level fees are the FBA side's and compare holds the two sides. |
| afterFeesInPeak | Yes | The same in peak season (FBA's peak fee); equal to afterFees for FBM. |
| shippingCharged | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: it assumes the Professional selling plan, flags the FBA figure as an estimate, marks unconfirmed readings as verified:false, points to Amazon's Fee Preview for real fees, and states the service is free and stores nothing. These details matter for a read-only estimator and are not inferable from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, but the description is a very long, dense paragraph mixing scenarios, parameter rules, assumptions and return details. It is not wasteful, but the lack of structure makes it harder to scan for a 14-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complex schema and annotations, the description covers required inputs, key assumptions, estimate caveats, verification flags and fee-source dating. Since an output schema exists, it does not need to explain return values further.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds useful cross-parameter logic: FBA needs packed size and weight bands or packed dimensions; FBM uses buyer-paid shipping; both mode needs packed and labelCost and optionally time/packaging inputs. This helps an agent assemble valid invocations beyond the per-field schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Works out Amazon's fees on one unit at a price.' It enumerates the referral, closing, FBA fulfillment, surcharge and peak fees, and clearly scopes the tool to one unit, distinguishing it from broader fee-comparison tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit usage contexts, such as 'what Amazon takes on a sale,' 'what FBA costs for an item,' 'whether a price sits just over a fee line,' and 'whether FBA or shipping it themselves costs less.' It does not explicitly name sibling tools or say when not to use this one, so it falls short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sellerprofit_box_billingWhat your box bills atARead-onlyIdempotentInspect
Works out the billable weight of one box with USPS (Priority Mail, Ground Advantage), UPS (Daily Rates and Retail Rates) and FedEx, from its outside size in inches and its actual weight, with each carrier's 2026 dimensional weight rules: sides rounded up to whole inches, cubic inches ÷ the divisor (139 for USPS since July 12, 2026, only for boxes over 1 cubic foot; UPS 139 Daily, 166 Retail; FedEx 139), rounded up to a pound, and the larger of that and the actual weight. It fits a seller who asks why a label cost more than the weight suggests, whether a box is too big, what dimensional weight a box has, or whether a smaller box would bill less. Takes lengthIn, widthIn, heightIn and weightLb or weightOz; optionally otherBox (a second box size) to compare. UPS and FedEx bill a large box (over 96 in long or over 130 in length plus girth) at least 90 lb; USPS prices by weight up to 108 in length plus girth (Ground Advantage commercial takes up to 130 in at a flat oversized price), and its row shows no billable weight past that; a box over 165 in length plus girth is refused. Returns per carrier the size weight, the billable weight, whether it bills on actual or size weight, and the largest box that still bills on the actual weight; USPS Ground Advantage cubic fit as information; warnings; and notes. No label prices (they depend on zone and account); divisors can differ by account. Dated carrier rules with sources. Free, no sign-in. Takes numbers only; nothing is stored.
| Name | Required | Description | Default |
|---|---|---|---|
| widthIn | Yes | Width, inches, measured on the outside of the box (decimals are fine: 15.2). | |
| heightIn | Yes | Height, inches, measured on the outside of the box (decimals are fine: 15.2). | |
| lengthIn | Yes | Length, inches, measured on the outside of the box (decimals are fine: 15.2). | |
| otherBox | No | Optional: a second (usually smaller) box to compare, inches, at the same weight. Adds what it bills at and the pounds it changes with each carrier. | |
| weightLb | No | The packed box's actual weight, pounds (3.2 is 3.2 lb), up to 70. Or send weightOz. | |
| weightOz | No | The packed box's actual weight in ounces (16 oz is 1 lb). Or send weightLb. |
Output Schema
| Name | Required | Description |
|---|---|---|
| box | Yes | |
| fix | Yes | When a carrier bills on size: the largest box that bills on the actual weight with each one, in plain words. |
| link | Yes | Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent. |
| text | Yes | |
| notes | Yes | What the weights leave out and why, in plain words: no label prices, divisors that depend on the account, carriers re-measure. |
| rates | Yes | Which carrier rules the weights use, as of when, and where they come from. |
| otherBox | Yes | With otherBox only: the second box at the same weight. |
| warnings | Yes | Things worth knowing about this box (rounding takes it over 1 cubic foot; USPS size limits and fees; UPS and FedEx large packages). |
| weightLb | Yes | The actual weight, pounds, to 3 decimals. |
| weightOz | Yes | The actual weight, ounces. |
| assumptions | Yes | |
| billableRange | Yes | Billable weight across the carrier rows that price this box by weight. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description still adds substantial behavioral context: oversize thresholds (96 in long, 130 in L+girth, USPS 108/130 in, 165 in refusal), 90 lb minimums, that divisors vary by account, no label prices, free/no sign-in, and that nothing is stored. This is well beyond what the structured fields convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the body is one dense ~250-word run-on paragraph mixing carrier rules, edge cases, outputs and caveats with no structural breaks. Nearly every fact earns its place, but the lack of segmentation hurts scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an existing output schema, the description anticipates the multi-carrier, multi-rule complexity by covering return contents, cubic-fit info, warnings/notes, and the caveats (account-specific divisors, no pricing). Nothing an agent needs to call and interpret it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning: it identifies lengthIn/widthIn/heightIn plus weightLb-or-weightOz as the inputs and explains otherBox as a second (usually smaller) box compared at the same weight. That clarifies intent beyond the per-field schema text without duplicating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — computing the billable (dimensional) weight of one box under USPS, UPS and FedEx 2026 rules — from outside dimensions and actual weight. 'No label prices' cleanly separates it from rate/fee siblings like sellerprofit_rates, so an agent can place it without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use scenarios: a seller asking why a label cost more than the weight suggests, whether a box is too big, what dim weight a box has, or whether a smaller box would bill less. It does not name a specific sibling alternative or a when-not condition, so it stops short of the top tier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sellerprofit_checkupShop profit check-up (Etsy, Shopify, Amazon)ARead-onlyIdempotentInspect
Runs the free profit check-up for an Etsy shop, a Shopify store or an Amazon seller. Returns the grade (a word such as Watch, with level 1 Healthy to 5 Losing money), what one order (Amazon: one unit) and the month keep after fees, ads and costs, the loss total, and the top 3 losses, each with its fix and what it's worth a month at the seller's numbers if orders hold. It fits a seller who asks where their money goes, whether their shop is healthy, or what to fix first. Takes platform (etsy is the default) and that platform's Quiz v1 answers; each field says what it takes. Bands and "not-sure" are accepted: every default used is listed (isDefault). There may be no grade yet: with too few answers, level is null, word is "Not enough answers yet", and grade.missing lists the answers a grade needs; losses found still show. Amazon: fulfillment, storage and returns dollars are estimates from Amazon's 2026 rates for the size and stock given (estimate: true, in estimatedLeakTotal, apart from leakTotal); a typed fbaFee from Fee Preview makes that fee the seller's own. Money is US dollars; shares are fractions (0.1 is 10%). Every result carries the dated rates with sources. Free, no sign-in. Takes numbers only; nothing is stored.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| pay | Yes | Etsy only, with the time answer. |
| link | Yes | Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent. |
| grade | Yes | |
| rates | Yes | Which rules the numbers use, as of when, and where they come from. |
| checks | Yes | |
| verdict | Yes | |
| keptLine | Yes | |
| knowThis | Yes | Facts with no fix the seller controls; never losses. |
| perMonth | Yes | |
| perOrder | Yes | One typical order; on Amazon, one unit. |
| platform | Yes | |
| topLeaks | Yes | The top 3 losses: official sure dollars first, then estimates, then "up to", each with its fixes and dollar values if orders hold. |
| leakTotal | Yes | Sure dollars on official rates only. |
| salesLine | Yes | |
| assumptions | Yes | |
| breakEvenAcos | Yes | Amazon only: the ACoS at which Sponsored Products break even. Null elsewhere. |
| breakEvenRoas | Yes | |
| notCheckedYet | Yes | |
| estimatedLeakTotal | Yes | Sure dollars that rest on estimated fees (Amazon's, by size and stock), shown apart from leakTotal and counted in the grade. |
| platform_supported | Yes | Platforms this server checks. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive, closed-world behavior, yet the description adds substantial context: free, no sign-in, nothing stored, defaults surfaced via isDefault, bands and 'not-sure' accepted, an explicit degraded mode where level is null and grade.missing lists needed answers, and Amazon fulfillment/storage/return figures flagged as estimates in estimatedLeakTotal separate from leakTotal. It also declares the unit conventions (USD, shares as fractions) and that results carry dated rates with sources.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and outputs, then agent-relevant caveats ranked sensibly (grade-missing state, Amazon estimates, units, privacy). It is a single dense block of roughly 200 words, so a few clauses (the dollar/fraction convention, 'Takes numbers only') could be tightened or split for scannability without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite a very large tri-platform oneOf schema, the description covers the cases an agent most needs before calling: which platform branch to pick, that partial answers still yield losses with a null grade and a missing-answers list, and how estimates versus seller-supplied fees differ on Amazon. An output schema exists, yet the description's summary of return contents is a useful orientation rather than redundant filler.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is reported at 100%, so the baseline is 3, but the description earns extra by explaining cross-cutting semantics the schema can't: bands and 'not-sure' are uniformly accepted, every default applied is echoed back via isDefault, and a typed fbaFee overrides the Amazon estimate. It does not walk through individual platform-required fields, relying on the schema for that, which is reasonable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Runs the free profit check-up') scoped to three named platforms, and enumerates the concrete outputs (grade 1-5, per-order and monthly profit, loss total, top 3 losses with fixes). The sibling calculators each do one slice; this is clearly the composite diagnostic, and the sentence about who it fits ('where their money goes... what to fix first') reinforces that umbrella role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: it fits a seller asking where money goes, whether the shop is healthy, or what to fix first, and it tells the agent which platform values are accepted and that etsy is the default. It does not explicitly name alternatives (e.g. use sellerprofit_price_for_margin for a single pricing question instead), so the routing against siblings is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sellerprofit_compare_feesFees compared: one sale on Etsy, Shopify and AmazonARead-onlyIdempotentInspect
Works out the fees on one sale on Etsy (listing, transaction, processing; Offsite Ads optional), on a Shopify store (card fee by plan through Shopify Payments) and on Amazon (referral fee by category, the Individual plan's per-item fee, an optional FBA fee the seller types), side by side, each column equal to that platform's single fee tool; with orders a month, Shopify's plan and Amazon's Professional plan are spread over each order. It fits a seller who asks which platform takes less of a sale, Etsy vs Shopify vs Amazon fees, or which is cheaper to sell on. Takes the item price and shipping charged; optionally orders a month, the Offsite Ads rate, the Shopify plan, the Amazon category, plan and FBA fee. Returns each platform's fee lines, fixed cost per order, total, what's left and its share of the sale, and which costs least at these numbers, with the caveat that fees are one part of the choice. US dollars; dated rates with sources. Free, no sign-in. Takes numbers only; nothing is stored.
| Name | Required | Description | Default |
|---|---|---|---|
| itemPrice | Yes | The item price on the sale, US dollars, before shipping and tax. | |
| amazonPlan | No | Amazon: professional ($39.99 a month) or individual ($0.99 an item). Left out: professional, flagged. | |
| shopifyPlan | No | Shopify: the plan, paid through Shopify Payments. Left out: basic, flagged. | |
| amazonCategory | No | Amazon: the category, which sets the referral fee. Left out: Everything Else (15%), flagged. | |
| etsyOffsiteAds | No | Etsy: did the sale come from an Offsite Ad? none, 12-percent (shops past $10,000 a year) or 15-percent. Left out: none, flagged. off is taken as none. | |
| ordersPerMonth | No | Orders a month, 1 to 100,000: spreads the fixed monthly costs (Shopify's plan, Amazon's Professional plan) over each order. Left out: fees on the sale only, before monthly plans (plansCounted false). | |
| shopifyBilling | No | Shopify: how the plan is billed, used with ordersPerMonth. Left out: monthly. | |
| shippingCharged | No | What the buyer pays for shipping, US dollars (0 if free). | |
| amazonFulfillmentFee | No | Amazon: the FBA fee per unit (Fee Preview in Seller Central) when Amazon ships it. The Amazon sale is then the item price alone (no shipping charged), and the fee replaces the label. Left out: the seller ships, and the buyer pays shippingCharged. |
Output Schema
| Name | Required | Description |
|---|---|---|
| link | Yes | Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent. |
| text | Yes | |
| notes | Yes | |
| rates | Yes | |
| caveat | Yes | |
| lowest | Yes | The platform (or platforms, at a tie) with the lowest totalPerOrder at these numbers. |
| columns | Yes | Etsy, Shopify, Amazon, in that order. |
| itemPrice | Yes | |
| amazonShips | Yes | True when amazonFulfillmentFee was sent: the Amazon sale is the item price alone. |
| assumptions | Yes | |
| plansCounted | Yes | False without ordersPerMonth: Shopify's plan and Amazon's Professional plan aren't in any total, so the lowest is on the sale's fees alone. |
| ordersPerMonth | Yes | |
| plansNotCounted | Yes | When plansCounted is false: the monthly plans left out, by name and price. Say it with the lowest. |
| shippingCharged | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and no side effects. The description adds useful behavioral context beyond annotations: 'Free, no sign-in. Takes numbers only; nothing is stored.' and 'US dollars; dated rates with sources.' However, it does not discuss rate limits, data freshness details, or response structure (output schema covers returns). The extra context is valuable but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and covers necessary details, but it is a single dense run-on sentence with semicolons, making it harder to scan. It could be broken into shorter sentences for better structure, though there is little wasted content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (9 parameters, enums, output schema) and the presence of annotations, the description is complete. It covers purpose, usage context, parameter overview, return values, and caveats ('fees are one part of the choice'), while noting currency and data freshness. Nothing critical is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description enumerates the parameters ('Takes the item price and shipping charged; optionally orders a month, the Offsite Ads rate, the Shopify plan, the Amazon category, plan and FBA fee') but adds no syntax, format, or interaction details beyond what the schema provides. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: 'Works out the fees on one sale on Etsy, Shopify and Amazon, side by side' and distinguishes itself from single-platform siblings by noting each column equals that platform's single fee tool. An agent can immediately tell this is a cross-platform comparison tool versus the many single-platform fee tools in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states the use case: 'It fits a seller who asks which platform takes less of a sale, Etsy vs Shopify vs Amazon fees, or which is cheaper to sell on.' It also references the alternative single-platform tools ('each column equal to that platform's single fee tool'), giving clear when-to-use guidance and implicit when-not-to-use (use the single tools for one platform).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sellerprofit_etsy_feesFees on one Etsy saleARead-onlyIdempotentInspect
Works out Etsy's fees on one sale, line by line: the $0.20 listing fee, the 6.5% transaction fee, the 3% + $0.25 payment processing fee (also charged on sales tax), the 2.5% currency conversion when it applies, and the Offsite Ads fee (12% or 15%, at most $100) when the sale came from an Offsite Ad. It fits a seller who asks what Etsy takes from a sale, or what they keep from it before costs. Takes the item price and shipping charged; optionally the sales tax rate, whether it was an Offsite Ads sale and at which rate, and a currency mismatch. Returns each fee, the total, its share of the order and what's left, in US dollars, with the dated Etsy rules and their sources. Free, no sign-in. Takes numbers only; nothing is stored.
| Name | Required | Description | Default |
|---|---|---|---|
| itemPrice | Yes | The item price on this sale, US dollars, before shipping. | |
| offsiteAds | No | Did this sale come from an Offsite Ad? none, or the rate the shop pays: 12-percent (the shop has sold $10,000 or more in any 12 months) or 15-percent (under $10,000). Default none; off is taken as none. | none |
| salesTaxRate | No | The sales tax rate the buyer paid, as a fraction (0.07 is 7%). Etsy charges its 3% processing fee on the tax too. Default 0. | |
| shippingCharged | No | What the buyer paid for shipping, US dollars (0 if free). | |
| currencyMismatch | No | True when the listing's currency differs from the payment account's (Etsy adds 2.5%). Default false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fees | Yes | |
| link | Yes | Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent. |
| text | Yes | |
| rates | Yes | Which rules the numbers use, as of when, and where they come from. |
| platform | Yes | |
| salesTax | Yes | |
| afterFees | Yes | Order total minus every fee: what's left before materials, packaging, the label and ads. |
| totalFees | Yes | |
| offsiteAds | Yes | |
| orderTotal | Yes | Item + shipping the buyer paid, before tax, US dollars. |
| feeShareOfOrder | Yes | Total fees ÷ order total. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, closed-world behavior, and the description adds real context beyond them: the rates are baked in and dated with sources, results are in USD, and it's free with no sign-in and nothing stored. It stops short of covering edge behavior (e.g. caps on totals, rounding), so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The fee enumeration is front-loaded and the purpose is clear in the first clause, with no wasted framing. It is still a long, dense passage that partly duplicates the schema's parameter list, so it is efficient but not maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter, closed-world calculator with an output schema, the description covers inputs, outputs, currency, rate sources and dating, and the no-auth/no-storage traits — nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter carries a complete description, so the schema does the heavy lifting. The description's input summary ("takes the item price and shipping charged; optionally the sales tax rate...") restates the parameters without adding semantics beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ("works out Etsy's fees on one sale") and enumerates the exact fee lines covered, which cleanly separates it from siblings like sellerprofit_amazon_fees or sellerprofit_compare_fees. An agent can tell at a glance this is the single-sale Etsy fee calculator.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: "fits a seller who asks what Etsy takes from a sale, or what they keep from it before costs." It does not, however, state when to prefer sellerprofit_compare_fees, sellerprofit_offsite_ads, or sellerprofit_sale_breakeven instead, so the routing between siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sellerprofit_etsy_profitProfit on one Etsy saleARead-onlyIdempotentInspect
Works out what one Etsy sale leaves the seller: the order total, minus Etsy's listing, transaction and payment processing fees, the Offsite Ads fee when the sale came from one, materials, packaging and the shipping label. With the minutes the item takes, it also says what that comes to an hour, and with an hourly rate, the item price that pays it. It fits a seller who asks whether a sale makes money, what their margin is, or what they earn an hour. Takes the item price, shipping charged, materials and label cost; optionally packaging, whether it was an Offsite Ads sale, the sales tax rate, minutes per item and hourly pay. Returns each fee and cost, the profit, the margin and the break-even item price, in US dollars, with the dated Etsy rules and their sources. Free, no sign-in. Takes numbers only; nothing is stored.
| Name | Required | Description | Default |
|---|---|---|---|
| hourlyPay | No | What the seller wants to earn an hour, US dollars. Send with minutesPerItem. | |
| itemPrice | Yes | The item price on this sale, US dollars, before shipping. | |
| labelCost | Yes | What the shipping label cost, US dollars (0 if the buyer collected it). | |
| materials | Yes | Materials and supplies for the item, US dollars. | |
| packaging | No | Packaging per order in US dollars, or mailer (about $1), box (about $3) or not-sure. Left out: $1, a weakly sourced typical figure, flagged as a default. | |
| offsiteAds | No | Did this sale come from an Offsite Ad? none, or the shop's rate: 12-percent or 15-percent. Default none; off is taken as none. | none |
| salesTaxRate | No | The sales tax rate the buyer paid, as a fraction (0.07 is 7%). Etsy charges its 3% processing fee on the tax too. Default 0. | |
| minutesPerItem | No | Minutes the seller spends making, listing and packing one item. Left out: the seller's time isn't counted. | |
| shippingCharged | No | What the buyer paid for shipping, US dollars (0 if free). |
Output Schema
| Name | Required | Description |
|---|---|---|
| fees | Yes | |
| link | Yes | Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent. |
| text | Yes | |
| time | Yes | |
| costs | Yes | |
| rates | Yes | Which rules the numbers use, as of when, and where they come from. |
| margin | Yes | Profit ÷ order total. |
| profit | Yes | Order total minus every fee and cost above: what the sale leaves, before the seller's time. |
| platform | Yes | |
| orderTotal | Yes | Item + shipping the buyer paid, before tax, US dollars. |
| assumptions | Yes | |
| breakEvenItemPrice | Yes | The item price below which this sale loses money, at the same shipping and costs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world and non-destructive, so the safety profile is covered. The description adds genuinely new behavioral context: free, no sign-in, numbers only, nothing stored, results in US dollars, and fees tied to dated Etsy rules with sources. It does not mention latency or failure modes, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core computation in the first sentence, then outputs, then audience, then inputs. Slightly long and the input enumeration partially restates the schema, but every sentence carries information and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter calculator with a full output schema and complete annotations, the description covers inputs, units, optional-vs-required stance, the conditional time/rate feature, output currency, sourcing of fee rules, and the no-storage guarantee. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by grouping required inputs (item price, shipping charged, materials, label cost) and explaining the interaction between minutesPerItem and hourlyPay — that hourly pay only produces the break-even item price when paired with minutes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: works out what one Etsy sale leaves the seller, enumerating the exact deductions (listing, transaction, processing, Offsite Ads, materials, packaging, label). This is distinguishable from sibling fee-lookup tools like sellerprofit_etsy_fees and from sellerprofit_sale_breakeven, which solve a different question.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage context: "It fits a seller who asks whether a sale makes money, what their margin is, or what they earn an hour." That tells the agent when to reach for it, but no sibling is named and no exclusion (e.g. use etsy_fees for pure rate lookup) is offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sellerprofit_offsite_adsWhat Offsite Ads cost on Etsy, and the price that covers itARead-onlyIdempotentInspect
Works out what Etsy's Offsite Ads cost a shop at its share of sales (12% or 15% of an attributed order, at most $100 an order), per order and per month, and the item price that covers the fee. It fits a seller who asks what Offsite Ads cost them, whether to price them in, or whether to opt out. Takes the item price, shipping charged, the shop's Offsite Ads rate (12-percent past $10,000, 15-percent under, or off), orders a month, and the share of sales from Offsite Ads if the seller knows it (else 10%, the figure Etsy gave at launch in 2020, flagged as a default). Materials and label cost are optional and add how far orders could fall before the price rise leaves the seller worse off. Returns the fee per attributed order and on average, the monthly and yearly cost, the price fix and its value if orders hold, and when opting out is possible. US dollars; dated Etsy rules with sources. Free, no sign-in. Takes numbers only; nothing is stored.
| Name | Required | Description | Default |
|---|---|---|---|
| orders | Yes | Orders in a typical month: a number from 1 to 100,000 (Shop Manager > Stats > Orders), or a band. Over 300: send the number. | |
| itemPrice | Yes | Typical item price, US dollars, before shipping. | |
| labelCost | No | Optional: the shipping label, US dollars. | |
| materials | No | Optional: materials per item, US dollars. With labelCost, adds how far orders could fall before the price fix leaves the seller worse off. | |
| packaging | No | Packaging per order in US dollars, or mailer (about $1), box (about $3) or not-sure. Left out: $1, a weakly sourced typical figure, flagged as a default. | |
| offsiteAds | Yes | The shop's Offsite Ads rate: 12-percent (the shop has sold $10,000 or more in any 12 months; for life, no opt-out), 15-percent (under $10,000, Offsite Ads on), or off (opted out). none is taken as off. | |
| offsiteShare | No | Share of sales from Offsite Ads (Marketing > Offsite Ads): a fraction (0.1 is 10%), or a band. Left out: 10%, the figure Etsy gave at launch in 2020, flagged as a default. | |
| shippingCharged | No | What the buyer pays for shipping, US dollars (0 if free). Offsite Ads are charged on it too. |
Output Schema
| Name | Required | Description |
|---|---|---|
| link | Yes | Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent. |
| rate | Yes | The fee on an attributed order: 0.12, 0.15, or 0 when off. |
| text | Yes | |
| rates | Yes | Which rules the numbers use, as of when, and where they come from. |
| share | Yes | Share of sales from Offsite Ads used. |
| optOut | Yes | Opting out is possible only under $10,000. A test, not a verdict. |
| yearly | Yes | |
| monthly | Yes | |
| platform | Yes | |
| priceFix | Yes | The item price that covers the Offsite Ads fee; null when there's no fee. |
| capApplied | Yes | |
| orderTotal | Yes | |
| assumptions | Yes | |
| shareIsDefault | Yes | |
| averagePerOrder | Yes | The fee spread over every order: share × fee. |
| feePerAttributedOrder | Yes | min(rate × order, $100), US dollars. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: discloses US-dollar currency, dated Etsy rules with sources, free/no sign-in, 'takes numbers only; nothing is stored', and that defaults are explicitly flagged. This is exactly the extra context annotations can't carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core computation, but the opening is a single very long sentence loaded with parentheticals, and the per-order/per-month and return contents are partly repeated later. Dense but not wasteful in content, so middle score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema, it summarizes what is returned (fee per order and average, monthly/yearly cost, price fix, opt-out timing) and covers defaults, currency, and sourcing. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents every parameter including the 12%/15%/off tiers and the 10% default flag. The description restates the rate thresholds and default-share rationale but adds little syntax beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific computation: Offsite Ads cost at 12%/15% with $100 cap, per order and per month, plus the covering item price. The resource and verb are clear, though it never names the sibling ads_breakeven/roas_breakeven tools to distinguish itself from them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the use cases: 'fits a seller who asks what Offsite Ads cost them, whether to price them in, or whether to opt out.' That is clear context, but no when-not or named alternative tools are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sellerprofit_price_for_marginPrice for a target profit on EtsyARead-onlyIdempotentInspect
Works out the item price at which one Etsy order keeps a target profit after Etsy's fees (listing, 6.5% transaction, 3% + $0.25 processing), the average Offsite Ads fee, Etsy Ads spread over orders, materials, packaging and the label. The target is dollars per order or a share of the order; with neither, it returns the break-even price. It fits a seller who asks what to charge, how to price for a profit, or what their break-even price is on Etsy. Takes materials, label cost, shipping charged and the shop's Offsite Ads rate (12-percent, 15-percent or off); packaging, the Offsite share, ad spend with orders, and targetProfitPerOrder or targetMargin are optional. Returns the price, the order at that price line by line, the break-even price and what each extra dollar keeps. US dollars; dated Etsy rules with sources. Free, no sign-in. Takes numbers only; nothing is stored.
| Name | Required | Description | Default |
|---|---|---|---|
| orders | No | Orders a month. Needed only with adsMonthlySpend. | |
| labelCost | Yes | The shipping label, US dollars. | |
| materials | Yes | Materials and supplies per item, US dollars. | |
| packaging | No | Packaging per order in US dollars, or mailer (about $1), box (about $3) or not-sure. Left out: $1, a weakly sourced typical figure, flagged as a default. | |
| offsiteAds | Yes | The shop's Offsite Ads rate: 12-percent (past $10,000 in any 12 months), 15-percent (under $10,000, on), or off. none is taken as off. | |
| offsiteShare | No | Share of sales from Offsite Ads: a fraction, or a band. Left out: 10%, the figure Etsy gave at launch in 2020, flagged as a default. | |
| targetMargin | No | The profit one order should keep as a share of the order (item + shipping), such as 0.25. Or send targetProfitPerOrder. | |
| adsMonthlySpend | No | Optional: Etsy Ads spend a month, US dollars, spread over orders. Needs orders. | |
| shippingCharged | No | What the buyer pays for shipping, US dollars (0 if free). | |
| targetProfitPerOrder | No | The profit one order should keep after every cost, US dollars. Or send targetMargin. Neither: the break-even price. |
Output Schema
| Name | Required | Description |
|---|---|---|
| link | Yes | Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent. |
| text | Yes | |
| rates | Yes | Which rules the numbers use, as of when, and where they come from. |
| target | Yes | |
| platform | Yes | |
| itemPrice | Yes | The item price to charge, US dollars, before shipping. |
| orderTotal | Yes | |
| assumptions | Yes | |
| atThatPrice | Yes | One order at that price, as the engine works it out (costs as positive dollars). Kept can differ from the target by a cent: Etsy rounds each fee. |
| breakEvenItemPrice | Yes | The item price at which an order keeps $0. |
| keptPerExtraDollar | Yes | Of each extra dollar the buyer pays, what the seller keeps after Etsy's percentage fees and the average Offsite fee. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered structurally. The description still adds genuinely useful context beyond them: free, no sign-in, nothing stored, US-dollar units, and dated Etsy fee rules with sources. It does not discuss failure modes or rounding/precision, but the added operational facts justify more than the annotation-covered baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded with the core computation and fee list before optional inputs and return values, and every clause carries information. The prose is dense and slightly run-on across long sentences, which costs some scannability, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It covers units, defaults, the break-even fallback, and even sketches the return payload (price, line-by-line order, break-even, marginal keep per extra dollar), which goes past the existing output schema. Combined with rich annotations, an agent has enough to call it correctly; only edge-case behavior under extreme inputs is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including the enum bands and defaults ($1 packaging, 10% Offsite share) is already documented in the schema. The description echoes the same inputs and the targetProfitPerOrder-vs-targetMargin either/or rule without adding format or interaction detail beyond it, so it is baseline-level for a fully documented schema rather than value-adding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a precise computation (item price that preserves a target profit after named Etsy fees) rather than restating the tool name. It is unambiguous what the tool produces, but it never distinguishes itself from siblings such as sellerprofit_etsy_fees or sellerprofit_sale_breakeven, so an agent must infer which pricing calculator to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete triggering questions ('what to charge', 'how to price for a profit', 'break-even price on Etsy') and states the neither-target case returns break-even, which is real usage context. It stops short of naming an alternative tool or an explicit when-not condition, so routing against the many sibling calculators is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sellerprofit_ratesFee tables (dated, sourced): Etsy, Shopify, AmazonARead-onlyIdempotentInspect
Returns one platform's fee table, the one this server's numbers use: every fee and rule with its value, a plain label, its source link and the day it was checked, whether it's official or a third-party estimate, and both values where sources disagree, plus when the table is due for its next check. Etsy: listing, transaction, processing, Offsite Ads, Etsy Ads minimums, shipping lines, Etsy Plus, tax facts. Shopify: plan prices on both billings, card rates, the third-party processor fee, currency, chargebacks, Shopify Tax. Amazon: plans, referral by category, the media closing fee, FBA, size tiers, storage, aged stock, removal, returns, placement, low-inventory and peak fees (official, from Amazon's own pages), and coupon fees (third-party). It serves to cite a platform's fees, to answer what a fee is, or to check how current the numbers are. Takes no figures; platform defaults to etsy. Free, no sign-in. Nothing is stored.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | No | Whose fee table. Default etsy. | etsy |
Output Schema
| Name | Required | Description |
|---|---|---|
| link | Yes | Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent. |
| rates | Yes | Which rules the numbers use, as of when, and where they come from. |
| table | Yes | |
| sources | Yes | |
| platform | Yes | |
| platform_supported | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds real context beyond them: no cost, no sign-in, nothing stored, each figure carries a source link and checked date, official vs third-party estimate is flagged, conflicting sources are shown side by side, and a next-check date is included.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core statement and scope lead, followed by per-platform coverage and then usage. The three platform enumeration sentences are long and comma-dense, but each names fee categories an agent would otherwise have to discover by calling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one optional parameter, rich annotations, and an output schema, the remaining burden is coverage and trust context — which the description fully supplies: what is included per platform, sourcing, dating, uncertainty handling, and cost/auth constraints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single enum parameter is already documented with its default. The description only restates 'platform defaults to etsy' and 'takes no figures,' adding no new semantics, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Returns one platform's fee table, the one this server's numbers use' — and immediately scopes it to a single platform argument. The phrase 'the one this server's numbers use' distinguishes it from generic fee lookups and from the sibling compare_fees style tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit use cases are given: cite a platform's fees, answer what a fee is, or check how current the numbers are, plus the constraint 'Takes no figures; platform defaults to etsy.' It stops short of naming alternatives such as sellerprofit_etsy_fees or sellerprofit_compare_fees and saying when those are preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sellerprofit_sale_breakevenIs this sale worth it?ARead-onlyIdempotentInspect
Works out how many more orders a sale or coupon needs just to keep the same profit a month, for one item on Etsy, Shopify or Amazon. Each platform's fees are worked out at the full price and again at the sale price: percentage fees fall with the price and fixed fees stay (Etsy's listing and processing fees, Shopify's 30¢), so the answer is extra orders = kept at full price ÷ kept on sale − 1. On Amazon the sale is a coupon plus the 2.5% coupon fee (third-party estimate); Amazon's public pages don't state whether the referral fee is on the price before or after the coupon, so both readings are returned. It fits a seller who asks whether 25% off is worth it, how many more sales a discount needs, or whether to join a sales event. Takes the platform, the item price, the discount percent, materials and label; optionally shipping charged, packaging ($1 typical, flagged), orders a month, and the platform's own field: Etsy Offsite Ads, Shopify plan, Amazon category and fulfillment fee. Returns one order at full price and on sale (price, each fee, costs, kept), the fee change, the extra orders needed and, with orders a month, the orders needed and what the sale costs if orders don't rise. When the sale price keeps nothing, it says no number of orders makes the sale pay. US dollars; dated rates with sources. Free, no sign-in. Takes numbers only; nothing is stored.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Amazon only: the referral category, or not-sure. Left out: Everything Else (15%), flagged. | |
| platform | Yes | Where the item sells. | |
| itemPrice | Yes | The item's full price, US dollars, before shipping and before the discount. | |
| labelCost | Yes | The shipping label per order, US dollars (0 if Amazon ships it). | |
| materials | Yes | Materials or product cost per item, US dollars (Amazon: landed cost). | |
| packaging | No | Packaging per order in US dollars, or mailer (about $1), box (about $3) or not-sure. Left out: $1, a weakly sourced typical figure, flagged as a default. | |
| offsiteAds | No | Etsy only: do these orders come from an Offsite Ad? none, or the shop's rate: 12-percent (past $10,000 in any 12 months) or 15-percent. Left out: none (no Offsite Ads fee). off is taken as none. | |
| shopifyPlan | No | Shopify only: the plan, which sets the Shopify Payments card rate. Left out: basic, flagged. | |
| fulfillmentFee | No | Amazon only: the FBA fee per unit (Fee Preview) when Amazon ships it, US dollars. It stays the same on sale. Left out: 0 (the seller ships), flagged. | |
| ordersPerMonth | No | Optional: orders a month at full price now, a whole number. Adds the orders needed a month and what the sale costs if orders don't rise. | |
| discountPercent | Yes | The discount, as a percent from 1 to 90 (25 is 25% off). It comes off the item price only. | |
| shippingCharged | No | What the buyer pays for shipping, US dollars (0 if free). The discount doesn't touch it. Default 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| full | Yes | One order at the full price. |
| link | Yes | Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent. |
| sale | Yes | One order at the sale price, fees worked out again at that price. On Amazon: with the referral fee on the price before the coupon (referralAfterCoupon has the other reading). |
| text | Yes | |
| month | Yes | With ordersPerMonth only. |
| notes | Yes | What the math assumes and leaves out, in plain words. |
| rates | Yes | Which rules the numbers use, as of when, and where they come from. |
| status | Yes | |
| keptLess | Yes | Kept at full price − kept on sale, per order: the discount less the fees that fall (plus Amazon's coupon fee). |
| platform | Yes | |
| feeChange | Yes | Fees on sale − fees at full price, US dollars: below 0 when fees fall with the price (Etsy, Shopify), above 0 when the coupon fee adds more (Amazon). |
| assumptions | Yes | |
| timesAsMany | Yes | Kept at full ÷ kept on sale: orders needed on sale for each order now. Null when no number works (see status). |
| ordersFor100 | Yes | Orders needed on sale for every 100 orders now, rounded up. |
| discountAmount | Yes | What comes off the item price, US dollars. |
| discountPercent | Yes | |
| extraOrdersShare | Yes | timesAsMany − 1, a fraction (0.93 is 93% more orders). Null when no number works. |
| referralAfterCoupon | Yes | Amazon only (null on Etsy and Shopify): the same sale if the referral fee is charged on the price after the coupon. The fields above count it on the price before the coupon. Amazon's public pricing page doesn't say which one applies to coupons, so give the seller both. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, non-destructive, idempotent, and closed-world, and the description adds meaningful behavior: fee treatment at full and sale price, Amazon coupon-fee ambiguity returning both readings, flagged defaults, and the edge case where the sale keeps nothing. It also states the tool is free, no sign-in, and stores nothing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core calculation and then explains platform fee logic, use cases, inputs, outputs, and edge cases. It is information-dense and appropriate for a complex breakeven tool, though some of the input enumeration is repetitive with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 12 parameters, multiple platforms, enum-heavy schema, and an existing output schema, the description is complete enough to call the tool correctly. It covers required inputs, optional inputs, platform-specific fields, outputs, and a critical edge case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the 12 parameters in detail. The description restates the key inputs and optional platform fields but adds little syntax or format meaning beyond what the schema provides, which fits the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific calculation: how many additional orders a sale or coupon needs to preserve the same monthly profit for one item on Etsy, Shopify, or Amazon. It clearly defines scope and platform-specific fee behavior, so an agent can tell this apart from ad-breakeven or fee-comparison tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete use cases such as asking whether 25% off is worth it, how many more sales a discount needs, or whether to join a sales event. It does not explicitly route the agent away from sibling tools like sellerprofit_ads_breakeven, but the context is clear enough for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sellerprofit_shipping_gapThe shipping gap on Etsy, and the fix priceARead-onlyIdempotentInspect
Works out the shipping gap for an Etsy shop: what the label and packaging cost beyond what the buyer pays, per order and per month, and the fixes: the item price that covers the gap with shipping kept under Etsy's $6 search line, calculated shipping, and (for free-shipping shops) building shipping into items of $35 and up, each worth so much a month if orders hold. It fits a seller who charges less for shipping than the label costs, offers free shipping, or asks how to price shipping on Etsy. Takes the item price, shipping charged, label cost and orders a month; packaging (else $1 typical, flagged), the share of orders shipping free, the Offsite Ads rate and share, and materials are optional and sharpen the fix. Returns the gap, the fix price, every fix's monthly value and how far orders could fall before it leaves the seller worse off. US dollars; dated Etsy rules with sources. Free, no sign-in. Takes numbers only; nothing is stored.
| Name | Required | Description | Default |
|---|---|---|---|
| orders | Yes | Orders in a typical month: a number from 1 to 100,000 (Shop Manager > Stats > Orders), or a band. Over 300: send the number. | |
| itemPrice | Yes | Typical item price, US dollars, before shipping. | |
| labelCost | Yes | What the shipping label costs, US dollars (Shop Manager > Finances > Payment account > Shipping). | |
| materials | No | Optional: materials per item, US dollars. Adds how far orders could fall before each fix leaves the seller worse off. | |
| packaging | No | Packaging per order in US dollars, or mailer (about $1), box (about $3) or not-sure. Left out: $1, a weakly sourced typical figure, flagged as a default. | |
| offsiteAds | No | Optional: the shop's Offsite Ads rate. Fees on the higher price depend on it. Left out: estimated from orders × price, flagged. none is taken as off. | |
| offsiteShare | No | Optional: share of sales from Offsite Ads. Left out: 10%, the figure Etsy gave at launch in 2020, flagged as a default. | |
| shippingCharged | Yes | What the buyer pays for shipping on an order that isn't free, US dollars (0 if shipping is always free). | |
| freeShippingShare | No | Share of orders that ship free: a fraction (0.25), or a band. Default none. |
Output Schema
| Name | Required | Description |
|---|---|---|
| link | Yes | Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent. |
| text | Yes | |
| fixes | Yes | |
| rates | Yes | Which rules the numbers use, as of when, and where they come from. |
| status | Yes | |
| yearly | Yes | |
| monthly | Yes | |
| platform | Yes | |
| priceFix | Yes | The item price that covers the gap with shipping kept as is (under $6 when it is today). |
| searchLine | Yes | Etsy favors US listings with shipping under this in search (calculated shipping is left out of the rule). |
| assumptions | Yes | |
| gapPerOrder | Yes | |
| shippingCost | Yes | Label + packaging per order, US dollars. |
| overSearchLine | Yes | |
| shippingCharged | Yes | |
| freeShippingShare | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, closed-world, so the description adds real value elsewhere: USD currency, dated Etsy rules with sources, no sign-in needed, and explicit flags for defaulted inputs (packaging $1, offsite share 10% from Etsy's 2020 launch figure, estimated Offsite Ads rate). 'Nothing is stored' restates readOnlyHint but the rest is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the opening sentence is a long run-on that packs the gap, the three fixes, and the audience into one breath. The trailing 'Free, no sign-in. Takes numbers only; nothing is stored' is partly redundant with the annotations and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 9 parameters and an output schema, the definition supplies what an agent needs to invoke it: inputs, defaults, flags, currency, and the meaning of the returned fix values. It is complete for invocation; only the dense prose keeps it from being exemplary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description still adds meaning the schema does not: which four inputs are required, that packaging/free-shipping share/Offsite Ads/materials are optional and 'sharpen the fix', and that optional materials specifically unlock the order-drop tolerance output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb-plus-resource is specific: it computes the label/packaging cost beyond what the buyer pays, per order and per month, plus the fix price. The seller profile sentence ('charges less for shipping than the label costs, offers free shipping, or asks how to price shipping') separates it from neighbors like sellerprofit_price_for_margin, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear when-to-use trigger: sellers whose shipping charge is under the label cost, free-shipping sellers, or anyone pricing shipping on Etsy. There is no explicit when-not statement or named alternative, which keeps it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sellerprofit_shopify_order_feesFees on one Shopify orderARead-onlyIdempotentInspect
Works out every fee on one order of a US Shopify store, line by line: the Shopify Payments card fee by plan (premium cards optional), the international card and currency conversion fees, the 1.25% for mixing Shopify Payments with another card processor, another processor's own fee and Shopify's third-party fee on top (2%, 1% or 0.6% by plan), and the PayPal exemption from that fee when Shopify Payments is the main processor. It fits a seller who asks how much Shopify takes per sale, what one order costs in fees, or what's left of an order. Takes the item price, shipping charged, the plan (basic, grow, advanced) and how the order was paid; orders a month, billing and the app bill put the plan price and apps on each order. Returns each fee with its working, the total, its share of the order and what's left, and with orders the plan and apps per order. US dollars; dated Shopify rates with sources. Free, no sign-in. Takes numbers only; nothing is stored.
| Name | Required | Description | Default |
|---|---|---|---|
| plan | Yes | The store's plan (Settings > Plan). Plus is priced per store and Starter's rates aren't on Shopify's pricing page. | |
| billing | No | How the plan is paid (price per month). Needs ordersPerMonth. Default monthly. | |
| itemPrice | Yes | What the buyer pays for the items on this order, US dollars, before shipping and tax. | |
| processor | Yes | How this order was paid: shopify-payments (the store's only card processor); another (Stripe, Square and others, or PayPal on a store without Shopify Payments: Shopify adds its third-party fee); both (the store runs Shopify Payments beside another card processor: the 1.25% applies to what Shopify Payments handles); paypal (paid with PayPal on a store whose primary provider is Shopify Payments: no third-party fee). | |
| appsMonthly | No | The monthly app bill, US dollars. Needs ordersPerMonth. Default 0. | |
| foreignShare | No | With shopify-payments or both only: the share of Shopify Payments sales paid by buyers abroad in another currency (1% international card fee + 1.5% conversion); 1 when this order was. Default 0. | |
| ordersPerMonth | No | Orders a month, a whole number from 1 to 100,000. Spreads the plan price and the app bill over each order. Left out: per-order fees only. | |
| shippingCharged | No | What the buyer pays for shipping, US dollars (0 if free). | |
| premiumCardShare | No | With shopify-payments or both only: the share of Shopify Payments card sales on premium cards (Amex, business cards), which pay a higher rate; 1 when this order was on one. Default 0. | |
| otherProcessorCents | No | That company's fixed fee per sale, in cents (30 is 30¢). Send with otherProcessorPercent. | |
| shopifyPaymentsShare | No | With both: the share of orders Shopify Payments handles, a fraction (1 when this order went through Shopify Payments, 0 when through the other one). Left out: half, flagged. | |
| otherProcessorPercent | No | With another, both or paypal: that company's rate as a percent (2.9 is 2.9%). Send with otherProcessorCents. Left out: 2.9% + 30¢ (Stripe's standard rate), or 3.49% + 49¢ for paypal (the PayPal Wallet starting rate on Shopify's pricing page), flagged. |
Output Schema
| Name | Required | Description |
|---|---|---|
| link | Yes | Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent. |
| plan | Yes | |
| text | Yes | |
| lines | Yes | Each fee on the order, each rounded to the cent. A PayPal order shows the third-party fee at 0, exempt. |
| notes | Yes | Rules the numbers rest on (shipping in the fee base, US rates, the PayPal exemption). |
| rates | Yes | Which rules the numbers use, as of when, and where they come from. |
| monthly | Yes | Null without ordersPerMonth: the plan price and app bill are monthly, so they can't be put on one order. |
| planName | Yes | |
| platform | Yes | |
| afterFees | Yes | orderTotal − totalFees: what's left before product cost, the label, packaging, ads, the plan and apps. |
| itemPrice | Yes | |
| processor | Yes | |
| totalFees | Yes | The lines added up, US dollars. |
| orderTotal | Yes | Items + shipping, before tax, US dollars: what the card fees are worked on. |
| assumptions | Yes | |
| paypalExempt | Yes | True for processor paypal: no third-party fee, as Shopify Payments is the primary provider. |
| shareIsDefault | Yes | |
| feeShareOfOrder | Yes | totalFees ÷ orderTotal. |
| shippingCharged | Yes | |
| shopifyPaymentsShare | Yes | The share Shopify Payments handles: 1, 0, or the split. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive/closed-world, yet the description still adds real value: 'Free, no sign-in', 'Takes numbers only; nothing is stored', dated Shopify rates with sources, USD-only, and documented fallback behavior for omitted optional inputs ('Left out: half, flagged', 'Left out: 2.9% + 30¢ ... flagged'). Return shape is described but an output schema exists, so that portion is partly redundant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the fee breakdown, then inputs, then outputs, then disclaimers — a sensible order. It is dense and the opening sentence runs long with a multi-clause enumeration, but nearly every clause carries information an agent cannot get elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter calculation tool with an output schema and full annotations, the description supplies the missing conceptual layer: US-only scope, USD, dated rate sources, plan-dependent rates, and default/flag behavior. The main gap is no explicit sibling routing or statement of what is out of scope (e.g., non-US stores, Shopify Plus/Starter pricing).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains each of the 12 parameters in depth, including enum meanings and defaults. The description adds some cross-parameter logic (plan drives the card rate, ordersPerMonth spreads plan price and app bill, premium cards optional), but not enough to exceed the baseline for fully documented schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'works out every fee on one order of a US Shopify store, line by line' — and enumerates the fee types covered (card by plan, international, 1.25% mixed-processor, third-party fee, PayPal exemption). This is clearly distinguishable from sibling fee tools like sellerprofit_amazon_fees, sellerprofit_etsy_fees and sellerprofit_compare_fees.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Frames the target user need explicitly ('a seller who asks how much Shopify takes per sale, what one order costs in fees, or what's left of an order') and scopes it to US Shopify stores. It does not, however, name when to prefer a sibling such as sellerprofit_compare_fees or sellerprofit_shopify_plan_fit, so routing is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sellerprofit_shopify_plan_fitWhich Shopify plan and billing fit your salesARead-onlyIdempotentInspect
Works out which Shopify plan (Basic, Grow, Advanced) costs least at a store's card sales: each plan's price plus the card fees that change with the plan (or Shopify's third-party fee on sales through another processor), the card sales above which each move up pays for itself, on monthly and yearly billing, and what yearly billing takes off the price. It fits a seller who asks whether to upgrade or downgrade their Shopify plan, whether yearly billing is worth it, or why a bigger plan costs them more. Takes monthly card sales (US dollars), the current plan, billing and processor; with both processors, the share Shopify Payments handles. Returns every plan's cost, the cheapest plan on the current billing and on either billing, the break-even sales, and the yearly-billing difference, with the dated Shopify rates and sources. A move's value holds at these sales; below the break-even the bigger plan costs more. Free, no sign-in. Takes numbers only; nothing is stored.
| Name | Required | Description | Default |
|---|---|---|---|
| billing | Yes | How the plan is paid now. | |
| processor | Yes | How card payments arrive (Settings > Payments): shopify-payments, another (Stripe, Square and others; Shopify then adds its third-party fee), or both. | |
| currentPlan | Yes | The store's plan (Settings > Plan). Plus is priced per store and Starter's figures aren't on Shopify's pricing page, so neither is compared here. | |
| monthlyCardSales | Yes | Online card sales a month, US dollars (order totals with shipping): what the card fees are charged on. | |
| premiumCardShare | No | Share of card sales on premium cards (Amex, business cards), which pay a higher rate on every plan. Default 0. | |
| shopifyPaymentsShare | No | With both: the share of sales Shopify Payments handles, a fraction. Left out: half, flagged. |
Output Schema
| Name | Required | Description |
|---|---|---|
| link | Yes | Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent. |
| text | Yes | |
| plans | Yes | Each plan's cost at these sales. Fees the same on every plan (the 30¢, currency, the other processor's own fee) drop out. |
| rates | Yes | Which rules the numbers use, as of when, and where they come from. |
| billing | Yes | |
| cheapest | Yes | The cheapest plan on the store's current billing. |
| platform | Yes | |
| processor | Yes | |
| breakEvens | Yes | Price gap ÷ rate gap, for each move up, on both billings. |
| currentPlan | Yes | |
| yearlyBilling | Yes | What yearly billing takes off the price: the current plan first, then the cheapest plan when it differs. |
| sameAsCheapest | Yes | Other plans that cost the same as the cheapest to the cent, on the current billing (empty when none do). |
| shareIsDefault | Yes | True when the split is the default half, which the seller's own split would replace. |
| assumedNoPremium | Yes | True when premiumCardShare was left out and some sales go through Shopify Payments: none were counted as premium cards; the seller's own share would change the answer. |
| monthlyCardSales | Yes | |
| cheapestAnyBilling | Yes | The cheapest plan and billing together, against the current plan on its current billing. |
| shopifyPaymentsShare | Yes | The share Shopify Payments handles: 1, 0, or the split. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive, closed-world), and the description adds real context: it is free, requires no sign-in, stores nothing, takes numbers only, and returns dated rates with sources. It also discloses the interpretive caveat that a move's value holds only at the entered sales level, though it does not discuss input limits or how the 'flagged' fallback surfaces.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and every clause is substantive, but the content is delivered as one very long run-on paragraph with heavy parenthetical accumulation, which makes it harder to scan than a short purpose sentence followed by usage and output notes. Several clauses (billing discount restatement, 'Free, no sign-in') could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter, stateless calculator with an output schema, the description covers purpose, valid inputs, the both-processor edge case, and the shape of the returned comparison (per-plan costs, cheapest plan, break-even, yearly savings). Nothing an agent needs to select or invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description goes further by explaining the meaningful parameter, the Shopify Payments share when 'both' processors are used, and by clarifying that card fees are charged on sales including shipping. It spends less attention on premiumCardShare's effect beyond noting it, so it improves on the schema without fully characterizing every optional input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: it works out which Shopify plan (Basic, Grow, Advanced) and billing cycle costs least given a store's card sales. It also distinguishes itself from adjacent calculators by scoping to plan-level subscription plus plan-dependent card fees, with break-even math, rather than order fees or ad breakeven.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states concrete triggering questions: whether to upgrade or downgrade, whether yearly billing is worth it, or why a bigger plan costs more. That is clear use-context guidance, but it never names a sibling tool or says when a different calculator (e.g. shopify_order_fees or compare_fees) is the better pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Added
sellerprofit_etsy_profit
14 tool updates
- Changed
sellerprofit_ads_breakeven2 fields changed- changed
Output schema / properties / fix / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "additive": { - "description": "False when this fix's value is part of another fix's, not on top of it.", - "type": "boolean" - }, - "estimate": { - "description": "True when the fix's dollars rest on a third-party rate (Amazon's fulfillment fees): say \"about\" and \"estimated\" when quoting it.", - "type": "boolean" - }, - "id": { - "type": "string" - }, - "monthly": { - "description": "What the fix is worth a month in US dollars, at the seller's numbers, if orders hold; null when no monthly total can be known.", - "type": [ - "number", - "null" - ] - }, - "newItemPrice": { - "type": [ - "number", - "null" - ] - }, - "ordersCanFall": { - "description": "How far orders could fall (a fraction) before the fix leaves the seller worse off; null when there's no limit or it doesn't apply.", - "type": [ - "number", - "null" - ] - }, - "priceChange": { - "type": [ - "number", - "null" - ] - }, - "risk": { - "type": "string" - }, - "text": { - "description": "The fix in plain words, with its condition (\"if orders hold\").", - "type": "string" - }, - "title": { - "type": "string" - }, - "valueKind": { - "enum": [ - "if_orders_hold", - "at_least", - "up_to", - "per_unit", - "none" - ], - "type": "string" - } - }, - "required": [ - "id", - "title", - "text", - "monthly", - "valueKind", - "risk", - "ordersCanFall", - "newItemPrice", - "priceChange", - "additive", - "estimate" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "additive": { + "description": "False when this fix's value is part of another fix's, not on top of it.", + "type": "boolean" + }, + "estimate": { + "description": "True when the fix's dollars rest on an estimated fee (Amazon's, by the size and stock Amazon measures): say \"about\" and \"estimated\" when quoting it.", + "type": "boolean" + }, + "id": { + "type": "string" + }, + "monthly": { + "description": "What the fix is worth a month in US dollars, at the seller's numbers, if orders hold; null when no monthly total can be known.", + "type": [ + "number", + "null" + ] + }, + "newItemPrice": { + "type": [ + "number", + "null" + ] + }, + "ordersCanFall": { + "description": "How far orders could fall (a fraction) before the fix leaves the seller worse off; null when there's no limit or it doesn't apply.", + "type": [ + "number", + "null" + ] + }, + "priceChange": { + "type": [ + "number", + "null" + ] + }, + "risk": { + "type": "string" + }, + "text": { + "description": "The fix in plain words, with its condition (\"if orders hold\").", + "type": "string" + }, + "title": { + "type": "string" + }, + "valueKind": { + "enum": [ + "if_orders_hold", + "at_least", + "up_to", + "per_unit", + "none" + ], + "type": "string" + } + }, + "required": [ + "id", + "title", + "text", + "monthly", + "valueKind", + "risk", + "ordersCanFall", + "newItemPrice", + "priceChange", + "additive", + "estimate" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / rates / properties / estimatesLine / descriptionPrevious value: -"Amazon only: which rates are third-party estimates (FBA, storage, returns and the rest sit behind the Seller Central login). Say so when citing them."New value: +"Amazon only: which figures are estimates (FBA, storage, returns and the rest depend on the size and stock Amazon measures). Say so when citing them."
- Changed
sellerprofit_ads_roas_breakeven2 fields changed- changed
Output schema / properties / fix / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "additive": { - "description": "False when this fix's value is part of another fix's, not on top of it.", - "type": "boolean" - }, - "estimate": { - "description": "True when the fix's dollars rest on a third-party rate (Amazon's fulfillment fees): say \"about\" and \"estimated\" when quoting it.", - "type": "boolean" - }, - "id": { - "type": "string" - }, - "monthly": { - "description": "What the fix is worth a month in US dollars, at the seller's numbers, if orders hold; null when no monthly total can be known.", - "type": [ - "number", - "null" - ] - }, - "newItemPrice": { - "type": [ - "number", - "null" - ] - }, - "ordersCanFall": { - "description": "How far orders could fall (a fraction) before the fix leaves the seller worse off; null when there's no limit or it doesn't apply.", - "type": [ - "number", - "null" - ] - }, - "priceChange": { - "type": [ - "number", - "null" - ] - }, - "risk": { - "type": "string" - }, - "text": { - "description": "The fix in plain words, with its condition (\"if orders hold\").", - "type": "string" - }, - "title": { - "type": "string" - }, - "valueKind": { - "enum": [ - "if_orders_hold", - "at_least", - "up_to", - "per_unit", - "none" - ], - "type": "string" - } - }, - "required": [ - "id", - "title", - "text", - "monthly", - "valueKind", - "risk", - "ordersCanFall", - "newItemPrice", - "priceChange", - "additive", - "estimate" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "additive": { + "description": "False when this fix's value is part of another fix's, not on top of it.", + "type": "boolean" + }, + "estimate": { + "description": "True when the fix's dollars rest on an estimated fee (Amazon's, by the size and stock Amazon measures): say \"about\" and \"estimated\" when quoting it.", + "type": "boolean" + }, + "id": { + "type": "string" + }, + "monthly": { + "description": "What the fix is worth a month in US dollars, at the seller's numbers, if orders hold; null when no monthly total can be known.", + "type": [ + "number", + "null" + ] + }, + "newItemPrice": { + "type": [ + "number", + "null" + ] + }, + "ordersCanFall": { + "description": "How far orders could fall (a fraction) before the fix leaves the seller worse off; null when there's no limit or it doesn't apply.", + "type": [ + "number", + "null" + ] + }, + "priceChange": { + "type": [ + "number", + "null" + ] + }, + "risk": { + "type": "string" + }, + "text": { + "description": "The fix in plain words, with its condition (\"if orders hold\").", + "type": "string" + }, + "title": { + "type": "string" + }, + "valueKind": { + "enum": [ + "if_orders_hold", + "at_least", + "up_to", + "per_unit", + "none" + ], + "type": "string" + } + }, + "required": [ + "id", + "title", + "text", + "monthly", + "valueKind", + "risk", + "ordersCanFall", + "newItemPrice", + "priceChange", + "additive", + "estimate" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / rates / properties / estimatesLine / descriptionPrevious value: -"Amazon only: which rates are third-party estimates (FBA, storage, returns and the rest sit behind the Seller Central login). Say so when citing them."New value: +"Amazon only: which figures are estimates (FBA, storage, returns and the rest depend on the size and stock Amazon measures). Say so when citing them."
- Changed
sellerprofit_amazon_ads_breakeven7 fields changed- changed
Output schema / properties / fba / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "billedWeightOz": { - "type": "number" - }, - "byDimensionalWeight": { - "description": "True when the packed size bills more than the item weighs (dimensional weight).", - "type": "boolean" - }, - "cardFee": { - "description": "The rate card's fee before the surcharge and peak, US dollars.", - "type": "number" - }, - "estimate": { - "const": true, - "type": "boolean" - }, - "fromBands": { - "type": "boolean" - }, - "peakAdd": { - "description": "What the holiday peak adds to the card for this size and weight row, before the surcharge, US dollars.", - "type": "number" - }, - "sizeTier": { - "type": "string" - } - }, - "required": [ - "estimate", - "sizeTier", - "billedWeightOz", - "byDimensionalWeight", - "fromBands", - "cardFee", - "peakAdd" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "billedWeightOz": { + "type": "number" + }, + "byDimensionalWeight": { + "description": "True when the packed size bills more than the item weighs (dimensional weight).", + "type": "boolean" + }, + "cardFee": { + "description": "The rate card's fee before the surcharge and peak, US dollars.", + "type": "number" + }, + "estimate": { + "const": true, + "type": "boolean" + }, + "fromBands": { + "type": "boolean" + }, + "overmax": { + "description": "Overmax handling per unit, US dollars (extra-large over 96 in long or 130 in length + girth); 0 otherwise. In both seasons' FBA fee.", + "type": "number" + }, + "peakAdd": { + "description": "What the holiday peak adds to the card for this size and weight row, before the surcharge, US dollars.", + "type": "number" + }, + "sizeTier": { + "type": "string" + } + }, + "required": [ + "estimate", + "sizeTier", + "billedWeightOz", + "byDimensionalWeight", + "fromBands", + "cardFee", + "peakAdd", + "overmax" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / fba / descriptionPrevious value: -"FBA only: an estimate from third-party 2026 rate cards. Fee Preview in Seller Central shows the real fee."New value: +"FBA only: an estimate from Amazon's 2026 rate cards for the size given. Fee Preview in Seller Central shows the real fee." - changed
Output schema / properties / offPeak / properties / estimate / descriptionPrevious value: -"True when keptBeforeAds rests on a third-party rate (the FBA fee, storage): say \"about\"."New value: +"True when keptBeforeAds rests on an estimated fee (the FBA fee, storage, which depend on the size and stock Amazon measures): say \"about\"." - changed
Output schema / properties / offPeak / properties / fix / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "additive": { - "description": "False when this fix's value is part of another fix's, not on top of it.", - "type": "boolean" - }, - "estimate": { - "description": "True when the fix's dollars rest on a third-party rate (Amazon's fulfillment fees): say \"about\" and \"estimated\" when quoting it.", - "type": "boolean" - }, - "id": { - "type": "string" - }, - "monthly": { - "description": "What the fix is worth a month in US dollars, at the seller's numbers, if orders hold; null when no monthly total can be known.", - "type": [ - "number", - "null" - ] - }, - "newItemPrice": { - "type": [ - "number", - "null" - ] - }, - "ordersCanFall": { - "description": "How far orders could fall (a fraction) before the fix leaves the seller worse off; null when there's no limit or it doesn't apply.", - "type": [ - "number", - "null" - ] - }, - "priceChange": { - "type": [ - "number", - "null" - ] - }, - "risk": { - "type": "string" - }, - "text": { - "description": "The fix in plain words, with its condition (\"if orders hold\").", - "type": "string" - }, - "title": { - "type": "string" - }, - "valueKind": { - "enum": [ - "if_orders_hold", - "at_least", - "up_to", - "per_unit", - "none" - ], - "type": "string" - } - }, - "required": [ - "id", - "title", - "text", - "monthly", - "valueKind", - "risk", - "ordersCanFall", - "newItemPrice", - "priceChange", - "additive", - "estimate" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "additive": { + "description": "False when this fix's value is part of another fix's, not on top of it.", + "type": "boolean" + }, + "estimate": { + "description": "True when the fix's dollars rest on an estimated fee (Amazon's, by the size and stock Amazon measures): say \"about\" and \"estimated\" when quoting it.", + "type": "boolean" + }, + "id": { + "type": "string" + }, + "monthly": { + "description": "What the fix is worth a month in US dollars, at the seller's numbers, if orders hold; null when no monthly total can be known.", + "type": [ + "number", + "null" + ] + }, + "newItemPrice": { + "type": [ + "number", + "null" + ] + }, + "ordersCanFall": { + "description": "How far orders could fall (a fraction) before the fix leaves the seller worse off; null when there's no limit or it doesn't apply.", + "type": [ + "number", + "null" + ] + }, + "priceChange": { + "type": [ + "number", + "null" + ] + }, + "risk": { + "type": "string" + }, + "text": { + "description": "The fix in plain words, with its condition (\"if orders hold\").", + "type": "string" + }, + "title": { + "type": "string" + }, + "valueKind": { + "enum": [ + "if_orders_hold", + "at_least", + "up_to", + "per_unit", + "none" + ], + "type": "string" + } + }, + "required": [ + "id", + "title", + "text", + "monthly", + "valueKind", + "risk", + "ordersCanFall", + "newItemPrice", + "priceChange", + "additive", + "estimate" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / peak / properties / estimate / descriptionPrevious value: -"True when keptBeforeAds rests on a third-party rate (the FBA fee, storage): say \"about\"."New value: +"True when keptBeforeAds rests on an estimated fee (the FBA fee, storage, which depend on the size and stock Amazon measures): say \"about\"." - changed
Output schema / properties / peak / properties / fix / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "additive": { - "description": "False when this fix's value is part of another fix's, not on top of it.", - "type": "boolean" - }, - "estimate": { - "description": "True when the fix's dollars rest on a third-party rate (Amazon's fulfillment fees): say \"about\" and \"estimated\" when quoting it.", - "type": "boolean" - }, - "id": { - "type": "string" - }, - "monthly": { - "description": "What the fix is worth a month in US dollars, at the seller's numbers, if orders hold; null when no monthly total can be known.", - "type": [ - "number", - "null" - ] - }, - "newItemPrice": { - "type": [ - "number", - "null" - ] - }, - "ordersCanFall": { - "description": "How far orders could fall (a fraction) before the fix leaves the seller worse off; null when there's no limit or it doesn't apply.", - "type": [ - "number", - "null" - ] - }, - "priceChange": { - "type": [ - "number", - "null" - ] - }, - "risk": { - "type": "string" - }, - "text": { - "description": "The fix in plain words, with its condition (\"if orders hold\").", - "type": "string" - }, - "title": { - "type": "string" - }, - "valueKind": { - "enum": [ - "if_orders_hold", - "at_least", - "up_to", - "per_unit", - "none" - ], - "type": "string" - } - }, - "required": [ - "id", - "title", - "text", - "monthly", - "valueKind", - "risk", - "ordersCanFall", - "newItemPrice", - "priceChange", - "additive", - "estimate" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "additive": { + "description": "False when this fix's value is part of another fix's, not on top of it.", + "type": "boolean" + }, + "estimate": { + "description": "True when the fix's dollars rest on an estimated fee (Amazon's, by the size and stock Amazon measures): say \"about\" and \"estimated\" when quoting it.", + "type": "boolean" + }, + "id": { + "type": "string" + }, + "monthly": { + "description": "What the fix is worth a month in US dollars, at the seller's numbers, if orders hold; null when no monthly total can be known.", + "type": [ + "number", + "null" + ] + }, + "newItemPrice": { + "type": [ + "number", + "null" + ] + }, + "ordersCanFall": { + "description": "How far orders could fall (a fraction) before the fix leaves the seller worse off; null when there's no limit or it doesn't apply.", + "type": [ + "number", + "null" + ] + }, + "priceChange": { + "type": [ + "number", + "null" + ] + }, + "risk": { + "type": "string" + }, + "text": { + "description": "The fix in plain words, with its condition (\"if orders hold\").", + "type": "string" + }, + "title": { + "type": "string" + }, + "valueKind": { + "enum": [ + "if_orders_hold", + "at_least", + "up_to", + "per_unit", + "none" + ], + "type": "string" + } + }, + "required": [ + "id", + "title", + "text", + "monthly", + "valueKind", + "risk", + "ordersCanFall", + "newItemPrice", + "priceChange", + "additive", + "estimate" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / rates / properties / estimatesLine / descriptionPrevious value: -"Amazon only: which rates are third-party estimates (FBA, storage, returns and the rest sit behind the Seller Central login). Say so when citing them."New value: +"Amazon only: which figures are estimates (FBA, storage, returns and the rest depend on the size and stock Amazon measures). Say so when citing them."
- Changed
sellerprofit_amazon_fees6 fields changed- changed
Input schema / properties / inboundSplit / descriptionPrevious value: -"both: how stock goes to Amazon: minimal (one location; Amazon charges a placement fee), partial, or optimized (Amazon's split, no placement fee). Left out: placement isn't counted (said)."New value: +"both: how stock goes to Amazon: minimal (one location; Amazon charges a placement fee), partial (2–3 locations, offered only for bulky sizes; a standard-size unit is priced as minimal), or optimized (Amazon's split, no placement fee). Extra-large pays none. Left out: placement isn't counted (said)." - changed
Output schema / properties / fba / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "billedWeightOz": { - "type": "number" - }, - "cardFee": { - "description": "The rate card's non-peak fee, before the surcharge, US dollars.", - "type": "number" - }, - "dimensionalWeightOz": { - "description": "Packed size only: when the box's dimensional weight (L × W × H in ÷ 139 × 16, in oz) is more than its packed weight and Amazon bills on it, that weight (equal to billedWeightOz); null otherwise.", - "type": [ - "number", - "null" - ] - }, - "estimate": { - "const": true, - "type": "boolean" - }, - "exactness": { - "const": "third-party-estimate", - "type": "string" - }, - "fee": { - "description": "All-in FBA fee per unit outside peak, US dollars: card × 1.035, rounded to the cent.", - "type": "number" - }, - "fromBands": { - "description": "True when built from the size and weight bands (top of the band; over-3lb is billed from 3 lb, a floor) rather than a packed size.", - "type": "boolean" - }, - "notes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "peakAdd": { - "description": "What the holiday peak adds to the card for this size and weight row, before the surcharge, US dollars.", - "type": "number" - }, - "peakFee": { - "description": "All-in FBA fee per unit in peak season: (card + peakAdd) × 1.035.", - "type": "number" - }, - "peakWindow": { - "additionalProperties": false, - "properties": { - "from": { - "type": "string" - }, - "until": { - "type": "string" - } - }, - "required": [ - "from", - "until" - ], - "type": "object" - }, - "sizeTier": { - "type": "string" - }, - "surcharge": { - "description": "The 3.5% fuel and logistics surcharge on it, US dollars.", - "type": "number" - } - }, - "required": [ - "estimate", - "exactness", - "sizeTier", - "billedWeightOz", - "dimensionalWeightOz", - "fromBands", - "cardFee", - "surcharge", - "fee", - "peakAdd", - "peakFee", - "peakWindow", - "notes" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "billedWeightOz": { + "type": "number" + }, + "cardFee": { + "description": "The rate card's non-peak fee, before the surcharge, US dollars.", + "type": "number" + }, + "dimensionalWeightOz": { + "description": "Packed size only: when the box's dimensional weight (L × W × H in ÷ 139 × 16, in oz) is more than its packed weight and Amazon bills on it, that weight (equal to billedWeightOz); null otherwise.", + "type": [ + "number", + "null" + ] + }, + "estimate": { + "const": true, + "type": "boolean" + }, + "exactness": { + "const": "official", + "description": "The rates are Amazon's own 2026 cards; the fee is still an estimate, since Amazon measures the unit itself.", + "type": "string" + }, + "fee": { + "description": "All-in FBA fee per unit outside peak, US dollars: card × 1.035, rounded to the cent, plus overmax.", + "type": "number" + }, + "fromBands": { + "description": "True when built from the size and weight bands (top of the band; over-3lb is billed from 3 lb, a floor) rather than a packed size.", + "type": "boolean" + }, + "notes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "overmax": { + "description": "Overmax handling per unit, US dollars: extra-large up to 150 lb over 96 in long or 130 in length + girth pays $17, $21 or $25 by weight; 0 otherwise. Included in fee and peakFee.", + "type": "number" + }, + "peakAdd": { + "description": "What the holiday peak adds to the card for this size and weight row, before the surcharge, US dollars.", + "type": "number" + }, + "peakFee": { + "description": "All-in FBA fee per unit in peak season: (card + peakAdd) × 1.035, plus overmax.", + "type": "number" + }, + "peakWindow": { + "additionalProperties": false, + "properties": { + "from": { + "type": "string" + }, + "until": { + "type": "string" + } + }, + "required": [ + "from", + "until" + ], + "type": "object" + }, + "sizeTier": { + "type": "string" + }, + "surcharge": { + "description": "The 3.5% fuel and logistics surcharge on it, US dollars.", + "type": "number" + } + }, + "required": [ + "estimate", + "exactness", + "sizeTier", + "billedWeightOz", + "dimensionalWeightOz", + "fromBands", + "cardFee", + "surcharge", + "overmax", + "fee", + "peakAdd", + "peakFee", + "peakWindow", + "notes" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / fba / descriptionPrevious value: -"FBA only. An estimate: Amazon's own fee table is behind the Seller Central login; Fee Preview shows the real fee."New value: +"FBA only. An estimate from Amazon's 2026 rate cards for the size given: Amazon measures the unit itself; Fee Preview shows the real fee." - changed
Output schema / properties / priceLines / items / properties / estimate / descriptionPrevious value: -"True when the fee rests on third-party rate cards."New value: +"True when the fee is an estimate: it depends on the size and weight Amazon measures." - changed
Output schema / properties / rates / properties / estimatesLine / descriptionPrevious value: -"Amazon only: which rates are third-party estimates (FBA, storage, returns and the rest sit behind the Seller Central login). Say so when citing them."New value: +"Amazon only: which figures are estimates (FBA, storage, returns and the rest depend on the size and stock Amazon measures). Say so when citing them." - changed
Output schema / properties / referral / properties / verified / descriptionPrevious value: -"False when the fee rests on a reading Amazon's public page doesn't confirm (stepped categories; shipping in the base)."New value: +"False when the fee rests on a reading Amazon doesn't spell out (stepped categories: the whole-price reading)."
- Changed
sellerprofit_checkup5 fields changed- changed
Output schema / properties / estimatedLeakTotal / descriptionPrevious value: -"Sure dollars that rest on third-party rates (Amazon's fulfillment fees), shown apart from leakTotal and counted in the grade."New value: +"Sure dollars that rest on estimated fees (Amazon's, by size and stock), shown apart from leakTotal and counted in the grade." - changed
Output schema / properties / grade / properties / estimatedLeakMonthly / descriptionPrevious value: -"US dollars a month of the grade's losses that rest on third-party rates."New value: +"US dollars a month of the grade's losses that rest on estimated fees." - changed
Output schema / properties / rates / properties / estimatesLine / descriptionPrevious value: -"Amazon only: which rates are third-party estimates (FBA, storage, returns and the rest sit behind the Seller Central login). Say so when citing them."New value: +"Amazon only: which figures are estimates (FBA, storage, returns and the rest depend on the size and stock Amazon measures). Say so when citing them." - changed
Output schema / properties / topLeaks / items / properties / estimate / descriptionPrevious value: -"True when the dollars rest on a third-party rate (Amazon's fulfillment fees): in estimatedLeakTotal, not leakTotal. Say \"about\" and \"estimated\"."New value: +"True when the dollars rest on an estimated fee (Amazon's, by the size and stock Amazon measures): in estimatedLeakTotal, not leakTotal. Say \"about\" and \"estimated\"." - changed
Output schema / properties / topLeaks / items / properties / fixes / items / properties / estimate / descriptionPrevious value: -"True when the fix's dollars rest on a third-party rate (Amazon's fulfillment fees): say \"about\" and \"estimated\" when quoting it."New value: +"True when the fix's dollars rest on an estimated fee (Amazon's, by the size and stock Amazon measures): say \"about\" and \"estimated\" when quoting it."
- Changed
sellerprofit_compare_fees3 fields changed- changed
Output schema / properties / rates / properties / amazon / properties / estimatesLine / descriptionPrevious value: -"Amazon only: which rates are third-party estimates (FBA, storage, returns and the rest sit behind the Seller Central login). Say so when citing them."New value: +"Amazon only: which figures are estimates (FBA, storage, returns and the rest depend on the size and stock Amazon measures). Say so when citing them." - changed
Output schema / properties / rates / properties / etsy / properties / estimatesLine / descriptionPrevious value: -"Amazon only: which rates are third-party estimates (FBA, storage, returns and the rest sit behind the Seller Central login). Say so when citing them."New value: +"Amazon only: which figures are estimates (FBA, storage, returns and the rest depend on the size and stock Amazon measures). Say so when citing them." - changed
Output schema / properties / rates / properties / shopify / properties / estimatesLine / descriptionPrevious value: -"Amazon only: which rates are third-party estimates (FBA, storage, returns and the rest sit behind the Seller Central login). Say so when citing them."New value: +"Amazon only: which figures are estimates (FBA, storage, returns and the rest depend on the size and stock Amazon measures). Say so when citing them."
- Changed
sellerprofit_etsy_fees1 field changed- changed
Output schema / properties / rates / properties / estimatesLine / descriptionPrevious value: -"Amazon only: which rates are third-party estimates (FBA, storage, returns and the rest sit behind the Seller Central login). Say so when citing them."New value: +"Amazon only: which figures are estimates (FBA, storage, returns and the rest depend on the size and stock Amazon measures). Say so when citing them."
- Changed
sellerprofit_offsite_ads1 field changed- changed
Output schema / properties / rates / properties / estimatesLine / descriptionPrevious value: -"Amazon only: which rates are third-party estimates (FBA, storage, returns and the rest sit behind the Seller Central login). Say so when citing them."New value: +"Amazon only: which figures are estimates (FBA, storage, returns and the rest depend on the size and stock Amazon measures). Say so when citing them."
- Changed
sellerprofit_price_for_margin1 field changed- changed
Output schema / properties / rates / properties / estimatesLine / descriptionPrevious value: -"Amazon only: which rates are third-party estimates (FBA, storage, returns and the rest sit behind the Seller Central login). Say so when citing them."New value: +"Amazon only: which figures are estimates (FBA, storage, returns and the rest depend on the size and stock Amazon measures). Say so when citing them."
- Changed
sellerprofit_rates1 field changed- changed
Output schema / properties / rates / properties / estimatesLine / descriptionPrevious value: -"Amazon only: which rates are third-party estimates (FBA, storage, returns and the rest sit behind the Seller Central login). Say so when citing them."New value: +"Amazon only: which figures are estimates (FBA, storage, returns and the rest depend on the size and stock Amazon measures). Say so when citing them."
- Changed
sellerprofit_sale_breakeven1 field changed- changed
Output schema / properties / rates / properties / estimatesLine / descriptionPrevious value: -"Amazon only: which rates are third-party estimates (FBA, storage, returns and the rest sit behind the Seller Central login). Say so when citing them."New value: +"Amazon only: which figures are estimates (FBA, storage, returns and the rest depend on the size and stock Amazon measures). Say so when citing them."
- Changed
sellerprofit_shipping_gap2 fields changed- changed
Output schema / properties / fixes / items / properties / estimate / descriptionPrevious value: -"True when the fix's dollars rest on a third-party rate (Amazon's fulfillment fees): say \"about\" and \"estimated\" when quoting it."New value: +"True when the fix's dollars rest on an estimated fee (Amazon's, by the size and stock Amazon measures): say \"about\" and \"estimated\" when quoting it." - changed
Output schema / properties / rates / properties / estimatesLine / descriptionPrevious value: -"Amazon only: which rates are third-party estimates (FBA, storage, returns and the rest sit behind the Seller Central login). Say so when citing them."New value: +"Amazon only: which figures are estimates (FBA, storage, returns and the rest depend on the size and stock Amazon measures). Say so when citing them."
- Changed
sellerprofit_shopify_order_fees1 field changed- changed
Output schema / properties / rates / properties / estimatesLine / descriptionPrevious value: -"Amazon only: which rates are third-party estimates (FBA, storage, returns and the rest sit behind the Seller Central login). Say so when citing them."New value: +"Amazon only: which figures are estimates (FBA, storage, returns and the rest depend on the size and stock Amazon measures). Say so when citing them."
- Changed
sellerprofit_shopify_plan_fit1 field changed- changed
Output schema / properties / rates / properties / estimatesLine / descriptionPrevious value: -"Amazon only: which rates are third-party estimates (FBA, storage, returns and the rest sit behind the Seller Central login). Say so when citing them."New value: +"Amazon only: which figures are estimates (FBA, storage, returns and the rest depend on the size and stock Amazon measures). Say so when citing them."
2 tool updates
- Changed
sellerprofit_amazon_ads_breakeven1 field changed- changed
Output schema / properties / fba / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "billedWeightOz": { - "type": "number" - }, - "byDimensionalWeight": { - "description": "True when the packed size bills more than the item weighs (dimensional weight).", - "type": "boolean" - }, - "cardFee": { - "description": "The rate card's fee before the surcharge and peak, US dollars.", - "type": "number" - }, - "estimate": { - "const": true, - "type": "boolean" - }, - "fromBands": { - "type": "boolean" - }, - "sizeTier": { - "type": "string" - } - }, - "required": [ - "estimate", - "sizeTier", - "billedWeightOz", - "byDimensionalWeight", - "fromBands", - "cardFee" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "billedWeightOz": { + "type": "number" + }, + "byDimensionalWeight": { + "description": "True when the packed size bills more than the item weighs (dimensional weight).", + "type": "boolean" + }, + "cardFee": { + "description": "The rate card's fee before the surcharge and peak, US dollars.", + "type": "number" + }, + "estimate": { + "const": true, + "type": "boolean" + }, + "fromBands": { + "type": "boolean" + }, + "peakAdd": { + "description": "What the holiday peak adds to the card for this size and weight row, before the surcharge, US dollars.", + "type": "number" + }, + "sizeTier": { + "type": "string" + } + }, + "required": [ + "estimate", + "sizeTier", + "billedWeightOz", + "byDimensionalWeight", + "fromBands", + "cardFee", + "peakAdd" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
sellerprofit_amazon_fees1 field changed- changed
Output schema / properties / fba / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "billedWeightOz": { - "type": "number" - }, - "cardFee": { - "description": "The rate card's non-peak fee, before the surcharge, US dollars.", - "type": "number" - }, - "dimensionalWeightOz": { - "description": "Packed size only: when the box's dimensional weight (L × W × H in ÷ 139 × 16, in oz) is more than its packed weight and Amazon bills on it, that weight (equal to billedWeightOz); null otherwise.", - "type": [ - "number", - "null" - ] - }, - "estimate": { - "const": true, - "type": "boolean" - }, - "exactness": { - "const": "third-party-estimate", - "type": "string" - }, - "fee": { - "description": "All-in FBA fee per unit outside peak, US dollars: card × 1.035, rounded to the cent.", - "type": "number" - }, - "fromBands": { - "description": "True when built from the size and weight bands (top of the band; over-3lb is billed from 3 lb, a floor) rather than a packed size.", - "type": "boolean" - }, - "notes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "peakFee": { - "description": "All-in FBA fee per unit in peak season: (card + $0.32) × 1.035.", - "type": "number" - }, - "peakWindow": { - "additionalProperties": false, - "properties": { - "from": { - "type": "string" - }, - "until": { - "type": "string" - } - }, - "required": [ - "from", - "until" - ], - "type": "object" - }, - "sizeTier": { - "type": "string" - }, - "surcharge": { - "description": "The 3.5% fuel and logistics surcharge on it, US dollars.", - "type": "number" - } - }, - "required": [ - "estimate", - "exactness", - "sizeTier", - "billedWeightOz", - "dimensionalWeightOz", - "fromBands", - "cardFee", - "surcharge", - "fee", - "peakFee", - "peakWindow", - "notes" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "billedWeightOz": { + "type": "number" + }, + "cardFee": { + "description": "The rate card's non-peak fee, before the surcharge, US dollars.", + "type": "number" + }, + "dimensionalWeightOz": { + "description": "Packed size only: when the box's dimensional weight (L × W × H in ÷ 139 × 16, in oz) is more than its packed weight and Amazon bills on it, that weight (equal to billedWeightOz); null otherwise.", + "type": [ + "number", + "null" + ] + }, + "estimate": { + "const": true, + "type": "boolean" + }, + "exactness": { + "const": "third-party-estimate", + "type": "string" + }, + "fee": { + "description": "All-in FBA fee per unit outside peak, US dollars: card × 1.035, rounded to the cent.", + "type": "number" + }, + "fromBands": { + "description": "True when built from the size and weight bands (top of the band; over-3lb is billed from 3 lb, a floor) rather than a packed size.", + "type": "boolean" + }, + "notes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "peakAdd": { + "description": "What the holiday peak adds to the card for this size and weight row, before the surcharge, US dollars.", + "type": "number" + }, + "peakFee": { + "description": "All-in FBA fee per unit in peak season: (card + peakAdd) × 1.035.", + "type": "number" + }, + "peakWindow": { + "additionalProperties": false, + "properties": { + "from": { + "type": "string" + }, + "until": { + "type": "string" + } + }, + "required": [ + "from", + "until" + ], + "type": "object" + }, + "sizeTier": { + "type": "string" + }, + "surcharge": { + "description": "The 3.5% fuel and logistics surcharge on it, US dollars.", + "type": "number" + } + }, + "required": [ + "estimate", + "exactness", + "sizeTier", + "billedWeightOz", + "dimensionalWeightOz", + "fromBands", + "cardFee", + "surcharge", + "fee", + "peakAdd", + "peakFee", + "peakWindow", + "notes" + ], + "type": "object" + }, + { + "type": "null" + } +]
4 tool updates
- Changed
sellerprofit_checkup1 field changed- changed
Input schema / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "adsDailyBudget": { - "description": "Etsy Ads daily budget, US dollars (assumed fully spent, 30 days a month).", - "maximum": 10000, - "minimum": 0.01, - "type": "number" - }, - "adsMonthlySpend": { - "description": "Exact Etsy Ads spend last 30 days, US dollars. Wins over the daily budget.", - "maximum": 300000, - "minimum": 0.01, - "type": "number" - }, - "deeper": { - "additionalProperties": false, - "description": "Optional go-deeper answers; each one sharpens the result.", - "properties": { - "discountDepth": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "none", - "up-to-10", - "11-20", - "21-30", - "over-30" - ], - "type": "string" - } - ], - "description": "Typical discount: a fraction (0.15), or a band." - }, - "discountShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "a-few", - "some", - "many" - ], - "type": "string" - } - ], - "description": "Share of orders that use a discount: a fraction, or a band. Needed when discountDepth isn't none or 0." - }, - "freeShippingShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "none", - "1-in-4", - "half", - "3-in-4", - "all" - ], - "type": "string" - } - ], - "description": "Share of orders that ship free: a fraction (0.25), or a band." - }, - "hourlyPay": { - "description": "The hourly pay the seller wants for their time, US dollars. Needs minutesPerItem.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "minutesPerItem": { - "anyOf": [ - { - "maximum": 6000, - "minimum": 1, - "type": "number" - }, - { - "enum": [ - "under-15", - "15-44", - "45-90" - ], - "type": "string" - } - ], - "description": "Minutes to make and pack one item: a number, or a band." - }, - "offsiteShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-5", - "5-14", - "15-24", - "25-plus" - ], - "type": "string" - } - ], - "description": "Share of sales from Offsite Ads (Marketing > Offsite Ads): a fraction, or a band. Left out: Etsy's typical 10% (2020), flagged as a default." - }, - "packaging": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "mailer", - "box", - "not-sure" - ], - "type": "string" - } - ], - "description": "Packaging per order in US dollars, or mailer (about $1), box (about $3) or not-sure. Left out: $1, a weakly sourced typical figure, flagged as a default." - }, - "refunds": { - "additionalProperties": false, - "description": "Refunds: send frequency or perMonth, and outcome.", - "properties": { - "frequency": { - "description": "How often: rarely (1 in 50), sometimes (1 in 20), often (1 in 10). Or send perMonth.", - "enum": [ - "rarely", - "sometimes", - "often" - ], - "type": "string" - }, - "outcome": { - "description": "What usually happens on a refund.", - "enum": [ - "back-buyer-pays-return", - "back-i-pay-return", - "buyer-keeps", - "mixed" - ], - "type": "string" - }, - "perMonth": { - "description": "Refunds in a typical month, as a number. Or send frequency.", - "maximum": 100000, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "outcome" - ], - "type": "object" - } - }, - "type": "object" - }, - "etsyAds": { - "description": "Etsy Ads daily budget: no, a band (dollars a day), or yes with adsDailyBudget or adsMonthlySpend. 25-plus needs adsDailyBudget.", - "enum": [ - "no", - "yes", - "1-4", - "5-14", - "15-24", - "25-plus" - ], - "type": "string" - }, - "itemPrice": { - "description": "Typical item price in US dollars, before shipping (the item sold most).", - "maximum": 100000, - "minimum": 0.01, - "type": "number" - }, - "labelCost": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "What the shipping label costs, US dollars, or not-sure (shipping is then treated as breaking even and shown as couldn't check)." - }, - "materials": { - "description": "Materials and supplies for one item, US dollars. Or send materialsShare when the seller isn't sure.", - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - "materialsShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-20", - "20-35", - "35-50", - "over-50" - ], - "type": "string" - } - ], - "description": "When the seller isn't sure of materials: the share of the price they take, a fraction or a band." - }, - "orders": { - "anyOf": [ - { - "maximum": 100000, - "minimum": 1, - "type": "number" - }, - { - "enum": [ - "1-10", - "11-30", - "31-75", - "76-150", - "151-300" - ], - "type": "string" - } - ], - "description": "Orders in a typical month: a number from 1 to 100,000 (Shop Manager > Stats > Orders), or a band. Over 300: send the number." - }, - "platform": { - "const": "etsy", - "default": "etsy", - "description": "etsy (the default when left out).", - "type": "string" - }, - "roas": { - "anyOf": [ - { - "maximum": 100, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-1", - "1-1.9", - "2-2.9", - "3-4.9", - "5-plus" - ], - "type": "string" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "Etsy Ads ROAS, last 30 days (Etsy Ads page): a number, a band, or not-sure. Only when the shop runs ads." - }, - "shippingCharged": { - "description": "What the buyer pays for shipping on a typical order, US dollars (0 if free).", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "targetProfitPerOrder": { - "description": "Profit per order the seller wants on top of costs, US dollars (used by the price fix when orders lose money). Default 0.", - "maximum": 10000, - "minimum": 0, - "type": "number" - }, - "tenK": { - "description": "Has the shop sold $10,000 or more in any 12 months? yes (Offsite Ads 12% for life), no-offsite-on (15%, can opt out), no-opted-out (no Offsite fee), not-sure (estimated from orders × price).", - "enum": [ - "yes", - "no-offsite-on", - "no-opted-out", - "not-sure" - ], - "type": "string" - } - }, - "required": [ - "orders", - "itemPrice", - "shippingCharged", - "labelCost", - "tenK", - "etsyAds" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "ads": { - "description": "Ads a month (Meta, Google, TikTok): none, a band (US dollars a month), or yes with adsMonthlySpend. 3000-plus needs adsMonthlySpend.", - "enum": [ - "none", - "yes", - "under-300", - "300-999", - "1000-2999", - "3000-plus" - ], - "type": "string" - }, - "adsMonthlySpend": { - "description": "Ad spend a month, US dollars. Wins over the band.", - "maximum": 1000000, - "minimum": 0.01, - "type": "number" - }, - "billing": { - "description": "How the plan is paid, or not-sure.", - "enum": [ - "monthly", - "yearly", - "not-sure" - ], - "type": "string" - }, - "deeper": { - "additionalProperties": false, - "description": "Optional go-deeper answers; each one sharpens the result and adds a check.", - "properties": { - "appBill": { - "anyOf": [ - { - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-50", - "50-149", - "150-299" - ], - "type": "string" - } - ], - "description": "The monthly app bill: US dollars, or a band. $300 or more: send the dollars." - }, - "appsUnproven": { - "anyOf": [ - { - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "Of the app bill, US dollars a month for apps the seller can't tie to sales or time saved, or not-sure. Needs appBill." - }, - "chargebacksLostPerMonth": { - "description": "Chargebacks lost in a typical month.", - "maximum": 100000, - "minimum": 0, - "type": "integer" - }, - "foreignShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "none", - "under-5", - "5-14", - "15-24", - "25-plus" - ], - "type": "string" - } - ], - "description": "Share of sales paid in another currency: a fraction, or a band." - }, - "freeShippingShareOver": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "none", - "1-in-4", - "half", - "3-in-4", - "all" - ], - "type": "string" - } - ], - "description": "Share of orders at or over the threshold: a fraction, or a band." - }, - "freeShippingThreshold": { - "description": "The free-shipping threshold, US dollars. Needs freeShippingShareOver.", - "maximum": 10000, - "minimum": 0, - "type": "number" - }, - "packaging": { - "description": "Packaging per order, US dollars. Left out: not counted, and flagged.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "refunds": { - "additionalProperties": false, - "description": "Refunds and returns: send frequency or perMonth, and outcome.", - "properties": { - "frequency": { - "description": "How often: rarely (1 in 50), sometimes (1 in 20), often (1 in 10). Or send perMonth.", - "enum": [ - "rarely", - "sometimes", - "often" - ], - "type": "string" - }, - "outcome": { - "description": "What usually happens on a refund.", - "enum": [ - "back-buyer-pays-return", - "back-i-pay-return", - "buyer-keeps", - "mixed" - ], - "type": "string" - }, - "perMonth": { - "description": "Refunds in a typical month, as a number. Or send frequency.", - "maximum": 100000, - "minimum": 0, - "type": "integer" - }, - "returnLabel": { - "description": "What a return label costs the store, US dollars. Default: what the outbound label costs.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "unsellablePerMonth": { - "description": "Returned items a month that can't be resold.", - "maximum": 100000, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "outcome" - ], - "type": "object" - } - }, - "type": "object" - }, - "labelCost": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "What the shipping label costs, US dollars, or not-sure (shipping is then treated as breaking even and shown as couldn't check)." - }, - "orderValue": { - "description": "A typical order before shipping and tax, US dollars (average order value).", - "maximum": 100000, - "minimum": 0.01, - "type": "number" - }, - "orders": { - "anyOf": [ - { - "maximum": 100000, - "minimum": 1, - "type": "number" - }, - { - "enum": [ - "1-30", - "31-100", - "101-300", - "301-1000" - ], - "type": "string" - } - ], - "description": "Orders in a typical month (Analytics > Orders): a number, or a band. Over 1,000: send the number." - }, - "otherProcessorCents": { - "description": "The other card company's fixed fee per sale, in cents (30 is 30¢). Send with otherProcessorPercent.", - "maximum": 500, - "minimum": 0, - "type": "number" - }, - "otherProcessorPercent": { - "description": "The other card company's rate as a percent (2.9 is 2.9%). Send with otherProcessorCents. Left out: 2.9% + 30¢, flagged.", - "maximum": 20, - "minimum": 0, - "type": "number" - }, - "payments": { - "description": "How card payments arrive (Settings > Payments): shopify-payments, another (for example Stripe or Square), both, or not-sure (the third-party fee checks then can't run).", - "enum": [ - "shopify-payments", - "another", - "both", - "not-sure" - ], - "type": "string" - }, - "plan": { - "description": "The plan (Settings > Plan), or not-sure (plan fit and billing then can't be checked).", - "enum": [ - "basic", - "grow", - "advanced", - "plus", - "starter", - "not-sure" - ], - "type": "string" - }, - "platform": { - "const": "shopify", - "description": "shopify, for a store on the seller's own Shopify site.", - "type": "string" - }, - "productCost": { - "description": "What the products in that order cost the seller (COGS), US dollars. Or send productCostShare when not sure.", - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - "productCostShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-20", - "20-35", - "35-50", - "over-50" - ], - "type": "string" - } - ], - "description": "When the seller isn't sure of product cost: its share of the order, a fraction or a band." - }, - "roas": { - "anyOf": [ - { - "maximum": 100, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-1.5", - "1.5-2.49", - "2.5-3.99", - "4-plus" - ], - "type": "string" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "Sales from Shopify (not Ads Manager) ÷ ad spend, last 30 days: a number, a band, or not-sure. Only when the store runs ads." - }, - "shippingCharged": { - "description": "What the buyer pays for shipping on a typical order, US dollars (0 if free).", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "shopifyPaymentsShare": { - "description": "With both: the share of sales Shopify Payments handles (Shop Pay, local methods), a fraction. Left out: half, flagged.", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "targetMargin": { - "description": "The margin the seller wants on each order after every cost, a fraction (0.2 is 20%), for the target price.", - "maximum": 0.9, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "platform", - "orders", - "orderValue", - "shippingCharged", - "labelCost", - "plan", - "billing", - "payments", - "ads" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "acos": { - "anyOf": [ - { - "exclusiveMinimum": 0, - "maximum": 10, - "type": "number" - }, - { - "enum": [ - "under-20", - "20-34", - "35-49", - "50-plus" - ], - "type": "string" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "ACoS, last 30 days (Campaign Manager): a fraction (0.3 is 30%), a band, or not-sure. Only when the seller runs Sponsored Products." - }, - "category": { - "description": "The Amazon category, which sets the referral fee, or not-sure (Everything Else, 15%, flagged).", - "enum": [ - "beauty-health", - "baby", - "grocery", - "clothing", - "home-kitchen", - "toys", - "sports-outdoors", - "pet", - "electronics-accessories", - "media", - "jewelry", - "furniture", - "everything-else", - "amazon-device-accessories", - "compact-appliances", - "full-size-appliances", - "automotive", - "base-power-tools", - "backpacks-handbags-luggage", - "business-industrial-scientific", - "computers", - "consumer-electronics", - "eyewear", - "footwear", - "gift-cards", - "lawn-garden", - "lawn-mowers-snow-throwers", - "mattresses", - "musical-instruments", - "office", - "tires", - "tools", - "video-games", - "video-game-consoles", - "watches", - "not-sure" - ], - "type": "string" - }, - "deeper": { - "additionalProperties": false, - "description": "Optional go-deeper answers; each one sharpens the result. packed (the packed size) makes the FBA estimate and the size and weight checks exact to the rate card.", - "properties": { - "coupons": { - "additionalProperties": false, - "description": "Coupons.", - "properties": { - "discount": { - "description": "The coupon discount, a fraction of the price.", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "runsPerMonth": { - "description": "Coupon runs a month.", - "maximum": 100, - "minimum": 0, - "type": "integer" - }, - "share": { - "description": "Share of units sold with the coupon.", - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "runsPerMonth", - "discount", - "share" - ], - "type": "object" - }, - "cubicFeet": { - "description": "Cubic feet per packed unit, when the dimensions aren't known (storage).", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "fbaShare": { - "description": "With fulfillment both: the share of units Amazon ships, a fraction. Left out: half, flagged.", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "inbound": { - "additionalProperties": false, - "description": "Inbound placement choice.", - "properties": { - "extraFreightPerUnit": { - "description": "Extra freight per unit an optimized split costs, US dollars, if quoted.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "split": { - "description": "How stock is split across Amazon's inbound locations.", - "enum": [ - "minimal", - "partial", - "optimized" - ], - "type": "string" - } - }, - "required": [ - "split" - ], - "type": "object" - }, - "inventory": { - "additionalProperties": false, - "description": "Stock at Amazon.", - "properties": { - "agedBand": { - "description": "How old those units are, in days. Default 181-270.", - "enum": [ - "181-270", - "271-365", - "over-365" - ], - "type": "string" - }, - "agedUnits": { - "description": "Units older than 6 months (181+ days).", - "maximum": 1000000, - "minimum": 0, - "type": "integer" - }, - "daysOfSupply": { - "description": "Days of supply on hand (Amazon's low-inventory measure).", - "maximum": 3650, - "minimum": 0, - "type": "integer" - }, - "unitsAtAmazon": { - "description": "Units in Amazon's warehouses. Default: one month of sales.", - "maximum": 1000000, - "minimum": 0, - "type": "integer" - } - }, - "type": "object" - }, - "packaging": { - "description": "Packaging per unit the seller ships, US dollars. Left out: $1 typical, flagged.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "packed": { - "additionalProperties": false, - "description": "The packed size and weight, as Amazon measures it: makes the FBA estimate and the size and weight checks exact to the rate card.", - "properties": { - "heightIn": { - "description": "Height, inches, packed.", - "exclusiveMinimum": 0, - "maximum": 200, - "type": "number" - }, - "lengthIn": { - "description": "Length, inches, packed.", - "exclusiveMinimum": 0, - "maximum": 200, - "type": "number" - }, - "weightOz": { - "description": "Weight, ounces, packed (16 oz is 1 lb).", - "exclusiveMinimum": 0, - "maximum": 4800, - "type": "number" - }, - "widthIn": { - "description": "Width, inches, packed.", - "exclusiveMinimum": 0, - "maximum": 200, - "type": "number" - } - }, - "required": [ - "lengthIn", - "widthIn", - "heightIn", - "weightOz" - ], - "type": "object" - }, - "peakUnits": { - "description": "Units shipped October 15 to January 14 (the peak season), for the whole season.", - "maximum": 10000000, - "minimum": 0, - "type": "integer" - }, - "returns": { - "additionalProperties": false, - "description": "Returns: the rate, and the unsellable share.", - "properties": { - "rate": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-3", - "3-6", - "6-10", - "10-15", - "over-15" - ], - "type": "string" - } - ], - "description": "Share of units returned: a fraction, or a band (bands are our assumption)." - }, - "unsellableShare": { - "description": "Share of returns that come back unsellable. Default 0.", - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "rate" - ], - "type": "object" - }, - "sourcingCostEntered": { - "description": "True when the seller has entered sourcing costs in Manage Your Sourcing Cost.", - "type": "boolean" - } - }, - "type": "object" - }, - "fbaFee": { - "description": "FBA or both: the FBA fee per unit from Fee Preview or the Revenue Calculator, US dollars, all-in. Turns the estimate into the seller's own number. Or send sizeBand and weightBand.", - "maximum": 1000, - "minimum": 0.01, - "type": "number" - }, - "fulfillment": { - "description": "Who ships: fba (Amazon), fbm (the seller), or both.", - "enum": [ - "fba", - "fbm", - "both" - ], - "type": "string" - }, - "labelCost": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "FBM or both: what the label costs per unit, US dollars, or not-sure." - }, - "landedCost": { - "description": "Landed cost per unit (product + freight + duties + prep, to Amazon's door), US dollars. Or send landedCostShare when not sure.", - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - "landedCostShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-20", - "20-35", - "35-50", - "over-50" - ], - "type": "string" - } - ], - "description": "When the seller isn't sure of landed cost: its share of the price, a fraction or a band." - }, - "plan": { - "description": "professional ($39.99 a month), individual ($0.99 an item), or not-sure.", - "enum": [ - "professional", - "individual", - "not-sure" - ], - "type": "string" - }, - "platform": { - "const": "amazon", - "description": "amazon, for a seller on Amazon's US marketplace.", - "type": "string" - }, - "ppc": { - "description": "Sponsored Products a month: none, a band (US dollars a month), or yes with ppcMonthlySpend. 5000-plus needs ppcMonthlySpend.", - "enum": [ - "none", - "yes", - "under-500", - "500-1999", - "2000-4999", - "5000-plus" - ], - "type": "string" - }, - "ppcMonthlySpend": { - "description": "Sponsored Products spend a month, US dollars. Wins over the band.", - "maximum": 1000000, - "minimum": 0.01, - "type": "number" - }, - "price": { - "description": "The selling price on Amazon, US dollars.", - "maximum": 100000, - "minimum": 0.01, - "type": "number" - }, - "shippingCharged": { - "description": "FBM or both: what the buyer pays for shipping per unit, US dollars (0 if free).", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "sizeBand": { - "description": "FBA or both, when the FBA fee isn't known: small-flat (fits 15 × 12 × 0.75 in), standard-box (up to 18 × 14 × 8 in), bigger. Send with weightBand.", - "enum": [ - "small-flat", - "standard-box", - "bigger" - ], - "type": "string" - }, - "targetMargin": { - "description": "The margin the seller wants after every cost, a fraction of the price (0.2 is 20%), for the repricing fixes. Default 0: break-even.", - "maximum": 0.9, - "minimum": 0, - "type": "number" - }, - "today": { - "description": "Today's date, YYYY-MM-DD: picks the storage season and the peak window (October 15 to January 14). Default: today in Los Angeles.", - "maxLength": 10, - "pattern": "^20(2[6-9]|[3-9]\\d)-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$", - "type": "string" - }, - "units": { - "anyOf": [ - { - "maximum": 1000000, - "minimum": 1, - "type": "number" - }, - { - "enum": [ - "1-40", - "41-150", - "151-500", - "501-1500", - "1501-5000" - ], - "type": "string" - } - ], - "description": "Units sold in a typical month (Business Reports > Sales Dashboard > Units Ordered): a number, or a band. Over 5,000: send the number." - }, - "weightBand": { - "description": "FBA or both, when the FBA fee isn't known: the packed weight band. Send with sizeBand.", - "enum": [ - "under-8oz", - "8oz-1lb", - "1-2lb", - "2-3lb", - "over-3lb" - ], - "type": "string" - } - }, - "required": [ - "platform", - "units", - "price", - "category", - "fulfillment", - "plan", - "ppc" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "adsDailyBudget": { + "description": "Etsy Ads daily budget, US dollars (assumed fully spent, 30 days a month).", + "maximum": 10000, + "minimum": 0.01, + "type": "number" + }, + "adsMonthlySpend": { + "description": "Exact Etsy Ads spend last 30 days, US dollars. Wins over the daily budget.", + "maximum": 300000, + "minimum": 0.01, + "type": "number" + }, + "deeper": { + "additionalProperties": false, + "description": "Optional go-deeper answers; each one sharpens the result.", + "properties": { + "discountDepth": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "none", + "up-to-10", + "11-20", + "21-30", + "over-30" + ], + "type": "string" + } + ], + "description": "Typical discount: a fraction (0.15), or a band." + }, + "discountShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "a-few", + "some", + "many" + ], + "type": "string" + } + ], + "description": "Share of orders that use a discount: a fraction, or a band. Needed when discountDepth isn't none or 0." + }, + "freeShippingShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "none", + "1-in-4", + "half", + "3-in-4", + "all" + ], + "type": "string" + } + ], + "description": "Share of orders that ship free: a fraction (0.25), or a band." + }, + "hourlyPay": { + "description": "The hourly pay the seller wants for their time, US dollars. Needs minutesPerItem.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "minutesPerItem": { + "anyOf": [ + { + "maximum": 6000, + "minimum": 1, + "type": "number" + }, + { + "enum": [ + "under-15", + "15-44", + "45-90" + ], + "type": "string" + } + ], + "description": "Minutes to make and pack one item: a number, or a band." + }, + "offsiteShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-5", + "5-14", + "15-24", + "25-plus" + ], + "type": "string" + } + ], + "description": "Share of sales from Offsite Ads (Marketing > Offsite Ads): a fraction, or a band. Left out: 10%, the figure Etsy gave at launch in 2020, flagged as a default." + }, + "packaging": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "mailer", + "box", + "not-sure" + ], + "type": "string" + } + ], + "description": "Packaging per order in US dollars, or mailer (about $1), box (about $3) or not-sure. Left out: $1, a weakly sourced typical figure, flagged as a default." + }, + "refunds": { + "additionalProperties": false, + "description": "Refunds: send frequency or perMonth, and outcome.", + "properties": { + "frequency": { + "description": "How often: rarely (1 in 50), sometimes (1 in 20), often (1 in 10). Or send perMonth.", + "enum": [ + "rarely", + "sometimes", + "often" + ], + "type": "string" + }, + "outcome": { + "description": "What usually happens on a refund.", + "enum": [ + "back-buyer-pays-return", + "back-i-pay-return", + "buyer-keeps", + "mixed" + ], + "type": "string" + }, + "perMonth": { + "description": "Refunds in a typical month, as a number. Or send frequency.", + "maximum": 100000, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "outcome" + ], + "type": "object" + } + }, + "type": "object" + }, + "etsyAds": { + "description": "Etsy Ads daily budget: no, a band (dollars a day), or yes with adsDailyBudget or adsMonthlySpend. 25-plus needs adsDailyBudget.", + "enum": [ + "no", + "yes", + "1-4", + "5-14", + "15-24", + "25-plus" + ], + "type": "string" + }, + "itemPrice": { + "description": "Typical item price in US dollars, before shipping (the item sold most).", + "maximum": 100000, + "minimum": 0.01, + "type": "number" + }, + "labelCost": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "What the shipping label costs, US dollars, or not-sure (shipping is then treated as breaking even and shown as couldn't check)." + }, + "materials": { + "description": "Materials and supplies for one item, US dollars. Or send materialsShare when the seller isn't sure.", + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + "materialsShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-20", + "20-35", + "35-50", + "over-50" + ], + "type": "string" + } + ], + "description": "When the seller isn't sure of materials: the share of the price they take, a fraction or a band." + }, + "orders": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 1, + "type": "number" + }, + { + "enum": [ + "1-10", + "11-30", + "31-75", + "76-150", + "151-300" + ], + "type": "string" + } + ], + "description": "Orders in a typical month: a number from 1 to 100,000 (Shop Manager > Stats > Orders), or a band. Over 300: send the number." + }, + "platform": { + "const": "etsy", + "default": "etsy", + "description": "etsy (the default when left out).", + "type": "string" + }, + "roas": { + "anyOf": [ + { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-1", + "1-1.9", + "2-2.9", + "3-4.9", + "5-plus" + ], + "type": "string" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "Etsy Ads ROAS, last 30 days (Etsy Ads page): a number, a band, or not-sure. Only when the shop runs ads." + }, + "shippingCharged": { + "description": "What the buyer pays for shipping on a typical order, US dollars (0 if free).", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "targetProfitPerOrder": { + "description": "Profit per order the seller wants on top of costs, US dollars (used by the price fix when orders lose money). Default 0.", + "maximum": 10000, + "minimum": 0, + "type": "number" + }, + "tenK": { + "description": "Has the shop sold $10,000 or more in any 12 months? yes (Offsite Ads 12% for life), no-offsite-on (15%, can opt out), no-opted-out (no Offsite fee), not-sure (estimated from orders × price).", + "enum": [ + "yes", + "no-offsite-on", + "no-opted-out", + "not-sure" + ], + "type": "string" + } + }, + "required": [ + "orders", + "itemPrice", + "shippingCharged", + "labelCost", + "tenK", + "etsyAds" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "ads": { + "description": "Ads a month (Meta, Google, TikTok): none, a band (US dollars a month), or yes with adsMonthlySpend. 3000-plus needs adsMonthlySpend.", + "enum": [ + "none", + "yes", + "under-300", + "300-999", + "1000-2999", + "3000-plus" + ], + "type": "string" + }, + "adsMonthlySpend": { + "description": "Ad spend a month, US dollars. Wins over the band.", + "maximum": 1000000, + "minimum": 0.01, + "type": "number" + }, + "billing": { + "description": "How the plan is paid, or not-sure.", + "enum": [ + "monthly", + "yearly", + "not-sure" + ], + "type": "string" + }, + "deeper": { + "additionalProperties": false, + "description": "Optional go-deeper answers; each one sharpens the result and adds a check.", + "properties": { + "appBill": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-50", + "50-149", + "150-299" + ], + "type": "string" + } + ], + "description": "The monthly app bill: US dollars, or a band. $300 or more: send the dollars." + }, + "appsUnproven": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "Of the app bill, US dollars a month for apps the seller can't tie to sales or time saved, or not-sure. Needs appBill." + }, + "chargebacksLostPerMonth": { + "description": "Chargebacks lost in a typical month.", + "maximum": 100000, + "minimum": 0, + "type": "integer" + }, + "foreignShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "none", + "under-5", + "5-14", + "15-24", + "25-plus" + ], + "type": "string" + } + ], + "description": "Share of sales paid in another currency: a fraction, or a band." + }, + "freeShippingShareOver": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "none", + "1-in-4", + "half", + "3-in-4", + "all" + ], + "type": "string" + } + ], + "description": "Share of orders at or over the threshold: a fraction, or a band." + }, + "freeShippingThreshold": { + "description": "The free-shipping threshold, US dollars. Needs freeShippingShareOver.", + "maximum": 10000, + "minimum": 0, + "type": "number" + }, + "packaging": { + "description": "Packaging per order, US dollars. Left out: not counted, and flagged.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "refunds": { + "additionalProperties": false, + "description": "Refunds and returns: send frequency or perMonth, and outcome.", + "properties": { + "frequency": { + "description": "How often: rarely (1 in 50), sometimes (1 in 20), often (1 in 10). Or send perMonth.", + "enum": [ + "rarely", + "sometimes", + "often" + ], + "type": "string" + }, + "outcome": { + "description": "What usually happens on a refund.", + "enum": [ + "back-buyer-pays-return", + "back-i-pay-return", + "buyer-keeps", + "mixed" + ], + "type": "string" + }, + "perMonth": { + "description": "Refunds in a typical month, as a number. Or send frequency.", + "maximum": 100000, + "minimum": 0, + "type": "integer" + }, + "returnLabel": { + "description": "What a return label costs the store, US dollars. Default: what the outbound label costs.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "unsellablePerMonth": { + "description": "Returned items a month that can't be resold.", + "maximum": 100000, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "outcome" + ], + "type": "object" + } + }, + "type": "object" + }, + "labelCost": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "What the shipping label costs, US dollars, or not-sure (shipping is then treated as breaking even and shown as couldn't check)." + }, + "orderValue": { + "description": "A typical order before shipping and tax, US dollars (average order value).", + "maximum": 100000, + "minimum": 0.01, + "type": "number" + }, + "orders": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 1, + "type": "number" + }, + { + "enum": [ + "1-30", + "31-100", + "101-300", + "301-1000" + ], + "type": "string" + } + ], + "description": "Orders in a typical month (Analytics > Orders): a number, or a band. Over 1,000: send the number." + }, + "otherProcessorCents": { + "description": "The other card company's fixed fee per sale, in cents (30 is 30¢). Send with otherProcessorPercent.", + "maximum": 500, + "minimum": 0, + "type": "number" + }, + "otherProcessorPercent": { + "description": "The other card company's rate as a percent (2.9 is 2.9%). Send with otherProcessorCents. Left out: 2.9% + 30¢, flagged.", + "maximum": 20, + "minimum": 0, + "type": "number" + }, + "payments": { + "description": "How card payments arrive (Settings > Payments): shopify-payments, another (for example Stripe or Square), both, or not-sure (the third-party fee checks then can't run).", + "enum": [ + "shopify-payments", + "another", + "both", + "not-sure" + ], + "type": "string" + }, + "plan": { + "description": "The plan (Settings > Plan), or not-sure (plan fit and billing then can't be checked).", + "enum": [ + "basic", + "grow", + "advanced", + "plus", + "starter", + "not-sure" + ], + "type": "string" + }, + "platform": { + "const": "shopify", + "description": "shopify, for a store on the seller's own Shopify site.", + "type": "string" + }, + "productCost": { + "description": "What the products in that order cost the seller (COGS), US dollars. Or send productCostShare when not sure.", + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + "productCostShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-20", + "20-35", + "35-50", + "over-50" + ], + "type": "string" + } + ], + "description": "When the seller isn't sure of product cost: its share of the order, a fraction or a band." + }, + "roas": { + "anyOf": [ + { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-1.5", + "1.5-2.49", + "2.5-3.99", + "4-plus" + ], + "type": "string" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "Sales from Shopify (not Ads Manager) ÷ ad spend, last 30 days: a number, a band, or not-sure. Only when the store runs ads." + }, + "shippingCharged": { + "description": "What the buyer pays for shipping on a typical order, US dollars (0 if free).", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "shopifyPaymentsShare": { + "description": "With both: the share of sales Shopify Payments handles (Shop Pay, local methods), a fraction. Left out: half, flagged.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "targetMargin": { + "description": "The margin the seller wants on each order after every cost, a fraction (0.2 is 20%), for the target price.", + "maximum": 0.9, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "platform", + "orders", + "orderValue", + "shippingCharged", + "labelCost", + "plan", + "billing", + "payments", + "ads" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "acos": { + "anyOf": [ + { + "exclusiveMinimum": 0, + "maximum": 10, + "type": "number" + }, + { + "enum": [ + "under-20", + "20-34", + "35-49", + "50-plus" + ], + "type": "string" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "ACoS, last 30 days (Campaign Manager): a fraction (0.3 is 30%), a band, or not-sure. Only when the seller runs Sponsored Products." + }, + "category": { + "description": "The Amazon category, which sets the referral fee, or not-sure (Everything Else, 15%, flagged).", + "enum": [ + "beauty-health", + "baby", + "grocery", + "clothing", + "home-kitchen", + "toys", + "sports-outdoors", + "pet", + "electronics-accessories", + "media", + "jewelry", + "furniture", + "everything-else", + "amazon-device-accessories", + "compact-appliances", + "full-size-appliances", + "automotive", + "base-power-tools", + "backpacks-handbags-luggage", + "business-industrial-scientific", + "computers", + "consumer-electronics", + "eyewear", + "footwear", + "gift-cards", + "lawn-garden", + "lawn-mowers-snow-throwers", + "mattresses", + "musical-instruments", + "office", + "tires", + "tools", + "video-games", + "video-game-consoles", + "watches", + "not-sure" + ], + "type": "string" + }, + "deeper": { + "additionalProperties": false, + "description": "Optional go-deeper answers; each one sharpens the result. packed (the packed size) makes the FBA estimate and the size and weight checks exact to the rate card.", + "properties": { + "coupons": { + "additionalProperties": false, + "description": "Coupons.", + "properties": { + "discount": { + "description": "The coupon discount, a fraction of the price.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "runsPerMonth": { + "description": "Coupon runs a month.", + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + "share": { + "description": "Share of units sold with the coupon.", + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "runsPerMonth", + "discount", + "share" + ], + "type": "object" + }, + "cubicFeet": { + "description": "Cubic feet per packed unit, when the dimensions aren't known (storage).", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "fbaShare": { + "description": "With fulfillment both: the share of units Amazon ships, a fraction. Left out: half, flagged.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "inbound": { + "additionalProperties": false, + "description": "Inbound placement choice.", + "properties": { + "extraFreightPerUnit": { + "description": "Extra freight per unit an optimized split costs, US dollars, if quoted.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "split": { + "description": "How stock is split across Amazon's inbound locations.", + "enum": [ + "minimal", + "partial", + "optimized" + ], + "type": "string" + } + }, + "required": [ + "split" + ], + "type": "object" + }, + "inventory": { + "additionalProperties": false, + "description": "Stock at Amazon.", + "properties": { + "agedBand": { + "description": "How old those units are, in days. Default 181-270.", + "enum": [ + "181-270", + "271-365", + "over-365" + ], + "type": "string" + }, + "agedUnits": { + "description": "Units older than 6 months (181+ days).", + "maximum": 1000000, + "minimum": 0, + "type": "integer" + }, + "daysOfSupply": { + "description": "Days of supply on hand (Amazon's low-inventory measure).", + "maximum": 3650, + "minimum": 0, + "type": "integer" + }, + "unitsAtAmazon": { + "description": "Units in Amazon's warehouses. Default: one month of sales.", + "maximum": 1000000, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + "packaging": { + "description": "Packaging per unit the seller ships, US dollars. Left out: $1 typical, flagged.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "packed": { + "additionalProperties": false, + "description": "The packed size and weight, as Amazon measures it: makes the FBA estimate and the size and weight checks exact to the rate card.", + "properties": { + "heightIn": { + "description": "Height, inches, packed.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + }, + "lengthIn": { + "description": "Length, inches, packed.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + }, + "weightOz": { + "description": "Weight, ounces, packed (16 oz is 1 lb).", + "exclusiveMinimum": 0, + "maximum": 4800, + "type": "number" + }, + "widthIn": { + "description": "Width, inches, packed.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + } + }, + "required": [ + "lengthIn", + "widthIn", + "heightIn", + "weightOz" + ], + "type": "object" + }, + "peakUnits": { + "description": "Units shipped October 15 to January 14 (the peak season), for the whole season.", + "maximum": 10000000, + "minimum": 0, + "type": "integer" + }, + "returns": { + "additionalProperties": false, + "description": "Returns: the rate, and the unsellable share.", + "properties": { + "rate": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-3", + "3-6", + "6-10", + "10-15", + "over-15" + ], + "type": "string" + } + ], + "description": "Share of units returned: a fraction, or a band (bands are our assumption)." + }, + "unsellableShare": { + "description": "Share of returns that come back unsellable. Default 0.", + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "rate" + ], + "type": "object" + }, + "sourcingCostEntered": { + "description": "True when the seller has entered sourcing costs in Manage Your Sourcing Cost.", + "type": "boolean" + } + }, + "type": "object" + }, + "fbaFee": { + "description": "FBA or both: the FBA fee per unit from Fee Preview or the Revenue Calculator, US dollars, all-in. Turns the estimate into the seller's own number. Or send sizeBand and weightBand.", + "maximum": 1000, + "minimum": 0.01, + "type": "number" + }, + "fulfillment": { + "description": "Who ships: fba (Amazon), fbm (the seller), or both.", + "enum": [ + "fba", + "fbm", + "both" + ], + "type": "string" + }, + "labelCost": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "FBM or both: what the label costs per unit, US dollars, or not-sure." + }, + "landedCost": { + "description": "Landed cost per unit (product + freight + duties + prep, to Amazon's door), US dollars. Or send landedCostShare when not sure.", + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + "landedCostShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-20", + "20-35", + "35-50", + "over-50" + ], + "type": "string" + } + ], + "description": "When the seller isn't sure of landed cost: its share of the price, a fraction or a band." + }, + "plan": { + "description": "professional ($39.99 a month), individual ($0.99 an item), or not-sure.", + "enum": [ + "professional", + "individual", + "not-sure" + ], + "type": "string" + }, + "platform": { + "const": "amazon", + "description": "amazon, for a seller on Amazon's US marketplace.", + "type": "string" + }, + "ppc": { + "description": "Sponsored Products a month: none, a band (US dollars a month), or yes with ppcMonthlySpend. 5000-plus needs ppcMonthlySpend.", + "enum": [ + "none", + "yes", + "under-500", + "500-1999", + "2000-4999", + "5000-plus" + ], + "type": "string" + }, + "ppcMonthlySpend": { + "description": "Sponsored Products spend a month, US dollars. Wins over the band.", + "maximum": 1000000, + "minimum": 0.01, + "type": "number" + }, + "price": { + "description": "The selling price on Amazon, US dollars.", + "maximum": 100000, + "minimum": 0.01, + "type": "number" + }, + "shippingCharged": { + "description": "FBM or both: what the buyer pays for shipping per unit, US dollars (0 if free).", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "sizeBand": { + "description": "FBA or both, when the FBA fee isn't known: small-flat (fits 15 × 12 × 0.75 in), standard-box (up to 18 × 14 × 8 in), bigger. Send with weightBand.", + "enum": [ + "small-flat", + "standard-box", + "bigger" + ], + "type": "string" + }, + "targetMargin": { + "description": "The margin the seller wants after every cost, a fraction of the price (0.2 is 20%), for the repricing fixes. Default 0: break-even.", + "maximum": 0.9, + "minimum": 0, + "type": "number" + }, + "today": { + "description": "Today's date, YYYY-MM-DD: picks the storage season and the peak window (October 15 to January 14). Default: today in Los Angeles.", + "maxLength": 10, + "pattern": "^20(2[6-9]|[3-9]\\d)-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$", + "type": "string" + }, + "units": { + "anyOf": [ + { + "maximum": 1000000, + "minimum": 1, + "type": "number" + }, + { + "enum": [ + "1-40", + "41-150", + "151-500", + "501-1500", + "1501-5000" + ], + "type": "string" + } + ], + "description": "Units sold in a typical month (Business Reports > Sales Dashboard > Units Ordered): a number, or a band. Over 5,000: send the number." + }, + "weightBand": { + "description": "FBA or both, when the FBA fee isn't known: the packed weight band. Send with sizeBand.", + "enum": [ + "under-8oz", + "8oz-1lb", + "1-2lb", + "2-3lb", + "over-3lb" + ], + "type": "string" + } + }, + "required": [ + "platform", + "units", + "price", + "category", + "fulfillment", + "plan", + "ppc" + ], + "type": "object" + } +]
- Changed
sellerprofit_offsite_ads1 field changed- changed
Input schema / properties / offsiteShare / descriptionPrevious value: -"Share of sales from Offsite Ads (Marketing > Offsite Ads): a fraction (0.1 is 10%), or a band. Left out: Etsy's typical 10% (2020), flagged as a default."New value: +"Share of sales from Offsite Ads (Marketing > Offsite Ads): a fraction (0.1 is 10%), or a band. Left out: 10%, the figure Etsy gave at launch in 2020, flagged as a default."
- Changed
sellerprofit_price_for_margin1 field changed- changed
Input schema / properties / offsiteShare / descriptionPrevious value: -"Share of sales from Offsite Ads: a fraction, or a band. Left out: Etsy's typical 10%, flagged."New value: +"Share of sales from Offsite Ads: a fraction, or a band. Left out: 10%, the figure Etsy gave at launch in 2020, flagged as a default."
- Changed
sellerprofit_shipping_gap1 field changed- changed
Input schema / properties / offsiteShare / descriptionPrevious value: -"Optional: share of sales from Offsite Ads. Left out: Etsy's typical 10%, flagged."New value: +"Optional: share of sales from Offsite Ads. Left out: 10%, the figure Etsy gave at launch in 2020, flagged as a default."
1 tool update
- Changed
sellerprofit_checkup1 field changed- changed
Input schema / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "adsDailyBudget": { - "description": "Etsy Ads daily budget, US dollars (assumed fully spent, 30 days a month).", - "maximum": 10000, - "minimum": 0.01, - "type": "number" - }, - "adsMonthlySpend": { - "description": "Exact Etsy Ads spend last 30 days, US dollars. Wins over the daily budget.", - "maximum": 300000, - "minimum": 0.01, - "type": "number" - }, - "deeper": { - "additionalProperties": false, - "description": "Optional go-deeper answers; each one sharpens the result.", - "properties": { - "discountDepth": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "none", - "up-to-10", - "11-20", - "21-30", - "over-30" - ], - "type": "string" - } - ], - "description": "Typical discount: a fraction (0.15), or a band." - }, - "discountShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "a-few", - "some", - "many" - ], - "type": "string" - } - ], - "description": "Share of orders that use a discount: a fraction, or a band. Needed when discountDepth isn't none or 0." - }, - "freeShippingShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "none", - "1-in-4", - "half", - "3-in-4", - "all" - ], - "type": "string" - } - ], - "description": "Share of orders that ship free: a fraction (0.25), or a band." - }, - "hourlyPay": { - "description": "The hourly pay the seller wants for their time, US dollars. Needs minutesPerItem.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "minutesPerItem": { - "anyOf": [ - { - "maximum": 6000, - "minimum": 1, - "type": "number" - }, - { - "enum": [ - "under-15", - "15-44", - "45-90" - ], - "type": "string" - } - ], - "description": "Minutes to make and pack one item: a number, or a band." - }, - "offsiteShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-5", - "5-14", - "15-24", - "25-plus" - ], - "type": "string" - } - ], - "description": "Share of sales from Offsite Ads (Marketing > Offsite Ads): a fraction, or a band. Left out: Etsy's typical 10% (2020), flagged as a default." - }, - "packaging": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "mailer", - "box", - "not-sure" - ], - "type": "string" - } - ], - "description": "Packaging per order in US dollars, or mailer (about $1), box (about $3) or not-sure. Left out: $1, a weakly sourced typical figure, flagged as a default." - }, - "refunds": { - "additionalProperties": false, - "description": "Refunds: send frequency or perMonth, and outcome.", - "properties": { - "frequency": { - "description": "How often: rarely (1 in 50), sometimes (1 in 20), often (1 in 10). Or send perMonth.", - "enum": [ - "rarely", - "sometimes", - "often" - ], - "type": "string" - }, - "outcome": { - "description": "What usually happens on a refund.", - "enum": [ - "back-buyer-pays-return", - "back-i-pay-return", - "buyer-keeps", - "mixed" - ], - "type": "string" - }, - "perMonth": { - "description": "Refunds in a typical month, as a number. Or send frequency.", - "maximum": 100000, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "outcome" - ], - "type": "object" - } - }, - "type": "object" - }, - "etsyAds": { - "description": "Etsy Ads daily budget: no, a band (dollars a day), or yes with adsDailyBudget or adsMonthlySpend. 25-plus needs adsDailyBudget.", - "enum": [ - "no", - "yes", - "1-4", - "5-14", - "15-24", - "25-plus" - ], - "type": "string" - }, - "itemPrice": { - "description": "Typical item price in US dollars, before shipping (the item sold most).", - "maximum": 100000, - "minimum": 0.01, - "type": "number" - }, - "labelCost": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "What the shipping label costs, US dollars, or not-sure (shipping is then treated as breaking even and shown as couldn't check)." - }, - "materials": { - "description": "Materials and supplies for one item, US dollars. Or send materialsShare when the seller isn't sure.", - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - "materialsShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-20", - "20-35", - "35-50", - "over-50" - ], - "type": "string" - } - ], - "description": "When the seller isn't sure of materials: the share of the price they take, a fraction or a band." - }, - "orders": { - "anyOf": [ - { - "maximum": 100000, - "minimum": 1, - "type": "number" - }, - { - "enum": [ - "1-10", - "11-30", - "31-75", - "76-150", - "151-300" - ], - "type": "string" - } - ], - "description": "Orders in a typical month: a number from 1 to 100,000 (Shop Manager > Stats > Orders), or a band. Over 300: send the number." - }, - "platform": { - "const": "etsy", - "default": "etsy", - "description": "etsy (the default when left out).", - "type": "string" - }, - "roas": { - "anyOf": [ - { - "maximum": 100, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-1", - "1-1.9", - "2-2.9", - "3-4.9", - "5-plus" - ], - "type": "string" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "Etsy Ads ROAS, last 30 days (Etsy Ads page): a number, a band, or not-sure. Only when the shop runs ads." - }, - "shippingCharged": { - "description": "What the buyer pays for shipping on a typical order, US dollars (0 if free).", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "targetProfitPerOrder": { - "description": "Profit per order the seller wants on top of costs, US dollars (used by the price fix when orders lose money). Default 0.", - "maximum": 10000, - "minimum": 0, - "type": "number" - }, - "tenK": { - "description": "Has the shop sold $10,000 or more in any 12 months? yes (Offsite Ads 12% for life), no-offsite-on (15%, can opt out), no-opted-out (no Offsite fee), not-sure (estimated from orders × price).", - "enum": [ - "yes", - "no-offsite-on", - "no-opted-out", - "not-sure" - ], - "type": "string" - } - }, - "required": [ - "orders", - "itemPrice", - "shippingCharged", - "labelCost", - "tenK", - "etsyAds" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "ads": { - "description": "Ads a month (Meta, Google, TikTok): none, a band (US dollars a month), or yes with adsMonthlySpend. 3000-plus needs adsMonthlySpend.", - "enum": [ - "none", - "yes", - "under-300", - "300-999", - "1000-2999", - "3000-plus" - ], - "type": "string" - }, - "adsMonthlySpend": { - "description": "Ad spend a month, US dollars. Wins over the band.", - "maximum": 1000000, - "minimum": 0.01, - "type": "number" - }, - "billing": { - "description": "How the plan is paid, or not-sure.", - "enum": [ - "monthly", - "yearly", - "not-sure" - ], - "type": "string" - }, - "deeper": { - "additionalProperties": false, - "description": "Optional go-deeper answers; each one sharpens the result and adds a check.", - "properties": { - "appBill": { - "anyOf": [ - { - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-50", - "50-149", - "150-299" - ], - "type": "string" - } - ], - "description": "The monthly app bill: US dollars, or a band. $300 or more: send the dollars." - }, - "appsUnproven": { - "anyOf": [ - { - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "Of the app bill, US dollars a month for apps the seller can't tie to sales or time saved, or not-sure. Needs appBill." - }, - "chargebacksLostPerMonth": { - "description": "Chargebacks lost in a typical month.", - "maximum": 100000, - "minimum": 0, - "type": "integer" - }, - "foreignShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "none", - "under-5", - "5-14", - "15-24", - "25-plus" - ], - "type": "string" - } - ], - "description": "Share of sales paid in another currency: a fraction, or a band." - }, - "freeShippingShareOver": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "none", - "1-in-4", - "half", - "3-in-4", - "all" - ], - "type": "string" - } - ], - "description": "Share of orders at or over the threshold: a fraction, or a band." - }, - "freeShippingThreshold": { - "description": "The free-shipping threshold, US dollars. Needs freeShippingShareOver.", - "maximum": 10000, - "minimum": 0, - "type": "number" - }, - "packaging": { - "description": "Packaging per order, US dollars. Left out: not counted, and flagged.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "refunds": { - "additionalProperties": false, - "description": "Refunds and returns: send frequency or perMonth, and outcome.", - "properties": { - "frequency": { - "description": "How often: rarely (1 in 50), sometimes (1 in 20), often (1 in 10). Or send perMonth.", - "enum": [ - "rarely", - "sometimes", - "often" - ], - "type": "string" - }, - "outcome": { - "description": "What usually happens on a refund.", - "enum": [ - "back-buyer-pays-return", - "back-i-pay-return", - "buyer-keeps", - "mixed" - ], - "type": "string" - }, - "perMonth": { - "description": "Refunds in a typical month, as a number. Or send frequency.", - "maximum": 100000, - "minimum": 0, - "type": "integer" - }, - "returnLabel": { - "description": "What a return label costs the store, US dollars. Default: what the outbound label costs.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "unsellablePerMonth": { - "description": "Returned items a month that can't be resold.", - "maximum": 100000, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "outcome" - ], - "type": "object" - } - }, - "type": "object" - }, - "labelCost": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "What the shipping label costs, US dollars, or not-sure (shipping is then treated as breaking even and shown as couldn't check)." - }, - "orderValue": { - "description": "A typical order before shipping and tax, US dollars (average order value).", - "maximum": 100000, - "minimum": 0.01, - "type": "number" - }, - "orders": { - "anyOf": [ - { - "maximum": 100000, - "minimum": 1, - "type": "number" - }, - { - "enum": [ - "1-30", - "31-100", - "101-300", - "301-1000" - ], - "type": "string" - } - ], - "description": "Orders in a typical month (Analytics > Orders): a number, or a band. Over 1,000: send the number." - }, - "otherProcessorCents": { - "description": "The other card company's fixed fee per sale, in cents (30 is 30¢). Send with otherProcessorPercent.", - "maximum": 500, - "minimum": 0, - "type": "number" - }, - "otherProcessorPercent": { - "description": "The other card company's rate as a percent (2.9 is 2.9%). Send with otherProcessorCents. Left out: 2.9% + 30¢, flagged.", - "maximum": 20, - "minimum": 0, - "type": "number" - }, - "payments": { - "description": "How card payments arrive (Settings > Payments): shopify-payments, another (for example Stripe or Square), both, or not-sure (the third-party fee checks then can't run).", - "enum": [ - "shopify-payments", - "another", - "both", - "not-sure" - ], - "type": "string" - }, - "plan": { - "description": "The plan (Settings > Plan), or not-sure (plan fit and billing then can't be checked).", - "enum": [ - "basic", - "grow", - "advanced", - "plus", - "starter", - "not-sure" - ], - "type": "string" - }, - "platform": { - "const": "shopify", - "description": "shopify, for a store on the seller's own Shopify site.", - "type": "string" - }, - "productCost": { - "description": "What the products in that order cost the seller (COGS), US dollars. Or send productCostShare when not sure.", - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - "productCostShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-20", - "20-35", - "35-50", - "over-50" - ], - "type": "string" - } - ], - "description": "When the seller isn't sure of product cost: its share of the order, a fraction or a band." - }, - "roas": { - "anyOf": [ - { - "maximum": 100, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-1.5", - "1.5-2.49", - "2.5-3.99", - "4-plus" - ], - "type": "string" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "Sales from Shopify (not Ads Manager) ÷ ad spend, last 30 days: a number, a band, or not-sure. Only when the store runs ads." - }, - "shippingCharged": { - "description": "What the buyer pays for shipping on a typical order, US dollars (0 if free).", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "shopifyPaymentsShare": { - "description": "With both: the share of sales Shopify Payments handles (Shop Pay, local methods), a fraction. Left out: half, flagged.", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "targetMargin": { - "description": "The margin the seller wants on each order after every cost, a fraction (0.2 is 20%), for the target price.", - "maximum": 0.9, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "platform", - "orders", - "orderValue", - "shippingCharged", - "labelCost", - "plan", - "billing", - "payments", - "ads" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "acos": { - "anyOf": [ - { - "exclusiveMinimum": 0, - "maximum": 10, - "type": "number" - }, - { - "enum": [ - "under-20", - "20-34", - "35-49", - "50-plus" - ], - "type": "string" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "ACoS, last 30 days (Campaign Manager): a fraction (0.3 is 30%), a band, or not-sure. Only when the seller runs Sponsored Products." - }, - "category": { - "description": "The Amazon category, which sets the referral fee, or not-sure (Everything Else, 15%, flagged).", - "enum": [ - "beauty-health", - "baby", - "grocery", - "clothing", - "home-kitchen", - "toys", - "sports-outdoors", - "pet", - "electronics-accessories", - "media", - "jewelry", - "furniture", - "everything-else", - "amazon-device-accessories", - "compact-appliances", - "full-size-appliances", - "automotive", - "base-power-tools", - "backpacks-handbags-luggage", - "business-industrial-scientific", - "computers", - "consumer-electronics", - "eyewear", - "footwear", - "gift-cards", - "lawn-garden", - "lawn-mowers-snow-throwers", - "mattresses", - "musical-instruments", - "office", - "tires", - "tools", - "video-games", - "video-game-consoles", - "watches", - "not-sure" - ], - "type": "string" - }, - "deeper": { - "additionalProperties": false, - "description": "Optional go-deeper answers; each one sharpens the result. packed (the packed size) makes the FBA estimate and the size and weight checks exact to the rate card.", - "properties": { - "coupons": { - "additionalProperties": false, - "description": "Coupons.", - "properties": { - "discount": { - "description": "The coupon discount, a fraction of the price.", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "runsPerMonth": { - "description": "Coupon runs a month.", - "maximum": 100, - "minimum": 0, - "type": "integer" - }, - "share": { - "description": "Share of units sold with the coupon.", - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "runsPerMonth", - "discount", - "share" - ], - "type": "object" - }, - "cubicFeet": { - "description": "Cubic feet per packed unit, when the dimensions aren't known (storage).", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "fbaShare": { - "description": "With fulfillment both: the share of units Amazon ships, a fraction. Left out: half, flagged.", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "inbound": { - "additionalProperties": false, - "description": "Inbound placement choice.", - "properties": { - "extraFreightPerUnit": { - "description": "Extra freight per unit an optimized split costs, US dollars, if quoted.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "split": { - "description": "How stock is split across Amazon's inbound locations.", - "enum": [ - "minimal", - "partial", - "optimized" - ], - "type": "string" - } - }, - "required": [ - "split" - ], - "type": "object" - }, - "inventory": { - "additionalProperties": false, - "description": "Stock at Amazon.", - "properties": { - "agedBand": { - "description": "How old those units are, in days. Default 181-270.", - "enum": [ - "181-270", - "271-365", - "over-365" - ], - "type": "string" - }, - "agedUnits": { - "description": "Units older than 6 months (181+ days).", - "maximum": 1000000, - "minimum": 0, - "type": "integer" - }, - "daysOfSupply": { - "description": "Days of supply on hand (Amazon's low-inventory measure).", - "maximum": 3650, - "minimum": 0, - "type": "integer" - }, - "unitsAtAmazon": { - "description": "Units in Amazon's warehouses. Default: one month of sales.", - "maximum": 1000000, - "minimum": 0, - "type": "integer" - } - }, - "type": "object" - }, - "packaging": { - "description": "Packaging per unit the seller ships, US dollars. Left out: $1 typical, flagged.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "packed": { - "additionalProperties": false, - "description": "The packed size and weight, as Amazon measures it: makes the FBA estimate and the size and weight checks exact to the rate card.", - "properties": { - "heightIn": { - "description": "Height, inches, packed.", - "exclusiveMinimum": 0, - "maximum": 200, - "type": "number" - }, - "lengthIn": { - "description": "Length, inches, packed.", - "exclusiveMinimum": 0, - "maximum": 200, - "type": "number" - }, - "weightOz": { - "description": "Weight, ounces, packed (16 oz is 1 lb).", - "exclusiveMinimum": 0, - "maximum": 4800, - "type": "number" - }, - "widthIn": { - "description": "Width, inches, packed.", - "exclusiveMinimum": 0, - "maximum": 200, - "type": "number" - } - }, - "required": [ - "lengthIn", - "widthIn", - "heightIn", - "weightOz" - ], - "type": "object" - }, - "peakUnits": { - "description": "Units shipped October 15 to January 14 (the peak season), for the whole season.", - "maximum": 10000000, - "minimum": 0, - "type": "integer" - }, - "returns": { - "additionalProperties": false, - "description": "Returns: the rate, and the unsellable share.", - "properties": { - "rate": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-3", - "3-6", - "6-10", - "10-15", - "over-15" - ], - "type": "string" - } - ], - "description": "Share of units returned: a fraction, or a band (bands are our assumption)." - }, - "unsellableShare": { - "description": "Share of returns that come back unsellable. Default 0.", - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "rate" - ], - "type": "object" - }, - "sourcingCostEntered": { - "description": "True when the seller has entered sourcing costs in Manage Your Sourcing Cost.", - "type": "boolean" - } - }, - "type": "object" - }, - "fbaFee": { - "description": "FBA or both: the FBA fee per unit from Fee Preview or the Revenue Calculator, US dollars, all-in. Turns the estimate into the seller's own number. Or send sizeBand and weightBand.", - "maximum": 1000, - "minimum": 0.01, - "type": "number" - }, - "fulfillment": { - "description": "Who ships: fba (Amazon), fbm (the seller), or both.", - "enum": [ - "fba", - "fbm", - "both" - ], - "type": "string" - }, - "labelCost": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "FBM or both: what the label costs per unit, US dollars, or not-sure." - }, - "landedCost": { - "description": "Landed cost per unit (product + freight + duties + prep, to Amazon's door), US dollars. Or send landedCostShare when not sure.", - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - "landedCostShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-20", - "20-35", - "35-50", - "over-50" - ], - "type": "string" - } - ], - "description": "When the seller isn't sure of landed cost: its share of the price, a fraction or a band." - }, - "plan": { - "description": "professional ($39.99 a month), individual ($0.99 an item), or not-sure.", - "enum": [ - "professional", - "individual", - "not-sure" - ], - "type": "string" - }, - "platform": { - "const": "amazon", - "description": "amazon, for a seller on Amazon's US marketplace.", - "type": "string" - }, - "ppc": { - "description": "Sponsored Products a month: none, a band (US dollars a month), or yes with ppcMonthlySpend. 5000-plus needs ppcMonthlySpend.", - "enum": [ - "none", - "yes", - "under-500", - "500-1999", - "2000-4999", - "5000-plus" - ], - "type": "string" - }, - "ppcMonthlySpend": { - "description": "Sponsored Products spend a month, US dollars. Wins over the band.", - "maximum": 1000000, - "minimum": 0.01, - "type": "number" - }, - "price": { - "description": "The selling price on Amazon, US dollars.", - "maximum": 100000, - "minimum": 0.01, - "type": "number" - }, - "shippingCharged": { - "description": "FBM or both: what the buyer pays for shipping per unit, US dollars (0 if free).", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "sizeBand": { - "description": "FBA or both, when the FBA fee isn't known: small-flat (fits 15 × 12 × 0.75 in), standard-box (up to 18 × 14 × 8 in), bigger. Send with weightBand.", - "enum": [ - "small-flat", - "standard-box", - "bigger" - ], - "type": "string" - }, - "targetMargin": { - "description": "The margin the seller wants after every cost, a fraction of the price (0.2 is 20%), for the repricing fixes. Default 0: break-even.", - "maximum": 0.9, - "minimum": 0, - "type": "number" - }, - "today": { - "description": "Today's date, YYYY-MM-DD: picks the storage season and the peak window (October 15 to January 14). Default: the rates' as-of date, October 13, 2026.", - "maxLength": 10, - "pattern": "^20(2[6-9]|[3-9]\\d)-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$", - "type": "string" - }, - "units": { - "anyOf": [ - { - "maximum": 1000000, - "minimum": 1, - "type": "number" - }, - { - "enum": [ - "1-40", - "41-150", - "151-500", - "501-1500", - "1501-5000" - ], - "type": "string" - } - ], - "description": "Units sold in a typical month (Business Reports > Sales Dashboard > Units Ordered): a number, or a band. Over 5,000: send the number." - }, - "weightBand": { - "description": "FBA or both, when the FBA fee isn't known: the packed weight band. Send with sizeBand.", - "enum": [ - "under-8oz", - "8oz-1lb", - "1-2lb", - "2-3lb", - "over-3lb" - ], - "type": "string" - } - }, - "required": [ - "platform", - "units", - "price", - "category", - "fulfillment", - "plan", - "ppc" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "adsDailyBudget": { + "description": "Etsy Ads daily budget, US dollars (assumed fully spent, 30 days a month).", + "maximum": 10000, + "minimum": 0.01, + "type": "number" + }, + "adsMonthlySpend": { + "description": "Exact Etsy Ads spend last 30 days, US dollars. Wins over the daily budget.", + "maximum": 300000, + "minimum": 0.01, + "type": "number" + }, + "deeper": { + "additionalProperties": false, + "description": "Optional go-deeper answers; each one sharpens the result.", + "properties": { + "discountDepth": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "none", + "up-to-10", + "11-20", + "21-30", + "over-30" + ], + "type": "string" + } + ], + "description": "Typical discount: a fraction (0.15), or a band." + }, + "discountShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "a-few", + "some", + "many" + ], + "type": "string" + } + ], + "description": "Share of orders that use a discount: a fraction, or a band. Needed when discountDepth isn't none or 0." + }, + "freeShippingShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "none", + "1-in-4", + "half", + "3-in-4", + "all" + ], + "type": "string" + } + ], + "description": "Share of orders that ship free: a fraction (0.25), or a band." + }, + "hourlyPay": { + "description": "The hourly pay the seller wants for their time, US dollars. Needs minutesPerItem.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "minutesPerItem": { + "anyOf": [ + { + "maximum": 6000, + "minimum": 1, + "type": "number" + }, + { + "enum": [ + "under-15", + "15-44", + "45-90" + ], + "type": "string" + } + ], + "description": "Minutes to make and pack one item: a number, or a band." + }, + "offsiteShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-5", + "5-14", + "15-24", + "25-plus" + ], + "type": "string" + } + ], + "description": "Share of sales from Offsite Ads (Marketing > Offsite Ads): a fraction, or a band. Left out: Etsy's typical 10% (2020), flagged as a default." + }, + "packaging": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "mailer", + "box", + "not-sure" + ], + "type": "string" + } + ], + "description": "Packaging per order in US dollars, or mailer (about $1), box (about $3) or not-sure. Left out: $1, a weakly sourced typical figure, flagged as a default." + }, + "refunds": { + "additionalProperties": false, + "description": "Refunds: send frequency or perMonth, and outcome.", + "properties": { + "frequency": { + "description": "How often: rarely (1 in 50), sometimes (1 in 20), often (1 in 10). Or send perMonth.", + "enum": [ + "rarely", + "sometimes", + "often" + ], + "type": "string" + }, + "outcome": { + "description": "What usually happens on a refund.", + "enum": [ + "back-buyer-pays-return", + "back-i-pay-return", + "buyer-keeps", + "mixed" + ], + "type": "string" + }, + "perMonth": { + "description": "Refunds in a typical month, as a number. Or send frequency.", + "maximum": 100000, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "outcome" + ], + "type": "object" + } + }, + "type": "object" + }, + "etsyAds": { + "description": "Etsy Ads daily budget: no, a band (dollars a day), or yes with adsDailyBudget or adsMonthlySpend. 25-plus needs adsDailyBudget.", + "enum": [ + "no", + "yes", + "1-4", + "5-14", + "15-24", + "25-plus" + ], + "type": "string" + }, + "itemPrice": { + "description": "Typical item price in US dollars, before shipping (the item sold most).", + "maximum": 100000, + "minimum": 0.01, + "type": "number" + }, + "labelCost": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "What the shipping label costs, US dollars, or not-sure (shipping is then treated as breaking even and shown as couldn't check)." + }, + "materials": { + "description": "Materials and supplies for one item, US dollars. Or send materialsShare when the seller isn't sure.", + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + "materialsShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-20", + "20-35", + "35-50", + "over-50" + ], + "type": "string" + } + ], + "description": "When the seller isn't sure of materials: the share of the price they take, a fraction or a band." + }, + "orders": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 1, + "type": "number" + }, + { + "enum": [ + "1-10", + "11-30", + "31-75", + "76-150", + "151-300" + ], + "type": "string" + } + ], + "description": "Orders in a typical month: a number from 1 to 100,000 (Shop Manager > Stats > Orders), or a band. Over 300: send the number." + }, + "platform": { + "const": "etsy", + "default": "etsy", + "description": "etsy (the default when left out).", + "type": "string" + }, + "roas": { + "anyOf": [ + { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-1", + "1-1.9", + "2-2.9", + "3-4.9", + "5-plus" + ], + "type": "string" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "Etsy Ads ROAS, last 30 days (Etsy Ads page): a number, a band, or not-sure. Only when the shop runs ads." + }, + "shippingCharged": { + "description": "What the buyer pays for shipping on a typical order, US dollars (0 if free).", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "targetProfitPerOrder": { + "description": "Profit per order the seller wants on top of costs, US dollars (used by the price fix when orders lose money). Default 0.", + "maximum": 10000, + "minimum": 0, + "type": "number" + }, + "tenK": { + "description": "Has the shop sold $10,000 or more in any 12 months? yes (Offsite Ads 12% for life), no-offsite-on (15%, can opt out), no-opted-out (no Offsite fee), not-sure (estimated from orders × price).", + "enum": [ + "yes", + "no-offsite-on", + "no-opted-out", + "not-sure" + ], + "type": "string" + } + }, + "required": [ + "orders", + "itemPrice", + "shippingCharged", + "labelCost", + "tenK", + "etsyAds" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "ads": { + "description": "Ads a month (Meta, Google, TikTok): none, a band (US dollars a month), or yes with adsMonthlySpend. 3000-plus needs adsMonthlySpend.", + "enum": [ + "none", + "yes", + "under-300", + "300-999", + "1000-2999", + "3000-plus" + ], + "type": "string" + }, + "adsMonthlySpend": { + "description": "Ad spend a month, US dollars. Wins over the band.", + "maximum": 1000000, + "minimum": 0.01, + "type": "number" + }, + "billing": { + "description": "How the plan is paid, or not-sure.", + "enum": [ + "monthly", + "yearly", + "not-sure" + ], + "type": "string" + }, + "deeper": { + "additionalProperties": false, + "description": "Optional go-deeper answers; each one sharpens the result and adds a check.", + "properties": { + "appBill": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-50", + "50-149", + "150-299" + ], + "type": "string" + } + ], + "description": "The monthly app bill: US dollars, or a band. $300 or more: send the dollars." + }, + "appsUnproven": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "Of the app bill, US dollars a month for apps the seller can't tie to sales or time saved, or not-sure. Needs appBill." + }, + "chargebacksLostPerMonth": { + "description": "Chargebacks lost in a typical month.", + "maximum": 100000, + "minimum": 0, + "type": "integer" + }, + "foreignShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "none", + "under-5", + "5-14", + "15-24", + "25-plus" + ], + "type": "string" + } + ], + "description": "Share of sales paid in another currency: a fraction, or a band." + }, + "freeShippingShareOver": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "none", + "1-in-4", + "half", + "3-in-4", + "all" + ], + "type": "string" + } + ], + "description": "Share of orders at or over the threshold: a fraction, or a band." + }, + "freeShippingThreshold": { + "description": "The free-shipping threshold, US dollars. Needs freeShippingShareOver.", + "maximum": 10000, + "minimum": 0, + "type": "number" + }, + "packaging": { + "description": "Packaging per order, US dollars. Left out: not counted, and flagged.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "refunds": { + "additionalProperties": false, + "description": "Refunds and returns: send frequency or perMonth, and outcome.", + "properties": { + "frequency": { + "description": "How often: rarely (1 in 50), sometimes (1 in 20), often (1 in 10). Or send perMonth.", + "enum": [ + "rarely", + "sometimes", + "often" + ], + "type": "string" + }, + "outcome": { + "description": "What usually happens on a refund.", + "enum": [ + "back-buyer-pays-return", + "back-i-pay-return", + "buyer-keeps", + "mixed" + ], + "type": "string" + }, + "perMonth": { + "description": "Refunds in a typical month, as a number. Or send frequency.", + "maximum": 100000, + "minimum": 0, + "type": "integer" + }, + "returnLabel": { + "description": "What a return label costs the store, US dollars. Default: what the outbound label costs.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "unsellablePerMonth": { + "description": "Returned items a month that can't be resold.", + "maximum": 100000, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "outcome" + ], + "type": "object" + } + }, + "type": "object" + }, + "labelCost": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "What the shipping label costs, US dollars, or not-sure (shipping is then treated as breaking even and shown as couldn't check)." + }, + "orderValue": { + "description": "A typical order before shipping and tax, US dollars (average order value).", + "maximum": 100000, + "minimum": 0.01, + "type": "number" + }, + "orders": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 1, + "type": "number" + }, + { + "enum": [ + "1-30", + "31-100", + "101-300", + "301-1000" + ], + "type": "string" + } + ], + "description": "Orders in a typical month (Analytics > Orders): a number, or a band. Over 1,000: send the number." + }, + "otherProcessorCents": { + "description": "The other card company's fixed fee per sale, in cents (30 is 30¢). Send with otherProcessorPercent.", + "maximum": 500, + "minimum": 0, + "type": "number" + }, + "otherProcessorPercent": { + "description": "The other card company's rate as a percent (2.9 is 2.9%). Send with otherProcessorCents. Left out: 2.9% + 30¢, flagged.", + "maximum": 20, + "minimum": 0, + "type": "number" + }, + "payments": { + "description": "How card payments arrive (Settings > Payments): shopify-payments, another (for example Stripe or Square), both, or not-sure (the third-party fee checks then can't run).", + "enum": [ + "shopify-payments", + "another", + "both", + "not-sure" + ], + "type": "string" + }, + "plan": { + "description": "The plan (Settings > Plan), or not-sure (plan fit and billing then can't be checked).", + "enum": [ + "basic", + "grow", + "advanced", + "plus", + "starter", + "not-sure" + ], + "type": "string" + }, + "platform": { + "const": "shopify", + "description": "shopify, for a store on the seller's own Shopify site.", + "type": "string" + }, + "productCost": { + "description": "What the products in that order cost the seller (COGS), US dollars. Or send productCostShare when not sure.", + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + "productCostShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-20", + "20-35", + "35-50", + "over-50" + ], + "type": "string" + } + ], + "description": "When the seller isn't sure of product cost: its share of the order, a fraction or a band." + }, + "roas": { + "anyOf": [ + { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-1.5", + "1.5-2.49", + "2.5-3.99", + "4-plus" + ], + "type": "string" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "Sales from Shopify (not Ads Manager) ÷ ad spend, last 30 days: a number, a band, or not-sure. Only when the store runs ads." + }, + "shippingCharged": { + "description": "What the buyer pays for shipping on a typical order, US dollars (0 if free).", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "shopifyPaymentsShare": { + "description": "With both: the share of sales Shopify Payments handles (Shop Pay, local methods), a fraction. Left out: half, flagged.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "targetMargin": { + "description": "The margin the seller wants on each order after every cost, a fraction (0.2 is 20%), for the target price.", + "maximum": 0.9, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "platform", + "orders", + "orderValue", + "shippingCharged", + "labelCost", + "plan", + "billing", + "payments", + "ads" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "acos": { + "anyOf": [ + { + "exclusiveMinimum": 0, + "maximum": 10, + "type": "number" + }, + { + "enum": [ + "under-20", + "20-34", + "35-49", + "50-plus" + ], + "type": "string" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "ACoS, last 30 days (Campaign Manager): a fraction (0.3 is 30%), a band, or not-sure. Only when the seller runs Sponsored Products." + }, + "category": { + "description": "The Amazon category, which sets the referral fee, or not-sure (Everything Else, 15%, flagged).", + "enum": [ + "beauty-health", + "baby", + "grocery", + "clothing", + "home-kitchen", + "toys", + "sports-outdoors", + "pet", + "electronics-accessories", + "media", + "jewelry", + "furniture", + "everything-else", + "amazon-device-accessories", + "compact-appliances", + "full-size-appliances", + "automotive", + "base-power-tools", + "backpacks-handbags-luggage", + "business-industrial-scientific", + "computers", + "consumer-electronics", + "eyewear", + "footwear", + "gift-cards", + "lawn-garden", + "lawn-mowers-snow-throwers", + "mattresses", + "musical-instruments", + "office", + "tires", + "tools", + "video-games", + "video-game-consoles", + "watches", + "not-sure" + ], + "type": "string" + }, + "deeper": { + "additionalProperties": false, + "description": "Optional go-deeper answers; each one sharpens the result. packed (the packed size) makes the FBA estimate and the size and weight checks exact to the rate card.", + "properties": { + "coupons": { + "additionalProperties": false, + "description": "Coupons.", + "properties": { + "discount": { + "description": "The coupon discount, a fraction of the price.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "runsPerMonth": { + "description": "Coupon runs a month.", + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + "share": { + "description": "Share of units sold with the coupon.", + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "runsPerMonth", + "discount", + "share" + ], + "type": "object" + }, + "cubicFeet": { + "description": "Cubic feet per packed unit, when the dimensions aren't known (storage).", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "fbaShare": { + "description": "With fulfillment both: the share of units Amazon ships, a fraction. Left out: half, flagged.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "inbound": { + "additionalProperties": false, + "description": "Inbound placement choice.", + "properties": { + "extraFreightPerUnit": { + "description": "Extra freight per unit an optimized split costs, US dollars, if quoted.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "split": { + "description": "How stock is split across Amazon's inbound locations.", + "enum": [ + "minimal", + "partial", + "optimized" + ], + "type": "string" + } + }, + "required": [ + "split" + ], + "type": "object" + }, + "inventory": { + "additionalProperties": false, + "description": "Stock at Amazon.", + "properties": { + "agedBand": { + "description": "How old those units are, in days. Default 181-270.", + "enum": [ + "181-270", + "271-365", + "over-365" + ], + "type": "string" + }, + "agedUnits": { + "description": "Units older than 6 months (181+ days).", + "maximum": 1000000, + "minimum": 0, + "type": "integer" + }, + "daysOfSupply": { + "description": "Days of supply on hand (Amazon's low-inventory measure).", + "maximum": 3650, + "minimum": 0, + "type": "integer" + }, + "unitsAtAmazon": { + "description": "Units in Amazon's warehouses. Default: one month of sales.", + "maximum": 1000000, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + "packaging": { + "description": "Packaging per unit the seller ships, US dollars. Left out: $1 typical, flagged.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "packed": { + "additionalProperties": false, + "description": "The packed size and weight, as Amazon measures it: makes the FBA estimate and the size and weight checks exact to the rate card.", + "properties": { + "heightIn": { + "description": "Height, inches, packed.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + }, + "lengthIn": { + "description": "Length, inches, packed.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + }, + "weightOz": { + "description": "Weight, ounces, packed (16 oz is 1 lb).", + "exclusiveMinimum": 0, + "maximum": 4800, + "type": "number" + }, + "widthIn": { + "description": "Width, inches, packed.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + } + }, + "required": [ + "lengthIn", + "widthIn", + "heightIn", + "weightOz" + ], + "type": "object" + }, + "peakUnits": { + "description": "Units shipped October 15 to January 14 (the peak season), for the whole season.", + "maximum": 10000000, + "minimum": 0, + "type": "integer" + }, + "returns": { + "additionalProperties": false, + "description": "Returns: the rate, and the unsellable share.", + "properties": { + "rate": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-3", + "3-6", + "6-10", + "10-15", + "over-15" + ], + "type": "string" + } + ], + "description": "Share of units returned: a fraction, or a band (bands are our assumption)." + }, + "unsellableShare": { + "description": "Share of returns that come back unsellable. Default 0.", + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "rate" + ], + "type": "object" + }, + "sourcingCostEntered": { + "description": "True when the seller has entered sourcing costs in Manage Your Sourcing Cost.", + "type": "boolean" + } + }, + "type": "object" + }, + "fbaFee": { + "description": "FBA or both: the FBA fee per unit from Fee Preview or the Revenue Calculator, US dollars, all-in. Turns the estimate into the seller's own number. Or send sizeBand and weightBand.", + "maximum": 1000, + "minimum": 0.01, + "type": "number" + }, + "fulfillment": { + "description": "Who ships: fba (Amazon), fbm (the seller), or both.", + "enum": [ + "fba", + "fbm", + "both" + ], + "type": "string" + }, + "labelCost": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "FBM or both: what the label costs per unit, US dollars, or not-sure." + }, + "landedCost": { + "description": "Landed cost per unit (product + freight + duties + prep, to Amazon's door), US dollars. Or send landedCostShare when not sure.", + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + "landedCostShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-20", + "20-35", + "35-50", + "over-50" + ], + "type": "string" + } + ], + "description": "When the seller isn't sure of landed cost: its share of the price, a fraction or a band." + }, + "plan": { + "description": "professional ($39.99 a month), individual ($0.99 an item), or not-sure.", + "enum": [ + "professional", + "individual", + "not-sure" + ], + "type": "string" + }, + "platform": { + "const": "amazon", + "description": "amazon, for a seller on Amazon's US marketplace.", + "type": "string" + }, + "ppc": { + "description": "Sponsored Products a month: none, a band (US dollars a month), or yes with ppcMonthlySpend. 5000-plus needs ppcMonthlySpend.", + "enum": [ + "none", + "yes", + "under-500", + "500-1999", + "2000-4999", + "5000-plus" + ], + "type": "string" + }, + "ppcMonthlySpend": { + "description": "Sponsored Products spend a month, US dollars. Wins over the band.", + "maximum": 1000000, + "minimum": 0.01, + "type": "number" + }, + "price": { + "description": "The selling price on Amazon, US dollars.", + "maximum": 100000, + "minimum": 0.01, + "type": "number" + }, + "shippingCharged": { + "description": "FBM or both: what the buyer pays for shipping per unit, US dollars (0 if free).", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "sizeBand": { + "description": "FBA or both, when the FBA fee isn't known: small-flat (fits 15 × 12 × 0.75 in), standard-box (up to 18 × 14 × 8 in), bigger. Send with weightBand.", + "enum": [ + "small-flat", + "standard-box", + "bigger" + ], + "type": "string" + }, + "targetMargin": { + "description": "The margin the seller wants after every cost, a fraction of the price (0.2 is 20%), for the repricing fixes. Default 0: break-even.", + "maximum": 0.9, + "minimum": 0, + "type": "number" + }, + "today": { + "description": "Today's date, YYYY-MM-DD: picks the storage season and the peak window (October 15 to January 14). Default: today in Los Angeles.", + "maxLength": 10, + "pattern": "^20(2[6-9]|[3-9]\\d)-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$", + "type": "string" + }, + "units": { + "anyOf": [ + { + "maximum": 1000000, + "minimum": 1, + "type": "number" + }, + { + "enum": [ + "1-40", + "41-150", + "151-500", + "501-1500", + "1501-5000" + ], + "type": "string" + } + ], + "description": "Units sold in a typical month (Business Reports > Sales Dashboard > Units Ordered): a number, or a band. Over 5,000: send the number." + }, + "weightBand": { + "description": "FBA or both, when the FBA fee isn't known: the packed weight band. Send with sizeBand.", + "enum": [ + "under-8oz", + "8oz-1lb", + "1-2lb", + "2-3lb", + "over-3lb" + ], + "type": "string" + } + }, + "required": [ + "platform", + "units", + "price", + "category", + "fulfillment", + "plan", + "ppc" + ], + "type": "object" + } +]
1 tool update
- Changed
sellerprofit_amazon_ads_breakeven1 field changed- changed
Output schema / properties / referral / descriptionPrevious value: -"The referral fee's working and whether its reading is confirmed (same as sellerprofit_amazon_fees)."New value: +"The referral fee's working and whether its reading is confirmed."
13 tool updates
- Changed
sellerprofit_ads_breakeven1 field changed- changed
Output schema / properties / assumptions / items / properties / isDefault / descriptionPrevious value: -"True when the value isn't the seller's own number or tap. Tell the seller, and ask for theirs."New value: +"True when the value isn't the seller's own number or tap: a default their own figure would replace."
- Changed
sellerprofit_ads_roas_breakeven2 fields changed- changed
Output schema / properties / assumptions / items / properties / isDefault / descriptionPrevious value: -"True when the value isn't the seller's own number or tap. Tell the seller, and ask for theirs."New value: +"True when the value isn't the seller's own number or tap: a default their own figure would replace." - changed
Output schema / properties / notes / descriptionPrevious value: -"What the math counts, assumes and leaves out, in plain words. Tell the seller."New value: +"What the math counts, assumes and leaves out, in plain words."
- Changed
sellerprofit_amazon_ads_breakeven2 fields changed- changed
Output schema / properties / assumptions / items / properties / isDefault / descriptionPrevious value: -"True when the value isn't the seller's own number or tap. Tell the seller, and ask for theirs."New value: +"True when the value isn't the seller's own number or tap: a default their own figure would replace." - changed
Output schema / properties / fbmLabel / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "label": { - "description": "The label cost counted per order, US dollars.", - "type": "number" - }, - "labelGiven": { - "description": "False when labelCost was left out: the label is then counted as shipping charged − packaging, never below 0.", - "type": "boolean" - }, - "note": { - "description": "When labelCost was left out: what was counted, in words. Tell the seller and ask for their label cost.", - "type": [ - "string", - "null" - ] - }, - "packaging": { - "type": "number" - }, - "packagingGiven": { - "type": "boolean" - } - }, - "required": [ - "label", - "labelGiven", - "packaging", - "packagingGiven", - "note" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "label": { + "description": "The label cost counted per order, US dollars.", + "type": "number" + }, + "labelGiven": { + "description": "False when labelCost was left out: the label is then counted as shipping charged − packaging, never below 0.", + "type": "boolean" + }, + "note": { + "description": "When labelCost was left out: what was counted, in words; the seller's own label cost would replace it.", + "type": [ + "string", + "null" + ] + }, + "packaging": { + "type": "number" + }, + "packagingGiven": { + "type": "boolean" + } + }, + "required": [ + "label", + "labelGiven", + "packaging", + "packagingGiven", + "note" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
sellerprofit_amazon_fees1 field changed- changed
Output schema / properties / assumptions / items / properties / isDefault / descriptionPrevious value: -"True when the value isn't the seller's own number or tap. Tell the seller, and ask for theirs."New value: +"True when the value isn't the seller's own number or tap: a default their own figure would replace."
- Changed
sellerprofit_box_billing3 fields changed- changed
Output schema / properties / assumptions / items / properties / isDefault / descriptionPrevious value: -"True when the value isn't the seller's own number or tap. Tell the seller, and ask for theirs."New value: +"True when the value isn't the seller's own number or tap: a default their own figure would replace." - changed
Output schema / properties / notes / descriptionPrevious value: -"What the weights leave out and why, in plain words: no label prices, divisors that depend on the account, carriers re-measure. Tell the seller."New value: +"What the weights leave out and why, in plain words: no label prices, divisors that depend on the account, carriers re-measure." - changed
Output schema / properties / warnings / descriptionPrevious value: -"Things about this box to tell the seller (rounding takes it over 1 cubic foot; USPS size limits and fees; UPS and FedEx large packages)."New value: +"Things worth knowing about this box (rounding takes it over 1 cubic foot; USPS size limits and fees; UPS and FedEx large packages)."
- Changed
sellerprofit_checkup2 fields changed- changed
Output schema / properties / assumptions / items / properties / isDefault / descriptionPrevious value: -"True when the value isn't the seller's own number or tap. Tell the seller, and ask for theirs."New value: +"True when the value isn't the seller's own number or tap: a default their own figure would replace." - changed
Output schema / properties / grade / properties / missing / descriptionPrevious value: -"With no grade yet: the answers that would let more checks run, most useful first. Ask the seller for these, then call again."New value: +"With no grade yet: the answers that would let more checks run, most useful first."
- Changed
sellerprofit_compare_fees1 field changed- changed
Output schema / properties / assumptions / items / properties / isDefault / descriptionPrevious value: -"True when the value isn't the seller's own number or tap. Tell the seller, and ask for theirs."New value: +"True when the value isn't the seller's own number or tap: a default their own figure would replace."
- Changed
sellerprofit_offsite_ads1 field changed- changed
Output schema / properties / assumptions / items / properties / isDefault / descriptionPrevious value: -"True when the value isn't the seller's own number or tap. Tell the seller, and ask for theirs."New value: +"True when the value isn't the seller's own number or tap: a default their own figure would replace."
- Changed
sellerprofit_price_for_margin1 field changed- changed
Output schema / properties / assumptions / items / properties / isDefault / descriptionPrevious value: -"True when the value isn't the seller's own number or tap. Tell the seller, and ask for theirs."New value: +"True when the value isn't the seller's own number or tap: a default their own figure would replace."
- Changed
sellerprofit_sale_breakeven2 fields changed- changed
Output schema / properties / assumptions / items / properties / isDefault / descriptionPrevious value: -"True when the value isn't the seller's own number or tap. Tell the seller, and ask for theirs."New value: +"True when the value isn't the seller's own number or tap: a default their own figure would replace." - changed
Output schema / properties / notes / descriptionPrevious value: -"What the math assumes and leaves out, in plain words. Tell the seller."New value: +"What the math assumes and leaves out, in plain words."
- Changed
sellerprofit_shipping_gap1 field changed- changed
Output schema / properties / assumptions / items / properties / isDefault / descriptionPrevious value: -"True when the value isn't the seller's own number or tap. Tell the seller, and ask for theirs."New value: +"True when the value isn't the seller's own number or tap: a default their own figure would replace."
- Changed
sellerprofit_shopify_order_fees1 field changed- changed
Output schema / properties / assumptions / items / properties / isDefault / descriptionPrevious value: -"True when the value isn't the seller's own number or tap. Tell the seller, and ask for theirs."New value: +"True when the value isn't the seller's own number or tap: a default their own figure would replace."
- Changed
sellerprofit_shopify_plan_fit2 fields changed- changed
Output schema / properties / assumedNoPremium / descriptionPrevious value: -"True when premiumCardShare was left out and some sales go through Shopify Payments: none were counted as premium cards. Tell the seller, and ask for their share."New value: +"True when premiumCardShare was left out and some sales go through Shopify Payments: none were counted as premium cards; the seller's own share would change the answer." - changed
Output schema / properties / shareIsDefault / descriptionPrevious value: -"True when the split is the default half: ask the seller for theirs."New value: +"True when the split is the default half, which the seller's own split would replace."
13 tool updates
- Changed
sellerprofit_ads_roas_breakeven2 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"Amazon only: the referral category: beauty-health, baby, grocery, clothing, home-kitchen, toys, sports-outdoors, pet, electronics-accessories, media, jewelry, furniture, everything-else, amazon-device-accessories, compact-appliances, full-size-appliances, automotive, base-power-tools, backpacks-handbags-luggage, business-industrial-scientific, computers, consumer-electronics, eyewear, footwear, gift-cards, lawn-garden, lawn-mowers-snow-throwers, mattresses, musical-instruments, office, tires, tools, video-games, video-game-consoles, watches, or not-sure. Left out: Everything Else (15%), flagged."New value: +"Amazon only: the referral category, or not-sure. Left out: Everything Else (15%), flagged." - changed
Input schema / properties / shopifyPlan / descriptionPrevious value: -"Shopify only: basic, grow or advanced (sets the Shopify Payments card rate). Left out: basic, flagged."New value: +"Shopify only: the plan, which sets the Shopify Payments card rate. Left out: basic, flagged."
- Changed
sellerprofit_amazon_ads_breakeven2 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"The Amazon category (sets the referral fee): beauty-health, baby, grocery, clothing, home-kitchen, toys, sports-outdoors, pet, electronics-accessories, media, jewelry, furniture, everything-else, amazon-device-accessories, compact-appliances, full-size-appliances, automotive, base-power-tools, backpacks-handbags-luggage, business-industrial-scientific, computers, consumer-electronics, eyewear, footwear, gift-cards, lawn-garden, lawn-mowers-snow-throwers, mattresses, musical-instruments, office, tires, tools, video-games, video-game-consoles, watches, or not-sure (Everything Else, 15%, flagged)."New value: +"The Amazon category, which sets the referral fee, or not-sure (Everything Else, 15%, flagged)." - changed
Input schema / properties / weightBand / descriptionPrevious value: -"FBA: under-8oz, 8oz-1lb, 1-2lb, 2-3lb, over-3lb (the top of the band is used; over-3lb has no top, so it is billed from 3 lb and heavier items cost more: send packed for a closer number). Send with sizeBand."New value: +"FBA: the packed weight band (the top of the band is used; over-3lb has no top, so it is billed from 3 lb and heavier items cost more: send packed for a closer number). Send with sizeBand."
- Changed
sellerprofit_amazon_fees2 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"The Amazon category (sets the referral fee): beauty-health, baby, grocery, clothing, home-kitchen, toys, sports-outdoors, pet, electronics-accessories, media, jewelry, furniture, everything-else, amazon-device-accessories, compact-appliances, full-size-appliances, automotive, base-power-tools, backpacks-handbags-luggage, business-industrial-scientific, computers, consumer-electronics, eyewear, footwear, gift-cards, lawn-garden, lawn-mowers-snow-throwers, mattresses, musical-instruments, office, tires, tools, video-games, video-game-consoles, watches, or not-sure (Everything Else, 15%, flagged)."New value: +"The Amazon category, which sets the referral fee, or not-sure (Everything Else, 15%, flagged)." - changed
Input schema / properties / weightBand / descriptionPrevious value: -"FBA only (both needs packed): under-8oz, 8oz-1lb, 1-2lb, 2-3lb, over-3lb (the top of the band is used; over-3lb has no top, so it is billed from 3 lb and heavier items cost more: send packed for a closer number). Send with sizeBand."New value: +"FBA only (both needs packed): the packed weight band (the top of the band is used; over-3lb has no top, so it is billed from 3 lb and heavier items cost more: send packed for a closer number). Send with sizeBand."
- Changed
sellerprofit_checkup1 field changed- changed
Input schema / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "adsDailyBudget": { - "description": "Etsy Ads daily budget, US dollars (assumed fully spent, 30 days a month).", - "maximum": 10000, - "minimum": 0.01, - "type": "number" - }, - "adsMonthlySpend": { - "description": "Exact Etsy Ads spend last 30 days, US dollars. Wins over the daily budget.", - "maximum": 300000, - "minimum": 0.01, - "type": "number" - }, - "deeper": { - "additionalProperties": false, - "description": "Optional go-deeper answers; each one sharpens the result.", - "properties": { - "discountDepth": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "none", - "up-to-10", - "11-20", - "21-30", - "over-30" - ], - "type": "string" - } - ], - "description": "Typical discount: a fraction (0.15), or none, up-to-10, 11-20, 21-30, over-30." - }, - "discountShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "a-few", - "some", - "many" - ], - "type": "string" - } - ], - "description": "Share of orders that use a discount: a fraction, or a-few, some, many. Needed when discountDepth isn't none or 0." - }, - "freeShippingShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "none", - "1-in-4", - "half", - "3-in-4", - "all" - ], - "type": "string" - } - ], - "description": "Share of orders that ship free: a fraction (0.25), or none, 1-in-4, half, 3-in-4, all." - }, - "hourlyPay": { - "description": "The hourly pay the seller wants for their time, US dollars. Needs minutesPerItem.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "minutesPerItem": { - "anyOf": [ - { - "maximum": 6000, - "minimum": 1, - "type": "number" - }, - { - "enum": [ - "under-15", - "15-44", - "45-90" - ], - "type": "string" - } - ], - "description": "Minutes to make and pack one item: a number, or under-15, 15-44, 45-90." - }, - "offsiteShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-5", - "5-14", - "15-24", - "25-plus" - ], - "type": "string" - } - ], - "description": "Share of sales from Offsite Ads (Marketing > Offsite Ads): a fraction, or under-5, 5-14, 15-24, 25-plus. Left out: Etsy's typical 10% (2020), flagged as a default." - }, - "packaging": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "mailer", - "box", - "not-sure" - ], - "type": "string" - } - ], - "description": "Packaging per order in US dollars, or mailer (about $1), box (about $3) or not-sure. Left out: $1, a weakly sourced typical figure, flagged as a default." - }, - "refunds": { - "additionalProperties": false, - "description": "Refunds: send frequency or perMonth, and outcome.", - "properties": { - "frequency": { - "description": "How often: rarely (1 in 50), sometimes (1 in 20), often (1 in 10). Or send perMonth.", - "enum": [ - "rarely", - "sometimes", - "often" - ], - "type": "string" - }, - "outcome": { - "description": "What usually happens on a refund: back-buyer-pays-return, back-i-pay-return, buyer-keeps or mixed.", - "enum": [ - "back-buyer-pays-return", - "back-i-pay-return", - "buyer-keeps", - "mixed" - ], - "type": "string" - }, - "perMonth": { - "description": "Refunds in a typical month, as a number. Or send frequency.", - "maximum": 100000, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "outcome" - ], - "type": "object" - } - }, - "type": "object" - }, - "etsyAds": { - "description": "Etsy Ads daily budget: no, a band 1-4, 5-14, 15-24, 25-plus (dollars a day), or yes with adsDailyBudget or adsMonthlySpend. 25-plus needs adsDailyBudget.", - "enum": [ - "no", - "yes", - "1-4", - "5-14", - "15-24", - "25-plus" - ], - "type": "string" - }, - "itemPrice": { - "description": "Typical item price in US dollars, before shipping (the item sold most).", - "maximum": 100000, - "minimum": 0.01, - "type": "number" - }, - "labelCost": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "What the shipping label costs, US dollars, or not-sure (shipping is then treated as breaking even and shown as couldn't check)." - }, - "materials": { - "description": "Materials and supplies for one item, US dollars. Or send materialsShare when the seller isn't sure.", - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - "materialsShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-20", - "20-35", - "35-50", - "over-50" - ], - "type": "string" - } - ], - "description": "When the seller isn't sure of materials: the share of the price they take, a fraction or under-20, 20-35, 35-50, over-50." - }, - "orders": { - "anyOf": [ - { - "maximum": 100000, - "minimum": 1, - "type": "number" - }, - { - "enum": [ - "1-10", - "11-30", - "31-75", - "76-150", - "151-300" - ], - "type": "string" - } - ], - "description": "Orders in a typical month: a number from 1 to 100,000 (Shop Manager > Stats > Orders), or a band: 1-10, 11-30, 31-75, 76-150, 151-300. Over 300: send the number." - }, - "platform": { - "const": "etsy", - "default": "etsy", - "description": "etsy (the default when left out).", - "type": "string" - }, - "roas": { - "anyOf": [ - { - "maximum": 100, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-1", - "1-1.9", - "2-2.9", - "3-4.9", - "5-plus" - ], - "type": "string" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "Etsy Ads ROAS, last 30 days (Etsy Ads page): a number, a band (under-1, 1-1.9, 2-2.9, 3-4.9, 5-plus), or not-sure. Only when the shop runs ads." - }, - "shippingCharged": { - "description": "What the buyer pays for shipping on a typical order, US dollars (0 if free).", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "targetProfitPerOrder": { - "description": "Profit per order the seller wants on top of costs, US dollars (used by the price fix when orders lose money). Default 0.", - "maximum": 10000, - "minimum": 0, - "type": "number" - }, - "tenK": { - "description": "Has the shop sold $10,000 or more in any 12 months? yes (Offsite Ads 12% for life), no-offsite-on (15%, can opt out), no-opted-out (no Offsite fee), not-sure (estimated from orders × price).", - "enum": [ - "yes", - "no-offsite-on", - "no-opted-out", - "not-sure" - ], - "type": "string" - } - }, - "required": [ - "orders", - "itemPrice", - "shippingCharged", - "labelCost", - "tenK", - "etsyAds" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "ads": { - "description": "Ads a month (Meta, Google, TikTok): none, a band under-300, 300-999, 1000-2999, 3000-plus (US dollars a month), or yes with adsMonthlySpend. 3000-plus needs adsMonthlySpend.", - "enum": [ - "none", - "yes", - "under-300", - "300-999", - "1000-2999", - "3000-plus" - ], - "type": "string" - }, - "adsMonthlySpend": { - "description": "Ad spend a month, US dollars. Wins over the band.", - "maximum": 1000000, - "minimum": 0.01, - "type": "number" - }, - "billing": { - "description": "How the plan is paid: monthly, yearly, or not-sure.", - "enum": [ - "monthly", - "yearly", - "not-sure" - ], - "type": "string" - }, - "deeper": { - "additionalProperties": false, - "description": "Optional go-deeper answers; each one sharpens the result and adds a check.", - "properties": { - "appBill": { - "anyOf": [ - { - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-50", - "50-149", - "150-299" - ], - "type": "string" - } - ], - "description": "The monthly app bill: US dollars, or under-50, 50-149, 150-299. $300 or more: send the dollars." - }, - "appsUnproven": { - "anyOf": [ - { - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "Of the app bill, US dollars a month for apps the seller can't tie to sales or time saved, or not-sure. Needs appBill." - }, - "chargebacksLostPerMonth": { - "description": "Chargebacks lost in a typical month.", - "maximum": 100000, - "minimum": 0, - "type": "integer" - }, - "foreignShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "none", - "under-5", - "5-14", - "15-24", - "25-plus" - ], - "type": "string" - } - ], - "description": "Share of sales paid in another currency: a fraction, or none, under-5, 5-14, 15-24, 25-plus." - }, - "freeShippingShareOver": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "none", - "1-in-4", - "half", - "3-in-4", - "all" - ], - "type": "string" - } - ], - "description": "Share of orders at or over the threshold: a fraction, or none, 1-in-4, half, 3-in-4, all." - }, - "freeShippingThreshold": { - "description": "The free-shipping threshold, US dollars. Needs freeShippingShareOver.", - "maximum": 10000, - "minimum": 0, - "type": "number" - }, - "packaging": { - "description": "Packaging per order, US dollars. Left out: not counted, and flagged.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "refunds": { - "additionalProperties": false, - "description": "Refunds and returns: send frequency or perMonth, and outcome.", - "properties": { - "frequency": { - "description": "How often: rarely (1 in 50), sometimes (1 in 20), often (1 in 10). Or send perMonth.", - "enum": [ - "rarely", - "sometimes", - "often" - ], - "type": "string" - }, - "outcome": { - "description": "What usually happens on a refund: back-buyer-pays-return, back-i-pay-return, buyer-keeps or mixed.", - "enum": [ - "back-buyer-pays-return", - "back-i-pay-return", - "buyer-keeps", - "mixed" - ], - "type": "string" - }, - "perMonth": { - "description": "Refunds in a typical month, as a number. Or send frequency.", - "maximum": 100000, - "minimum": 0, - "type": "integer" - }, - "returnLabel": { - "description": "What a return label costs the store, US dollars. Default: what the outbound label costs.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "unsellablePerMonth": { - "description": "Returned items a month that can't be resold.", - "maximum": 100000, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "outcome" - ], - "type": "object" - } - }, - "type": "object" - }, - "labelCost": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "What the shipping label costs, US dollars, or not-sure (shipping is then treated as breaking even and shown as couldn't check)." - }, - "orderValue": { - "description": "A typical order before shipping and tax, US dollars (average order value).", - "maximum": 100000, - "minimum": 0.01, - "type": "number" - }, - "orders": { - "anyOf": [ - { - "maximum": 100000, - "minimum": 1, - "type": "number" - }, - { - "enum": [ - "1-30", - "31-100", - "101-300", - "301-1000" - ], - "type": "string" - } - ], - "description": "Orders in a typical month (Analytics > Orders): a number, or a band 1-30, 31-100, 101-300, 301-1000. Over 1,000: send the number." - }, - "otherProcessorCents": { - "description": "The other card company's fixed fee per sale, in cents (30 is 30¢). Send with otherProcessorPercent.", - "maximum": 500, - "minimum": 0, - "type": "number" - }, - "otherProcessorPercent": { - "description": "The other card company's rate as a percent (2.9 is 2.9%). Send with otherProcessorCents. Left out: 2.9% + 30¢, flagged.", - "maximum": 20, - "minimum": 0, - "type": "number" - }, - "payments": { - "description": "How card payments arrive (Settings > Payments): shopify-payments, another (for example Stripe or Square), both, or not-sure (the third-party fee checks then can't run).", - "enum": [ - "shopify-payments", - "another", - "both", - "not-sure" - ], - "type": "string" - }, - "plan": { - "description": "The plan (Settings > Plan): basic, grow, advanced, plus, starter, or not-sure (plan fit and billing then can't be checked).", - "enum": [ - "basic", - "grow", - "advanced", - "plus", - "starter", - "not-sure" - ], - "type": "string" - }, - "platform": { - "const": "shopify", - "description": "shopify, for a store on the seller's own Shopify site.", - "type": "string" - }, - "productCost": { - "description": "What the products in that order cost the seller (COGS), US dollars. Or send productCostShare when not sure.", - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - "productCostShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-20", - "20-35", - "35-50", - "over-50" - ], - "type": "string" - } - ], - "description": "When the seller isn't sure of product cost: its share of the order, a fraction or under-20, 20-35, 35-50, over-50." - }, - "roas": { - "anyOf": [ - { - "maximum": 100, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-1.5", - "1.5-2.49", - "2.5-3.99", - "4-plus" - ], - "type": "string" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "Sales from Shopify (not Ads Manager) ÷ ad spend, last 30 days: a number, a band (under-1.5, 1.5-2.49, 2.5-3.99, 4-plus), or not-sure. Only when the store runs ads." - }, - "shippingCharged": { - "description": "What the buyer pays for shipping on a typical order, US dollars (0 if free).", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "shopifyPaymentsShare": { - "description": "With both: the share of sales Shopify Payments handles (Shop Pay, local methods), a fraction. Left out: half, flagged.", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "targetMargin": { - "description": "The margin the seller wants on each order after every cost, a fraction (0.2 is 20%), for the target price.", - "maximum": 0.9, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "platform", - "orders", - "orderValue", - "shippingCharged", - "labelCost", - "plan", - "billing", - "payments", - "ads" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "acos": { - "anyOf": [ - { - "exclusiveMinimum": 0, - "maximum": 10, - "type": "number" - }, - { - "enum": [ - "under-20", - "20-34", - "35-49", - "50-plus" - ], - "type": "string" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "ACoS, last 30 days (Campaign Manager): a fraction (0.3 is 30%), a band (under-20, 20-34, 35-49, 50-plus), or not-sure. Only when the seller runs Sponsored Products." - }, - "category": { - "description": "The Amazon category (sets the referral fee): beauty-health, baby, grocery, clothing, home-kitchen, toys, sports-outdoors, pet, electronics-accessories, media, jewelry, furniture, everything-else, or another row of Amazon's referral table (amazon-device-accessories, compact-appliances, full-size-appliances, automotive, base-power-tools, backpacks-handbags-luggage, business-industrial-scientific, computers, consumer-electronics, eyewear, footwear, gift-cards, lawn-garden, lawn-mowers-snow-throwers, mattresses, musical-instruments, office, tires, tools, video-games, video-game-consoles, watches), or not-sure (15%, flagged).", - "enum": [ - "beauty-health", - "baby", - "grocery", - "clothing", - "home-kitchen", - "toys", - "sports-outdoors", - "pet", - "electronics-accessories", - "media", - "jewelry", - "furniture", - "everything-else", - "amazon-device-accessories", - "compact-appliances", - "full-size-appliances", - "automotive", - "base-power-tools", - "backpacks-handbags-luggage", - "business-industrial-scientific", - "computers", - "consumer-electronics", - "eyewear", - "footwear", - "gift-cards", - "lawn-garden", - "lawn-mowers-snow-throwers", - "mattresses", - "musical-instruments", - "office", - "tires", - "tools", - "video-games", - "video-game-consoles", - "watches", - "not-sure" - ], - "type": "string" - }, - "deeper": { - "additionalProperties": false, - "description": "Optional go-deeper answers; each one sharpens the result. packed (the packed size) makes the FBA estimate and the size and weight checks exact to the rate card.", - "properties": { - "coupons": { - "additionalProperties": false, - "description": "Coupons.", - "properties": { - "discount": { - "description": "The coupon discount, a fraction of the price.", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "runsPerMonth": { - "description": "Coupon runs a month.", - "maximum": 100, - "minimum": 0, - "type": "integer" - }, - "share": { - "description": "Share of units sold with the coupon.", - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "runsPerMonth", - "discount", - "share" - ], - "type": "object" - }, - "cubicFeet": { - "description": "Cubic feet per packed unit, when the dimensions aren't known (storage).", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "fbaShare": { - "description": "With fulfillment both: the share of units Amazon ships, a fraction. Left out: half, flagged.", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "inbound": { - "additionalProperties": false, - "description": "Inbound placement choice.", - "properties": { - "extraFreightPerUnit": { - "description": "Extra freight per unit an optimized split costs, US dollars, if quoted.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "split": { - "description": "minimal, partial or optimized.", - "enum": [ - "minimal", - "partial", - "optimized" - ], - "type": "string" - } - }, - "required": [ - "split" - ], - "type": "object" - }, - "inventory": { - "additionalProperties": false, - "description": "Stock at Amazon.", - "properties": { - "agedBand": { - "description": "How old those units are: 181-270, 271-365, over-365. Default 181-270.", - "enum": [ - "181-270", - "271-365", - "over-365" - ], - "type": "string" - }, - "agedUnits": { - "description": "Units older than 6 months (181+ days).", - "maximum": 1000000, - "minimum": 0, - "type": "integer" - }, - "daysOfSupply": { - "description": "Days of supply on hand (Amazon's low-inventory measure).", - "maximum": 3650, - "minimum": 0, - "type": "integer" - }, - "unitsAtAmazon": { - "description": "Units in Amazon's warehouses. Default: one month of sales.", - "maximum": 1000000, - "minimum": 0, - "type": "integer" - } - }, - "type": "object" - }, - "packaging": { - "description": "Packaging per unit the seller ships, US dollars. Left out: $1 typical, flagged.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "packed": { - "additionalProperties": false, - "description": "The packed size and weight, as Amazon measures it: makes the FBA estimate and the size and weight checks exact to the rate card.", - "properties": { - "heightIn": { - "description": "Height, inches, packed.", - "exclusiveMinimum": 0, - "maximum": 200, - "type": "number" - }, - "lengthIn": { - "description": "Length, inches, packed.", - "exclusiveMinimum": 0, - "maximum": 200, - "type": "number" - }, - "weightOz": { - "description": "Weight, ounces, packed (16 oz is 1 lb).", - "exclusiveMinimum": 0, - "maximum": 4800, - "type": "number" - }, - "widthIn": { - "description": "Width, inches, packed.", - "exclusiveMinimum": 0, - "maximum": 200, - "type": "number" - } - }, - "required": [ - "lengthIn", - "widthIn", - "heightIn", - "weightOz" - ], - "type": "object" - }, - "peakUnits": { - "description": "Units shipped October 15 to January 14 (the peak season), for the whole season.", - "maximum": 10000000, - "minimum": 0, - "type": "integer" - }, - "returns": { - "additionalProperties": false, - "description": "Returns: the rate, and the unsellable share.", - "properties": { - "rate": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-3", - "3-6", - "6-10", - "10-15", - "over-15" - ], - "type": "string" - } - ], - "description": "Share of units returned: a fraction, or under-3, 3-6, 6-10, 10-15, over-15 (bands are our assumption)." - }, - "unsellableShare": { - "description": "Share of returns that come back unsellable. Default 0.", - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "rate" - ], - "type": "object" - }, - "sourcingCostEntered": { - "description": "True when the seller has entered sourcing costs in Manage Your Sourcing Cost.", - "type": "boolean" - } - }, - "type": "object" - }, - "fbaFee": { - "description": "FBA or both: the FBA fee per unit from Fee Preview or the Revenue Calculator, US dollars, all-in. Turns the estimate into the seller's own number. Or send sizeBand and weightBand.", - "maximum": 1000, - "minimum": 0.01, - "type": "number" - }, - "fulfillment": { - "description": "Who ships: fba (Amazon), fbm (the seller), or both.", - "enum": [ - "fba", - "fbm", - "both" - ], - "type": "string" - }, - "labelCost": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "FBM or both: what the label costs per unit, US dollars, or not-sure." - }, - "landedCost": { - "description": "Landed cost per unit (product + freight + duties + prep, to Amazon's door), US dollars. Or send landedCostShare when not sure.", - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - "landedCostShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-20", - "20-35", - "35-50", - "over-50" - ], - "type": "string" - } - ], - "description": "When the seller isn't sure of landed cost: its share of the price, a fraction or under-20, 20-35, 35-50, over-50." - }, - "plan": { - "description": "professional ($39.99 a month), individual ($0.99 an item), or not-sure.", - "enum": [ - "professional", - "individual", - "not-sure" - ], - "type": "string" - }, - "platform": { - "const": "amazon", - "description": "amazon, for a seller on Amazon's US marketplace.", - "type": "string" - }, - "ppc": { - "description": "Sponsored Products a month: none, a band under-500, 500-1999, 2000-4999, 5000-plus (US dollars a month), or yes with ppcMonthlySpend. 5000-plus needs ppcMonthlySpend.", - "enum": [ - "none", - "yes", - "under-500", - "500-1999", - "2000-4999", - "5000-plus" - ], - "type": "string" - }, - "ppcMonthlySpend": { - "description": "Sponsored Products spend a month, US dollars. Wins over the band.", - "maximum": 1000000, - "minimum": 0.01, - "type": "number" - }, - "price": { - "description": "The selling price on Amazon, US dollars.", - "maximum": 100000, - "minimum": 0.01, - "type": "number" - }, - "shippingCharged": { - "description": "FBM or both: what the buyer pays for shipping per unit, US dollars (0 if free).", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "sizeBand": { - "description": "FBA or both, when the FBA fee isn't known: small-flat (fits 15 × 12 × 0.75 in), standard-box (up to 18 × 14 × 8 in), bigger. Send with weightBand.", - "enum": [ - "small-flat", - "standard-box", - "bigger" - ], - "type": "string" - }, - "targetMargin": { - "description": "The margin the seller wants after every cost, a fraction of the price (0.2 is 20%), for the repricing fixes. Default 0: break-even.", - "maximum": 0.9, - "minimum": 0, - "type": "number" - }, - "today": { - "description": "Today's date, YYYY-MM-DD: picks the storage season and the peak window (October 15 to January 14). Default: the rates' as-of date, October 13, 2026.", - "maxLength": 10, - "pattern": "^20(2[6-9]|[3-9]\\d)-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$", - "type": "string" - }, - "units": { - "anyOf": [ - { - "maximum": 1000000, - "minimum": 1, - "type": "number" - }, - { - "enum": [ - "1-40", - "41-150", - "151-500", - "501-1500", - "1501-5000" - ], - "type": "string" - } - ], - "description": "Units sold in a typical month (Business Reports > Sales Dashboard > Units Ordered): a number, or a band 1-40, 41-150, 151-500, 501-1500, 1501-5000. Over 5,000: send the number." - }, - "weightBand": { - "description": "FBA or both, when the FBA fee isn't known: under-8oz, 8oz-1lb, 1-2lb, 2-3lb, over-3lb. Send with sizeBand.", - "enum": [ - "under-8oz", - "8oz-1lb", - "1-2lb", - "2-3lb", - "over-3lb" - ], - "type": "string" - } - }, - "required": [ - "platform", - "units", - "price", - "category", - "fulfillment", - "plan", - "ppc" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "adsDailyBudget": { + "description": "Etsy Ads daily budget, US dollars (assumed fully spent, 30 days a month).", + "maximum": 10000, + "minimum": 0.01, + "type": "number" + }, + "adsMonthlySpend": { + "description": "Exact Etsy Ads spend last 30 days, US dollars. Wins over the daily budget.", + "maximum": 300000, + "minimum": 0.01, + "type": "number" + }, + "deeper": { + "additionalProperties": false, + "description": "Optional go-deeper answers; each one sharpens the result.", + "properties": { + "discountDepth": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "none", + "up-to-10", + "11-20", + "21-30", + "over-30" + ], + "type": "string" + } + ], + "description": "Typical discount: a fraction (0.15), or a band." + }, + "discountShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "a-few", + "some", + "many" + ], + "type": "string" + } + ], + "description": "Share of orders that use a discount: a fraction, or a band. Needed when discountDepth isn't none or 0." + }, + "freeShippingShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "none", + "1-in-4", + "half", + "3-in-4", + "all" + ], + "type": "string" + } + ], + "description": "Share of orders that ship free: a fraction (0.25), or a band." + }, + "hourlyPay": { + "description": "The hourly pay the seller wants for their time, US dollars. Needs minutesPerItem.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "minutesPerItem": { + "anyOf": [ + { + "maximum": 6000, + "minimum": 1, + "type": "number" + }, + { + "enum": [ + "under-15", + "15-44", + "45-90" + ], + "type": "string" + } + ], + "description": "Minutes to make and pack one item: a number, or a band." + }, + "offsiteShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-5", + "5-14", + "15-24", + "25-plus" + ], + "type": "string" + } + ], + "description": "Share of sales from Offsite Ads (Marketing > Offsite Ads): a fraction, or a band. Left out: Etsy's typical 10% (2020), flagged as a default." + }, + "packaging": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "mailer", + "box", + "not-sure" + ], + "type": "string" + } + ], + "description": "Packaging per order in US dollars, or mailer (about $1), box (about $3) or not-sure. Left out: $1, a weakly sourced typical figure, flagged as a default." + }, + "refunds": { + "additionalProperties": false, + "description": "Refunds: send frequency or perMonth, and outcome.", + "properties": { + "frequency": { + "description": "How often: rarely (1 in 50), sometimes (1 in 20), often (1 in 10). Or send perMonth.", + "enum": [ + "rarely", + "sometimes", + "often" + ], + "type": "string" + }, + "outcome": { + "description": "What usually happens on a refund.", + "enum": [ + "back-buyer-pays-return", + "back-i-pay-return", + "buyer-keeps", + "mixed" + ], + "type": "string" + }, + "perMonth": { + "description": "Refunds in a typical month, as a number. Or send frequency.", + "maximum": 100000, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "outcome" + ], + "type": "object" + } + }, + "type": "object" + }, + "etsyAds": { + "description": "Etsy Ads daily budget: no, a band (dollars a day), or yes with adsDailyBudget or adsMonthlySpend. 25-plus needs adsDailyBudget.", + "enum": [ + "no", + "yes", + "1-4", + "5-14", + "15-24", + "25-plus" + ], + "type": "string" + }, + "itemPrice": { + "description": "Typical item price in US dollars, before shipping (the item sold most).", + "maximum": 100000, + "minimum": 0.01, + "type": "number" + }, + "labelCost": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "What the shipping label costs, US dollars, or not-sure (shipping is then treated as breaking even and shown as couldn't check)." + }, + "materials": { + "description": "Materials and supplies for one item, US dollars. Or send materialsShare when the seller isn't sure.", + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + "materialsShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-20", + "20-35", + "35-50", + "over-50" + ], + "type": "string" + } + ], + "description": "When the seller isn't sure of materials: the share of the price they take, a fraction or a band." + }, + "orders": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 1, + "type": "number" + }, + { + "enum": [ + "1-10", + "11-30", + "31-75", + "76-150", + "151-300" + ], + "type": "string" + } + ], + "description": "Orders in a typical month: a number from 1 to 100,000 (Shop Manager > Stats > Orders), or a band. Over 300: send the number." + }, + "platform": { + "const": "etsy", + "default": "etsy", + "description": "etsy (the default when left out).", + "type": "string" + }, + "roas": { + "anyOf": [ + { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-1", + "1-1.9", + "2-2.9", + "3-4.9", + "5-plus" + ], + "type": "string" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "Etsy Ads ROAS, last 30 days (Etsy Ads page): a number, a band, or not-sure. Only when the shop runs ads." + }, + "shippingCharged": { + "description": "What the buyer pays for shipping on a typical order, US dollars (0 if free).", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "targetProfitPerOrder": { + "description": "Profit per order the seller wants on top of costs, US dollars (used by the price fix when orders lose money). Default 0.", + "maximum": 10000, + "minimum": 0, + "type": "number" + }, + "tenK": { + "description": "Has the shop sold $10,000 or more in any 12 months? yes (Offsite Ads 12% for life), no-offsite-on (15%, can opt out), no-opted-out (no Offsite fee), not-sure (estimated from orders × price).", + "enum": [ + "yes", + "no-offsite-on", + "no-opted-out", + "not-sure" + ], + "type": "string" + } + }, + "required": [ + "orders", + "itemPrice", + "shippingCharged", + "labelCost", + "tenK", + "etsyAds" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "ads": { + "description": "Ads a month (Meta, Google, TikTok): none, a band (US dollars a month), or yes with adsMonthlySpend. 3000-plus needs adsMonthlySpend.", + "enum": [ + "none", + "yes", + "under-300", + "300-999", + "1000-2999", + "3000-plus" + ], + "type": "string" + }, + "adsMonthlySpend": { + "description": "Ad spend a month, US dollars. Wins over the band.", + "maximum": 1000000, + "minimum": 0.01, + "type": "number" + }, + "billing": { + "description": "How the plan is paid, or not-sure.", + "enum": [ + "monthly", + "yearly", + "not-sure" + ], + "type": "string" + }, + "deeper": { + "additionalProperties": false, + "description": "Optional go-deeper answers; each one sharpens the result and adds a check.", + "properties": { + "appBill": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-50", + "50-149", + "150-299" + ], + "type": "string" + } + ], + "description": "The monthly app bill: US dollars, or a band. $300 or more: send the dollars." + }, + "appsUnproven": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "Of the app bill, US dollars a month for apps the seller can't tie to sales or time saved, or not-sure. Needs appBill." + }, + "chargebacksLostPerMonth": { + "description": "Chargebacks lost in a typical month.", + "maximum": 100000, + "minimum": 0, + "type": "integer" + }, + "foreignShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "none", + "under-5", + "5-14", + "15-24", + "25-plus" + ], + "type": "string" + } + ], + "description": "Share of sales paid in another currency: a fraction, or a band." + }, + "freeShippingShareOver": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "none", + "1-in-4", + "half", + "3-in-4", + "all" + ], + "type": "string" + } + ], + "description": "Share of orders at or over the threshold: a fraction, or a band." + }, + "freeShippingThreshold": { + "description": "The free-shipping threshold, US dollars. Needs freeShippingShareOver.", + "maximum": 10000, + "minimum": 0, + "type": "number" + }, + "packaging": { + "description": "Packaging per order, US dollars. Left out: not counted, and flagged.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "refunds": { + "additionalProperties": false, + "description": "Refunds and returns: send frequency or perMonth, and outcome.", + "properties": { + "frequency": { + "description": "How often: rarely (1 in 50), sometimes (1 in 20), often (1 in 10). Or send perMonth.", + "enum": [ + "rarely", + "sometimes", + "often" + ], + "type": "string" + }, + "outcome": { + "description": "What usually happens on a refund.", + "enum": [ + "back-buyer-pays-return", + "back-i-pay-return", + "buyer-keeps", + "mixed" + ], + "type": "string" + }, + "perMonth": { + "description": "Refunds in a typical month, as a number. Or send frequency.", + "maximum": 100000, + "minimum": 0, + "type": "integer" + }, + "returnLabel": { + "description": "What a return label costs the store, US dollars. Default: what the outbound label costs.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "unsellablePerMonth": { + "description": "Returned items a month that can't be resold.", + "maximum": 100000, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "outcome" + ], + "type": "object" + } + }, + "type": "object" + }, + "labelCost": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "What the shipping label costs, US dollars, or not-sure (shipping is then treated as breaking even and shown as couldn't check)." + }, + "orderValue": { + "description": "A typical order before shipping and tax, US dollars (average order value).", + "maximum": 100000, + "minimum": 0.01, + "type": "number" + }, + "orders": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 1, + "type": "number" + }, + { + "enum": [ + "1-30", + "31-100", + "101-300", + "301-1000" + ], + "type": "string" + } + ], + "description": "Orders in a typical month (Analytics > Orders): a number, or a band. Over 1,000: send the number." + }, + "otherProcessorCents": { + "description": "The other card company's fixed fee per sale, in cents (30 is 30¢). Send with otherProcessorPercent.", + "maximum": 500, + "minimum": 0, + "type": "number" + }, + "otherProcessorPercent": { + "description": "The other card company's rate as a percent (2.9 is 2.9%). Send with otherProcessorCents. Left out: 2.9% + 30¢, flagged.", + "maximum": 20, + "minimum": 0, + "type": "number" + }, + "payments": { + "description": "How card payments arrive (Settings > Payments): shopify-payments, another (for example Stripe or Square), both, or not-sure (the third-party fee checks then can't run).", + "enum": [ + "shopify-payments", + "another", + "both", + "not-sure" + ], + "type": "string" + }, + "plan": { + "description": "The plan (Settings > Plan), or not-sure (plan fit and billing then can't be checked).", + "enum": [ + "basic", + "grow", + "advanced", + "plus", + "starter", + "not-sure" + ], + "type": "string" + }, + "platform": { + "const": "shopify", + "description": "shopify, for a store on the seller's own Shopify site.", + "type": "string" + }, + "productCost": { + "description": "What the products in that order cost the seller (COGS), US dollars. Or send productCostShare when not sure.", + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + "productCostShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-20", + "20-35", + "35-50", + "over-50" + ], + "type": "string" + } + ], + "description": "When the seller isn't sure of product cost: its share of the order, a fraction or a band." + }, + "roas": { + "anyOf": [ + { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-1.5", + "1.5-2.49", + "2.5-3.99", + "4-plus" + ], + "type": "string" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "Sales from Shopify (not Ads Manager) ÷ ad spend, last 30 days: a number, a band, or not-sure. Only when the store runs ads." + }, + "shippingCharged": { + "description": "What the buyer pays for shipping on a typical order, US dollars (0 if free).", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "shopifyPaymentsShare": { + "description": "With both: the share of sales Shopify Payments handles (Shop Pay, local methods), a fraction. Left out: half, flagged.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "targetMargin": { + "description": "The margin the seller wants on each order after every cost, a fraction (0.2 is 20%), for the target price.", + "maximum": 0.9, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "platform", + "orders", + "orderValue", + "shippingCharged", + "labelCost", + "plan", + "billing", + "payments", + "ads" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "acos": { + "anyOf": [ + { + "exclusiveMinimum": 0, + "maximum": 10, + "type": "number" + }, + { + "enum": [ + "under-20", + "20-34", + "35-49", + "50-plus" + ], + "type": "string" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "ACoS, last 30 days (Campaign Manager): a fraction (0.3 is 30%), a band, or not-sure. Only when the seller runs Sponsored Products." + }, + "category": { + "description": "The Amazon category, which sets the referral fee, or not-sure (Everything Else, 15%, flagged).", + "enum": [ + "beauty-health", + "baby", + "grocery", + "clothing", + "home-kitchen", + "toys", + "sports-outdoors", + "pet", + "electronics-accessories", + "media", + "jewelry", + "furniture", + "everything-else", + "amazon-device-accessories", + "compact-appliances", + "full-size-appliances", + "automotive", + "base-power-tools", + "backpacks-handbags-luggage", + "business-industrial-scientific", + "computers", + "consumer-electronics", + "eyewear", + "footwear", + "gift-cards", + "lawn-garden", + "lawn-mowers-snow-throwers", + "mattresses", + "musical-instruments", + "office", + "tires", + "tools", + "video-games", + "video-game-consoles", + "watches", + "not-sure" + ], + "type": "string" + }, + "deeper": { + "additionalProperties": false, + "description": "Optional go-deeper answers; each one sharpens the result. packed (the packed size) makes the FBA estimate and the size and weight checks exact to the rate card.", + "properties": { + "coupons": { + "additionalProperties": false, + "description": "Coupons.", + "properties": { + "discount": { + "description": "The coupon discount, a fraction of the price.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "runsPerMonth": { + "description": "Coupon runs a month.", + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + "share": { + "description": "Share of units sold with the coupon.", + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "runsPerMonth", + "discount", + "share" + ], + "type": "object" + }, + "cubicFeet": { + "description": "Cubic feet per packed unit, when the dimensions aren't known (storage).", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "fbaShare": { + "description": "With fulfillment both: the share of units Amazon ships, a fraction. Left out: half, flagged.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "inbound": { + "additionalProperties": false, + "description": "Inbound placement choice.", + "properties": { + "extraFreightPerUnit": { + "description": "Extra freight per unit an optimized split costs, US dollars, if quoted.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "split": { + "description": "How stock is split across Amazon's inbound locations.", + "enum": [ + "minimal", + "partial", + "optimized" + ], + "type": "string" + } + }, + "required": [ + "split" + ], + "type": "object" + }, + "inventory": { + "additionalProperties": false, + "description": "Stock at Amazon.", + "properties": { + "agedBand": { + "description": "How old those units are, in days. Default 181-270.", + "enum": [ + "181-270", + "271-365", + "over-365" + ], + "type": "string" + }, + "agedUnits": { + "description": "Units older than 6 months (181+ days).", + "maximum": 1000000, + "minimum": 0, + "type": "integer" + }, + "daysOfSupply": { + "description": "Days of supply on hand (Amazon's low-inventory measure).", + "maximum": 3650, + "minimum": 0, + "type": "integer" + }, + "unitsAtAmazon": { + "description": "Units in Amazon's warehouses. Default: one month of sales.", + "maximum": 1000000, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + "packaging": { + "description": "Packaging per unit the seller ships, US dollars. Left out: $1 typical, flagged.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "packed": { + "additionalProperties": false, + "description": "The packed size and weight, as Amazon measures it: makes the FBA estimate and the size and weight checks exact to the rate card.", + "properties": { + "heightIn": { + "description": "Height, inches, packed.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + }, + "lengthIn": { + "description": "Length, inches, packed.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + }, + "weightOz": { + "description": "Weight, ounces, packed (16 oz is 1 lb).", + "exclusiveMinimum": 0, + "maximum": 4800, + "type": "number" + }, + "widthIn": { + "description": "Width, inches, packed.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + } + }, + "required": [ + "lengthIn", + "widthIn", + "heightIn", + "weightOz" + ], + "type": "object" + }, + "peakUnits": { + "description": "Units shipped October 15 to January 14 (the peak season), for the whole season.", + "maximum": 10000000, + "minimum": 0, + "type": "integer" + }, + "returns": { + "additionalProperties": false, + "description": "Returns: the rate, and the unsellable share.", + "properties": { + "rate": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-3", + "3-6", + "6-10", + "10-15", + "over-15" + ], + "type": "string" + } + ], + "description": "Share of units returned: a fraction, or a band (bands are our assumption)." + }, + "unsellableShare": { + "description": "Share of returns that come back unsellable. Default 0.", + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "rate" + ], + "type": "object" + }, + "sourcingCostEntered": { + "description": "True when the seller has entered sourcing costs in Manage Your Sourcing Cost.", + "type": "boolean" + } + }, + "type": "object" + }, + "fbaFee": { + "description": "FBA or both: the FBA fee per unit from Fee Preview or the Revenue Calculator, US dollars, all-in. Turns the estimate into the seller's own number. Or send sizeBand and weightBand.", + "maximum": 1000, + "minimum": 0.01, + "type": "number" + }, + "fulfillment": { + "description": "Who ships: fba (Amazon), fbm (the seller), or both.", + "enum": [ + "fba", + "fbm", + "both" + ], + "type": "string" + }, + "labelCost": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "FBM or both: what the label costs per unit, US dollars, or not-sure." + }, + "landedCost": { + "description": "Landed cost per unit (product + freight + duties + prep, to Amazon's door), US dollars. Or send landedCostShare when not sure.", + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + "landedCostShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-20", + "20-35", + "35-50", + "over-50" + ], + "type": "string" + } + ], + "description": "When the seller isn't sure of landed cost: its share of the price, a fraction or a band." + }, + "plan": { + "description": "professional ($39.99 a month), individual ($0.99 an item), or not-sure.", + "enum": [ + "professional", + "individual", + "not-sure" + ], + "type": "string" + }, + "platform": { + "const": "amazon", + "description": "amazon, for a seller on Amazon's US marketplace.", + "type": "string" + }, + "ppc": { + "description": "Sponsored Products a month: none, a band (US dollars a month), or yes with ppcMonthlySpend. 5000-plus needs ppcMonthlySpend.", + "enum": [ + "none", + "yes", + "under-500", + "500-1999", + "2000-4999", + "5000-plus" + ], + "type": "string" + }, + "ppcMonthlySpend": { + "description": "Sponsored Products spend a month, US dollars. Wins over the band.", + "maximum": 1000000, + "minimum": 0.01, + "type": "number" + }, + "price": { + "description": "The selling price on Amazon, US dollars.", + "maximum": 100000, + "minimum": 0.01, + "type": "number" + }, + "shippingCharged": { + "description": "FBM or both: what the buyer pays for shipping per unit, US dollars (0 if free).", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "sizeBand": { + "description": "FBA or both, when the FBA fee isn't known: small-flat (fits 15 × 12 × 0.75 in), standard-box (up to 18 × 14 × 8 in), bigger. Send with weightBand.", + "enum": [ + "small-flat", + "standard-box", + "bigger" + ], + "type": "string" + }, + "targetMargin": { + "description": "The margin the seller wants after every cost, a fraction of the price (0.2 is 20%), for the repricing fixes. Default 0: break-even.", + "maximum": 0.9, + "minimum": 0, + "type": "number" + }, + "today": { + "description": "Today's date, YYYY-MM-DD: picks the storage season and the peak window (October 15 to January 14). Default: the rates' as-of date, October 13, 2026.", + "maxLength": 10, + "pattern": "^20(2[6-9]|[3-9]\\d)-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$", + "type": "string" + }, + "units": { + "anyOf": [ + { + "maximum": 1000000, + "minimum": 1, + "type": "number" + }, + { + "enum": [ + "1-40", + "41-150", + "151-500", + "501-1500", + "1501-5000" + ], + "type": "string" + } + ], + "description": "Units sold in a typical month (Business Reports > Sales Dashboard > Units Ordered): a number, or a band. Over 5,000: send the number." + }, + "weightBand": { + "description": "FBA or both, when the FBA fee isn't known: the packed weight band. Send with sizeBand.", + "enum": [ + "under-8oz", + "8oz-1lb", + "1-2lb", + "2-3lb", + "over-3lb" + ], + "type": "string" + } + }, + "required": [ + "platform", + "units", + "price", + "category", + "fulfillment", + "plan", + "ppc" + ], + "type": "object" + } +]
- Changed
sellerprofit_compare_fees7 fields changed- changed
Input schema / properties / amazonCategory / descriptionPrevious value: -"Amazon: the category, which sets the referral fee: beauty-health, baby, grocery, clothing, home-kitchen, toys, sports-outdoors, pet, electronics-accessories, media, jewelry, furniture, everything-else, amazon-device-accessories, compact-appliances, full-size-appliances, automotive, base-power-tools, backpacks-handbags-luggage, business-industrial-scientific, computers, consumer-electronics, eyewear, footwear, gift-cards, lawn-garden, lawn-mowers-snow-throwers, mattresses, musical-instruments, office, tires, tools, video-games, video-game-consoles, watches. Left out: Everything Else (15%), flagged."New value: +"Amazon: the category, which sets the referral fee. Left out: Everything Else (15%), flagged." - changed
Input schema / properties / etsyOffsiteAds / descriptionPrevious value: -"Etsy: did the sale come from an Offsite Ad? none, 12-percent (shops past $10,000 a year) or 15-percent. Left out: none, flagged."New value: +"Etsy: did the sale come from an Offsite Ad? none, 12-percent (shops past $10,000 a year) or 15-percent. Left out: none, flagged. off is taken as none." - changed
Input schema / properties / etsyOffsiteAds / enumPrevious value: -[ - "none", - "12-percent", - "15-percent" -]New value: +[ + "none", + "12-percent", + "15-percent", + "off" +] - changed
Input schema / properties / shopifyBilling / descriptionPrevious value: -"Shopify: monthly or yearly plan billing, used with ordersPerMonth. Left out: monthly."New value: +"Shopify: how the plan is billed, used with ordersPerMonth. Left out: monthly." - changed
Input schema / properties / shopifyPlan / descriptionPrevious value: -"Shopify: basic, grow or advanced, paid through Shopify Payments. Left out: basic, flagged."New value: +"Shopify: the plan, paid through Shopify Payments. Left out: basic, flagged." - added
Output schema / properties / columns / items / properties / moreThanLowestAdded value: +{ + "description": "totalPerOrder − the lowest column's totalPerOrder, US dollars: how much more this platform takes than the one that takes least (0 for the lowest).", + "type": "number" +} - changed
Output schema / properties / columns / items / requiredPrevious value: -[ - "platform", - "name", - "setup", - "orderTotal", - "lines", - "feesOnSale", - "fixed", - "totalPerOrder", - "left", - "shareOfOrder", - "lowest" -]New value: +[ + "platform", + "name", + "setup", + "orderTotal", + "lines", + "feesOnSale", + "fixed", + "totalPerOrder", + "left", + "shareOfOrder", + "lowest", + "moreThanLowest" +]
- Changed
sellerprofit_etsy_fees2 fields changed- changed
Input schema / properties / offsiteAds / descriptionPrevious value: -"Did this sale come from an Offsite Ad? none, or the rate the shop pays: 12-percent (the shop has sold $10,000 or more in any 12 months) or 15-percent (under $10,000). Default none."New value: +"Did this sale come from an Offsite Ad? none, or the rate the shop pays: 12-percent (the shop has sold $10,000 or more in any 12 months) or 15-percent (under $10,000). Default none; off is taken as none." - changed
Input schema / properties / offsiteAds / enumPrevious value: -[ - "none", - "12-percent", - "15-percent" -]New value: +[ + "none", + "12-percent", + "15-percent", + "off" +]
- Changed
sellerprofit_offsite_ads4 fields changed- changed
Input schema / properties / offsiteAds / descriptionPrevious value: -"The shop's Offsite Ads rate: 12-percent (the shop has sold $10,000 or more in any 12 months; for life, no opt-out), 15-percent (under $10,000, Offsite Ads on), or off (opted out)."New value: +"The shop's Offsite Ads rate: 12-percent (the shop has sold $10,000 or more in any 12 months; for life, no opt-out), 15-percent (under $10,000, Offsite Ads on), or off (opted out). none is taken as off." - changed
Input schema / properties / offsiteAds / enumPrevious value: -[ - "12-percent", - "15-percent", - "off" -]New value: +[ + "12-percent", + "15-percent", + "off", + "none" +] - changed
Input schema / properties / offsiteShare / descriptionPrevious value: -"Share of sales from Offsite Ads (Marketing > Offsite Ads): a fraction (0.1 is 10%), or under-5, 5-14, 15-24, 25-plus. Left out: Etsy's typical 10% (2020), flagged as a default."New value: +"Share of sales from Offsite Ads (Marketing > Offsite Ads): a fraction (0.1 is 10%), or a band. Left out: Etsy's typical 10% (2020), flagged as a default." - changed
Input schema / properties / orders / descriptionPrevious value: -"Orders in a typical month: a number from 1 to 100,000 (Shop Manager > Stats > Orders), or a band: 1-10, 11-30, 31-75, 76-150, 151-300. Over 300: send the number."New value: +"Orders in a typical month: a number from 1 to 100,000 (Shop Manager > Stats > Orders), or a band. Over 300: send the number."
- Changed
sellerprofit_price_for_margin3 fields changed- changed
Input schema / properties / offsiteAds / descriptionPrevious value: -"The shop's Offsite Ads rate: 12-percent (past $10,000 in any 12 months), 15-percent (under $10,000, on), or off."New value: +"The shop's Offsite Ads rate: 12-percent (past $10,000 in any 12 months), 15-percent (under $10,000, on), or off. none is taken as off." - changed
Input schema / properties / offsiteAds / enumPrevious value: -[ - "12-percent", - "15-percent", - "off" -]New value: +[ + "12-percent", + "15-percent", + "off", + "none" +] - changed
Input schema / properties / offsiteShare / descriptionPrevious value: -"Share of sales from Offsite Ads: a fraction, or under-5, 5-14, 15-24, 25-plus. Left out: Etsy's typical 10%, flagged."New value: +"Share of sales from Offsite Ads: a fraction, or a band. Left out: Etsy's typical 10%, flagged."
- Changed
sellerprofit_rates1 field changed- changed
Input schema / properties / platform / descriptionPrevious value: -"Whose fee table: etsy (the default), shopify or amazon."New value: +"Whose fee table. Default etsy."
- Changed
sellerprofit_sale_breakeven5 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"Amazon only: the referral category: beauty-health, baby, grocery, clothing, home-kitchen, toys, sports-outdoors, pet, electronics-accessories, media, jewelry, furniture, everything-else, amazon-device-accessories, compact-appliances, full-size-appliances, automotive, base-power-tools, backpacks-handbags-luggage, business-industrial-scientific, computers, consumer-electronics, eyewear, footwear, gift-cards, lawn-garden, lawn-mowers-snow-throwers, mattresses, musical-instruments, office, tires, tools, video-games, video-game-consoles, watches, or not-sure. Left out: Everything Else (15%), flagged."New value: +"Amazon only: the referral category, or not-sure. Left out: Everything Else (15%), flagged." - changed
Input schema / properties / offsiteAds / descriptionPrevious value: -"Etsy only: do these orders come from an Offsite Ad? none, or the shop's rate: 12-percent (past $10,000 in any 12 months) or 15-percent. Left out: none (no Offsite Ads fee)."New value: +"Etsy only: do these orders come from an Offsite Ad? none, or the shop's rate: 12-percent (past $10,000 in any 12 months) or 15-percent. Left out: none (no Offsite Ads fee). off is taken as none." - changed
Input schema / properties / offsiteAds / enumPrevious value: -[ - "none", - "12-percent", - "15-percent" -]New value: +[ + "none", + "12-percent", + "15-percent", + "off" +] - changed
Input schema / properties / platform / descriptionPrevious value: -"Where the item sells: etsy, shopify or amazon."New value: +"Where the item sells." - changed
Input schema / properties / shopifyPlan / descriptionPrevious value: -"Shopify only: basic, grow or advanced (sets the Shopify Payments card rate). Left out: basic, flagged."New value: +"Shopify only: the plan, which sets the Shopify Payments card rate. Left out: basic, flagged."
- Changed
sellerprofit_shipping_gap4 fields changed- changed
Input schema / properties / freeShippingShare / descriptionPrevious value: -"Share of orders that ship free: a fraction (0.25), or none, 1-in-4, half, 3-in-4, all. Default none."New value: +"Share of orders that ship free: a fraction (0.25), or a band. Default none." - changed
Input schema / properties / offsiteAds / descriptionPrevious value: -"Optional: the shop's Offsite Ads rate (12-percent, 15-percent or off). Fees on the higher price depend on it. Left out: estimated from orders × price, flagged."New value: +"Optional: the shop's Offsite Ads rate. Fees on the higher price depend on it. Left out: estimated from orders × price, flagged. none is taken as off." - changed
Input schema / properties / offsiteAds / enumPrevious value: -[ - "12-percent", - "15-percent", - "off" -]New value: +[ + "12-percent", + "15-percent", + "off", + "none" +] - changed
Input schema / properties / orders / descriptionPrevious value: -"Orders in a typical month: a number from 1 to 100,000 (Shop Manager > Stats > Orders), or a band: 1-10, 11-30, 31-75, 76-150, 151-300. Over 300: send the number."New value: +"Orders in a typical month: a number from 1 to 100,000 (Shop Manager > Stats > Orders), or a band. Over 300: send the number."
- Changed
sellerprofit_shopify_order_fees2 fields changed- changed
Input schema / properties / billing / descriptionPrevious value: -"How the plan is paid: monthly or yearly (price per month). Needs ordersPerMonth. Default monthly."New value: +"How the plan is paid (price per month). Needs ordersPerMonth. Default monthly." - changed
Input schema / properties / plan / descriptionPrevious value: -"The store's plan (Settings > Plan): basic, grow or advanced. Plus is priced per store and Starter's rates aren't on Shopify's pricing page."New value: +"The store's plan (Settings > Plan). Plus is priced per store and Starter's rates aren't on Shopify's pricing page."
- Changed
sellerprofit_shopify_plan_fit2 fields changed- changed
Input schema / properties / billing / descriptionPrevious value: -"How the plan is paid now: monthly or yearly."New value: +"How the plan is paid now." - changed
Input schema / properties / currentPlan / descriptionPrevious value: -"The store's plan (Settings > Plan): basic, grow or advanced. Plus is priced per store and Starter's figures aren't on Shopify's pricing page, so neither is compared here."New value: +"The store's plan (Settings > Plan). Plus is priced per store and Starter's figures aren't on Shopify's pricing page, so neither is compared here."
15 tool updates
- Changed
sellerprofit_ads_breakeven2 fields changed- added
Output schema / properties / linkAdded value: +{ + "description": "Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "platform", - "orderTotal", - "profitPerAdOrder", - "marginForAds", - "breakEvenRoas", - "adSpendMonthly", - "roas", - "adSales", - "earnedAfterCosts", - "monthlyGainOrLoss", - "status", - "fix", - "text", - "assumptions", - "rates" -]New value: +[ + "platform", + "orderTotal", + "profitPerAdOrder", + "marginForAds", + "breakEvenRoas", + "adSpendMonthly", + "roas", + "adSales", + "earnedAfterCosts", + "monthlyGainOrLoss", + "status", + "fix", + "text", + "assumptions", + "link", + "rates" +]
- Changed
sellerprofit_ads_roas_breakeven2 fields changed- added
Output schema / properties / linkAdded value: +{ + "description": "Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "platform", - "itemPrice", - "shippingCharged", - "orderTotal", - "fees", - "totalFees", - "productCost", - "packaging", - "label", - "keptPerSale", - "refundShare", - "lostPerRefund", - "lostPerRefundHow", - "keptPerAdOrder", - "marginForAds", - "breakEvenRoas", - "referralOtherReading", - "adSpendMonthly", - "roas", - "roasFrom", - "adSales", - "adOrdersCounted", - "adCostPerOrder", - "earnedAfterCosts", - "monthlyGainOrLoss", - "ordersPerMonth", - "allOrdersRoas", - "ownOrdersCap", - "status", - "fix", - "text", - "notes", - "assumptions", - "rates" -]New value: +[ + "platform", + "itemPrice", + "shippingCharged", + "orderTotal", + "fees", + "totalFees", + "productCost", + "packaging", + "label", + "keptPerSale", + "refundShare", + "lostPerRefund", + "lostPerRefundHow", + "keptPerAdOrder", + "marginForAds", + "breakEvenRoas", + "referralOtherReading", + "adSpendMonthly", + "roas", + "roasFrom", + "adSales", + "adOrdersCounted", + "adCostPerOrder", + "earnedAfterCosts", + "monthlyGainOrLoss", + "ordersPerMonth", + "allOrdersRoas", + "ownOrdersCap", + "status", + "fix", + "text", + "notes", + "assumptions", + "link", + "rates" +]
- Changed
sellerprofit_amazon_ads_breakeven2 fields changed- added
Output schema / properties / linkAdded value: +{ + "description": "Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "platform", - "fulfillment", - "price", - "shippingCharged", - "category", - "referral", - "fba", - "fbmLabel", - "storageCubicFeet", - "adSpend", - "acos", - "acosFrom", - "conversionRate", - "offPeak", - "peak", - "peakWindow", - "vendorMedianAcos", - "notes", - "text", - "assumptions", - "rates" -]New value: +[ + "platform", + "fulfillment", + "price", + "shippingCharged", + "category", + "referral", + "fba", + "fbmLabel", + "storageCubicFeet", + "adSpend", + "acos", + "acosFrom", + "conversionRate", + "offPeak", + "peak", + "peakWindow", + "vendorMedianAcos", + "notes", + "text", + "assumptions", + "link", + "rates" +]
- Changed
sellerprofit_amazon_fees2 fields changed- added
Output schema / properties / linkAdded value: +{ + "description": "Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "platform", - "price", - "shippingCharged", - "category", - "fulfillment", - "referral", - "closingFee", - "fba", - "totalFees", - "afterFees", - "afterFeesInPeak", - "plan", - "priceLines", - "text", - "assumptions", - "rates" -]New value: +[ + "platform", + "price", + "shippingCharged", + "category", + "fulfillment", + "referral", + "closingFee", + "fba", + "totalFees", + "afterFees", + "afterFeesInPeak", + "plan", + "priceLines", + "text", + "assumptions", + "link", + "rates" +]
- Changed
sellerprofit_box_billing2 fields changed- added
Output schema / properties / linkAdded value: +{ + "description": "Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "weightOz", - "weightLb", - "box", - "otherBox", - "billableRange", - "fix", - "warnings", - "text", - "notes", - "assumptions", - "rates" -]New value: +[ + "weightOz", + "weightLb", + "box", + "otherBox", + "billableRange", + "fix", + "warnings", + "text", + "notes", + "assumptions", + "link", + "rates" +]
- Changed
sellerprofit_checkup2 fields changed- added
Output schema / properties / linkAdded value: +{ + "description": "Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "platform", - "platform_supported", - "grade", - "verdict", - "salesLine", - "keptLine", - "perOrder", - "perMonth", - "leakTotal", - "estimatedLeakTotal", - "topLeaks", - "checks", - "notCheckedYet", - "breakEvenRoas", - "breakEvenAcos", - "pay", - "knowThis", - "assumptions", - "rates" -]New value: +[ + "platform", + "platform_supported", + "grade", + "verdict", + "salesLine", + "keptLine", + "perOrder", + "perMonth", + "leakTotal", + "estimatedLeakTotal", + "topLeaks", + "checks", + "notCheckedYet", + "breakEvenRoas", + "breakEvenAcos", + "pay", + "knowThis", + "assumptions", + "link", + "rates" +]
- Changed
sellerprofit_compare_fees2 fields changed- added
Output schema / properties / linkAdded value: +{ + "description": "Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "itemPrice", - "shippingCharged", - "ordersPerMonth", - "plansCounted", - "plansNotCounted", - "amazonShips", - "columns", - "lowest", - "caveat", - "text", - "notes", - "assumptions", - "rates" -]New value: +[ + "itemPrice", + "shippingCharged", + "ordersPerMonth", + "plansCounted", + "plansNotCounted", + "amazonShips", + "columns", + "lowest", + "caveat", + "text", + "notes", + "assumptions", + "link", + "rates" +]
- Changed
sellerprofit_etsy_fees2 fields changed- added
Output schema / properties / linkAdded value: +{ + "description": "Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "platform", - "orderTotal", - "salesTax", - "fees", - "offsiteAds", - "totalFees", - "feeShareOfOrder", - "afterFees", - "text", - "rates" -]New value: +[ + "platform", + "orderTotal", + "salesTax", + "fees", + "offsiteAds", + "totalFees", + "feeShareOfOrder", + "afterFees", + "text", + "link", + "rates" +]
- Changed
sellerprofit_offsite_ads2 fields changed- added
Output schema / properties / linkAdded value: +{ + "description": "Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "platform", - "rate", - "share", - "shareIsDefault", - "orderTotal", - "feePerAttributedOrder", - "capApplied", - "averagePerOrder", - "monthly", - "yearly", - "priceFix", - "optOut", - "text", - "assumptions", - "rates" -]New value: +[ + "platform", + "rate", + "share", + "shareIsDefault", + "orderTotal", + "feePerAttributedOrder", + "capApplied", + "averagePerOrder", + "monthly", + "yearly", + "priceFix", + "optOut", + "text", + "assumptions", + "link", + "rates" +]
- Changed
sellerprofit_price_for_margin2 fields changed- added
Output schema / properties / linkAdded value: +{ + "description": "Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "platform", - "itemPrice", - "orderTotal", - "target", - "atThatPrice", - "breakEvenItemPrice", - "keptPerExtraDollar", - "text", - "assumptions", - "rates" -]New value: +[ + "platform", + "itemPrice", + "orderTotal", + "target", + "atThatPrice", + "breakEvenItemPrice", + "keptPerExtraDollar", + "text", + "assumptions", + "link", + "rates" +]
- Changed
sellerprofit_rates2 fields changed- added
Output schema / properties / linkAdded value: +{ + "description": "Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "platform", - "platform_supported", - "table", - "sources", - "rates" -]New value: +[ + "platform", + "platform_supported", + "table", + "sources", + "link", + "rates" +]
- Changed
sellerprofit_sale_breakeven2 fields changed- added
Output schema / properties / linkAdded value: +{ + "description": "Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "platform", - "discountPercent", - "discountAmount", - "full", - "sale", - "feeChange", - "keptLess", - "timesAsMany", - "extraOrdersShare", - "ordersFor100", - "month", - "status", - "referralAfterCoupon", - "text", - "notes", - "assumptions", - "rates" -]New value: +[ + "platform", + "discountPercent", + "discountAmount", + "full", + "sale", + "feeChange", + "keptLess", + "timesAsMany", + "extraOrdersShare", + "ordersFor100", + "month", + "status", + "referralAfterCoupon", + "text", + "notes", + "assumptions", + "link", + "rates" +]
- Changed
sellerprofit_shipping_gap2 fields changed- added
Output schema / properties / linkAdded value: +{ + "description": "Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "platform", - "status", - "shippingCost", - "shippingCharged", - "freeShippingShare", - "gapPerOrder", - "monthly", - "yearly", - "searchLine", - "overSearchLine", - "priceFix", - "fixes", - "text", - "assumptions", - "rates" -]New value: +[ + "platform", + "status", + "shippingCost", + "shippingCharged", + "freeShippingShare", + "gapPerOrder", + "monthly", + "yearly", + "searchLine", + "overSearchLine", + "priceFix", + "fixes", + "text", + "assumptions", + "link", + "rates" +]
- Changed
sellerprofit_shopify_order_fees2 fields changed- added
Output schema / properties / linkAdded value: +{ + "description": "Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "platform", - "itemPrice", - "shippingCharged", - "orderTotal", - "plan", - "planName", - "processor", - "shopifyPaymentsShare", - "shareIsDefault", - "paypalExempt", - "lines", - "totalFees", - "feeShareOfOrder", - "afterFees", - "monthly", - "text", - "notes", - "assumptions", - "rates" -]New value: +[ + "platform", + "itemPrice", + "shippingCharged", + "orderTotal", + "plan", + "planName", + "processor", + "shopifyPaymentsShare", + "shareIsDefault", + "paypalExempt", + "lines", + "totalFees", + "feeShareOfOrder", + "afterFees", + "monthly", + "text", + "notes", + "assumptions", + "link", + "rates" +]
- Changed
sellerprofit_shopify_plan_fit2 fields changed- added
Output schema / properties / linkAdded value: +{ + "description": "Opens the matching page on sellerprofitdoctor.com. Carries none of the figures sent.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "platform", - "monthlyCardSales", - "currentPlan", - "billing", - "processor", - "shopifyPaymentsShare", - "shareIsDefault", - "assumedNoPremium", - "plans", - "cheapest", - "sameAsCheapest", - "cheapestAnyBilling", - "breakEvens", - "yearlyBilling", - "text", - "rates" -]New value: +[ + "platform", + "monthlyCardSales", + "currentPlan", + "billing", + "processor", + "shopifyPaymentsShare", + "shareIsDefault", + "assumedNoPremium", + "plans", + "cheapest", + "sameAsCheapest", + "cheapestAnyBilling", + "breakEvens", + "yearlyBilling", + "text", + "link", + "rates" +]
3 tool updates
- Added
sellerprofit_ads_roas_breakeven - Changed
sellerprofit_amazon_fees17 fields changed- added
Input schema / properties / freightToAmazonAdded value: +{ + "description": "both: the seller's own freight per unit to send stock to Amazon, US dollars. Left out: not counted (said).", + "maximum": 1000, + "minimum": 0, + "type": "number" +} - changed
Input schema / properties / fulfillment / descriptionPrevious value: -"fba (Amazon ships; adds the FBA fee estimate) or fbm (the seller ships)."New value: +"fba (Amazon ships; adds the FBA fee estimate), fbm (the seller ships), or both (the two side by side for the same item: send packed and labelCost)." - changed
Input schema / properties / fulfillment / enumPrevious value: -[ - "fba", - "fbm" -]New value: +[ + "fba", + "fbm", + "both" +] - added
Input schema / properties / hourlyValueAdded value: +{ + "description": "both: what an hour of the seller's time is worth, US dollars. Send with minutesPerOrder.", + "maximum": 1000, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / inboundSplitAdded value: +{ + "description": "both: how stock goes to Amazon: minimal (one location; Amazon charges a placement fee), partial, or optimized (Amazon's split, no placement fee). Left out: placement isn't counted (said).", + "enum": [ + "minimal", + "partial", + "optimized" + ], + "type": "string" +} - added
Input schema / properties / labelCostAdded value: +{ + "description": "both (required): what the seller's shipping label costs per order, US dollars.", + "maximum": 1000, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / minutesPerOrderAdded value: +{ + "description": "both: minutes the seller spends packing and shipping one order. Send with hourlyValue. Left out: the seller's time isn't counted (said).", + "maximum": 600, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / packagingAdded value: +{ + "description": "both: packaging per order, US dollars. Left out: $1, a weakly sourced typical figure, flagged.", + "maximum": 1000, + "minimum": 0, + "type": "number" +} - changed
Input schema / properties / packed / descriptionPrevious value: -"The packed size and weight, as Amazon measures it: makes the FBA estimate and the size and weight checks exact to the rate card."New value: +"The packed size and weight, as Amazon measures it: makes the FBA estimate exact to the rate card (with dimensional weight). Required with both: it can change which side leaves more, and gives the storage (cubic feet)." - changed
Input schema / properties / shippingCharged / descriptionPrevious value: -"FBM: what the buyer pays for shipping, US dollars (0 if free). The referral fee is charged on price + shipping. Default 0."New value: +"FBM or both: what the buyer pays for shipping when the seller ships, US dollars (0 if free). The referral fee is charged on price + shipping. Default 0." - changed
Input schema / properties / sizeBand / descriptionPrevious value: -"FBA: small-flat (fits 15 × 12 × 0.75 in), standard-box (up to 18 × 14 × 8 in) or bigger. Send with weightBand, or send packed."New value: +"FBA only (both needs packed): small-flat (fits 15 × 12 × 0.75 in), standard-box (up to 18 × 14 × 8 in) or bigger. Send with weightBand, or send packed." - added
Input schema / properties / unitsPerMonthAdded value: +{ + "description": "both: units sold a month; adds monthly totals.", + "maximum": 1000000, + "minimum": 1, + "type": "integer" +} - changed
Input schema / properties / weightBand / descriptionPrevious value: -"FBA: under-8oz, 8oz-1lb, 1-2lb, 2-3lb, over-3lb (the top of the band is used; over-3lb has no top, so it is billed from 3 lb and heavier items cost more: send packed for a closer number). Send with sizeBand."New value: +"FBA only (both needs packed): under-8oz, 8oz-1lb, 1-2lb, 2-3lb, over-3lb (the top of the band is used; over-3lb has no top, so it is billed from 3 lb and heavier items cost more: send packed for a closer number). Send with sizeBand." - added
Output schema / properties / compareAdded value: +{ + "additionalProperties": false, + "description": "fulfillment both only: Amazon shipping it and the seller shipping it, side by side. The top-level fees are the FBA side's.", + "properties": { + "estimate": { + "const": true, + "type": "boolean" + }, + "fbmReferral": { + "additionalProperties": false, + "description": "The referral fee when the seller ships: its working and what it's charged on (price + shipping).", + "properties": { + "chargedOn": { + "type": "number" + }, + "verified": { + "type": "boolean" + }, + "working": { + "type": "string" + } + }, + "required": [ + "working", + "chargedOn", + "verified" + ], + "type": "object" + }, + "freightToAmazon": { + "additionalProperties": false, + "properties": { + "counted": { + "type": "boolean" + }, + "perUnit": { + "type": "number" + } + }, + "required": [ + "counted", + "perUnit" + ], + "type": "object" + }, + "label": { + "type": "number" + }, + "notes": { + "description": "What the comparison leaves out or assumes, whatever was sent.", + "items": { + "type": "string" + }, + "type": "array" + }, + "offPeak": { + "additionalProperties": false, + "properties": { + "difference": { + "description": "How much more per unit, US dollars (0 when the same).", + "type": "number" + }, + "evenAt": { + "additionalProperties": false, + "description": "Where the answer flips.", + "properties": { + "label": { + "description": "The same line for the label alone, at the packaging and time counted; null when no label cost gets there.", + "type": [ + "number", + "null" + ] + }, + "labelPackagingTime": { + "description": "FBA fee + storage + placement + freight + shipping charged − (FBM referral − FBA referral): the seller shipping it leaves more while label + packaging + time stay under this, per unit.", + "type": "number" + } + }, + "required": [ + "labelPackagingTime", + "label" + ], + "type": "object" + }, + "fba": { + "additionalProperties": false, + "description": "Amazon ships it. Estimates: say \"about\".", + "properties": { + "closingFee": { + "type": "number" + }, + "fbaFee": { + "description": "All-in, with the 3.5% surcharge and, in peak, the peak fee. Estimate.", + "type": "number" + }, + "freightToAmazon": { + "type": "number" + }, + "left": { + "description": "Price − total: what's left per unit before landed cost and ads. Negative: it falls short by that much.", + "type": "number" + }, + "placement": { + "description": "Per unit for the inboundSplit sent. Estimate; 0 when not counted.", + "type": "number" + }, + "referralFee": { + "description": "On the price.", + "type": "number" + }, + "storage": { + "description": "One month per unit: cubic feet × the season's monthly rate. Estimate; 0 when not counted.", + "type": "number" + }, + "total": { + "type": "number" + } + }, + "required": [ + "referralFee", + "closingFee", + "fbaFee", + "storage", + "placement", + "freightToAmazon", + "total", + "left" + ], + "type": "object" + }, + "fbm": { + "additionalProperties": false, + "description": "The seller ships it.", + "properties": { + "closingFee": { + "type": "number" + }, + "label": { + "type": "number" + }, + "left": { + "description": "Price + shipping charged − total, before landed cost and ads. Negative: it falls short by that much.", + "type": "number" + }, + "packaging": { + "type": "number" + }, + "referralFee": { + "description": "On price + shipping charged.", + "type": "number" + }, + "time": { + "description": "minutesPerOrder × hourlyValue ÷ 60; 0 when not counted.", + "type": "number" + }, + "total": { + "type": "number" + } + }, + "required": [ + "referralFee", + "closingFee", + "label", + "packaging", + "time", + "total", + "left" + ], + "type": "object" + }, + "leavesMore": { + "description": "Which side leaves more per unit.", + "enum": [ + "fba", + "fbm", + "same" + ], + "type": "string" + }, + "monthly": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "difference": { + "type": "number" + }, + "fbaLeft": { + "type": "number" + }, + "fbmLeft": { + "type": "number" + }, + "units": { + "type": "number" + } + }, + "required": [ + "units", + "fbaLeft", + "fbmLeft", + "difference" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Each side's left × unitsPerMonth, and the difference; null without unitsPerMonth." + }, + "season": { + "enum": [ + "off_peak", + "peak" + ], + "type": "string" + }, + "window": { + "description": "When this side by side applies, in words.", + "type": "string" + } + }, + "required": [ + "season", + "window", + "fba", + "fbm", + "leavesMore", + "difference", + "evenAt", + "monthly" + ], + "type": "object" + }, + "packaging": { + "additionalProperties": false, + "properties": { + "given": { + "description": "False: the typical $1 was used, flagged.", + "type": "boolean" + }, + "perOrder": { + "type": "number" + } + }, + "required": [ + "perOrder", + "given" + ], + "type": "object" + }, + "peak": { + "additionalProperties": false, + "properties": { + "difference": { + "description": "How much more per unit, US dollars (0 when the same).", + "type": "number" + }, + "evenAt": { + "additionalProperties": false, + "description": "Where the answer flips.", + "properties": { + "label": { + "description": "The same line for the label alone, at the packaging and time counted; null when no label cost gets there.", + "type": [ + "number", + "null" + ] + }, + "labelPackagingTime": { + "description": "FBA fee + storage + placement + freight + shipping charged − (FBM referral − FBA referral): the seller shipping it leaves more while label + packaging + time stay under this, per unit.", + "type": "number" + } + }, + "required": [ + "labelPackagingTime", + "label" + ], + "type": "object" + }, + "fba": { + "additionalProperties": false, + "description": "Amazon ships it. Estimates: say \"about\".", + "properties": { + "closingFee": { + "type": "number" + }, + "fbaFee": { + "description": "All-in, with the 3.5% surcharge and, in peak, the peak fee. Estimate.", + "type": "number" + }, + "freightToAmazon": { + "type": "number" + }, + "left": { + "description": "Price − total: what's left per unit before landed cost and ads. Negative: it falls short by that much.", + "type": "number" + }, + "placement": { + "description": "Per unit for the inboundSplit sent. Estimate; 0 when not counted.", + "type": "number" + }, + "referralFee": { + "description": "On the price.", + "type": "number" + }, + "storage": { + "description": "One month per unit: cubic feet × the season's monthly rate. Estimate; 0 when not counted.", + "type": "number" + }, + "total": { + "type": "number" + } + }, + "required": [ + "referralFee", + "closingFee", + "fbaFee", + "storage", + "placement", + "freightToAmazon", + "total", + "left" + ], + "type": "object" + }, + "fbm": { + "additionalProperties": false, + "description": "The seller ships it.", + "properties": { + "closingFee": { + "type": "number" + }, + "label": { + "type": "number" + }, + "left": { + "description": "Price + shipping charged − total, before landed cost and ads. Negative: it falls short by that much.", + "type": "number" + }, + "packaging": { + "type": "number" + }, + "referralFee": { + "description": "On price + shipping charged.", + "type": "number" + }, + "time": { + "description": "minutesPerOrder × hourlyValue ÷ 60; 0 when not counted.", + "type": "number" + }, + "total": { + "type": "number" + } + }, + "required": [ + "referralFee", + "closingFee", + "label", + "packaging", + "time", + "total", + "left" + ], + "type": "object" + }, + "leavesMore": { + "description": "Which side leaves more per unit.", + "enum": [ + "fba", + "fbm", + "same" + ], + "type": "string" + }, + "monthly": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "difference": { + "type": "number" + }, + "fbaLeft": { + "type": "number" + }, + "fbmLeft": { + "type": "number" + }, + "units": { + "type": "number" + } + }, + "required": [ + "units", + "fbaLeft", + "fbmLeft", + "difference" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Each side's left × unitsPerMonth, and the difference; null without unitsPerMonth." + }, + "season": { + "enum": [ + "off_peak", + "peak" + ], + "type": "string" + }, + "window": { + "description": "When this side by side applies, in words.", + "type": "string" + } + }, + "required": [ + "season", + "window", + "fba", + "fbm", + "leavesMore", + "difference", + "evenAt", + "monthly" + ], + "type": "object" + }, + "placement": { + "additionalProperties": false, + "properties": { + "counted": { + "type": "boolean" + }, + "minimalSplit": { + "description": "What a minimal split (one location) costs per unit, for reference. Estimate.", + "type": "number" + }, + "perUnit": { + "type": "number" + }, + "split": { + "anyOf": [ + { + "enum": [ + "minimal", + "partial", + "optimized" + ], + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "counted", + "split", + "perUnit", + "minimalSplit" + ], + "type": "object" + }, + "shippingCharged": { + "type": "number" + }, + "storage": { + "additionalProperties": false, + "properties": { + "counted": { + "description": "False without the packed size (cubic feet).", + "type": "boolean" + }, + "cubicFeet": { + "type": [ + "number", + "null" + ] + }, + "monthsAssumed": { + "const": 1, + "description": "Each unit is assumed to wait about a month at Amazon.", + "type": "number" + }, + "ratePerCuFt": { + "additionalProperties": false, + "description": "Monthly, per cubic foot: January–September and October–December rates. Estimates.", + "properties": { + "offPeak": { + "type": "number" + }, + "peak": { + "type": "number" + } + }, + "required": [ + "offPeak", + "peak" + ], + "type": "object" + } + }, + "required": [ + "counted", + "cubicFeet", + "monthsAssumed", + "ratePerCuFt" + ], + "type": "object" + }, + "text": { + "type": "string" + }, + "time": { + "additionalProperties": false, + "properties": { + "counted": { + "type": "boolean" + }, + "hourlyValue": { + "type": [ + "number", + "null" + ] + }, + "minutesPerOrder": { + "type": [ + "number", + "null" + ] + }, + "perOrder": { + "type": "number" + } + }, + "required": [ + "counted", + "minutesPerOrder", + "hourlyValue", + "perOrder" + ], + "type": "object" + }, + "unitsPerMonth": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "estimate", + "shippingCharged", + "fbmReferral", + "label", + "packaging", + "time", + "storage", + "placement", + "freightToAmazon", + "unitsPerMonth", + "offPeak", + "peak", + "notes", + "text" + ], + "type": "object" +} - changed
Output schema / properties / fba / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "billedWeightOz": { - "type": "number" - }, - "cardFee": { - "description": "The rate card's non-peak fee, before the surcharge, US dollars.", - "type": "number" - }, - "estimate": { - "const": true, - "type": "boolean" - }, - "exactness": { - "const": "third-party-estimate", - "type": "string" - }, - "fee": { - "description": "All-in FBA fee per unit outside peak, US dollars: card × 1.035, rounded to the cent.", - "type": "number" - }, - "fromBands": { - "description": "True when built from the size and weight bands (top of the band; over-3lb is billed from 3 lb, a floor) rather than a packed size.", - "type": "boolean" - }, - "notes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "peakFee": { - "description": "All-in FBA fee per unit in peak season: (card + $0.32) × 1.035.", - "type": "number" - }, - "peakWindow": { - "additionalProperties": false, - "properties": { - "from": { - "type": "string" - }, - "until": { - "type": "string" - } - }, - "required": [ - "from", - "until" - ], - "type": "object" - }, - "sizeTier": { - "type": "string" - }, - "surcharge": { - "description": "The 3.5% fuel and logistics surcharge on it, US dollars.", - "type": "number" - } - }, - "required": [ - "estimate", - "exactness", - "sizeTier", - "billedWeightOz", - "fromBands", - "cardFee", - "surcharge", - "fee", - "peakFee", - "peakWindow", - "notes" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "billedWeightOz": { + "type": "number" + }, + "cardFee": { + "description": "The rate card's non-peak fee, before the surcharge, US dollars.", + "type": "number" + }, + "dimensionalWeightOz": { + "description": "Packed size only: when the box's dimensional weight (L × W × H in ÷ 139 × 16, in oz) is more than its packed weight and Amazon bills on it, that weight (equal to billedWeightOz); null otherwise.", + "type": [ + "number", + "null" + ] + }, + "estimate": { + "const": true, + "type": "boolean" + }, + "exactness": { + "const": "third-party-estimate", + "type": "string" + }, + "fee": { + "description": "All-in FBA fee per unit outside peak, US dollars: card × 1.035, rounded to the cent.", + "type": "number" + }, + "fromBands": { + "description": "True when built from the size and weight bands (top of the band; over-3lb is billed from 3 lb, a floor) rather than a packed size.", + "type": "boolean" + }, + "notes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "peakFee": { + "description": "All-in FBA fee per unit in peak season: (card + $0.32) × 1.035.", + "type": "number" + }, + "peakWindow": { + "additionalProperties": false, + "properties": { + "from": { + "type": "string" + }, + "until": { + "type": "string" + } + }, + "required": [ + "from", + "until" + ], + "type": "object" + }, + "sizeTier": { + "type": "string" + }, + "surcharge": { + "description": "The 3.5% fuel and logistics surcharge on it, US dollars.", + "type": "number" + } + }, + "required": [ + "estimate", + "exactness", + "sizeTier", + "billedWeightOz", + "dimensionalWeightOz", + "fromBands", + "cardFee", + "surcharge", + "fee", + "peakFee", + "peakWindow", + "notes" + ], + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / fulfillment / descriptionAdded value: +"With both, the top-level fees are the FBA side's and compare holds the two sides." - changed
Output schema / properties / fulfillment / enumPrevious value: -[ - "fba", - "fbm" -]New value: +[ + "fba", + "fbm", + "both" +]
- Added
sellerprofit_box_billing
5 tool updates
- Added
sellerprofit_amazon_ads_breakeven - Changed
sellerprofit_checkup1 field changed- changed
Input schema / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "adsDailyBudget": { - "description": "Etsy Ads daily budget, US dollars (assumed fully spent, 30 days a month).", - "maximum": 10000, - "minimum": 0.01, - "type": "number" - }, - "adsMonthlySpend": { - "description": "Exact Etsy Ads spend last 30 days, US dollars. Wins over the daily budget.", - "maximum": 300000, - "minimum": 0.01, - "type": "number" - }, - "deeper": { - "additionalProperties": false, - "description": "Optional go-deeper answers; each one sharpens the result.", - "properties": { - "discountDepth": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "none", - "up-to-10", - "11-20", - "21-30", - "over-30" - ], - "type": "string" - } - ], - "description": "Typical discount: a fraction (0.15), or none, up-to-10, 11-20, 21-30, over-30." - }, - "discountShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "a-few", - "some", - "many" - ], - "type": "string" - } - ], - "description": "Share of orders that use a discount: a fraction, or a-few, some, many. Needed when discountDepth isn't none or 0." - }, - "freeShippingShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "none", - "1-in-4", - "half", - "3-in-4", - "all" - ], - "type": "string" - } - ], - "description": "Share of orders that ship free: a fraction (0.25), or none, 1-in-4, half, 3-in-4, all." - }, - "hourlyPay": { - "description": "The hourly pay the seller wants for their time, US dollars. Needs minutesPerItem.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "minutesPerItem": { - "anyOf": [ - { - "maximum": 6000, - "minimum": 1, - "type": "number" - }, - { - "enum": [ - "under-15", - "15-44", - "45-90" - ], - "type": "string" - } - ], - "description": "Minutes to make and pack one item: a number, or under-15, 15-44, 45-90." - }, - "offsiteShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-5", - "5-14", - "15-24", - "25-plus" - ], - "type": "string" - } - ], - "description": "Share of sales from Offsite Ads (Marketing > Offsite Ads): a fraction, or under-5, 5-14, 15-24, 25-plus. Left out: Etsy's typical 10% (2020), flagged as a default." - }, - "packaging": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "mailer", - "box", - "not-sure" - ], - "type": "string" - } - ], - "description": "Packaging per order in US dollars, or mailer (about $1), box (about $3) or not-sure. Left out: $1, a weakly sourced typical figure, flagged as a default." - }, - "refunds": { - "additionalProperties": false, - "description": "Refunds: send frequency or perMonth, and outcome.", - "properties": { - "frequency": { - "description": "How often: rarely (1 in 50), sometimes (1 in 20), often (1 in 10). Or send perMonth.", - "enum": [ - "rarely", - "sometimes", - "often" - ], - "type": "string" - }, - "outcome": { - "description": "What usually happens on a refund: back-buyer-pays-return, back-i-pay-return, buyer-keeps or mixed.", - "enum": [ - "back-buyer-pays-return", - "back-i-pay-return", - "buyer-keeps", - "mixed" - ], - "type": "string" - }, - "perMonth": { - "description": "Refunds in a typical month, as a number. Or send frequency.", - "maximum": 100000, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "outcome" - ], - "type": "object" - } - }, - "type": "object" - }, - "etsyAds": { - "description": "Etsy Ads daily budget: no, a band 1-4, 5-14, 15-24, 25-plus (dollars a day), or yes with adsDailyBudget or adsMonthlySpend. 25-plus needs adsDailyBudget.", - "enum": [ - "no", - "yes", - "1-4", - "5-14", - "15-24", - "25-plus" - ], - "type": "string" - }, - "itemPrice": { - "description": "Typical item price in US dollars, before shipping (the item sold most).", - "maximum": 100000, - "minimum": 0.01, - "type": "number" - }, - "labelCost": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "What the shipping label costs, US dollars, or not-sure (shipping is then treated as breaking even and shown as couldn't check)." - }, - "materials": { - "description": "Materials and supplies for one item, US dollars. Or send materialsShare when the seller isn't sure.", - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - "materialsShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-20", - "20-35", - "35-50", - "over-50" - ], - "type": "string" - } - ], - "description": "When the seller isn't sure of materials: the share of the price they take, a fraction or under-20, 20-35, 35-50, over-50." - }, - "orders": { - "anyOf": [ - { - "maximum": 100000, - "minimum": 1, - "type": "number" - }, - { - "enum": [ - "1-10", - "11-30", - "31-75", - "76-150", - "151-300" - ], - "type": "string" - } - ], - "description": "Orders in a typical month: a number from 1 to 100,000 (Shop Manager > Stats > Orders), or a band: 1-10, 11-30, 31-75, 76-150, 151-300. Over 300: send the number." - }, - "platform": { - "const": "etsy", - "default": "etsy", - "description": "etsy (the default when left out).", - "type": "string" - }, - "roas": { - "anyOf": [ - { - "maximum": 100, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-1", - "1-1.9", - "2-2.9", - "3-4.9", - "5-plus" - ], - "type": "string" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "Etsy Ads ROAS, last 30 days (Etsy Ads page): a number, a band (under-1, 1-1.9, 2-2.9, 3-4.9, 5-plus), or not-sure. Only when the shop runs ads." - }, - "shippingCharged": { - "description": "What the buyer pays for shipping on a typical order, US dollars (0 if free).", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "targetProfitPerOrder": { - "description": "Profit per order the seller wants on top of costs, US dollars (used by the price fix when orders lose money). Default 0.", - "maximum": 10000, - "minimum": 0, - "type": "number" - }, - "tenK": { - "description": "Has the shop sold $10,000 or more in any 12 months? yes (Offsite Ads 12% for life), no-offsite-on (15%, can opt out), no-opted-out (no Offsite fee), not-sure (estimated from orders × price).", - "enum": [ - "yes", - "no-offsite-on", - "no-opted-out", - "not-sure" - ], - "type": "string" - } - }, - "required": [ - "orders", - "itemPrice", - "shippingCharged", - "labelCost", - "tenK", - "etsyAds" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "ads": { - "description": "Ads a month (Meta, Google, TikTok): none, a band under-300, 300-999, 1000-2999, 3000-plus (US dollars a month), or yes with adsMonthlySpend. 3000-plus needs adsMonthlySpend.", - "enum": [ - "none", - "yes", - "under-300", - "300-999", - "1000-2999", - "3000-plus" - ], - "type": "string" - }, - "adsMonthlySpend": { - "description": "Ad spend a month, US dollars. Wins over the band.", - "maximum": 1000000, - "minimum": 0.01, - "type": "number" - }, - "billing": { - "description": "How the plan is paid: monthly, yearly, or not-sure.", - "enum": [ - "monthly", - "yearly", - "not-sure" - ], - "type": "string" - }, - "deeper": { - "additionalProperties": false, - "description": "Optional go-deeper answers; each one sharpens the result and adds a check.", - "properties": { - "appBill": { - "anyOf": [ - { - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-50", - "50-149", - "150-299" - ], - "type": "string" - } - ], - "description": "The monthly app bill: US dollars, or under-50, 50-149, 150-299. $300 or more: send the dollars." - }, - "appsUnproven": { - "anyOf": [ - { - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "Of the app bill, US dollars a month for apps the seller can't tie to sales or time saved, or not-sure. Needs appBill." - }, - "chargebacksLostPerMonth": { - "description": "Chargebacks lost in a typical month.", - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - "foreignShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "none", - "under-5", - "5-14", - "15-24", - "25-plus" - ], - "type": "string" - } - ], - "description": "Share of sales paid in another currency: a fraction, or none, under-5, 5-14, 15-24, 25-plus." - }, - "freeShippingShareOver": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "none", - "1-in-4", - "half", - "3-in-4", - "all" - ], - "type": "string" - } - ], - "description": "Share of orders at or over the threshold: a fraction, or none, 1-in-4, half, 3-in-4, all." - }, - "freeShippingThreshold": { - "description": "The free-shipping threshold, US dollars. Needs freeShippingShareOver.", - "maximum": 10000, - "minimum": 0, - "type": "number" - }, - "packaging": { - "description": "Packaging per order, US dollars. Left out: not counted, and flagged.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "refunds": { - "additionalProperties": false, - "description": "Refunds and returns: send frequency or perMonth, and outcome.", - "properties": { - "frequency": { - "description": "How often: rarely (1 in 50), sometimes (1 in 20), often (1 in 10). Or send perMonth.", - "enum": [ - "rarely", - "sometimes", - "often" - ], - "type": "string" - }, - "outcome": { - "description": "What usually happens on a refund: back-buyer-pays-return, back-i-pay-return, buyer-keeps or mixed.", - "enum": [ - "back-buyer-pays-return", - "back-i-pay-return", - "buyer-keeps", - "mixed" - ], - "type": "string" - }, - "perMonth": { - "description": "Refunds in a typical month, as a number. Or send frequency.", - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - "returnLabel": { - "description": "What a return label costs the store, US dollars. Default: what the outbound label costs.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "unsellablePerMonth": { - "description": "Returned items a month that can't be resold.", - "maximum": 100000, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "outcome" - ], - "type": "object" - } - }, - "type": "object" - }, - "labelCost": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "What the shipping label costs, US dollars, or not-sure (shipping is then treated as breaking even and shown as couldn't check)." - }, - "orderValue": { - "description": "A typical order before shipping and tax, US dollars (average order value).", - "maximum": 100000, - "minimum": 0.01, - "type": "number" - }, - "orders": { - "anyOf": [ - { - "maximum": 100000, - "minimum": 1, - "type": "number" - }, - { - "enum": [ - "1-30", - "31-100", - "101-300", - "301-1000" - ], - "type": "string" - } - ], - "description": "Orders in a typical month (Analytics > Orders): a number, or a band 1-30, 31-100, 101-300, 301-1000. Over 1,000: send the number." - }, - "otherProcessorCents": { - "description": "The other card company's fixed fee per sale, in cents (30 is 30¢). Send with otherProcessorPercent.", - "maximum": 500, - "minimum": 0, - "type": "number" - }, - "otherProcessorPercent": { - "description": "The other card company's rate as a percent (2.9 is 2.9%). Send with otherProcessorCents. Left out: 2.9% + 30¢, flagged.", - "maximum": 20, - "minimum": 0, - "type": "number" - }, - "payments": { - "description": "How card payments arrive (Settings > Payments): shopify-payments, another (for example Stripe or Square), both, or not-sure (the third-party fee checks then can't run).", - "enum": [ - "shopify-payments", - "another", - "both", - "not-sure" - ], - "type": "string" - }, - "plan": { - "description": "The plan (Settings > Plan): basic, grow, advanced, plus, starter, or not-sure (plan fit and billing then can't be checked).", - "enum": [ - "basic", - "grow", - "advanced", - "plus", - "starter", - "not-sure" - ], - "type": "string" - }, - "platform": { - "const": "shopify", - "description": "shopify, for a store on the seller's own Shopify site.", - "type": "string" - }, - "productCost": { - "description": "What the products in that order cost the seller (COGS), US dollars. Or send productCostShare when not sure.", - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - "productCostShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-20", - "20-35", - "35-50", - "over-50" - ], - "type": "string" - } - ], - "description": "When the seller isn't sure of product cost: its share of the order, a fraction or under-20, 20-35, 35-50, over-50." - }, - "roas": { - "anyOf": [ - { - "maximum": 100, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-1.5", - "1.5-2.49", - "2.5-3.99", - "4-plus" - ], - "type": "string" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "Sales from Shopify (not Ads Manager) ÷ ad spend, last 30 days: a number, a band (under-1.5, 1.5-2.49, 2.5-3.99, 4-plus), or not-sure. Only when the store runs ads." - }, - "shippingCharged": { - "description": "What the buyer pays for shipping on a typical order, US dollars (0 if free).", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "shopifyPaymentsShare": { - "description": "With both: the share of sales Shopify Payments handles (Shop Pay, local methods), a fraction. Left out: half, flagged.", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "targetMargin": { - "description": "The margin the seller wants on each order after every cost, a fraction (0.2 is 20%), for the target price.", - "maximum": 0.9, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "platform", - "orders", - "orderValue", - "shippingCharged", - "labelCost", - "plan", - "billing", - "payments", - "ads" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "acos": { - "anyOf": [ - { - "exclusiveMinimum": 0, - "maximum": 10, - "type": "number" - }, - { - "enum": [ - "under-20", - "20-34", - "35-49", - "50-plus" - ], - "type": "string" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "ACoS, last 30 days (Campaign Manager): a fraction (0.3 is 30%), a band (under-20, 20-34, 35-49, 50-plus), or not-sure. Only when the seller runs Sponsored Products." - }, - "category": { - "description": "The Amazon category (sets the referral fee): beauty-health, baby, grocery, clothing, home-kitchen, toys, sports-outdoors, pet, electronics-accessories, media, jewelry, furniture, everything-else, or another row of Amazon's referral table (amazon-device-accessories, compact-appliances, full-size-appliances, automotive, base-power-tools, backpacks-handbags-luggage, business-industrial-scientific, computers, consumer-electronics, eyewear, footwear, gift-cards, lawn-garden, lawn-mowers-snow-throwers, mattresses, musical-instruments, office, tires, tools, video-games, video-game-consoles, watches), or not-sure (15%, flagged).", - "enum": [ - "beauty-health", - "baby", - "grocery", - "clothing", - "home-kitchen", - "toys", - "sports-outdoors", - "pet", - "electronics-accessories", - "media", - "jewelry", - "furniture", - "everything-else", - "amazon-device-accessories", - "compact-appliances", - "full-size-appliances", - "automotive", - "base-power-tools", - "backpacks-handbags-luggage", - "business-industrial-scientific", - "computers", - "consumer-electronics", - "eyewear", - "footwear", - "gift-cards", - "lawn-garden", - "lawn-mowers-snow-throwers", - "mattresses", - "musical-instruments", - "office", - "tires", - "tools", - "video-games", - "video-game-consoles", - "watches", - "not-sure" - ], - "type": "string" - }, - "deeper": { - "additionalProperties": false, - "description": "Optional go-deeper answers; each one sharpens the result. packed (the packed size) makes the FBA estimate and the size and weight checks exact to the rate card.", - "properties": { - "coupons": { - "additionalProperties": false, - "description": "Coupons.", - "properties": { - "discount": { - "description": "The coupon discount, a fraction of the price.", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "runsPerMonth": { - "description": "Coupon runs a month.", - "maximum": 100, - "minimum": 0, - "type": "number" - }, - "share": { - "description": "Share of units sold with the coupon.", - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "runsPerMonth", - "discount", - "share" - ], - "type": "object" - }, - "cubicFeet": { - "description": "Cubic feet per packed unit, when the dimensions aren't known (storage).", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "fbaShare": { - "description": "With fulfillment both: the share of units Amazon ships, a fraction. Left out: half, flagged.", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "inbound": { - "additionalProperties": false, - "description": "Inbound placement choice.", - "properties": { - "extraFreightPerUnit": { - "description": "Extra freight per unit an optimized split costs, US dollars, if quoted.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "split": { - "description": "minimal, partial or optimized.", - "enum": [ - "minimal", - "partial", - "optimized" - ], - "type": "string" - } - }, - "required": [ - "split" - ], - "type": "object" - }, - "inventory": { - "additionalProperties": false, - "description": "Stock at Amazon.", - "properties": { - "agedBand": { - "description": "How old those units are: 181-270, 271-365, over-365. Default 181-270.", - "enum": [ - "181-270", - "271-365", - "over-365" - ], - "type": "string" - }, - "agedUnits": { - "description": "Units older than 6 months (181+ days).", - "maximum": 1000000, - "minimum": 0, - "type": "number" - }, - "daysOfSupply": { - "description": "Days of supply on hand (Amazon's low-inventory measure).", - "maximum": 3650, - "minimum": 0, - "type": "number" - }, - "unitsAtAmazon": { - "description": "Units in Amazon's warehouses. Default: one month of sales.", - "maximum": 1000000, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "packaging": { - "description": "Packaging per unit the seller ships, US dollars. Left out: $1 typical, flagged.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "packed": { - "additionalProperties": false, - "description": "The packed size and weight, as Amazon measures it: makes the FBA estimate and the size and weight checks exact to the rate card.", - "properties": { - "heightIn": { - "description": "Height, inches, packed.", - "exclusiveMinimum": 0, - "maximum": 200, - "type": "number" - }, - "lengthIn": { - "description": "Length, inches, packed.", - "exclusiveMinimum": 0, - "maximum": 200, - "type": "number" - }, - "weightOz": { - "description": "Weight, ounces, packed (16 oz is 1 lb).", - "exclusiveMinimum": 0, - "maximum": 4800, - "type": "number" - }, - "widthIn": { - "description": "Width, inches, packed.", - "exclusiveMinimum": 0, - "maximum": 200, - "type": "number" - } - }, - "required": [ - "lengthIn", - "widthIn", - "heightIn", - "weightOz" - ], - "type": "object" - }, - "peakUnits": { - "description": "Units shipped October 15 to January 14 (the peak season), for the whole season.", - "maximum": 10000000, - "minimum": 0, - "type": "number" - }, - "returns": { - "additionalProperties": false, - "description": "Returns: the rate, and the unsellable share.", - "properties": { - "rate": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-3", - "3-6", - "6-10", - "10-15", - "over-15" - ], - "type": "string" - } - ], - "description": "Share of units returned: a fraction, or under-3, 3-6, 6-10, 10-15, over-15 (bands are our assumption)." - }, - "unsellableShare": { - "description": "Share of returns that come back unsellable. Default 0.", - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "rate" - ], - "type": "object" - }, - "sourcingCostEntered": { - "description": "True when the seller has entered sourcing costs in Manage Your Sourcing Cost.", - "type": "boolean" - } - }, - "type": "object" - }, - "fbaFee": { - "description": "FBA or both: the FBA fee per unit from Fee Preview or the Revenue Calculator, US dollars, all-in. Turns the estimate into the seller's own number. Or send sizeBand and weightBand.", - "maximum": 1000, - "minimum": 0.01, - "type": "number" - }, - "fulfillment": { - "description": "Who ships: fba (Amazon), fbm (the seller), or both.", - "enum": [ - "fba", - "fbm", - "both" - ], - "type": "string" - }, - "labelCost": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "FBM or both: what the label costs per unit, US dollars, or not-sure." - }, - "landedCost": { - "description": "Landed cost per unit (product + freight + duties + prep, to Amazon's door), US dollars. Or send landedCostShare when not sure.", - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - "landedCostShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-20", - "20-35", - "35-50", - "over-50" - ], - "type": "string" - } - ], - "description": "When the seller isn't sure of landed cost: its share of the price, a fraction or under-20, 20-35, 35-50, over-50." - }, - "plan": { - "description": "professional ($39.99 a month), individual ($0.99 an item), or not-sure.", - "enum": [ - "professional", - "individual", - "not-sure" - ], - "type": "string" - }, - "platform": { - "const": "amazon", - "description": "amazon, for a seller on Amazon's US marketplace.", - "type": "string" - }, - "ppc": { - "description": "Sponsored Products a month: none, a band under-500, 500-1999, 2000-4999, 5000-plus (US dollars a month), or yes with ppcMonthlySpend. 5000-plus needs ppcMonthlySpend.", - "enum": [ - "none", - "yes", - "under-500", - "500-1999", - "2000-4999", - "5000-plus" - ], - "type": "string" - }, - "ppcMonthlySpend": { - "description": "Sponsored Products spend a month, US dollars. Wins over the band.", - "maximum": 1000000, - "minimum": 0.01, - "type": "number" - }, - "price": { - "description": "The selling price on Amazon, US dollars.", - "maximum": 100000, - "minimum": 0.01, - "type": "number" - }, - "shippingCharged": { - "description": "FBM or both: what the buyer pays for shipping per unit, US dollars (0 if free).", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "sizeBand": { - "description": "FBA or both, when the FBA fee isn't known: small-flat (fits 15 × 12 × 0.75 in), standard-box (up to 18 × 14 × 8 in), bigger. Send with weightBand.", - "enum": [ - "small-flat", - "standard-box", - "bigger" - ], - "type": "string" - }, - "targetMargin": { - "description": "The margin the seller wants after every cost, a fraction of the price (0.2 is 20%), for the repricing fixes. Default 0: break-even.", - "maximum": 0.9, - "minimum": 0, - "type": "number" - }, - "today": { - "description": "Today's date, YYYY-MM-DD: picks the storage season and the peak window (October 15 to January 14). Default: the rates' as-of date, October 13, 2026.", - "maxLength": 10, - "pattern": "^20(2[6-9]|[3-9]\\d)-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$", - "type": "string" - }, - "units": { - "anyOf": [ - { - "maximum": 1000000, - "minimum": 1, - "type": "number" - }, - { - "enum": [ - "1-40", - "41-150", - "151-500", - "501-1500", - "1501-5000" - ], - "type": "string" - } - ], - "description": "Units sold in a typical month (Business Reports > Sales Dashboard > Units Ordered): a number, or a band 1-40, 41-150, 151-500, 501-1500, 1501-5000. Over 5,000: send the number." - }, - "weightBand": { - "description": "FBA or both, when the FBA fee isn't known: under-8oz, 8oz-1lb, 1-2lb, 2-3lb, over-3lb. Send with sizeBand.", - "enum": [ - "under-8oz", - "8oz-1lb", - "1-2lb", - "2-3lb", - "over-3lb" - ], - "type": "string" - } - }, - "required": [ - "platform", - "units", - "price", - "category", - "fulfillment", - "plan", - "ppc" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "adsDailyBudget": { + "description": "Etsy Ads daily budget, US dollars (assumed fully spent, 30 days a month).", + "maximum": 10000, + "minimum": 0.01, + "type": "number" + }, + "adsMonthlySpend": { + "description": "Exact Etsy Ads spend last 30 days, US dollars. Wins over the daily budget.", + "maximum": 300000, + "minimum": 0.01, + "type": "number" + }, + "deeper": { + "additionalProperties": false, + "description": "Optional go-deeper answers; each one sharpens the result.", + "properties": { + "discountDepth": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "none", + "up-to-10", + "11-20", + "21-30", + "over-30" + ], + "type": "string" + } + ], + "description": "Typical discount: a fraction (0.15), or none, up-to-10, 11-20, 21-30, over-30." + }, + "discountShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "a-few", + "some", + "many" + ], + "type": "string" + } + ], + "description": "Share of orders that use a discount: a fraction, or a-few, some, many. Needed when discountDepth isn't none or 0." + }, + "freeShippingShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "none", + "1-in-4", + "half", + "3-in-4", + "all" + ], + "type": "string" + } + ], + "description": "Share of orders that ship free: a fraction (0.25), or none, 1-in-4, half, 3-in-4, all." + }, + "hourlyPay": { + "description": "The hourly pay the seller wants for their time, US dollars. Needs minutesPerItem.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "minutesPerItem": { + "anyOf": [ + { + "maximum": 6000, + "minimum": 1, + "type": "number" + }, + { + "enum": [ + "under-15", + "15-44", + "45-90" + ], + "type": "string" + } + ], + "description": "Minutes to make and pack one item: a number, or under-15, 15-44, 45-90." + }, + "offsiteShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-5", + "5-14", + "15-24", + "25-plus" + ], + "type": "string" + } + ], + "description": "Share of sales from Offsite Ads (Marketing > Offsite Ads): a fraction, or under-5, 5-14, 15-24, 25-plus. Left out: Etsy's typical 10% (2020), flagged as a default." + }, + "packaging": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "mailer", + "box", + "not-sure" + ], + "type": "string" + } + ], + "description": "Packaging per order in US dollars, or mailer (about $1), box (about $3) or not-sure. Left out: $1, a weakly sourced typical figure, flagged as a default." + }, + "refunds": { + "additionalProperties": false, + "description": "Refunds: send frequency or perMonth, and outcome.", + "properties": { + "frequency": { + "description": "How often: rarely (1 in 50), sometimes (1 in 20), often (1 in 10). Or send perMonth.", + "enum": [ + "rarely", + "sometimes", + "often" + ], + "type": "string" + }, + "outcome": { + "description": "What usually happens on a refund: back-buyer-pays-return, back-i-pay-return, buyer-keeps or mixed.", + "enum": [ + "back-buyer-pays-return", + "back-i-pay-return", + "buyer-keeps", + "mixed" + ], + "type": "string" + }, + "perMonth": { + "description": "Refunds in a typical month, as a number. Or send frequency.", + "maximum": 100000, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "outcome" + ], + "type": "object" + } + }, + "type": "object" + }, + "etsyAds": { + "description": "Etsy Ads daily budget: no, a band 1-4, 5-14, 15-24, 25-plus (dollars a day), or yes with adsDailyBudget or adsMonthlySpend. 25-plus needs adsDailyBudget.", + "enum": [ + "no", + "yes", + "1-4", + "5-14", + "15-24", + "25-plus" + ], + "type": "string" + }, + "itemPrice": { + "description": "Typical item price in US dollars, before shipping (the item sold most).", + "maximum": 100000, + "minimum": 0.01, + "type": "number" + }, + "labelCost": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "What the shipping label costs, US dollars, or not-sure (shipping is then treated as breaking even and shown as couldn't check)." + }, + "materials": { + "description": "Materials and supplies for one item, US dollars. Or send materialsShare when the seller isn't sure.", + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + "materialsShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-20", + "20-35", + "35-50", + "over-50" + ], + "type": "string" + } + ], + "description": "When the seller isn't sure of materials: the share of the price they take, a fraction or under-20, 20-35, 35-50, over-50." + }, + "orders": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 1, + "type": "number" + }, + { + "enum": [ + "1-10", + "11-30", + "31-75", + "76-150", + "151-300" + ], + "type": "string" + } + ], + "description": "Orders in a typical month: a number from 1 to 100,000 (Shop Manager > Stats > Orders), or a band: 1-10, 11-30, 31-75, 76-150, 151-300. Over 300: send the number." + }, + "platform": { + "const": "etsy", + "default": "etsy", + "description": "etsy (the default when left out).", + "type": "string" + }, + "roas": { + "anyOf": [ + { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-1", + "1-1.9", + "2-2.9", + "3-4.9", + "5-plus" + ], + "type": "string" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "Etsy Ads ROAS, last 30 days (Etsy Ads page): a number, a band (under-1, 1-1.9, 2-2.9, 3-4.9, 5-plus), or not-sure. Only when the shop runs ads." + }, + "shippingCharged": { + "description": "What the buyer pays for shipping on a typical order, US dollars (0 if free).", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "targetProfitPerOrder": { + "description": "Profit per order the seller wants on top of costs, US dollars (used by the price fix when orders lose money). Default 0.", + "maximum": 10000, + "minimum": 0, + "type": "number" + }, + "tenK": { + "description": "Has the shop sold $10,000 or more in any 12 months? yes (Offsite Ads 12% for life), no-offsite-on (15%, can opt out), no-opted-out (no Offsite fee), not-sure (estimated from orders × price).", + "enum": [ + "yes", + "no-offsite-on", + "no-opted-out", + "not-sure" + ], + "type": "string" + } + }, + "required": [ + "orders", + "itemPrice", + "shippingCharged", + "labelCost", + "tenK", + "etsyAds" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "ads": { + "description": "Ads a month (Meta, Google, TikTok): none, a band under-300, 300-999, 1000-2999, 3000-plus (US dollars a month), or yes with adsMonthlySpend. 3000-plus needs adsMonthlySpend.", + "enum": [ + "none", + "yes", + "under-300", + "300-999", + "1000-2999", + "3000-plus" + ], + "type": "string" + }, + "adsMonthlySpend": { + "description": "Ad spend a month, US dollars. Wins over the band.", + "maximum": 1000000, + "minimum": 0.01, + "type": "number" + }, + "billing": { + "description": "How the plan is paid: monthly, yearly, or not-sure.", + "enum": [ + "monthly", + "yearly", + "not-sure" + ], + "type": "string" + }, + "deeper": { + "additionalProperties": false, + "description": "Optional go-deeper answers; each one sharpens the result and adds a check.", + "properties": { + "appBill": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-50", + "50-149", + "150-299" + ], + "type": "string" + } + ], + "description": "The monthly app bill: US dollars, or under-50, 50-149, 150-299. $300 or more: send the dollars." + }, + "appsUnproven": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "Of the app bill, US dollars a month for apps the seller can't tie to sales or time saved, or not-sure. Needs appBill." + }, + "chargebacksLostPerMonth": { + "description": "Chargebacks lost in a typical month.", + "maximum": 100000, + "minimum": 0, + "type": "integer" + }, + "foreignShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "none", + "under-5", + "5-14", + "15-24", + "25-plus" + ], + "type": "string" + } + ], + "description": "Share of sales paid in another currency: a fraction, or none, under-5, 5-14, 15-24, 25-plus." + }, + "freeShippingShareOver": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "none", + "1-in-4", + "half", + "3-in-4", + "all" + ], + "type": "string" + } + ], + "description": "Share of orders at or over the threshold: a fraction, or none, 1-in-4, half, 3-in-4, all." + }, + "freeShippingThreshold": { + "description": "The free-shipping threshold, US dollars. Needs freeShippingShareOver.", + "maximum": 10000, + "minimum": 0, + "type": "number" + }, + "packaging": { + "description": "Packaging per order, US dollars. Left out: not counted, and flagged.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "refunds": { + "additionalProperties": false, + "description": "Refunds and returns: send frequency or perMonth, and outcome.", + "properties": { + "frequency": { + "description": "How often: rarely (1 in 50), sometimes (1 in 20), often (1 in 10). Or send perMonth.", + "enum": [ + "rarely", + "sometimes", + "often" + ], + "type": "string" + }, + "outcome": { + "description": "What usually happens on a refund: back-buyer-pays-return, back-i-pay-return, buyer-keeps or mixed.", + "enum": [ + "back-buyer-pays-return", + "back-i-pay-return", + "buyer-keeps", + "mixed" + ], + "type": "string" + }, + "perMonth": { + "description": "Refunds in a typical month, as a number. Or send frequency.", + "maximum": 100000, + "minimum": 0, + "type": "integer" + }, + "returnLabel": { + "description": "What a return label costs the store, US dollars. Default: what the outbound label costs.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "unsellablePerMonth": { + "description": "Returned items a month that can't be resold.", + "maximum": 100000, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "outcome" + ], + "type": "object" + } + }, + "type": "object" + }, + "labelCost": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "What the shipping label costs, US dollars, or not-sure (shipping is then treated as breaking even and shown as couldn't check)." + }, + "orderValue": { + "description": "A typical order before shipping and tax, US dollars (average order value).", + "maximum": 100000, + "minimum": 0.01, + "type": "number" + }, + "orders": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 1, + "type": "number" + }, + { + "enum": [ + "1-30", + "31-100", + "101-300", + "301-1000" + ], + "type": "string" + } + ], + "description": "Orders in a typical month (Analytics > Orders): a number, or a band 1-30, 31-100, 101-300, 301-1000. Over 1,000: send the number." + }, + "otherProcessorCents": { + "description": "The other card company's fixed fee per sale, in cents (30 is 30¢). Send with otherProcessorPercent.", + "maximum": 500, + "minimum": 0, + "type": "number" + }, + "otherProcessorPercent": { + "description": "The other card company's rate as a percent (2.9 is 2.9%). Send with otherProcessorCents. Left out: 2.9% + 30¢, flagged.", + "maximum": 20, + "minimum": 0, + "type": "number" + }, + "payments": { + "description": "How card payments arrive (Settings > Payments): shopify-payments, another (for example Stripe or Square), both, or not-sure (the third-party fee checks then can't run).", + "enum": [ + "shopify-payments", + "another", + "both", + "not-sure" + ], + "type": "string" + }, + "plan": { + "description": "The plan (Settings > Plan): basic, grow, advanced, plus, starter, or not-sure (plan fit and billing then can't be checked).", + "enum": [ + "basic", + "grow", + "advanced", + "plus", + "starter", + "not-sure" + ], + "type": "string" + }, + "platform": { + "const": "shopify", + "description": "shopify, for a store on the seller's own Shopify site.", + "type": "string" + }, + "productCost": { + "description": "What the products in that order cost the seller (COGS), US dollars. Or send productCostShare when not sure.", + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + "productCostShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-20", + "20-35", + "35-50", + "over-50" + ], + "type": "string" + } + ], + "description": "When the seller isn't sure of product cost: its share of the order, a fraction or under-20, 20-35, 35-50, over-50." + }, + "roas": { + "anyOf": [ + { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-1.5", + "1.5-2.49", + "2.5-3.99", + "4-plus" + ], + "type": "string" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "Sales from Shopify (not Ads Manager) ÷ ad spend, last 30 days: a number, a band (under-1.5, 1.5-2.49, 2.5-3.99, 4-plus), or not-sure. Only when the store runs ads." + }, + "shippingCharged": { + "description": "What the buyer pays for shipping on a typical order, US dollars (0 if free).", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "shopifyPaymentsShare": { + "description": "With both: the share of sales Shopify Payments handles (Shop Pay, local methods), a fraction. Left out: half, flagged.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "targetMargin": { + "description": "The margin the seller wants on each order after every cost, a fraction (0.2 is 20%), for the target price.", + "maximum": 0.9, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "platform", + "orders", + "orderValue", + "shippingCharged", + "labelCost", + "plan", + "billing", + "payments", + "ads" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "acos": { + "anyOf": [ + { + "exclusiveMinimum": 0, + "maximum": 10, + "type": "number" + }, + { + "enum": [ + "under-20", + "20-34", + "35-49", + "50-plus" + ], + "type": "string" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "ACoS, last 30 days (Campaign Manager): a fraction (0.3 is 30%), a band (under-20, 20-34, 35-49, 50-plus), or not-sure. Only when the seller runs Sponsored Products." + }, + "category": { + "description": "The Amazon category (sets the referral fee): beauty-health, baby, grocery, clothing, home-kitchen, toys, sports-outdoors, pet, electronics-accessories, media, jewelry, furniture, everything-else, or another row of Amazon's referral table (amazon-device-accessories, compact-appliances, full-size-appliances, automotive, base-power-tools, backpacks-handbags-luggage, business-industrial-scientific, computers, consumer-electronics, eyewear, footwear, gift-cards, lawn-garden, lawn-mowers-snow-throwers, mattresses, musical-instruments, office, tires, tools, video-games, video-game-consoles, watches), or not-sure (15%, flagged).", + "enum": [ + "beauty-health", + "baby", + "grocery", + "clothing", + "home-kitchen", + "toys", + "sports-outdoors", + "pet", + "electronics-accessories", + "media", + "jewelry", + "furniture", + "everything-else", + "amazon-device-accessories", + "compact-appliances", + "full-size-appliances", + "automotive", + "base-power-tools", + "backpacks-handbags-luggage", + "business-industrial-scientific", + "computers", + "consumer-electronics", + "eyewear", + "footwear", + "gift-cards", + "lawn-garden", + "lawn-mowers-snow-throwers", + "mattresses", + "musical-instruments", + "office", + "tires", + "tools", + "video-games", + "video-game-consoles", + "watches", + "not-sure" + ], + "type": "string" + }, + "deeper": { + "additionalProperties": false, + "description": "Optional go-deeper answers; each one sharpens the result. packed (the packed size) makes the FBA estimate and the size and weight checks exact to the rate card.", + "properties": { + "coupons": { + "additionalProperties": false, + "description": "Coupons.", + "properties": { + "discount": { + "description": "The coupon discount, a fraction of the price.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "runsPerMonth": { + "description": "Coupon runs a month.", + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + "share": { + "description": "Share of units sold with the coupon.", + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "runsPerMonth", + "discount", + "share" + ], + "type": "object" + }, + "cubicFeet": { + "description": "Cubic feet per packed unit, when the dimensions aren't known (storage).", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "fbaShare": { + "description": "With fulfillment both: the share of units Amazon ships, a fraction. Left out: half, flagged.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "inbound": { + "additionalProperties": false, + "description": "Inbound placement choice.", + "properties": { + "extraFreightPerUnit": { + "description": "Extra freight per unit an optimized split costs, US dollars, if quoted.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "split": { + "description": "minimal, partial or optimized.", + "enum": [ + "minimal", + "partial", + "optimized" + ], + "type": "string" + } + }, + "required": [ + "split" + ], + "type": "object" + }, + "inventory": { + "additionalProperties": false, + "description": "Stock at Amazon.", + "properties": { + "agedBand": { + "description": "How old those units are: 181-270, 271-365, over-365. Default 181-270.", + "enum": [ + "181-270", + "271-365", + "over-365" + ], + "type": "string" + }, + "agedUnits": { + "description": "Units older than 6 months (181+ days).", + "maximum": 1000000, + "minimum": 0, + "type": "integer" + }, + "daysOfSupply": { + "description": "Days of supply on hand (Amazon's low-inventory measure).", + "maximum": 3650, + "minimum": 0, + "type": "integer" + }, + "unitsAtAmazon": { + "description": "Units in Amazon's warehouses. Default: one month of sales.", + "maximum": 1000000, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + "packaging": { + "description": "Packaging per unit the seller ships, US dollars. Left out: $1 typical, flagged.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "packed": { + "additionalProperties": false, + "description": "The packed size and weight, as Amazon measures it: makes the FBA estimate and the size and weight checks exact to the rate card.", + "properties": { + "heightIn": { + "description": "Height, inches, packed.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + }, + "lengthIn": { + "description": "Length, inches, packed.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + }, + "weightOz": { + "description": "Weight, ounces, packed (16 oz is 1 lb).", + "exclusiveMinimum": 0, + "maximum": 4800, + "type": "number" + }, + "widthIn": { + "description": "Width, inches, packed.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + } + }, + "required": [ + "lengthIn", + "widthIn", + "heightIn", + "weightOz" + ], + "type": "object" + }, + "peakUnits": { + "description": "Units shipped October 15 to January 14 (the peak season), for the whole season.", + "maximum": 10000000, + "minimum": 0, + "type": "integer" + }, + "returns": { + "additionalProperties": false, + "description": "Returns: the rate, and the unsellable share.", + "properties": { + "rate": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-3", + "3-6", + "6-10", + "10-15", + "over-15" + ], + "type": "string" + } + ], + "description": "Share of units returned: a fraction, or under-3, 3-6, 6-10, 10-15, over-15 (bands are our assumption)." + }, + "unsellableShare": { + "description": "Share of returns that come back unsellable. Default 0.", + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "rate" + ], + "type": "object" + }, + "sourcingCostEntered": { + "description": "True when the seller has entered sourcing costs in Manage Your Sourcing Cost.", + "type": "boolean" + } + }, + "type": "object" + }, + "fbaFee": { + "description": "FBA or both: the FBA fee per unit from Fee Preview or the Revenue Calculator, US dollars, all-in. Turns the estimate into the seller's own number. Or send sizeBand and weightBand.", + "maximum": 1000, + "minimum": 0.01, + "type": "number" + }, + "fulfillment": { + "description": "Who ships: fba (Amazon), fbm (the seller), or both.", + "enum": [ + "fba", + "fbm", + "both" + ], + "type": "string" + }, + "labelCost": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "FBM or both: what the label costs per unit, US dollars, or not-sure." + }, + "landedCost": { + "description": "Landed cost per unit (product + freight + duties + prep, to Amazon's door), US dollars. Or send landedCostShare when not sure.", + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + "landedCostShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-20", + "20-35", + "35-50", + "over-50" + ], + "type": "string" + } + ], + "description": "When the seller isn't sure of landed cost: its share of the price, a fraction or under-20, 20-35, 35-50, over-50." + }, + "plan": { + "description": "professional ($39.99 a month), individual ($0.99 an item), or not-sure.", + "enum": [ + "professional", + "individual", + "not-sure" + ], + "type": "string" + }, + "platform": { + "const": "amazon", + "description": "amazon, for a seller on Amazon's US marketplace.", + "type": "string" + }, + "ppc": { + "description": "Sponsored Products a month: none, a band under-500, 500-1999, 2000-4999, 5000-plus (US dollars a month), or yes with ppcMonthlySpend. 5000-plus needs ppcMonthlySpend.", + "enum": [ + "none", + "yes", + "under-500", + "500-1999", + "2000-4999", + "5000-plus" + ], + "type": "string" + }, + "ppcMonthlySpend": { + "description": "Sponsored Products spend a month, US dollars. Wins over the band.", + "maximum": 1000000, + "minimum": 0.01, + "type": "number" + }, + "price": { + "description": "The selling price on Amazon, US dollars.", + "maximum": 100000, + "minimum": 0.01, + "type": "number" + }, + "shippingCharged": { + "description": "FBM or both: what the buyer pays for shipping per unit, US dollars (0 if free).", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "sizeBand": { + "description": "FBA or both, when the FBA fee isn't known: small-flat (fits 15 × 12 × 0.75 in), standard-box (up to 18 × 14 × 8 in), bigger. Send with weightBand.", + "enum": [ + "small-flat", + "standard-box", + "bigger" + ], + "type": "string" + }, + "targetMargin": { + "description": "The margin the seller wants after every cost, a fraction of the price (0.2 is 20%), for the repricing fixes. Default 0: break-even.", + "maximum": 0.9, + "minimum": 0, + "type": "number" + }, + "today": { + "description": "Today's date, YYYY-MM-DD: picks the storage season and the peak window (October 15 to January 14). Default: the rates' as-of date, October 13, 2026.", + "maxLength": 10, + "pattern": "^20(2[6-9]|[3-9]\\d)-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$", + "type": "string" + }, + "units": { + "anyOf": [ + { + "maximum": 1000000, + "minimum": 1, + "type": "number" + }, + { + "enum": [ + "1-40", + "41-150", + "151-500", + "501-1500", + "1501-5000" + ], + "type": "string" + } + ], + "description": "Units sold in a typical month (Business Reports > Sales Dashboard > Units Ordered): a number, or a band 1-40, 41-150, 151-500, 501-1500, 1501-5000. Over 5,000: send the number." + }, + "weightBand": { + "description": "FBA or both, when the FBA fee isn't known: under-8oz, 8oz-1lb, 1-2lb, 2-3lb, over-3lb. Send with sizeBand.", + "enum": [ + "under-8oz", + "8oz-1lb", + "1-2lb", + "2-3lb", + "over-3lb" + ], + "type": "string" + } + }, + "required": [ + "platform", + "units", + "price", + "category", + "fulfillment", + "plan", + "ppc" + ], + "type": "object" + } +]
- Added
sellerprofit_compare_fees - Added
sellerprofit_sale_breakeven - Added
sellerprofit_shopify_order_fees
2 tool updates
- Changed
sellerprofit_amazon_fees2 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"The Amazon category (sets the referral fee): beauty-health, baby, grocery, clothing, home-kitchen, toys, sports-outdoors, pet, electronics-accessories, media, jewelry, furniture, everything-else, amazon-device-accessories, compact-appliances, full-size-appliances, automotive, base-power-tools, backpacks-handbags-luggage, business-industrial-scientific, computers, consumer-electronics, eyewear, footwear, gift-cards, lawn-garden, mattresses, musical-instruments, office, tires, tools, video-games, video-game-consoles, watches, or not-sure (Everything Else, 15%, flagged)."New value: +"The Amazon category (sets the referral fee): beauty-health, baby, grocery, clothing, home-kitchen, toys, sports-outdoors, pet, electronics-accessories, media, jewelry, furniture, everything-else, amazon-device-accessories, compact-appliances, full-size-appliances, automotive, base-power-tools, backpacks-handbags-luggage, business-industrial-scientific, computers, consumer-electronics, eyewear, footwear, gift-cards, lawn-garden, lawn-mowers-snow-throwers, mattresses, musical-instruments, office, tires, tools, video-games, video-game-consoles, watches, or not-sure (Everything Else, 15%, flagged)." - changed
Input schema / properties / category / enumPrevious value: -[ - "beauty-health", - "baby", - "grocery", - "clothing", - "home-kitchen", - "toys", - "sports-outdoors", - "pet", - "electronics-accessories", - "media", - "jewelry", - "furniture", - "everything-else", - "amazon-device-accessories", - "compact-appliances", - "full-size-appliances", - "automotive", - "base-power-tools", - "backpacks-handbags-luggage", - "business-industrial-scientific", - "computers", - "consumer-electronics", - "eyewear", - "footwear", - "gift-cards", - "lawn-garden", - "mattresses", - "musical-instruments", - "office", - "tires", - "tools", - "video-games", - "video-game-consoles", - "watches", - "not-sure" -]New value: +[ + "beauty-health", + "baby", + "grocery", + "clothing", + "home-kitchen", + "toys", + "sports-outdoors", + "pet", + "electronics-accessories", + "media", + "jewelry", + "furniture", + "everything-else", + "amazon-device-accessories", + "compact-appliances", + "full-size-appliances", + "automotive", + "base-power-tools", + "backpacks-handbags-luggage", + "business-industrial-scientific", + "computers", + "consumer-electronics", + "eyewear", + "footwear", + "gift-cards", + "lawn-garden", + "lawn-mowers-snow-throwers", + "mattresses", + "musical-instruments", + "office", + "tires", + "tools", + "video-games", + "video-game-consoles", + "watches", + "not-sure" +]
- Changed
sellerprofit_checkup1 field changed- changed
Input schema / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "adsDailyBudget": { - "description": "Etsy Ads daily budget, US dollars (assumed fully spent, 30 days a month).", - "maximum": 10000, - "minimum": 0.01, - "type": "number" - }, - "adsMonthlySpend": { - "description": "Exact Etsy Ads spend last 30 days, US dollars. Wins over the daily budget.", - "maximum": 300000, - "minimum": 0.01, - "type": "number" - }, - "deeper": { - "additionalProperties": false, - "description": "Optional go-deeper answers; each one sharpens the result.", - "properties": { - "discountDepth": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "none", - "up-to-10", - "11-20", - "21-30", - "over-30" - ], - "type": "string" - } - ], - "description": "Typical discount: a fraction (0.15), or none, up-to-10, 11-20, 21-30, over-30." - }, - "discountShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "a-few", - "some", - "many" - ], - "type": "string" - } - ], - "description": "Share of orders that use a discount: a fraction, or a-few, some, many. Needed when discountDepth isn't none or 0." - }, - "freeShippingShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "none", - "1-in-4", - "half", - "3-in-4", - "all" - ], - "type": "string" - } - ], - "description": "Share of orders that ship free: a fraction (0.25), or none, 1-in-4, half, 3-in-4, all." - }, - "hourlyPay": { - "description": "The hourly pay the seller wants for their time, US dollars. Needs minutesPerItem.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "minutesPerItem": { - "anyOf": [ - { - "maximum": 6000, - "minimum": 1, - "type": "number" - }, - { - "enum": [ - "under-15", - "15-44", - "45-90" - ], - "type": "string" - } - ], - "description": "Minutes to make and pack one item: a number, or under-15, 15-44, 45-90." - }, - "offsiteShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-5", - "5-14", - "15-24", - "25-plus" - ], - "type": "string" - } - ], - "description": "Share of sales from Offsite Ads (Marketing > Offsite Ads): a fraction, or under-5, 5-14, 15-24, 25-plus. Left out: Etsy's typical 10% (2020), flagged as a default." - }, - "packaging": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "mailer", - "box", - "not-sure" - ], - "type": "string" - } - ], - "description": "Packaging per order in US dollars, or mailer (about $1), box (about $3) or not-sure. Left out: $1, a weakly sourced typical figure, flagged as a default." - }, - "refunds": { - "additionalProperties": false, - "description": "Refunds: send frequency or perMonth, and outcome.", - "properties": { - "frequency": { - "description": "How often: rarely (1 in 50), sometimes (1 in 20), often (1 in 10). Or send perMonth.", - "enum": [ - "rarely", - "sometimes", - "often" - ], - "type": "string" - }, - "outcome": { - "description": "What usually happens on a refund: back-buyer-pays-return, back-i-pay-return, buyer-keeps or mixed.", - "enum": [ - "back-buyer-pays-return", - "back-i-pay-return", - "buyer-keeps", - "mixed" - ], - "type": "string" - }, - "perMonth": { - "description": "Refunds in a typical month, as a number. Or send frequency.", - "maximum": 100000, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "outcome" - ], - "type": "object" - } - }, - "type": "object" - }, - "etsyAds": { - "description": "Etsy Ads daily budget: no, a band 1-4, 5-14, 15-24, 25-plus (dollars a day), or yes with adsDailyBudget or adsMonthlySpend. 25-plus needs adsDailyBudget.", - "enum": [ - "no", - "yes", - "1-4", - "5-14", - "15-24", - "25-plus" - ], - "type": "string" - }, - "itemPrice": { - "description": "Typical item price in US dollars, before shipping (the item sold most).", - "maximum": 100000, - "minimum": 0.01, - "type": "number" - }, - "labelCost": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "What the shipping label costs, US dollars, or not-sure (shipping is then treated as breaking even and shown as couldn't check)." - }, - "materials": { - "description": "Materials and supplies for one item, US dollars. Or send materialsShare when the seller isn't sure.", - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - "materialsShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-20", - "20-35", - "35-50", - "over-50" - ], - "type": "string" - } - ], - "description": "When the seller isn't sure of materials: the share of the price they take, a fraction or under-20, 20-35, 35-50, over-50." - }, - "orders": { - "anyOf": [ - { - "maximum": 100000, - "minimum": 1, - "type": "number" - }, - { - "enum": [ - "1-10", - "11-30", - "31-75", - "76-150", - "151-300" - ], - "type": "string" - } - ], - "description": "Orders in a typical month: a number from 1 to 100,000 (Shop Manager > Stats > Orders), or a band: 1-10, 11-30, 31-75, 76-150, 151-300. Over 300: send the number." - }, - "platform": { - "const": "etsy", - "default": "etsy", - "description": "etsy (the default when left out).", - "type": "string" - }, - "roas": { - "anyOf": [ - { - "maximum": 100, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-1", - "1-1.9", - "2-2.9", - "3-4.9", - "5-plus" - ], - "type": "string" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "Etsy Ads ROAS, last 30 days (Etsy Ads page): a number, a band (under-1, 1-1.9, 2-2.9, 3-4.9, 5-plus), or not-sure. Only when the shop runs ads." - }, - "shippingCharged": { - "description": "What the buyer pays for shipping on a typical order, US dollars (0 if free).", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "targetProfitPerOrder": { - "description": "Profit per order the seller wants on top of costs, US dollars (used by the price fix when orders lose money). Default 0.", - "maximum": 10000, - "minimum": 0, - "type": "number" - }, - "tenK": { - "description": "Has the shop sold $10,000 or more in any 12 months? yes (Offsite Ads 12% for life), no-offsite-on (15%, can opt out), no-opted-out (no Offsite fee), not-sure (estimated from orders × price).", - "enum": [ - "yes", - "no-offsite-on", - "no-opted-out", - "not-sure" - ], - "type": "string" - } - }, - "required": [ - "orders", - "itemPrice", - "shippingCharged", - "labelCost", - "tenK", - "etsyAds" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "ads": { - "description": "Ads a month (Meta, Google, TikTok): none, a band under-300, 300-999, 1000-2999, 3000-plus (US dollars a month), or yes with adsMonthlySpend. 3000-plus needs adsMonthlySpend.", - "enum": [ - "none", - "yes", - "under-300", - "300-999", - "1000-2999", - "3000-plus" - ], - "type": "string" - }, - "adsMonthlySpend": { - "description": "Ad spend a month, US dollars. Wins over the band.", - "maximum": 1000000, - "minimum": 0.01, - "type": "number" - }, - "billing": { - "description": "How the plan is paid: monthly, yearly, or not-sure.", - "enum": [ - "monthly", - "yearly", - "not-sure" - ], - "type": "string" - }, - "deeper": { - "additionalProperties": false, - "description": "Optional go-deeper answers; each one sharpens the result and adds a check.", - "properties": { - "appBill": { - "anyOf": [ - { - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-50", - "50-149", - "150-299" - ], - "type": "string" - } - ], - "description": "The monthly app bill: US dollars, or under-50, 50-149, 150-299. $300 or more: send the dollars." - }, - "appsUnproven": { - "anyOf": [ - { - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "Of the app bill, US dollars a month for apps the seller can't tie to sales or time saved, or not-sure. Needs appBill." - }, - "chargebacksLostPerMonth": { - "description": "Chargebacks lost in a typical month.", - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - "foreignShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "none", - "under-5", - "5-14", - "15-24", - "25-plus" - ], - "type": "string" - } - ], - "description": "Share of sales paid in another currency: a fraction, or none, under-5, 5-14, 15-24, 25-plus." - }, - "freeShippingShareOver": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "none", - "1-in-4", - "half", - "3-in-4", - "all" - ], - "type": "string" - } - ], - "description": "Share of orders at or over the threshold: a fraction, or none, 1-in-4, half, 3-in-4, all." - }, - "freeShippingThreshold": { - "description": "The free-shipping threshold, US dollars. Needs freeShippingShareOver.", - "maximum": 10000, - "minimum": 0, - "type": "number" - }, - "packaging": { - "description": "Packaging per order, US dollars. Left out: not counted, and flagged.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "refunds": { - "additionalProperties": false, - "description": "Refunds and returns: send frequency or perMonth, and outcome.", - "properties": { - "frequency": { - "description": "How often: rarely (1 in 50), sometimes (1 in 20), often (1 in 10). Or send perMonth.", - "enum": [ - "rarely", - "sometimes", - "often" - ], - "type": "string" - }, - "outcome": { - "description": "What usually happens on a refund: back-buyer-pays-return, back-i-pay-return, buyer-keeps or mixed.", - "enum": [ - "back-buyer-pays-return", - "back-i-pay-return", - "buyer-keeps", - "mixed" - ], - "type": "string" - }, - "perMonth": { - "description": "Refunds in a typical month, as a number. Or send frequency.", - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - "returnLabel": { - "description": "What a return label costs the store, US dollars. Default: what the outbound label costs.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "unsellablePerMonth": { - "description": "Returned items a month that can't be resold.", - "maximum": 100000, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "outcome" - ], - "type": "object" - } - }, - "type": "object" - }, - "labelCost": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "What the shipping label costs, US dollars, or not-sure (shipping is then treated as breaking even and shown as couldn't check)." - }, - "orderValue": { - "description": "A typical order before shipping and tax, US dollars (average order value).", - "maximum": 100000, - "minimum": 0.01, - "type": "number" - }, - "orders": { - "anyOf": [ - { - "maximum": 100000, - "minimum": 1, - "type": "number" - }, - { - "enum": [ - "1-30", - "31-100", - "101-300", - "301-1000" - ], - "type": "string" - } - ], - "description": "Orders in a typical month (Analytics > Orders): a number, or a band 1-30, 31-100, 101-300, 301-1000. Over 1,000: send the number." - }, - "otherProcessorCents": { - "description": "The other card company's fixed fee per sale, in cents (30 is 30¢). Send with otherProcessorPercent.", - "maximum": 500, - "minimum": 0, - "type": "number" - }, - "otherProcessorPercent": { - "description": "The other card company's rate as a percent (2.9 is 2.9%). Send with otherProcessorCents. Left out: 2.9% + 30¢, flagged.", - "maximum": 20, - "minimum": 0, - "type": "number" - }, - "payments": { - "description": "How card payments arrive (Settings > Payments): shopify-payments, another (for example Stripe or Square), both, or not-sure (the third-party fee checks then can't run).", - "enum": [ - "shopify-payments", - "another", - "both", - "not-sure" - ], - "type": "string" - }, - "plan": { - "description": "The plan (Settings > Plan): basic, grow, advanced, plus, starter, or not-sure (plan fit and billing then can't be checked).", - "enum": [ - "basic", - "grow", - "advanced", - "plus", - "starter", - "not-sure" - ], - "type": "string" - }, - "platform": { - "const": "shopify", - "description": "shopify, for a store on the seller's own Shopify site.", - "type": "string" - }, - "productCost": { - "description": "What the products in that order cost the seller (COGS), US dollars. Or send productCostShare when not sure.", - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - "productCostShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-20", - "20-35", - "35-50", - "over-50" - ], - "type": "string" - } - ], - "description": "When the seller isn't sure of product cost: its share of the order, a fraction or under-20, 20-35, 35-50, over-50." - }, - "roas": { - "anyOf": [ - { - "maximum": 100, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-1.5", - "1.5-2.49", - "2.5-3.99", - "4-plus" - ], - "type": "string" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "Sales from Shopify (not Ads Manager) ÷ ad spend, last 30 days: a number, a band (under-1.5, 1.5-2.49, 2.5-3.99, 4-plus), or not-sure. Only when the store runs ads." - }, - "shippingCharged": { - "description": "What the buyer pays for shipping on a typical order, US dollars (0 if free).", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "shopifyPaymentsShare": { - "description": "With both: the share of sales Shopify Payments handles (Shop Pay, local methods), a fraction. Left out: half, flagged.", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "targetMargin": { - "description": "The margin the seller wants on each order after every cost, a fraction (0.2 is 20%), for the target price.", - "maximum": 0.9, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "platform", - "orders", - "orderValue", - "shippingCharged", - "labelCost", - "plan", - "billing", - "payments", - "ads" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "acos": { - "anyOf": [ - { - "exclusiveMinimum": 0, - "maximum": 10, - "type": "number" - }, - { - "enum": [ - "under-20", - "20-34", - "35-49", - "50-plus" - ], - "type": "string" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "ACoS, last 30 days (Campaign Manager): a fraction (0.3 is 30%), a band (under-20, 20-34, 35-49, 50-plus), or not-sure. Only when the seller runs Sponsored Products." - }, - "category": { - "description": "The Amazon category (sets the referral fee): beauty-health, baby, grocery, clothing, home-kitchen, toys, sports-outdoors, pet, electronics-accessories, media, jewelry, furniture, everything-else, or another row of Amazon's referral table (amazon-device-accessories, compact-appliances, full-size-appliances, automotive, base-power-tools, backpacks-handbags-luggage, business-industrial-scientific, computers, consumer-electronics, eyewear, footwear, gift-cards, lawn-garden, mattresses, musical-instruments, office, tires, tools, video-games, video-game-consoles, watches), or not-sure (15%, flagged).", - "enum": [ - "beauty-health", - "baby", - "grocery", - "clothing", - "home-kitchen", - "toys", - "sports-outdoors", - "pet", - "electronics-accessories", - "media", - "jewelry", - "furniture", - "everything-else", - "amazon-device-accessories", - "compact-appliances", - "full-size-appliances", - "automotive", - "base-power-tools", - "backpacks-handbags-luggage", - "business-industrial-scientific", - "computers", - "consumer-electronics", - "eyewear", - "footwear", - "gift-cards", - "lawn-garden", - "mattresses", - "musical-instruments", - "office", - "tires", - "tools", - "video-games", - "video-game-consoles", - "watches", - "not-sure" - ], - "type": "string" - }, - "deeper": { - "additionalProperties": false, - "description": "Optional go-deeper answers; each one sharpens the result. packed (the packed size) makes the FBA estimate and the size and weight checks exact to the rate card.", - "properties": { - "coupons": { - "additionalProperties": false, - "description": "Coupons.", - "properties": { - "discount": { - "description": "The coupon discount, a fraction of the price.", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "runsPerMonth": { - "description": "Coupon runs a month.", - "maximum": 100, - "minimum": 0, - "type": "number" - }, - "share": { - "description": "Share of units sold with the coupon.", - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "runsPerMonth", - "discount", - "share" - ], - "type": "object" - }, - "cubicFeet": { - "description": "Cubic feet per packed unit, when the dimensions aren't known (storage).", - "exclusiveMinimum": 0, - "maximum": 1000, - "type": "number" - }, - "fbaShare": { - "description": "With fulfillment both: the share of units Amazon ships, a fraction. Left out: half, flagged.", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "inbound": { - "additionalProperties": false, - "description": "Inbound placement choice.", - "properties": { - "extraFreightPerUnit": { - "description": "Extra freight per unit an optimized split costs, US dollars, if quoted.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "split": { - "description": "minimal, partial or optimized.", - "enum": [ - "minimal", - "partial", - "optimized" - ], - "type": "string" - } - }, - "required": [ - "split" - ], - "type": "object" - }, - "inventory": { - "additionalProperties": false, - "description": "Stock at Amazon.", - "properties": { - "agedBand": { - "description": "How old those units are: 181-270, 271-365, over-365. Default 181-270.", - "enum": [ - "181-270", - "271-365", - "over-365" - ], - "type": "string" - }, - "agedUnits": { - "description": "Units older than 6 months (181+ days).", - "maximum": 1000000, - "minimum": 0, - "type": "number" - }, - "daysOfSupply": { - "description": "Days of supply on hand (Amazon's low-inventory measure).", - "maximum": 3650, - "minimum": 0, - "type": "number" - }, - "unitsAtAmazon": { - "description": "Units in Amazon's warehouses. Default: one month of sales.", - "maximum": 1000000, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "packaging": { - "description": "Packaging per unit the seller ships, US dollars. Left out: $1 typical, flagged.", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "packed": { - "additionalProperties": false, - "description": "The packed size and weight, as Amazon measures it: makes the FBA estimate and the size and weight checks exact to the rate card.", - "properties": { - "heightIn": { - "description": "Height, inches, packed.", - "exclusiveMinimum": 0, - "maximum": 200, - "type": "number" - }, - "lengthIn": { - "description": "Length, inches, packed.", - "exclusiveMinimum": 0, - "maximum": 200, - "type": "number" - }, - "weightOz": { - "description": "Weight, ounces, packed (16 oz is 1 lb).", - "exclusiveMinimum": 0, - "maximum": 4800, - "type": "number" - }, - "widthIn": { - "description": "Width, inches, packed.", - "exclusiveMinimum": 0, - "maximum": 200, - "type": "number" - } - }, - "required": [ - "lengthIn", - "widthIn", - "heightIn", - "weightOz" - ], - "type": "object" - }, - "peakUnits": { - "description": "Units shipped October 15 to January 14 (the peak season), for the whole season.", - "maximum": 10000000, - "minimum": 0, - "type": "number" - }, - "returns": { - "additionalProperties": false, - "description": "Returns: the rate, and the unsellable share.", - "properties": { - "rate": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-3", - "3-6", - "6-10", - "10-15", - "over-15" - ], - "type": "string" - } - ], - "description": "Share of units returned: a fraction, or under-3, 3-6, 6-10, 10-15, over-15 (bands are our assumption)." - }, - "unsellableShare": { - "description": "Share of returns that come back unsellable. Default 0.", - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "rate" - ], - "type": "object" - }, - "sourcingCostEntered": { - "description": "True when the seller has entered sourcing costs in Manage Your Sourcing Cost.", - "type": "boolean" - } - }, - "type": "object" - }, - "fbaFee": { - "description": "FBA or both: the FBA fee per unit from Fee Preview or the Revenue Calculator, US dollars, all-in. Turns the estimate into the seller's own number. Or send sizeBand and weightBand.", - "maximum": 1000, - "minimum": 0.01, - "type": "number" - }, - "fulfillment": { - "description": "Who ships: fba (Amazon), fbm (the seller), or both.", - "enum": [ - "fba", - "fbm", - "both" - ], - "type": "string" - }, - "labelCost": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - { - "const": "not-sure", - "type": "string" - } - ], - "description": "FBM or both: what the label costs per unit, US dollars, or not-sure." - }, - "landedCost": { - "description": "Landed cost per unit (product + freight + duties + prep, to Amazon's door), US dollars. Or send landedCostShare when not sure.", - "maximum": 100000, - "minimum": 0, - "type": "number" - }, - "landedCostShare": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "enum": [ - "under-20", - "20-35", - "35-50", - "over-50" - ], - "type": "string" - } - ], - "description": "When the seller isn't sure of landed cost: its share of the price, a fraction or under-20, 20-35, 35-50, over-50." - }, - "plan": { - "description": "professional ($39.99 a month), individual ($0.99 an item), or not-sure.", - "enum": [ - "professional", - "individual", - "not-sure" - ], - "type": "string" - }, - "platform": { - "const": "amazon", - "description": "amazon, for a seller on Amazon's US marketplace.", - "type": "string" - }, - "ppc": { - "description": "Sponsored Products a month: none, a band under-500, 500-1999, 2000-4999, 5000-plus (US dollars a month), or yes with ppcMonthlySpend. 5000-plus needs ppcMonthlySpend.", - "enum": [ - "none", - "yes", - "under-500", - "500-1999", - "2000-4999", - "5000-plus" - ], - "type": "string" - }, - "ppcMonthlySpend": { - "description": "Sponsored Products spend a month, US dollars. Wins over the band.", - "maximum": 1000000, - "minimum": 0.01, - "type": "number" - }, - "price": { - "description": "The selling price on Amazon, US dollars.", - "maximum": 100000, - "minimum": 0.01, - "type": "number" - }, - "shippingCharged": { - "description": "FBM or both: what the buyer pays for shipping per unit, US dollars (0 if free).", - "maximum": 1000, - "minimum": 0, - "type": "number" - }, - "sizeBand": { - "description": "FBA or both, when the FBA fee isn't known: small-flat (fits 15 × 12 × 0.75 in), standard-box (up to 18 × 14 × 8 in), bigger. Send with weightBand.", - "enum": [ - "small-flat", - "standard-box", - "bigger" - ], - "type": "string" - }, - "targetMargin": { - "description": "The margin the seller wants after every cost, a fraction of the price (0.2 is 20%), for the repricing fixes. Default 0: break-even.", - "maximum": 0.9, - "minimum": 0, - "type": "number" - }, - "today": { - "description": "Today's date, YYYY-MM-DD: picks the storage season and the peak window (October 15 to January 14). Default: the rates' as-of date, October 13, 2026.", - "maxLength": 10, - "pattern": "^20(2[6-9]|[3-9]\\d)-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$", - "type": "string" - }, - "units": { - "anyOf": [ - { - "maximum": 1000000, - "minimum": 1, - "type": "number" - }, - { - "enum": [ - "1-40", - "41-150", - "151-500", - "501-1500", - "1501-5000" - ], - "type": "string" - } - ], - "description": "Units sold in a typical month (Business Reports > Sales Dashboard > Units Ordered): a number, or a band 1-40, 41-150, 151-500, 501-1500, 1501-5000. Over 5,000: send the number." - }, - "weightBand": { - "description": "FBA or both, when the FBA fee isn't known: under-8oz, 8oz-1lb, 1-2lb, 2-3lb, over-3lb. Send with sizeBand.", - "enum": [ - "under-8oz", - "8oz-1lb", - "1-2lb", - "2-3lb", - "over-3lb" - ], - "type": "string" - } - }, - "required": [ - "platform", - "units", - "price", - "category", - "fulfillment", - "plan", - "ppc" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "adsDailyBudget": { + "description": "Etsy Ads daily budget, US dollars (assumed fully spent, 30 days a month).", + "maximum": 10000, + "minimum": 0.01, + "type": "number" + }, + "adsMonthlySpend": { + "description": "Exact Etsy Ads spend last 30 days, US dollars. Wins over the daily budget.", + "maximum": 300000, + "minimum": 0.01, + "type": "number" + }, + "deeper": { + "additionalProperties": false, + "description": "Optional go-deeper answers; each one sharpens the result.", + "properties": { + "discountDepth": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "none", + "up-to-10", + "11-20", + "21-30", + "over-30" + ], + "type": "string" + } + ], + "description": "Typical discount: a fraction (0.15), or none, up-to-10, 11-20, 21-30, over-30." + }, + "discountShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "a-few", + "some", + "many" + ], + "type": "string" + } + ], + "description": "Share of orders that use a discount: a fraction, or a-few, some, many. Needed when discountDepth isn't none or 0." + }, + "freeShippingShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "none", + "1-in-4", + "half", + "3-in-4", + "all" + ], + "type": "string" + } + ], + "description": "Share of orders that ship free: a fraction (0.25), or none, 1-in-4, half, 3-in-4, all." + }, + "hourlyPay": { + "description": "The hourly pay the seller wants for their time, US dollars. Needs minutesPerItem.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "minutesPerItem": { + "anyOf": [ + { + "maximum": 6000, + "minimum": 1, + "type": "number" + }, + { + "enum": [ + "under-15", + "15-44", + "45-90" + ], + "type": "string" + } + ], + "description": "Minutes to make and pack one item: a number, or under-15, 15-44, 45-90." + }, + "offsiteShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-5", + "5-14", + "15-24", + "25-plus" + ], + "type": "string" + } + ], + "description": "Share of sales from Offsite Ads (Marketing > Offsite Ads): a fraction, or under-5, 5-14, 15-24, 25-plus. Left out: Etsy's typical 10% (2020), flagged as a default." + }, + "packaging": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "mailer", + "box", + "not-sure" + ], + "type": "string" + } + ], + "description": "Packaging per order in US dollars, or mailer (about $1), box (about $3) or not-sure. Left out: $1, a weakly sourced typical figure, flagged as a default." + }, + "refunds": { + "additionalProperties": false, + "description": "Refunds: send frequency or perMonth, and outcome.", + "properties": { + "frequency": { + "description": "How often: rarely (1 in 50), sometimes (1 in 20), often (1 in 10). Or send perMonth.", + "enum": [ + "rarely", + "sometimes", + "often" + ], + "type": "string" + }, + "outcome": { + "description": "What usually happens on a refund: back-buyer-pays-return, back-i-pay-return, buyer-keeps or mixed.", + "enum": [ + "back-buyer-pays-return", + "back-i-pay-return", + "buyer-keeps", + "mixed" + ], + "type": "string" + }, + "perMonth": { + "description": "Refunds in a typical month, as a number. Or send frequency.", + "maximum": 100000, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "outcome" + ], + "type": "object" + } + }, + "type": "object" + }, + "etsyAds": { + "description": "Etsy Ads daily budget: no, a band 1-4, 5-14, 15-24, 25-plus (dollars a day), or yes with adsDailyBudget or adsMonthlySpend. 25-plus needs adsDailyBudget.", + "enum": [ + "no", + "yes", + "1-4", + "5-14", + "15-24", + "25-plus" + ], + "type": "string" + }, + "itemPrice": { + "description": "Typical item price in US dollars, before shipping (the item sold most).", + "maximum": 100000, + "minimum": 0.01, + "type": "number" + }, + "labelCost": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "What the shipping label costs, US dollars, or not-sure (shipping is then treated as breaking even and shown as couldn't check)." + }, + "materials": { + "description": "Materials and supplies for one item, US dollars. Or send materialsShare when the seller isn't sure.", + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + "materialsShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-20", + "20-35", + "35-50", + "over-50" + ], + "type": "string" + } + ], + "description": "When the seller isn't sure of materials: the share of the price they take, a fraction or under-20, 20-35, 35-50, over-50." + }, + "orders": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 1, + "type": "number" + }, + { + "enum": [ + "1-10", + "11-30", + "31-75", + "76-150", + "151-300" + ], + "type": "string" + } + ], + "description": "Orders in a typical month: a number from 1 to 100,000 (Shop Manager > Stats > Orders), or a band: 1-10, 11-30, 31-75, 76-150, 151-300. Over 300: send the number." + }, + "platform": { + "const": "etsy", + "default": "etsy", + "description": "etsy (the default when left out).", + "type": "string" + }, + "roas": { + "anyOf": [ + { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-1", + "1-1.9", + "2-2.9", + "3-4.9", + "5-plus" + ], + "type": "string" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "Etsy Ads ROAS, last 30 days (Etsy Ads page): a number, a band (under-1, 1-1.9, 2-2.9, 3-4.9, 5-plus), or not-sure. Only when the shop runs ads." + }, + "shippingCharged": { + "description": "What the buyer pays for shipping on a typical order, US dollars (0 if free).", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "targetProfitPerOrder": { + "description": "Profit per order the seller wants on top of costs, US dollars (used by the price fix when orders lose money). Default 0.", + "maximum": 10000, + "minimum": 0, + "type": "number" + }, + "tenK": { + "description": "Has the shop sold $10,000 or more in any 12 months? yes (Offsite Ads 12% for life), no-offsite-on (15%, can opt out), no-opted-out (no Offsite fee), not-sure (estimated from orders × price).", + "enum": [ + "yes", + "no-offsite-on", + "no-opted-out", + "not-sure" + ], + "type": "string" + } + }, + "required": [ + "orders", + "itemPrice", + "shippingCharged", + "labelCost", + "tenK", + "etsyAds" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "ads": { + "description": "Ads a month (Meta, Google, TikTok): none, a band under-300, 300-999, 1000-2999, 3000-plus (US dollars a month), or yes with adsMonthlySpend. 3000-plus needs adsMonthlySpend.", + "enum": [ + "none", + "yes", + "under-300", + "300-999", + "1000-2999", + "3000-plus" + ], + "type": "string" + }, + "adsMonthlySpend": { + "description": "Ad spend a month, US dollars. Wins over the band.", + "maximum": 1000000, + "minimum": 0.01, + "type": "number" + }, + "billing": { + "description": "How the plan is paid: monthly, yearly, or not-sure.", + "enum": [ + "monthly", + "yearly", + "not-sure" + ], + "type": "string" + }, + "deeper": { + "additionalProperties": false, + "description": "Optional go-deeper answers; each one sharpens the result and adds a check.", + "properties": { + "appBill": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-50", + "50-149", + "150-299" + ], + "type": "string" + } + ], + "description": "The monthly app bill: US dollars, or under-50, 50-149, 150-299. $300 or more: send the dollars." + }, + "appsUnproven": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "Of the app bill, US dollars a month for apps the seller can't tie to sales or time saved, or not-sure. Needs appBill." + }, + "chargebacksLostPerMonth": { + "description": "Chargebacks lost in a typical month.", + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + "foreignShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "none", + "under-5", + "5-14", + "15-24", + "25-plus" + ], + "type": "string" + } + ], + "description": "Share of sales paid in another currency: a fraction, or none, under-5, 5-14, 15-24, 25-plus." + }, + "freeShippingShareOver": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "none", + "1-in-4", + "half", + "3-in-4", + "all" + ], + "type": "string" + } + ], + "description": "Share of orders at or over the threshold: a fraction, or none, 1-in-4, half, 3-in-4, all." + }, + "freeShippingThreshold": { + "description": "The free-shipping threshold, US dollars. Needs freeShippingShareOver.", + "maximum": 10000, + "minimum": 0, + "type": "number" + }, + "packaging": { + "description": "Packaging per order, US dollars. Left out: not counted, and flagged.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "refunds": { + "additionalProperties": false, + "description": "Refunds and returns: send frequency or perMonth, and outcome.", + "properties": { + "frequency": { + "description": "How often: rarely (1 in 50), sometimes (1 in 20), often (1 in 10). Or send perMonth.", + "enum": [ + "rarely", + "sometimes", + "often" + ], + "type": "string" + }, + "outcome": { + "description": "What usually happens on a refund: back-buyer-pays-return, back-i-pay-return, buyer-keeps or mixed.", + "enum": [ + "back-buyer-pays-return", + "back-i-pay-return", + "buyer-keeps", + "mixed" + ], + "type": "string" + }, + "perMonth": { + "description": "Refunds in a typical month, as a number. Or send frequency.", + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + "returnLabel": { + "description": "What a return label costs the store, US dollars. Default: what the outbound label costs.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "unsellablePerMonth": { + "description": "Returned items a month that can't be resold.", + "maximum": 100000, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "outcome" + ], + "type": "object" + } + }, + "type": "object" + }, + "labelCost": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "What the shipping label costs, US dollars, or not-sure (shipping is then treated as breaking even and shown as couldn't check)." + }, + "orderValue": { + "description": "A typical order before shipping and tax, US dollars (average order value).", + "maximum": 100000, + "minimum": 0.01, + "type": "number" + }, + "orders": { + "anyOf": [ + { + "maximum": 100000, + "minimum": 1, + "type": "number" + }, + { + "enum": [ + "1-30", + "31-100", + "101-300", + "301-1000" + ], + "type": "string" + } + ], + "description": "Orders in a typical month (Analytics > Orders): a number, or a band 1-30, 31-100, 101-300, 301-1000. Over 1,000: send the number." + }, + "otherProcessorCents": { + "description": "The other card company's fixed fee per sale, in cents (30 is 30¢). Send with otherProcessorPercent.", + "maximum": 500, + "minimum": 0, + "type": "number" + }, + "otherProcessorPercent": { + "description": "The other card company's rate as a percent (2.9 is 2.9%). Send with otherProcessorCents. Left out: 2.9% + 30¢, flagged.", + "maximum": 20, + "minimum": 0, + "type": "number" + }, + "payments": { + "description": "How card payments arrive (Settings > Payments): shopify-payments, another (for example Stripe or Square), both, or not-sure (the third-party fee checks then can't run).", + "enum": [ + "shopify-payments", + "another", + "both", + "not-sure" + ], + "type": "string" + }, + "plan": { + "description": "The plan (Settings > Plan): basic, grow, advanced, plus, starter, or not-sure (plan fit and billing then can't be checked).", + "enum": [ + "basic", + "grow", + "advanced", + "plus", + "starter", + "not-sure" + ], + "type": "string" + }, + "platform": { + "const": "shopify", + "description": "shopify, for a store on the seller's own Shopify site.", + "type": "string" + }, + "productCost": { + "description": "What the products in that order cost the seller (COGS), US dollars. Or send productCostShare when not sure.", + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + "productCostShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-20", + "20-35", + "35-50", + "over-50" + ], + "type": "string" + } + ], + "description": "When the seller isn't sure of product cost: its share of the order, a fraction or under-20, 20-35, 35-50, over-50." + }, + "roas": { + "anyOf": [ + { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-1.5", + "1.5-2.49", + "2.5-3.99", + "4-plus" + ], + "type": "string" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "Sales from Shopify (not Ads Manager) ÷ ad spend, last 30 days: a number, a band (under-1.5, 1.5-2.49, 2.5-3.99, 4-plus), or not-sure. Only when the store runs ads." + }, + "shippingCharged": { + "description": "What the buyer pays for shipping on a typical order, US dollars (0 if free).", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "shopifyPaymentsShare": { + "description": "With both: the share of sales Shopify Payments handles (Shop Pay, local methods), a fraction. Left out: half, flagged.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "targetMargin": { + "description": "The margin the seller wants on each order after every cost, a fraction (0.2 is 20%), for the target price.", + "maximum": 0.9, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "platform", + "orders", + "orderValue", + "shippingCharged", + "labelCost", + "plan", + "billing", + "payments", + "ads" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "acos": { + "anyOf": [ + { + "exclusiveMinimum": 0, + "maximum": 10, + "type": "number" + }, + { + "enum": [ + "under-20", + "20-34", + "35-49", + "50-plus" + ], + "type": "string" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "ACoS, last 30 days (Campaign Manager): a fraction (0.3 is 30%), a band (under-20, 20-34, 35-49, 50-plus), or not-sure. Only when the seller runs Sponsored Products." + }, + "category": { + "description": "The Amazon category (sets the referral fee): beauty-health, baby, grocery, clothing, home-kitchen, toys, sports-outdoors, pet, electronics-accessories, media, jewelry, furniture, everything-else, or another row of Amazon's referral table (amazon-device-accessories, compact-appliances, full-size-appliances, automotive, base-power-tools, backpacks-handbags-luggage, business-industrial-scientific, computers, consumer-electronics, eyewear, footwear, gift-cards, lawn-garden, lawn-mowers-snow-throwers, mattresses, musical-instruments, office, tires, tools, video-games, video-game-consoles, watches), or not-sure (15%, flagged).", + "enum": [ + "beauty-health", + "baby", + "grocery", + "clothing", + "home-kitchen", + "toys", + "sports-outdoors", + "pet", + "electronics-accessories", + "media", + "jewelry", + "furniture", + "everything-else", + "amazon-device-accessories", + "compact-appliances", + "full-size-appliances", + "automotive", + "base-power-tools", + "backpacks-handbags-luggage", + "business-industrial-scientific", + "computers", + "consumer-electronics", + "eyewear", + "footwear", + "gift-cards", + "lawn-garden", + "lawn-mowers-snow-throwers", + "mattresses", + "musical-instruments", + "office", + "tires", + "tools", + "video-games", + "video-game-consoles", + "watches", + "not-sure" + ], + "type": "string" + }, + "deeper": { + "additionalProperties": false, + "description": "Optional go-deeper answers; each one sharpens the result. packed (the packed size) makes the FBA estimate and the size and weight checks exact to the rate card.", + "properties": { + "coupons": { + "additionalProperties": false, + "description": "Coupons.", + "properties": { + "discount": { + "description": "The coupon discount, a fraction of the price.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "runsPerMonth": { + "description": "Coupon runs a month.", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "share": { + "description": "Share of units sold with the coupon.", + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "runsPerMonth", + "discount", + "share" + ], + "type": "object" + }, + "cubicFeet": { + "description": "Cubic feet per packed unit, when the dimensions aren't known (storage).", + "exclusiveMinimum": 0, + "maximum": 1000, + "type": "number" + }, + "fbaShare": { + "description": "With fulfillment both: the share of units Amazon ships, a fraction. Left out: half, flagged.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "inbound": { + "additionalProperties": false, + "description": "Inbound placement choice.", + "properties": { + "extraFreightPerUnit": { + "description": "Extra freight per unit an optimized split costs, US dollars, if quoted.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "split": { + "description": "minimal, partial or optimized.", + "enum": [ + "minimal", + "partial", + "optimized" + ], + "type": "string" + } + }, + "required": [ + "split" + ], + "type": "object" + }, + "inventory": { + "additionalProperties": false, + "description": "Stock at Amazon.", + "properties": { + "agedBand": { + "description": "How old those units are: 181-270, 271-365, over-365. Default 181-270.", + "enum": [ + "181-270", + "271-365", + "over-365" + ], + "type": "string" + }, + "agedUnits": { + "description": "Units older than 6 months (181+ days).", + "maximum": 1000000, + "minimum": 0, + "type": "number" + }, + "daysOfSupply": { + "description": "Days of supply on hand (Amazon's low-inventory measure).", + "maximum": 3650, + "minimum": 0, + "type": "number" + }, + "unitsAtAmazon": { + "description": "Units in Amazon's warehouses. Default: one month of sales.", + "maximum": 1000000, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "packaging": { + "description": "Packaging per unit the seller ships, US dollars. Left out: $1 typical, flagged.", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "packed": { + "additionalProperties": false, + "description": "The packed size and weight, as Amazon measures it: makes the FBA estimate and the size and weight checks exact to the rate card.", + "properties": { + "heightIn": { + "description": "Height, inches, packed.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + }, + "lengthIn": { + "description": "Length, inches, packed.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + }, + "weightOz": { + "description": "Weight, ounces, packed (16 oz is 1 lb).", + "exclusiveMinimum": 0, + "maximum": 4800, + "type": "number" + }, + "widthIn": { + "description": "Width, inches, packed.", + "exclusiveMinimum": 0, + "maximum": 200, + "type": "number" + } + }, + "required": [ + "lengthIn", + "widthIn", + "heightIn", + "weightOz" + ], + "type": "object" + }, + "peakUnits": { + "description": "Units shipped October 15 to January 14 (the peak season), for the whole season.", + "maximum": 10000000, + "minimum": 0, + "type": "number" + }, + "returns": { + "additionalProperties": false, + "description": "Returns: the rate, and the unsellable share.", + "properties": { + "rate": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-3", + "3-6", + "6-10", + "10-15", + "over-15" + ], + "type": "string" + } + ], + "description": "Share of units returned: a fraction, or under-3, 3-6, 6-10, 10-15, over-15 (bands are our assumption)." + }, + "unsellableShare": { + "description": "Share of returns that come back unsellable. Default 0.", + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "rate" + ], + "type": "object" + }, + "sourcingCostEntered": { + "description": "True when the seller has entered sourcing costs in Manage Your Sourcing Cost.", + "type": "boolean" + } + }, + "type": "object" + }, + "fbaFee": { + "description": "FBA or both: the FBA fee per unit from Fee Preview or the Revenue Calculator, US dollars, all-in. Turns the estimate into the seller's own number. Or send sizeBand and weightBand.", + "maximum": 1000, + "minimum": 0.01, + "type": "number" + }, + "fulfillment": { + "description": "Who ships: fba (Amazon), fbm (the seller), or both.", + "enum": [ + "fba", + "fbm", + "both" + ], + "type": "string" + }, + "labelCost": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + { + "const": "not-sure", + "type": "string" + } + ], + "description": "FBM or both: what the label costs per unit, US dollars, or not-sure." + }, + "landedCost": { + "description": "Landed cost per unit (product + freight + duties + prep, to Amazon's door), US dollars. Or send landedCostShare when not sure.", + "maximum": 100000, + "minimum": 0, + "type": "number" + }, + "landedCostShare": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "enum": [ + "under-20", + "20-35", + "35-50", + "over-50" + ], + "type": "string" + } + ], + "description": "When the seller isn't sure of landed cost: its share of the price, a fraction or under-20, 20-35, 35-50, over-50." + }, + "plan": { + "description": "professional ($39.99 a month), individual ($0.99 an item), or not-sure.", + "enum": [ + "professional", + "individual", + "not-sure" + ], + "type": "string" + }, + "platform": { + "const": "amazon", + "description": "amazon, for a seller on Amazon's US marketplace.", + "type": "string" + }, + "ppc": { + "description": "Sponsored Products a month: none, a band under-500, 500-1999, 2000-4999, 5000-plus (US dollars a month), or yes with ppcMonthlySpend. 5000-plus needs ppcMonthlySpend.", + "enum": [ + "none", + "yes", + "under-500", + "500-1999", + "2000-4999", + "5000-plus" + ], + "type": "string" + }, + "ppcMonthlySpend": { + "description": "Sponsored Products spend a month, US dollars. Wins over the band.", + "maximum": 1000000, + "minimum": 0.01, + "type": "number" + }, + "price": { + "description": "The selling price on Amazon, US dollars.", + "maximum": 100000, + "minimum": 0.01, + "type": "number" + }, + "shippingCharged": { + "description": "FBM or both: what the buyer pays for shipping per unit, US dollars (0 if free).", + "maximum": 1000, + "minimum": 0, + "type": "number" + }, + "sizeBand": { + "description": "FBA or both, when the FBA fee isn't known: small-flat (fits 15 × 12 × 0.75 in), standard-box (up to 18 × 14 × 8 in), bigger. Send with weightBand.", + "enum": [ + "small-flat", + "standard-box", + "bigger" + ], + "type": "string" + }, + "targetMargin": { + "description": "The margin the seller wants after every cost, a fraction of the price (0.2 is 20%), for the repricing fixes. Default 0: break-even.", + "maximum": 0.9, + "minimum": 0, + "type": "number" + }, + "today": { + "description": "Today's date, YYYY-MM-DD: picks the storage season and the peak window (October 15 to January 14). Default: the rates' as-of date, October 13, 2026.", + "maxLength": 10, + "pattern": "^20(2[6-9]|[3-9]\\d)-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$", + "type": "string" + }, + "units": { + "anyOf": [ + { + "maximum": 1000000, + "minimum": 1, + "type": "number" + }, + { + "enum": [ + "1-40", + "41-150", + "151-500", + "501-1500", + "1501-5000" + ], + "type": "string" + } + ], + "description": "Units sold in a typical month (Business Reports > Sales Dashboard > Units Ordered): a number, or a band 1-40, 41-150, 151-500, 501-1500, 1501-5000. Over 5,000: send the number." + }, + "weightBand": { + "description": "FBA or both, when the FBA fee isn't known: under-8oz, 8oz-1lb, 1-2lb, 2-3lb, over-3lb. Send with sizeBand.", + "enum": [ + "under-8oz", + "8oz-1lb", + "1-2lb", + "2-3lb", + "over-3lb" + ], + "type": "string" + } + }, + "required": [ + "platform", + "units", + "price", + "category", + "fulfillment", + "plan", + "ppc" + ], + "type": "object" + } +]
3 tool updates
- Changed
sellerprofit_ads_breakeven2 fields changed- changed
Input schema / properties / adsDailyBudget / descriptionPrevious value: -"Etsy Ads daily budget, US dollars (assumed fully spent, 30 days a month). Or send adsMonthlySpend."New value: +"Etsy Ads daily budget, US dollars, $1 or more (Etsy's smallest; assumed fully spent, 30 days a month). Or send adsMonthlySpend." - changed
Input schema / properties / adsDailyBudget / minimumPrevious value: -0.01New value: +1
- Changed
sellerprofit_amazon_fees8 fields changed- changed
Input schema / properties / weightBand / descriptionPrevious value: -"FBA: under-8oz, 8oz-1lb, 1-2lb, 2-3lb, over-3lb (the top of the band is used). Send with sizeBand."New value: +"FBA: under-8oz, 8oz-1lb, 1-2lb, 2-3lb, over-3lb (the top of the band is used; over-3lb has no top, so it is billed from 3 lb and heavier items cost more: send packed for a closer number). Send with sizeBand." - added
Output schema / properties / afterFeesInPeakAdded value: +{ + "description": "The same in peak season (FBA's peak fee); equal to afterFees for FBM.", + "type": "number" +} - changed
Output schema / properties / fba / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "billedWeightOz": { - "type": "number" - }, - "cardFee": { - "description": "The rate card's non-peak fee, before the surcharge, US dollars.", - "type": "number" - }, - "estimate": { - "const": true, - "type": "boolean" - }, - "exactness": { - "const": "third-party-estimate", - "type": "string" - }, - "fee": { - "description": "All-in FBA fee per unit outside peak, US dollars: card × 1.035, rounded to the cent.", - "type": "number" - }, - "fromBands": { - "description": "True when built from the size and weight bands (top of the band) rather than a packed size.", - "type": "boolean" - }, - "notes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "peakFee": { - "description": "All-in FBA fee per unit in peak season: (card + $0.32) × 1.035.", - "type": "number" - }, - "peakWindow": { - "additionalProperties": false, - "properties": { - "from": { - "type": "string" - }, - "until": { - "type": "string" - } - }, - "required": [ - "from", - "until" - ], - "type": "object" - }, - "sizeTier": { - "type": "string" - }, - "surcharge": { - "description": "The 3.5% fuel and logistics surcharge on it, US dollars.", - "type": "number" - } - }, - "required": [ - "estimate", - "exactness", - "sizeTier", - "billedWeightOz", - "fromBands", - "cardFee", - "surcharge", - "fee", - "peakFee", - "peakWindow", - "notes" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "billedWeightOz": { + "type": "number" + }, + "cardFee": { + "description": "The rate card's non-peak fee, before the surcharge, US dollars.", + "type": "number" + }, + "estimate": { + "const": true, + "type": "boolean" + }, + "exactness": { + "const": "third-party-estimate", + "type": "string" + }, + "fee": { + "description": "All-in FBA fee per unit outside peak, US dollars: card × 1.035, rounded to the cent.", + "type": "number" + }, + "fromBands": { + "description": "True when built from the size and weight bands (top of the band; over-3lb is billed from 3 lb, a floor) rather than a packed size.", + "type": "boolean" + }, + "notes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "peakFee": { + "description": "All-in FBA fee per unit in peak season: (card + $0.32) × 1.035.", + "type": "number" + }, + "peakWindow": { + "additionalProperties": false, + "properties": { + "from": { + "type": "string" + }, + "until": { + "type": "string" + } + }, + "required": [ + "from", + "until" + ], + "type": "object" + }, + "sizeTier": { + "type": "string" + }, + "surcharge": { + "description": "The 3.5% fuel and logistics surcharge on it, US dollars.", + "type": "number" + } + }, + "required": [ + "estimate", + "exactness", + "sizeTier", + "billedWeightOz", + "fromBands", + "cardFee", + "surcharge", + "fee", + "peakFee", + "peakWindow", + "notes" + ], + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / planAdded value: +{ + "additionalProperties": false, + "description": "The fees assume the Professional selling plan.", + "properties": { + "assumed": { + "const": "professional", + "type": "string" + }, + "individualPerItem": { + "description": "What the Individual plan adds for each item sold, US dollars (official).", + "type": "number" + } + }, + "required": [ + "assumed", + "individualPerItem" + ], + "type": "object" +} - changed
Output schema / properties / referral / properties / rate / descriptionPrevious value: -"The rate used at this price."New value: +"The rate at this price. For a category that charges each rate on its own slice of the price, above its line: the top slice's rate (working shows the slices)." - added
Output schema / properties / referral / properties / workingAdded value: +{ + "description": "How the fee is worked out, in words a person can redo: \"15.0% × $29.99\", or \"15% on the first $100.00 + 8% on the other $400.00\".", + "type": "string" +} - changed
Output schema / properties / referral / requiredPrevious value: -[ - "fee", - "rate", - "chargedOn", - "minimumApplied", - "exactness", - "verified", - "otherReading", - "note" -]New value: +[ + "fee", + "rate", + "working", + "chargedOn", + "minimumApplied", + "exactness", + "verified", + "otherReading", + "note" +] - changed
Output schema / requiredPrevious value: -[ - "platform", - "price", - "shippingCharged", - "category", - "fulfillment", - "referral", - "closingFee", - "fba", - "totalFees", - "afterFees", - "priceLines", - "text", - "assumptions", - "rates" -]New value: +[ + "platform", + "price", + "shippingCharged", + "category", + "fulfillment", + "referral", + "closingFee", + "fba", + "totalFees", + "afterFees", + "afterFeesInPeak", + "plan", + "priceLines", + "text", + "assumptions", + "rates" +]
- Changed
sellerprofit_shopify_plan_fit3 fields changed- added
Output schema / properties / assumedNoPremiumAdded value: +{ + "description": "True when premiumCardShare was left out and some sales go through Shopify Payments: none were counted as premium cards. Tell the seller, and ask for their share.", + "type": "boolean" +} - added
Output schema / properties / sameAsCheapestAdded value: +{ + "description": "Other plans that cost the same as the cheapest to the cent, on the current billing (empty when none do).", + "items": { + "enum": [ + "basic", + "grow", + "advanced" + ], + "type": "string" + }, + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "platform", - "monthlyCardSales", - "currentPlan", - "billing", - "processor", - "shopifyPaymentsShare", - "shareIsDefault", - "plans", - "cheapest", - "cheapestAnyBilling", - "breakEvens", - "yearlyBilling", - "text", - "rates" -]New value: +[ + "platform", + "monthlyCardSales", + "currentPlan", + "billing", + "processor", + "shopifyPaymentsShare", + "shareIsDefault", + "assumedNoPremium", + "plans", + "cheapest", + "sameAsCheapest", + "cheapestAnyBilling", + "breakEvens", + "yearlyBilling", + "text", + "rates" +]
9 tool updates
- First observed
sellerprofit_ads_breakeven - First observed
sellerprofit_amazon_fees - First observed
sellerprofit_checkup - First observed
sellerprofit_etsy_fees - First observed
sellerprofit_offsite_ads - First observed
sellerprofit_price_for_margin - First observed
sellerprofit_rates - First observed
sellerprofit_shipping_gap - First observed
sellerprofit_shopify_plan_fit
Related MCP Connectors
Hosted Etsy, eBay and Amazon FBA/FBM fee, profit, margin and target-price tools. Pay per result.
Exact US seller fees, payout and profit for eBay, Poshmark, Mercari, Etsy, Amazon and 7 more.
Landed cost, fees & profit calculators for cross-border Amazon, TikTok Shop and Shopify sellers.
True net profit and breakeven price for eBay, Etsy, Poshmark, Mercari, Depop, Whatnot, TikTok Shop.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceItemises marketplace fees, shipping, and item costs to work out true net profit, margin, and ROI for sales on eBay, Etsy, Poshmark, Mercari, Depop, Whatnot, and TikTok Shop. It also ranks the same item across all seven platforms and finds the lowest list price that still hits a target profit, with dated fee schedules and custom fee overrides.MIT
- AlicenseAqualityAmaintenanceEnables AI agents to compute exact Etsy, eBay and Amazon FBA/FBM seller fees, profit, margin, break-even and target prices from current marketplace fee tables, plus free category and region lookups and 3-way marketplace comparisons. Every result returns an itemized fee breakdown, assumptions, fee-table version and links to official sources and matching calculators, so price and margin questions can be answered deterministically without scraping or API keys.13MIT
- AlicenseBqualityCmaintenanceEnables AI agents to calculate Etsy, eBay, and Stripe fees, compare platform fees, and analyze profit margins through MCP tools.141MIT
- AlicenseBqualityCmaintenanceEnables users to calculate seller fees, net payouts, and break-even prices across Gumroad, Stripe, PayPal, and Etsy, and compare platforms for a given sale price.5161 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.