Skip to main content

Amazon

📄️Remove Single Discard

Remove a single discard record. The parent shipment's `qty_discarded` counter is decremented by the deleted row's quantity (backward-compat column kept in sync with the new `amazon_fba_removal_shipment_discards` audit table). Returns 404 if the discard does not belong to the supplied integration instance. After deletion, the removal order's receipt_status is recomputed (e.g. an order that was `fully_discarded` may transition back to `pending` if there are no other discards or receipts).

📄️Preview Undo All Receipts Impact

Read-only preview of the allocation-demotion impact of undoing all receipts for this removal order. Because undoing them removes the stock they added, this behaves like a manual negative adjustment and returns one row per affected product: how much of the removed quantity is unallocated vs soft-allocated vs hard-allocated, plus every sales-order allocation and fulfillment (printed shipping label) the removal would disturb. Use it to decide which fulfillments to authorize voiding via `void_confirmations` on the undo-all-receipts call. Nothing is mutated.

📄️Preview Bulk Remove Receipts Impact

Read-only preview of the allocation-demotion impact of removing a batch of receipts by ID. Post the same `receipt_ids` you would send to the bulk remove-receipts call and it returns one row per affected product: how much of the removed quantity is unallocated vs soft-allocated vs hard-allocated, plus every sales-order allocation and fulfillment (printed shipping label) the removal would disturb. Use it to decide which fulfillments to authorize voiding via `void_confirmations` on the bulk remove-receipts call. Nothing is mutated. A removal that only re-adds free stock returns an empty `data` array.

📄️Preview Removal Receipt Remove Impact

Read-only preview of the allocation-demotion impact of removing this removal shipment's receipt. Because removing the receipt removes the sellable stock it added back, this behaves like a negative adjustment and returns one row per affected product: how much of the removed quantity is unallocated vs soft-allocated vs hard-allocated, plus every sales-order allocation and fulfillment (printed shipping label) the removal would disturb. Use it to decide which fulfillments to authorize voiding via `void_confirmations` on the remove-receipt call. Nothing is mutated. A removal that only re-adds free stock returns an empty `data` array.

📄️Generate Content Update Previews

Start generating content update previews ('Adjust shipment') for a shipped shipment via the async SP-API `generateShipmentContentUpdatePreviews` operation — used to correct box contents / item quantities after the fact. Dispatches the tracked job **'Generate FBA Content Update Previews: {plan name}'** and returns its `tracked_job_log_id` for the tracked job log endpoints; once the job completes, fetch the previews via **List Content Update Previews** and apply one via **Confirm Content Update Preview**.

📄️Submit Verification

Finalize the verification: plan moves to `verified` (or `verified_with_adjustments` when any line was verified short). Fails with 400 `cant_submit_verification_unless_all_items_verified` while any line is unverified. Fails with 409 `verification_closed` when the plan is already submitted to Amazon, finalized or cancelled; the plan keeps its status. No bearer token — access is granted by the encrypted `hashedDraftInboundPlanId` in the URL (single plan scope). Generated from the plan's `portal_access_hash`.

📄️Submit Verification (Batch)

Submit the whole verification in one call: send one entry per product with the quantity the supplier can fulfill, and the plan is finalized immediately. Each product's quantity is distributed across that product's lines (each line capped at its requested quantity). The plan moves to `verified`, or `verified_with_adjustments` when any product was verified short. Fails with 400 `cant_submit_verification_unless_all_items_verified` if any product on the plan is omitted (every product must be included). Fails with 409 `verification_closed` when the plan is already submitted to Amazon, finalized or cancelled; the plan keeps its status and no quantity is saved. Each item requires a `product_id` and a non-negative integer `verified_quantity`. No bearer token — access is granted by the encrypted `hashedDraftInboundPlanId` in the URL (single plan scope).

📄️Download Prep & Pack Sheet CSV

Download the fulfillment prep & pack sheet as a CSV file, to hand to a 3PL or supplier that won't use the fulfilment portal (e.g. for upload into their own system). The CSV contains a Unit Mix section (SKU, product, MSKU, FNSKU, UPC, quantity, unit weight, unit dimensions, who labels, who preps), a Prep Requirements section (SKU, MSKU, FNSKU, quantity, required prep per Amazon, additional prep from the product's FBA Prep Instructions, who preps, who labels) and, once box contents have been submitted, a Box Contents section (box number, SKU, quantity) matching the box-import template so it round-trips. The Unit Mix section always leads the file, so systems that import it are unaffected by the sections after it.

📄️Preview 3PL Email

Preview the 'Email the 3PL' compose dialog: substitutes the email tokens in the supplied subject/body server-side and returns the rendered result (no email is sent). Available tokens: `{{reference}}`, `{{portal_link}}`, `{{instructions}}`, plus the per-shipment `{{shipment_id}}`, `{{ship_to}}`, `{{ship_from}}`, `{{carrier}}`, `{{method}}`, `{{notes}}` and `{{attachments_list}}` — resolved against the first confirmed shipment for the preview; the shipping-details send re-resolves them per shipment. Body: `subject` (required, max 255), `body` (required HTML string), `cc` (optional array of email addresses).

📄️Send 3PL Email

Send the operator-composed 'Email the 3PL' portal invitation: resolves the 3PL/supplier recipient, substitutes the email tokens — `{{reference}}`, `{{portal_link}}`, `{{instructions}}`, and the per-shipment `{{shipment_id}}`, `{{ship_to}}`, `{{ship_from}}`, `{{carrier}}`, `{{method}}`, `{{notes}}` and `{{attachments_list}}`, attaches the selected documents and delivers the mail (CC honoured), then marks the initial-stage documents and the packet Sent. The recipient check runs immediately (422 when none is configured); the send itself runs in the background because building the attachments can take a while. The response returns the fulfillment packet as it stood when the send was queued, plus `tracked_job_log_id` for following the background job; fetch the packet again once the job completes to see the Sent status.

📄️Get Portal Payload (3PL Portal)

Anonymous 3PL/supplier fulfillment portal entry point. Access is granted by the opaque `:token` in the URL (the packet's `portal_token`) — no bearer auth (`tenant.public-portal` middleware). Returns the full portal payload the 3PL sees: shipment reference + FBA id, source, the destination fulfillment center (`destination_fc`) and its **full destination address** (`destination_address`, Amazon SP-API camelCase keys — null until Amazon assigns placement), shipping mode / LTL flags, condition-aware `instructions` (markdown, rendered inline by the portal), downloadable `documents`, the product catalogue for the box-contents packing station (`products`), the tenant's saved carton presets (`carton_templates`), any existing `box_contents_submission` / `pallets_submission`, and the confirm gating (`can_confirm`, `confirm_blocked_reason`).

📄️Get Inbound Discrepancy KPIs

Headline figures for the inbound discrepancy report: total declared shortage value and count, the value still short today recomputed from live receipts, the stale portion (declared but since received - reversible by retraction), and Amazon inbound-category reimbursements over the same window. `reimbursed_value` counts only reimbursements paid in your base currency, because the other figures are your own cost in that currency; reimbursements in any other currency are listed per currency in `reimbursed_other_currencies` and never added to it. Requires a Personal Access Token.

📄️Detect Reimbursement Cases

Re-runs the reimbursement discrepancy detectors and the case reconciler across all Amazon integration instances (or the subset given in `integration_instance_ids`). Works entirely from data already synced into SKU.io (inventory ledger events, customer returns, ingested reimbursement rows, etc.) — it does not call Amazon. Newly detected discrepancies create cases in `potential` status; existing open cases are matched against reimbursements Amazon has already paid.

📄️Get Reimbursement Case Shipment Filing

How to file an inbound-shortage case with Amazon. Amazon researches a shipment's missing units in one request from the shipment's Contents page, so this returns every open short-SKU case of the case's FBA shipment as Amazon lists them (units expected, located, missing), the supplier's original invoice PDFs that prove ownership (and the SKUs each covers), and the SKUs still missing an invoice (`missing_invoices`: `case_id`, `sku` and the `proof_of_ownership` fields, so the invoice can be uploaded against that case), and a factual research note for Amazon's 'Additional information' box, cut to fit its 2,000-character limit (`note_limit`).

📄️Get Recovery Settings

Returns the Amazon Recovery settings for one Amazon integration: which reimbursement categories are checked for new opportunities, the minimum opportunity amount, the default assignee, the weekly digest opt-in, how long FBA losses and ledger discrepancies settle before they count as real, and whether reimbursed-unit COGS is posted. Settings that were never saved fall back to defaults: every category enabled, no minimum, no default assignee, digest off, a 30-day settle window, reimbursed-unit COGS off.

📄️Get FBA Loss Event

Gets one FBA loss event with its timeline: every linked inventory-ledger row, reimbursement, reversal, found unit and settlement line, oldest first. Each timeline entry has `role` (loss, found, replacement, reimbursement, reversal, settlement), `method` (ledger, heuristic, reversal, order, manual), the linked quantity/amount, `unit_cost` (the cost the loss consumed per unit), and `record` — the key fields of the linked record (for a settlement line this includes its own `currency`). Records you removed from the event are not shown.

📄️List FBA Reimbursement Reconciliation Exceptions

Lists the exceptions from reconciling three sources against each other: settlement cash, the FBA reimbursements report and the FBA inventory ledger. Only material mismatches old enough that Amazon has had a fair chance to close them are raised; a loss within a week of its claim deadline is raised whatever its age. Exceptions are re-detected daily and resolve themselves when the missing payment, stock or settlement arrives. Returns the standard Laravel paginator.

📄️Bulk Update COGS

Bulk-set the same COGS value on multiple FIFO layers. Validation (BulkUpdateFifoLayerCogsData): layer_ids required array min:1; layer_ids.* required integer exists:amazon_fifo_layers,id; cogs required numeric min:0. Additionally, all selected layers MUST belong to the same product or a 422 is returned. If any selected layer is dated on or before the accounting lock date, nothing is changed and a 422 is returned naming the layer date and the lock date; move the lock date back to correct a locked period. Returns the updated_count and a success message.

📄️Get FBA Shipment Record (Per Instance)

Get a single Amazon-fulfilled shipment report row by ID. Rows are imported from the Amazon fulfilled shipments report and describe one shipped order item: Amazon order/item identifiers, purchase, payment, shipment and reporting timestamps (UTC ISO 8601), buyer and recipient details, ship-to and bill-to addresses, item/shipping/gift-wrap prices and taxes, promotion discounts, carrier and tracking number, fulfillment center, fulfillment channel and sales channel.

📄️Get Restock Report Row (Per Instance)

Get a single row of the Amazon restock inventory recommendations report by ID. Each row is one FNSKU/marketplace combination with Amazon's replenishment guidance: identification (fnsku, merchant_sku, asin, product_name, condition, country), pricing and sales velocity (price, sales_last_30_days, units_sold_last_30_days), current inventory position (total_units, inbound, available, fc_transfer, fc_processing, customer_order, unfulfillable, working, shipped, receiving), days of supply, alerts, and Amazon's recommended_replenishment_qty and recommended_ship_date (Y-m-d).

📄️Create Next Report Request

Create the next pending report request for a report type on this integration instance. Computes the next data window — from the last synced data point up to the newest safe end time (Amazon report data is delayed by up to 72 hours depending on report type) — and stores a report request row without calling Amazon yet. Submit it with the Create Report from Request endpoint. If an identical pending request already exists it is returned instead of creating a duplicate. Report types with long windows are split into multiple requests; the first created request is returned.

📄️Export Ledgers

Export Amazon inventory ledgers as a CSV (all report columns, plus two reconciliation-only columns the table does not show: 'FIFO Layer Date' and 'Effective At' — the instants the Inventory Value Change report windows rows by; arrivals by their layer's date, consumptions by their effective instant, and a consumption only counts when its consumed layer's date falls on or before the window end. Use them to re-window an export onto the report's valuation basis instead of the ledger's calendar date). Small exports return a ready download_url immediately. Large exports run as a background job and return a tracked_job_log_id — poll the job status, then download the finished file via its download link. Use scope=selected with ids to export specific rows. Requires a Bearer token. COGS / Extended COGS restate the accounting atom the Inventory Valuation / Value Change reports book: whole cents per row at the FIFO layer's live unit cost (an arrival is ROUND(layer quantity x layer cost, 2); a consumption sums ROUND(row quantity x its layer's cost, 2) per consumption row), so a re-windowed export ties to the reports rather than to the stored four-decimal snapshot product. A final 'Row Source' column distinguishes real Amazon ledger rows from DERIVED subledger rows: when the export's date filter pins a full window (between/is on `date`), the file also carries the recognitions the valuation reports count that have no Amazon ledger row — summary true-ups, initial-inventory layers, unlinked consumptions, and closure-rounding flushes (IDs prefixed L-/C-/F-) — so a filtered export sums to the reports' change without leaving the file.

📄️List FBA Shipments Detail (paginated, across instances)

Paginated list of FBA shipments-detail rows aggregated across Amazon integration instances. Each row represents one shipped item line from the GET_AMAZON_FULFILLED_SHIPMENTS_DATA_GENERAL report. Filtering uses Spatie QueryBuilder with AdvancedSearchFilter (search across order/shipment/product/tracking/recipient fields) plus ~25 text filters, ~9 numeric filters, and ~8 datetime filters. Response includes linked_sales_order (bulk-resolved via amazon_order_id → amazon_orders → sales_orders join) and amazon_product (bulk-resolved by integration_instance_id + seller_sku). Default sort: -shipment_date.

📄️List Shipments

Returns a paginated `LengthAwarePaginator` of new (v2) FBA inbound shipments across one or more Amazon integration instances. Each item is transformed by Amazon new FBA inbound shipment object and includes identifier fields (`shipmentId`, `shipmentConfirmationId`, `amazonReferenceId`, `name`, `sourceName`), status info (`status`, `pending_status`, `errorLog`, `is_archived`), destination block (`destinationCountry`, `destinationWarehouse`, `destinationType`, `destination`), transportation IDs, the `sku_link` block (linked Purchase Order or Warehouse Transfer), `actual_source` (resolved supplier/from-warehouse derived from the SKU link), and `ship_from_mapping` (the mapping that *would* be applied today — used to surface divergence client-side). When the relevant relations are eager-loaded the resource also returns `pending_inbound`, `receipts`, and `items`. Defaults to excluding archived shipments unless `filter[archived]` is provided.

📄️Export AWD Ledgers

Streams the AWD ledger list as a CSV file (capped at 100,000 rows). Accepts the same filters as the paginated list, so a filtered export restates exactly what the table shows. Columns: ID, Integration, Date, Event Type, FNSKU, MSKU, Product SKU, Reference ID, Fulfillment Center, Disposition, Quantity, Reconciled Quantity, Reconciled At, COGS (per-unit, from the FIFO subledger), Extended COGS (signed by the event direction — negative for departures), FIFO Layer Date, Effective At, Linked Warehouse Transfer, Linked Sales Order, Created At.

📄️Export MCF Fulfillment Orders

Downloads MCF orders as XLSX or CSV. Accepts every list filter. Content modes: summary (one row per order), items (one row per order item, with the resolved product SKU), shipments (one row per shipment package with carrier and tracking). Scope: all (ignores filters), filtered (default), current_page (honours page/per_page), selected (requires ids). columns restricts the summary columns to the given keys. Datetimes are converted to the application's timezone so the sheet matches the UI. Capped at 50,000 rows — a larger set is truncated and the filename is suffixed -truncated-50000. Returns 422 when nothing matches.

📄️Get MCF Order Match Suggestions

Ranked candidate sales orders for one MCF order, scored 0–100 from the signals available: order number match (55), fulfillment reference match (45), tracking match (30), all items on the order with quantities that fit (20), partial item match (8), postcode (10), city (5), order date within 7 days (5); penalties for an already-fulfilled order (−25) and an FNSKU not mapped to a product (−20). Tiers: high (≥90 with no blockers), suggested (60–89, or any candidate that carries a blocker), weak (<60). blockers lists exactly why mapping would be rejected, so a candidate that cannot be linked is never presented as high. line_preview compares each MCF item's quantity with the order's total for that product. Empty for orders that are already mapped or not mappable. The top-level blockers array lists order-level reasons nothing can match (e.g. an FNSKU not mapped to a product, a missing destination address) — shown when the candidate list is empty.

📄️Create Sales Order from MCF Order

Creates a sales order from the MCF order — one line per Amazon item resolved to its product, the ship-to from the Amazon destination address, prices from the Amazon per-unit values (0 when absent), tagged mcf-created — and maps the MCF order to it in one transaction. sales_channel_id null creates a manual order. create_customer mints customer and address records instead of inline columns only. order_status is one of draft, reserved, open, closed (default open); payment_status is one of unpaid, partially_paid, paid, refunded, partially_refunded, and defaults to paid when every item carries a price, else unpaid. Idempotent: if a sales order already exists for this MCF order the request maps to it and reports already_existed. When the Amazon display order number is already in use, the seller fulfillment order ID is used instead and number_fallback is true. Returns 422 when an item's FNSKU is not mapped to a product, and 409 when the order was mapped concurrently. Requires both the sales_orders.create and sales_orders.fulfill permissions.

📄️Bulk Map MCF Orders to Sales Orders

Maps each unmapped order to its top suggested sales order when that suggestion is high-confidence (score ≥ min_confidence, default 90) and carries no blockers; orders without such a match are skipped with a reason. Historical orders are skipped unless include_historical is true. Requires sales_orders.fulfill. Scope is either ids (1–1000 order IDs) or apply_to_all: true with filters (the list filters as a flat map, e.g. {'mapping_status': 'unmapped'}), resolved when the job runs and capped at 5,000 orders — a larger set is rejected with 422 stating the matched count. Each order is processed independently; the job's results report succeeded_count, skipped_count, failed_count, has_failures, and per-order failures[]/skipped[] with a reason. Returns tracked_job_log_id.

📄️Bulk Unmap MCF Orders

Clears pending links; orders with a recorded shipment are skipped with the refusal reason, never reversed. Requires sales_orders.fulfill. Scope is either ids (1–1000 order IDs) or apply_to_all: true with filters (the list filters as a flat map, e.g. {'mapping_status': 'unmapped'}), resolved when the job runs and capped at 5,000 orders — a larger set is rejected with 422 stating the matched count. Each order is processed independently; the job's results report succeeded_count, skipped_count, failed_count, has_failures, and per-order failures[]/skipped[] with a reason. Returns tracked_job_log_id.

📄️Bulk Delete MCF Orders

Soft-deletes the orders. Requires integrations.update. Scope is either ids (1–1000 order IDs) or apply_to_all: true with filters (the list filters as a flat map, e.g. {'mapping_status': 'unmapped'}), resolved when the job runs and capped at 5,000 orders — a larger set is rejected with 422 stating the matched count. Each order is processed independently; the job's results report succeeded_count, skipped_count, failed_count, has_failures, and per-order failures[]/skipped[] with a reason. Returns tracked_job_log_id.

📄️Bulk Restore MCF Orders

Restores soft-deleted orders. Requires integrations.update. Scope is either ids (1–1000 order IDs) or apply_to_all: true with filters (the list filters as a flat map, e.g. {'mapping_status': 'unmapped'}), resolved when the job runs and capped at 5,000 orders — a larger set is rejected with 422 stating the matched count. Each order is processed independently; the job's results report succeeded_count, skipped_count, failed_count, has_failures, and per-order failures[]/skipped[] with a reason. Returns tracked_job_log_id.

📄️Bulk Archive MCF Orders

Archives the orders with a reason — archive_reason (required): pre_adoption, no_sales_order, duplicate, other; archive_note optional. Already-archived or mapped orders are skipped. Requires integrations.update. Scope is either ids (1–1000 order IDs) or apply_to_all: true with filters (the list filters as a flat map, e.g. {'mapping_status': 'unmapped'}), resolved when the job runs and capped at 5,000 orders — a larger set is rejected with 422 stating the matched count. Each order is processed independently; the job's results report succeeded_count, skipped_count, failed_count, has_failures, and per-order failures[]/skipped[] with a reason. Returns tracked_job_log_id.

📄️Bulk Unarchive MCF Orders

Returns archived orders to the active lifecycle. Requires integrations.update. Scope is either ids (1–1000 order IDs) or apply_to_all: true with filters (the list filters as a flat map, e.g. {'mapping_status': 'unmapped'}), resolved when the job runs and capped at 5,000 orders — a larger set is rejected with 422 stating the matched count. Each order is processed independently; the job's results report succeeded_count, skipped_count, failed_count, has_failures, and per-order failures[]/skipped[] with a reason. Returns tracked_job_log_id.

📄️Bulk Re-sync MCF Orders from Amazon

Refreshes each order from the Amazon Selling Partner API, one call per order. Requires integrations.sync. Scope is either ids (1–1000 order IDs) or apply_to_all: true with filters (the list filters as a flat map, e.g. {'mapping_status': 'unmapped'}), resolved when the job runs and capped at 5,000 orders — a larger set is rejected with 422 stating the matched count. Each order is processed independently; the job's results report succeeded_count, skipped_count, failed_count, has_failures, and per-order failures[]/skipped[] with a reason. Returns tracked_job_log_id.

📄️Bulk Create Sales Orders from MCF Orders

Creates and maps a sales order for each order, with the same options and rules as the single-order endpoint: sales_channel_id must be an existing sales channel (null for a manual order), order_status is one of draft, reserved, open, closed, and payment_status is one of unpaid, partially_paid, paid, refunded, partially_refunded (null derives it from the item prices). Orders that already have a sales order are mapped to it and counted in already_existed_ids. Requires both the sales_orders.create and sales_orders.fulfill permissions. Scope is either ids (1–1000 order IDs) or apply_to_all: true with filters (the list filters as a flat map, e.g. {'mapping_status': 'unmapped'}), resolved when the job runs and capped at 5,000 orders — a larger set is rejected with 422 stating the matched count. Each order is processed independently; the job's results report succeeded_count, skipped_count, failed_count, has_failures, and per-order failures[]/skipped[] with a reason. Returns tracked_job_log_id.

📄️Request Latest Storage Fee Report (Sync)

Request the FBA storage fee report (GET_FBA_STORAGE_FEE_CHARGES_DATA) from Amazon, backfilling from the instance's FBA inventory tracking start month forward. Per instance, only the next contiguous block of charge months with NO data yet is requested (a single report covers a multi-month window), so months already imported are never re-requested. When every month through the last completed month is already present, no report is requested and the response carries requested=false.

📄️Request Latest Aged Inventory Surcharge Report (Sync)

Request the FBA aged inventory surcharge / long-term storage fee report (GET_FBA_FULFILLMENT_LONGTERM_STORAGE_FEE_CHARGES_DATA) from Amazon, backfilling from the instance's FBA inventory tracking start month forward. Per instance, only the next contiguous block of charge months with NO data yet is requested (a single report covers a multi-month window), so months already imported are never re-requested. When every month through the last completed month is already present, no report is requested and the response carries requested=false.

📄️List Notification Events (audit log, paginated)

Paginated debug/audit log of delivered SP-API notification events across all Amazon instances, newest first. Read-only — lets support staff inspect exactly what Amazon delivered and how each event was processed (pending/processing/processed/failed, plus the raw payload and any error) when reconciling a missed or mis-handled notification. Filter by notification_type, processing_status, integration_instance_ids, or a free-text search over notification_id/error.