Skip to content

10 Things That Break When You Put Your Agent on AWS Marketplace

A one-page field guide for technical leaders shipping AI agents to production

Handout for: The Technical Leaders' GenAI & AI Agent Playbook — AWS DFW11, June 23, 2026 Author: Ron Davis · ex-AWS (8 yrs, partner side · May 2018–June 2026) · now building vell.ai Source of truth: derived from real BatchMeterUsage failures and Q1 2026 AWS Partner Assist data (295 prompts, 112 partners).


Why this exists

In Q1 2026, AWS's own Virtual Partner Assistant fielded 295 prompts from 112 named partners asking about SaaS metering, contract-vs-subscription confusion, and integration testing. The names include 1NCE, Infoblox, Synamedia, BMC, Mimecast, NetApp, and IBM. Every one of those prompts maps to one of the ten errors below.

If you're shipping an agent through AWS Marketplace, these are the failures waiting for you between your POC and your first metered invoice. Each row is the AWS exception class, what actually went wrong, and the first move that resolves it. Print this. Tape it next to your meter-usage cron.


The 10 errors that break agent listings on AWS Marketplace

# AWS Exception What actually broke First move
1 InvalidCustomerIdentifierException The customer_identifier doesn't match any subscribed customer for your product code — usually they unsubscribed, or the ID was copied from another listing. Check the Entitlements page first. If unsubscribed, write the batch off — don't retry.
2 DuplicateRequestException AWS already recorded this customer/product/dimension/timestamp. Metering is idempotent on those four fields. Safe to ignore. Add withoutOverlapping() to your meter cron. Never "fix" by changing the timestamp — that creates a real double-bill.
3 TimestampOutOfBoundsException Your record is outside the 6-hour acceptance window. Either backlog aged out or the host clock drifted. date -u against NTP. Aged-out records can't be billed — fix the metering delay before retrying anything.
4 InvalidUsageDimensionException The dimension name in your code doesn't exactly match a dimension on your listing. Case-sensitive, typo-sensitive. (This is the #1 partner pain point in AWS's Q1 data.) Compare your listing dimensions to your code constants. Pick one as authoritative; reconcile the other.
5 InvalidProductCodeException The product_code doesn't belong to your AWS seller account — usually copied from a different listing, or the product moved accounts. Check the authoritative product code in AWS Marketplace Management Portal. Update DB, retry only if subscription is still valid.
6 InvalidEndpointRegionException You called the Metering Service from somewhere other than us-east-1. It's the only region it exists in. Pin the metering client to us-east-1 explicitly. Do NOT change AWS_DEFAULT_REGION globally.
7 ThrottlingException You're submitting BatchMeterUsage too fast — usually a backfill or parallel workers. Exponential backoff + serialize workers + cap the cron to hourly. AWS recommends ≤1×/hr.
8 InternalServiceErrorException AWS itself blipped. Not your data. Retry. Don't modify the batch. Check the AWS Service Health Dashboard if persistent.
9 ExpiredTokenException Your assumed-role session expired mid-call (default 1h). Re-assume closer to the metering call, or raise DurationSeconds. The data is fine.
10 AccessDeniedException IAM principal lacks aws-marketplace:BatchMeterUsage. Often missed when policies are written from the AWS Marketplace docs without the explicit metering action. Add the action. Allow resource arn:aws:aws-marketplace:*:*:product/*. Check for SCPs and permission boundaries.

Pocket reference: SaaS Contract vs. SaaS Subscription

The single most expensive mistake we see: calling the wrong API for your model. Each dimension on a listing uses one model — not both.

SaaS Contract SaaS Subscription
Buyer commitment 1–3 year term, upfront or installments Pay-as-you-go, no commitment
API to verify access GetEntitlements (entitlement implicit)
API to report usage (none — dimensions are entitled) BatchMeterUsage
Dimensions are… Entitled Metered
Classic mistake Forgetting to call GetEntitlements before granting access → buyer uses expired contract Calling BatchMeterUsage against a contract dimension → InvalidUsageDimensionException

If your agent has both upfront-license customers and pay-as-you-go customers, you almost certainly need one dimension of each type — and your code must branch on the dimension's model, not the customer.


Two things AWS won't tell you out loud

  1. Sandbox product codes don't carry over to production. Your integration testing on a dev product is genuinely useful for shape — but the moment you flip to your real listing's product code, every dimension name and customer ID is a fresh surface that can fail differently. Plan one shadow week of production traffic with throwaway-able dimensions before you announce GA.

  2. Idempotency rounds aggressively. BatchMeterUsage keys on (customer, product, dimension, timestamp). Two cron invocations 30 seconds apart that round to the same minute are one recorded usage. Your local DB will show two batches accepted; AWS sees one. Reconcile against AWS, not against your own logs.


If one of these is biting you right now

Send the exception message + your dimension/product setup to ron@vell.ai with subject line "DFW handout — error #N". I'll send back a one-page diagnostic and the exact next step within 24 hours. Free, no follow-up cadence, no deck.

If you want to see how we surface these errors automatically for partners running their own SaaS listings, the Metered Billing Console at vell.ai is the place to look — but the handout above stands alone, and that's the point.


Built at Vellocity. We dog-food the AWS partner motion we sell — every line above came from our own production metering pipeline before it became a catalog entry. — Ron