Profit per SKU across channels: add AI media cost from Sume

Amazon lists cross-channel profitability as upcoming. Add what your product images and clips cost per SKU by reading Sume's usage ledger by job id.

5 min readSume
All posts

To put the cost of AI product images and clips into a per-SKU profit number, tag every Sume job with your SKU in its metadata, then read the usage ledger by job_id and use the debited_usd_micros figure from the summary. That is the amount the wallet actually deducted, so it can sit in the same spreadsheet as fees and ad spend.

Amazon's multichannel page lists cross-channel profitability analytics, plus ad spend and traffic data, as upcoming features for Seller Central (read 2026-10-04). Media generation will not be in that number, because Amazon does not know what you spent elsewhere.

What does Amazon's profitability view cover?

Only what the page states. Treat anything else as your own bookkeeping.

Amazon multichannel feature status, as stated on Amazon's page, read 2026-10-04
FeatureStatus on the page
Connect eBay, Shopify, TikTok and Walmart accountsAvailable now
Import and link off-Amazon listingsAvailable now
Cross-channel profitability analyticsUpcoming
Real-time ad spend and traffic dataUpcoming
Cost to sellersNo additional cost

How do you tie a Sume job to a SKU?

Generation requests accept a metadata object that Sume stores on the job; it is not sent to the provider. Put your SKU in it. Send an Idempotency-Key derived from the SKU and the asset name too, so a retry returns the same job instead of making a second charge.

Keep your own table of SKU, job id and idempotency key. The ledger is keyed by job id, so that table is the join.

How do you read the cost of one job?

GET /v1/usage accepts a job_id, run_id or thread_id and adds a summary over every ledger row that scope caused. debited_usd_micros is what the wallet deducted. held_usd_micros are open holds, not spend yet, and refunded_usd_micros are holds given back after a failure. final becomes true once no hold is open, so wait for it before booking the number. The docs say never to sum rows yourself, because a refunded row keeps its hold amount.

import os, requests

H = {"Authorization": "Bearer " + os.environ["SUME_API_KEY"]}
jobs = {"SKU-1001": "JOB_ID_FROM_YOUR_TABLE"}

for sku, job_id in jobs.items():
    r = requests.get(
        "https://api.sume.com/v1/usage",
        headers=H,
        params={"job_id": job_id, "limit": 50},
        timeout=30,
    )
    r.raise_for_status()
    s = r.json()["summary"]
    print(sku, s["debited_usd_micros"] / 1_000_000, "final:", s["final"])

What should you do with the number?

Divide by the channels the media serves. One master image reused on four channels costs the same once, so allocate it across them rather than charging each. Add it next to the per-channel fees and ad spend you already track. Amazon's page says the profitability view is upcoming, so for now this column is yours.

For an account-level check, GET /v1/balance returns the USD-denominated available balance. Use it before a large holiday batch, so a run is not cut short by an empty wallet.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume