Changelog
2026-09-14
Fixed
- Automations skip listing patches that match the latest queued or accepted request. For 40 seconds after Amazon accepts a B2C price change, conflicting offer notifications stay in the audit trail without overwriting readings or triggering another automation run.
- The Any Offer Changed template compares offers within your fulfillment channel and ignores secondary Buy Box winners when you're already winning. Upward moves are capped at 1% of your current landed price per run, including bisection against learned bounds. Bounds survive changes in competitor identity. Existing saved automations keep their code.
2026-09-13
Fixed
- Automations seeded before the
context.mutationsrewrite are re-seeded from their current template. Code that still called the removedlisting.setcould not be activated. - Activating an automation whose code will not run now shows you the reason instead of a generic error page.
2026-09-12
Changed
- The listings page now shows one account at a time, the account in your sidebar, and sellers who list in several marketplaces can narrow it to one. It ranks listings by what Amazon told us and what your automations asked for, so a routine catalog re-read no longer pushes everything to the top.
- Search now matches part of a SKU, part of a title, or an exact ASIN. It used to search the raw catalog JSON, where a word like "item" matched nearly every listing.
list_listingssearches the same way and returns newest first. - A listing's status is now its own field. The catalog crawl and Amazon's status notifications both write it, and the newer write wins.
data.listings_itemis exactly what the Listings Items API last returned.data.notifications.statusesis a copy of that field kept for one more release and then removed.list_listingsand automation contexts keep their shapes.
2026-09-10
Added
- Listings now have their own page in the console, showing what Pulsify has seen and done in the last month. Search reaches the whole catalog. Open a listing for its offer, trailing sales, advertising, the requests your automations made, and its activity.
Changed
- The per-listing
enabledswitch is nowblocked, and it does more. Block a listing and Pulsify stops sending its changes to Amazon: price, quantity, every attribute, and its advertising too. Your automations keep running and their requests are recorded, so you can read what they wanted to do while the listing was blocked. Unblocking never replays them.update_listingandlist_listingscarryblockedinstead ofenabled,patch_listingreports a blocked listing rather than queueing, andquery_datacan readblockedfromv_listings. - Listings that Amazon fulfils no longer start switched off. That default predated automation and blocked most catalogs by accident; blocked now means someone chose it.
Fixed
- The sign-in page retains the session-expired alert when a hovered link prefetches ahead of the click.
2026-09-09
Fixed
- Catalog sync now disconnects sellers whose Amazon refresh token is revoked and discards the failed job, stopping repeated retries.
- Data Kiosk subscriptions use payload version
2023-11-15. Invalid subscription requests stop retrying and retain the error on the stream. - Branded-content subscription
NotFounderrors stay visible on the stream without generating Sentry reports.
2026-09-08
Added
- Ads link to seller listings by account, marketplace, and SKU, and to catalog items by marketplace and ASIN. Links fill in regardless of discovery order. Listings expose ads, ad groups, campaigns, targets, and keywords through native associations. Pausing ads for a listing only affects its linked ads.
Changed
- Listing activity now follows Amazon's
BUYABLEandDISCOVERABLEstatuses. Listings with unknown status stay uninitialised, even with stock. Missing SKUs keep their last readings;list_listingsomitsinferred_inactive. - Listing condition comes from Amazon's listing item. Automation context and
list_listingsexposeconditionType(such asused_very_good) and its derivedconditionfamily.subconditionis removed. Condition stays null until the listing item reports it. - Offer-change events no longer trigger a synchronous pricing call. A
listing's
shippingcomes from your own offer in the event; on a listing you fulfil it stays null until such an offer arrives, and it is zero when Amazon fulfils. - Amazon listing writes now use native JSON patches through
patch_listingor automationcontext.mutations. Flat price, bound, stock and other convenience fields are no longer accepted. Invalid automation requests receive failed audit entries without stopping later valid patches. update_listingand the console edit form now save only the localenabledswitch. Usepatch_listingto change Amazon attributes, including bounds.listing.deletedis nownullin automation context when Amazon has not reported listing status, matchingbuyableanddiscoverable.- Listing reads no longer expose a single
quantity. Automations usecontext.listing.data;list_listingsreturns the same raw source data. Inspect FBA report stock, MFN availability, or the latest notification for the stock measure you need. Amazon's original keys and units are preserved. - SP-API notifications are retained before background processing, including events received before listings are initialized. Each notification appears once, with its associated listings, and failed targets retry independently.
- Listings remain uninitialized until a crawl reports status. Initialization replays the latest retained offer events; old stock/status events cannot overwrite the crawl.
run_automationacceptslisting_idfor real-event replay. Events with multiple listing targets require an explicit choice.
Fixed
- Retained offer replay follows listing activation and changes to condition, catalog item or inventory. Stock-only updates no longer queue replay.
- Partial listing items no longer crash condition reads or retained-event replay checks. Reported conditions remain available even when other item fields are missing or invalid.
- Status notifications can reactivate crawled listings regardless of their previous activity.
- Amazon client credential failures no longer disconnect sellers or erase their refresh tokens. A revoked seller grant still disconnects the seller.
- Collectible and refurbished offer notifications reach their listings and match the full condition token. Indistinguishable SKUs still trigger a refresh without assigning either SKU the other one's price.
- Buy Box status shows Amazon's last reading while price changes are queued. The listing page's update age uses the record timestamp.
2026-09-07
Added
get_product_type_schemareturns Amazon's full attribute schema for a product type, including required fields, allowed values and nested selectors. Defaults to the target account's marketplace and caches each seller's schema for 24 hours.- A public demo at
https://pulsify.dev/mcp/demo. Connect any MCP client with no account and work against Acme Brands, a fictional seller with US and UK accounts and a year of sales and advertising history. Reads are real. Writes are validated exactly as in production and answered with simulated receipts markedsimulated: true, so nothing reaches Amazon. run_automationtakescodeandstream_typeas an alternative toautomation_id, so an agent can dry-run JavaScript against a sample or real event before saving it as an automation.v_listing_mutationsview forquery_dataexposing listing mutation history (sku, marketplaceid, accountid, status, payload, submissionid, submittedat, created_at), session-scoped to authorized selling partners.listing.mutationsin the automation context so handlers can inspect in-flight and recently submitted requests.patch_listingqueues native Amazon patches for any writable listing attribute, with an optionalproduct_type. Each request keeps its ordered patches, submission id and Amazon's response.- A recovery sweep restores missing submission jobs for requests queued over 5 minutes ago, while respecting jobs already waiting or running in Sidekiq.
Changed
- Webhook delivery logs older than 30 days are now pruned nightly, matching the events retention window.
- Automations write changes through
context.mutations.push(...)instead of calling setter methods (context.listing.set,campaign.pause(),campaign.resume()). Listing mutations takepatchesformatted as Amazon JSON Patch operations; ad mutations specifytargetandaction("pause"or"resume"). Pulsify drains the outbox and applies changes after the handler returns. run_automationreturns the queuedmutationsarray from execution and dry runs alongsidemodifiedandactions.- Every Amazon listing write creates a separate queued mutation, including repeated values. Requests are immutable and submitted in order per listing.
- Listing fields hold Amazon's last reading. Agent writes go to the mutation queue; observed values change only when Amazon reports them. Floor and ceiling follow Amazon's crawl readings too.
list_listings,update_listingandpatch_listingexpose all queued mutations and the latest submission, including each request's id, payload, timestamps, acceptance and raw response. Acceptance means Amazon accepted the request for processing. Submitted rows are retained for 30 days.update_listingreportsqueuedfor Amazon writes andsavedfor changes to Pulsify'senabledswitch.- Paused age-based listing pruning while we define retention around queued mutations and submissions awaiting an Amazon reading.
- Latest price, stock, and listing-status notification payloads are retained in listing data alongside crawl and report readings.
- Missing listings carry an
inferred_inactivereason instead of being deleted or assigned zero stock. A fresh reading clears the inference.
Fixed
- Background jobs now retry quota, connection, and Amazon internal errors without their uniqueness lock silently dropping the retry.
- Discord messages reach the right team session: engineering, builds, errors,
and GitHub go to the Engineering Lead; growth goes to the Growth Lead.
bin/launch-teamrecords each role's session when it starts a turn or resumes. - Price updates send only the requested price and Amazon's required selectors. They no longer resend observed bounds or B2B price. Other convenience updates also include only the fields requested.
- Offer notifications update the observed price and Buy Box status even when the price falls outside Amazon's reported bounds. Inverted bounds are labelled as an observation in the audit log.
- Ambiguous offers no longer overwrite another SKU's price or Buy Box status. An exact-SKU refresh reads the listing while its previous values are kept.
- Missing FBA report stock fields remain unknown instead of becoming zero.
2026-09-04
Added
update_listingandcontext.listing.setwrite four more offer fields on listings you fulfil yourself:quantity,handling_time(Amazon'slead_time_to_ship_max_days),restock_dateandshipping_group(the merchant shipping template id).list_listingsandupdate_listingecho them, plusfba, so agents read what they can write.
Changed
- Dropped the
listingscolumns thedatacolumn and the ledger replaced (fba,fc,statuses,report_status,amazon_price,amazon_b2b_price,pending_fields,workflow_state,repriced_at,floor,ceiling,b2b_price,handling_time,restock_date,shipping_group,shipping,buy_box_winner,featured,b2b_buy_box_winner,b2b_featured,buy_box_synced_at,competitive_price_threshold) and thelistings_reportstable, in the same release as the backfills that moved their values. - Pulsify no longer clamps a price into floor and ceiling, refuses a price a hundredfold off Amazon's last reading, or skips a publish on an inactive listing. Floor and ceiling go to Amazon as its minimum and maximum allowed price and Amazon decides. Read the returned values as what you sent.
- A publish carries only the attributes that changed: a price change no longer resends stock, and a stock change never carries handling time it did not ask for. A publish Amazon rejects completes and is recorded rather than retried.
- Listings are discovered by crawling Amazon's listings search every 6
hours instead of through the merchant listings report. Each listing's raw
item lands in a new
datacolumn next to its FBA report rows, statuses are learned for every priced SKU on the first sweep, and a crawl never queues a price publish the way a report price change could. - The listings sweep no longer submits the daily Data Kiosk query; the daily schedule already does.
- Dropped the
asincolumn fromlistings; a listing's ASIN now comes from its catalog item's product.v_listingsandv_seller_economicsreadasinfromproducts, with the same column name and shape as before. The unusedstatusandsuppressedcolumns went with it. - A SKU that changes product (an ASIN merge, a reused SKU) keeps its floor, ceiling, enabled flag and price. Only the catalog item follows the report.
Fixed
v_sales_linesandlist_sales_by_listingkeep a line's title after the listing is pruned or relisted under another ASIN. The title now follows the ASIN sold rather than the SKU's current listing.
2026-09-03
Added
- Connecting a 4th Amazon account on a paid plan asks for consent first and adds a $49/month seat, prorated. Disconnecting the account drops the seat. Trials connect freely and see the price before conversion.
Product(global ASIN) andCatalogItem(marketplace-scoped entity) models extract catalog metadata fromListing, establishing a normalized 3NF parent entity for inventory and advertising models with cascading deletions.get_catalog_itemMCP tool looks up Amazon catalog metadata and raw payload data by ASIN or SKU for connected selling partners and advertisers.v_catalog_itemscurated SQL view inquery_dataexposes catalog items joined with listings for sellers and ads for advertisers.- Real-time
BRANDED_ITEM_CONTENT_CHANGEnotifications record 1 audit event onCatalogItemwhile evaluating automations across all active seller listings. Admodels link toCatalogItemvia a nullable foreign key, resolved from ASIN and advertising profile marketplace during advertiser sync.- Products persist GS1 identifiers from the Amazon catalog:
gtin(GTIN-14, zero-padded) and anidentifiersmap (EAN, UPC, GTIN, ISBN) merged from every marketplace's catalog item.get_catalog_itemandv_catalog_itemsexpose both, so an agent can match ASINs against external catalogs and ERPs without another API call.
Changed
- Automation actions older than 1 year and ads report rows for report dates
older than 100 days are now pruned nightly.
list_automation_actionsreads back a year of history. Daily sales, traffic, and ads metrics are untouched. - Dropped redundant catalog columns (
title,image_url,product_type,details_synced_at) fromlistings.v_listingsandv_sales_linesnow joincatalog_itemsto selecttitle. catalog_itemsstores full SP-API payloads in adataJSONB column instead of discrete columns, populated asynchronously viaSyncCatalogItemDataJob.
Fixed
- The subscription webhook now picks the base plan by lookup key, so a seat item can no longer overwrite the plan name.
2026-09-02
Added
report_bugandsuggest_ideaMCP tools accept structured diagnostic fields (what_happened,expected,tool_name) alongsidetitle.FeedbackReportformats them into structured markdown sections with tool context on GitHub issues and discussions.- The seven session-scoped
query_dataviews (v_sales_lines,v_ad_performance,v_advertised_products,v_listings,v_search_query_performance,v_seller_economics,v_vendor_metrics) expose anaccount_idcolumn so queries across connected accounts can group and filter by account. - MCP tools take an optional
accountargument for users with more than one connected Amazon account.connection_statuslists every account with its id and name. Read tools span every account by default and label each row withaccount_idandaccount_name; passaccountto read one.create_automationandupdate_listingask you to pick an account when more than one is connected. Tools addressed by id, such asrun_automationandupdate_automation, work the account out from the record. One connected account behaves exactly as before. - Automation code can read
context.account(idandname) to tell which connected account it is running for. - TypeScript definitions published in
@lineofflight/pulsify-automationsdeclarecontext.account(idandname) for every stream scope.
Changed
- MCP server instructions mandate showing the user a two-line preview (title,
context, and privacy check) and obtaining confirmation before calling
report_bugorsuggest_idea. query_dataviews cover every connected account by default. Each row is labeled withaccount_id, or passaccountto scope the query to one.- Trial and internal users can now connect more than 3 Amazon accounts while paid and inactive users remain capped at the 3 accounts included in the plan.
Fixed
- MCP tool calls that span multiple accounts (where no single account was specified) now appear in the activity timeline for all of the user's accounts.
- A listing's advertising card, and its ads, campaigns, and spend, now come from the account the listing belongs to. With more than one connected account advertising the same ASIN in the same marketplace, the card mixed in the first account's campaigns and showed spend in its currency.
2026-09-01
Added
- Dedicated Overview console landing page at
/overview(root_path). Displays greeting, agent onboarding and connection status, stream activity throughput, and Amazon integration health in one place, leaving/activityas a focused audit log. query_dataMCP tool now supports CSV URL pointer exports. Result sets over 500 rows (or queries withexport: true) stream to a downloadable compressed CSV URL with column definitions and a 5-row preview, preserving context windows for agent analysis.
Changed
- The
query_dataMCP tool result limit increased from 500 to 1,000 rows.
Fixed
- Pin
redisgem to~> 5.4to fix Action Cable Redis subscription adapter activation errors after upstream dependency bump. - Webhooks in Settings now persist custom headers submitted through the form. The header editor previously submitted serialized JSON that was dropped by parameter filtering.
- Removing a passkey from Settings now displays the confirmation toast. The button previously remained scoped inside the content frame.
- Frame-missing navigation events now reliably perform a full page visit across all un-framed responses.
2026-08-31
Added
- Amazon vendors can connect through Vendor Central. Settings now offers Seller Central and Vendor Central as separate choices, and an account takes one or the other, never both. Vendor data surfaces land next.
- Vendor accounts now sync Amazon's vendor analytics: ordered and shipped
revenue, glance views, costs, sell-through, and open purchase order units,
across every store the vendor operates in. Ask your agent for it, or query
v_vendor_metricsdirectly. Figures lag two days, which is when Amazon publishes them. - The automation reference templates are now public. Every default handler, its
sample event payload, and a reference page describing the context it receives
live at
github.com/lineofflight/pulsify,
with TypeScript definitions on npm as
@lineofflight/pulsify-automations. Your agent can read the shape ofhandle(event, context)before you connect an account. query_datacan read seller economics. Av_seller_economicsview exposes per-SKU referral, fulfillment and storage fees, net product sales and net proceeds by day, so an agent can ask which SKUs actually make money rather than which ones sell. Fees are signed, so net product sales plus total fees is net proceeds, and the three named fees plusother_feesalways add up to the total.- Seller economics history is backfilled, not just collected going forward. Connecting an account now seeds two years of per-SKU fees, net product sales and net proceeds alongside the sales and traffic history, so margin questions have something to answer from on day one instead of after a month of waiting.
Changed
- Vendor accounts no longer see seller-only surfaces. The MCP catalog drops the
listings and seller sales tools for a vendor,
connection_statusreports whether an account is a seller or a vendor, and Streams lists only what a vendor can actually automate. A vendor could previously create an automation on a seller event, activate it, and never learn that it would not fire. - Webhooks now live in Settings rather than their own sidebar section, and their delivery log has moved into Activity alongside events and agent activity.
Fixed
describe_stream_typenow publishes the portfolio half of the BUDGET_USAGE contract. Portfolio budget alerts have always handed automations acontext.portfolioobject, but the contract only described the campaign shape, so agents writing budget automations never saw it. Each field now names which shape it belongs to, andscopeis a list.- Listing links in the Activity timeline now look up listings across all of the account's active inventories and advance the browser URL bar cleanly rather than redirecting to Settings.
- Authenticated visits to marketing and login routes now navigate directly to the Console without firing a redundant "You are already signed in" toast.
- Navigating the Console after your session expires now takes you to the sign-in page, with a note explaining why. Sidebar and in-page links used to leave the shell in place and report "Content missing" where the page should have been.
- Listings now get their B2C and B2B price from Amazon at discovery/sync time instead of waiting for the first offer-change notification, and the pricing sync no longer overwrites a price that was just set from a more current source. B2B buy-box status is now tracked separately from B2C, so B2B and B2C offer-change events no longer overwrite each other's reading.
- Settings forms now keep what you typed when a save fails. Adding an account with a blank name, or renaming one to something invalid, used to redirect and lose the value; both now re-render the field with your input and the error. A failed password change no longer hides your Accounts list.
2026-08-30
Added
Seller Economics ingestion. Per-SKU referral, fulfillment and storage fees now land daily alongside net proceeds, so an agent can reason about margin rather than just revenue. Each run covers a trailing week, so Amazon's restatements and its monthly storage charges are picked up rather than missed.
describe_stream_typereturns the contract for automation code on any event type: the payload Amazon sends, the context your handler receives, and every field's units and nullability. It reflects your own account, so the webhooks it lists are the ones you can actually call. Read it before writing automation JavaScript instead of inferring the shape from a template.A comparison page at
/amazon-ads-mcpcovering how Pulsify differs from Amazon's Ads MCP Server and other Ads API wrappers: hourly Marketing Stream feeds instead of next-day reports, selling and advertising in one runtime, and code that runs headless instead of an agent in the loop.A comparison page at
/sp-api-mcp-serverssets Pulsify against a raw SP-API MCP wrapper: 23 curated tools instead of hundreds of endpoints, Amazon's push events instead of polling, queryable tables instead of JSON that dies with the turn, and automations that run with no model in the loop. Linked from the footer and listed inllms.txt.MCP clients can now authenticate with a Client ID Metadata Document: point
client_idat an HTTPS URL serving your client metadata and skip registration entirely. Dynamic client registration still works.Activity now opens with setup instructions until you have an agent connected, with one-click config for Claude Code, Claude Desktop, and Cursor. It turns over the moment you finish authorizing, and disappears for good once your agent runs its first tool.
Sponsored Products hourly traffic and conversion feeds are now automatable. Both fire once per campaign per hour with that hour's impressions, clicks, spend, attributed orders, sales, and units in
context.metrics, alongside the campaign and its trailing 24 hours. They also appear in the streams catalog, so you can add a script from the console or ask your agent for one.query_datanow includesv_search_query_performance: query score and volume, plus impression, click, cart-add, and purchase counts, shares, rates, and median prices per ASIN and search term, scoped to your own selling partner.Search Query Performance reports now sync weekly, monthly, and quarterly for brand-registered ASINs. Targeting adapts: ASINs that come back empty back off for 30 days, and a daily budget keeps requests under Amazon's processing cap.
pulsify.devis agent-readable:/llms.txtand/pricing.mdgive AI agents plain-text context and pricing,robots.txtexplicitly allows GPTBot, ClaudeBot, PerplexityBot, Google-Extended, and Bingbot, and every marketing page carriesOrganizationandWebSiteJSON-LD; pricing addsSoftwareApplication, and both FAQ sections emitFAQPage, plus short self-contained answer blocks for "What is Pulsify?" and "How much does Pulsify cost?".A comparison page at
/amazon-seller-assistantsets Amazon's Seller Assistant canvas against Pulsify on the four things that differ: whose logic runs, what starts it, how far it reaches, and what you can inspect. Listed in/llms.txt, and its answers carryFAQPageJSON-LD.An accounts page lists every Amazon business on your plan with its Seller Central and Advertising connection status. Connect or disconnect either side per account, and rename an account inline so the sidebar and audit log call it what you call it.
A switcher in the sidebar moves between accounts without leaving the page you are on.
Every MCP tool call is now recorded: which tool, which agent, what it was asked, how long it took, and what came back. Kept for 30 days.
Connecting an agent is now safer against server mix-up: authorization responses name the server that issued them (
iss), and the discovery document says so, so your client can check the code came from Pulsify before it redeems it.update_listingsets price, floor, ceiling, B2B price, and the automation switch on your listings, and pushes the change to Amazon. Send a batch of rows and each one succeeds or fails on its own. Prices are whole minor units, so 1999 is $19.99 and 100 is 100 yen. A SKU that sells in several marketplaces needs a marketplace, or that row comes back naming the candidates.
Changed
- The canned sample context now carries one of each advertising entity, so
missing_field_readscatches shape mistakes inside loops overcontext.listing.campaignsand its siblings instead of skipping them. - Floors and ceilings are yours. Pulsify no longer asks whether Amazon manages
your min and max price: you can always set them, in the console, in an
automation, or through
update_listing, and Pulsify always sends them to Amazon. A new listing still starts from whatever bounds Amazon reports, and they are yours to change from then on. The other side of that trade: because Pulsify now sends your bounds rather than reading them back, a bounds edit made in Seller Central is replaced by yours on the next price update. Change them in Pulsify. - New connections now seed two years of daily sales and traffic instead of starting from the day you connect. The backfill asks Amazon for a month at a time rather than a day, so it lands in a couple of hours rather than two days, and your agent can compare this week against the same week last year from the start.
Events is now Activity. Amazon events and the writes your agent makes share one timeline, so you can see the price change and the automation that caused it in the same place. Agent reads are one filter away.
Advertising read tools (
list_campaigns,list_keywords,list_targets,get_ads_summary) now strictly reject unparseable date bounds and inverted windows (sinceafteruntil) with aninvalid_windowerror, matching the shared read tool error vocabulary.The console's Automations tab is now Streams. Streams lists the 24 Amazon data streams you can automate, filtered by Selling Partner or Ads, each showing whether it is connected and what is running on it. Opening a stream shows its automations (active, drafts, archived), a sample event payload, and buttons to add a draft, make one active, or archive it.
/automationsredirects to/streams.The web console now opens on the events audit log, and the sidebar is down to Events, Automations, and Webhooks. The metrics dashboard and the listings and campaigns browsing pages are gone; listing detail still opens from audit log entries, and campaign and ad group pages stay reachable by direct link. The marketplace switcher lives on the account page now.
The authorization endpoint accepts only
response_mode=query. The other two modes Doorkeeper allowed could not carry the issuer, and no client used them.
Removed
- The
set_amazon_managed_min_max_pricetool, the Data sync setting it mirrored, and theamazon_manages_min_max_pricefield onconnection_statusandlist_listings. Bounds are the seller's now, so there is no account-level switch left to read or flip. - CSV listing import and export. Listings sync from Amazon on their own, and agents read them through MCP.
- In-app chat. Pulsify is the plumbing; your agent is the interface. Point Claude, ChatGPT, or Codex at the MCP server and talk to Pulsify there.
- The
/playgrounddemo and the in-browser code editor. Automations are written and tried out through your own agent now:update_automationto change the code,run_automationto run it against a replayed or canned event. The automation page shows what is running, read-only.
Fixed
Data Kiosk results are no longer truncated when Amazon splits them across pages. Sellers with large catalogues were silently losing every row after the first page.
Disconnecting Pulsify in Seller Central now disconnects your Amazon account here too. Amazon Login refusing the authorization is proof it is gone, so the account is marked disconnected and its streams unsubscribed, rather than every background job retrying against a dead token.
A role-scoped 401 from Amazon no longer disconnects your Amazon account. Pulsify now checks with Amazon Login whether the authorization itself is gone before revoking, so an endpoint you lack a role for stops that one call rather than taking listings sync and repricing down with it.
run_automationcan now replay a real campaign, ad group, ad, or target change event. It used to fail with an internal error; the replayed context now carriescontext.changeexactly as the live stream delivers it.Daily sales and traffic now store. Feedback metrics were read from the wrong half of Amazon's response, which failed every write, so the account-level numbers your agent reads were never being saved at all.
Listing detail syncs and inventory report syncs no longer stall when two processes write the same listing at once. The conflict retry now re-reads the row before trying again, and gives up after three attempts instead of looping forever. A contended listing could previously pin a background worker.
Connecting a different Amazon business to an account that already holds one no longer dead-ends. The incoming business gets its own account, the existing connection is left alone, and the console switches to the account you just connected.
Accounts connected to Amazon Ads only no longer see the "Connect your Amazon account" banner on pages they can already use, such as webhooks.
Ghost Amazon notification subscriptions — remote subscriptions Pulsify no longer tracked — are now discovered and cleaned up automatically. Deliveries on an untracked subscription heal it on arrival, reconnecting a seller sweeps Amazon for strays, and disconnecting a seller no longer strands live subscriptions. Events from healed streams regain replay protection and show up under their stream in the audit log.
Reject unknown arguments in windowed MCP read tools (
get_sales_summary,list_sales_by_listing,get_ads_summary,list_campaigns,list_keywords,list_targets) with a structured error instead of silently ignoring them.Portfolio sync works again. Amazon retired the legacy portfolios endpoints in June; we now read portfolios through their v3 API, so names, budgets, and budget states are fresh for portfolio-scoped automations.
Portfolio
budgetPolicynow reads exactly as Amazon returns it (MONTHLY_RECURRING,DATE_RANGE,NO_CAP,OTHER) instead of the old camelCase spelling (monthlyRecurring,dateRange). Automations matching on the old spelling need updating.Connecting a second Amazon business no longer overwrites the first. Each Seller Central and Amazon Ads authorization now lands under its own account, up to three per user; connecting the missing half of an account you already have attaches to it instead of starting a new one. A fourth connect is refused with a plain message rather than silently replacing something. Reconnecting an account you already hold reauthorizes it in place, and an account already connected by another Pulsify user is turned away.
Ads reports that reference entities not yet synced locally (a new campaign or ad group Amazon returned before our nightly sync caught up) now trigger an on-demand entity sync and retry parsing, instead of failing outright with a persistent Sentry warning. The warning still fires if entities remain unmatched after the retry budget is exhausted.
buyableanddiscoverableoncontext.listingarenull, notfalse, when Amazon hasn't reported a listing's status yet — automations can now tell "not buyable" from "unknown." Existing listings that predate this data are backfilled once.Advertiser automations (campaign and portfolio budget-usage scripts, and entity-change scripts) can now call
context.webhooks— it was silently empty before, since the automation's owner never reached those context builders. Webhooks are account-scoped now, not selling-partner-only, so an ads-only connected account can configure and use them too.
2026-08-29
Added
- listtargets: every Sponsored Products target — keywords, the four auto-targeting buckets, and product targets — with the same spend and sales rollups listkeywords gives keywords.
- MCP list and read responses now carry cache hints (
ttlMs,cacheScope) per the MCP 2026-07-28 spec, so agents can cache the tool and resource catalogs for an hour instead of re-fetching them every session.
Changed
- Auto-targeting and product-targeting expressions now sync as entities with per-target daily metrics. Campaigns that spend through close-match or loose-match are no longer invisible below the ad-group rollup.
- Every read tool now filters the same way.
list_eventsgainsuntiland takes exactasinandskuarguments (replacingasin_or_sku);list_listingsgainssince/untilon when a listing was added and anorder_byto force newest-first past keyword relevance. Bare dates cover whole UTC days, timestamps are exact instants, and a bad window comes back as a clearinvalid_windowerror instead of a protocol failure. Both tools now reporttotal(matches beforelimit), so counting questions no longer pull rows, and listing rows state theircurrencyoutright. - Advertising profile discovery now uses Amazon's unified account API, so brand accounts managed through an agency's manager account surface alongside directly owned ones. connection_status reports each profile's account name and ads account id in place of the old account type.
- MCP tools and resources are listed in name order, keeping the catalog stable across releases for agents that cache it.
2026-08-28
Fixed
- Daily ad reports for profiles running auto or product-targeting campaigns no longer fail with unmatched keywords. Targeting-expression spend lands in campaign and ad-group metrics, and keyword metrics stay reserved for real keywords.
2026-08-27
Added
- A
query_dataMCP tool: run one read-only SQL statement over five curated views (vsaleslines, vadperformance, vadvertisedproducts, vlistings, vmarketplaces) to answer cross-domain set questions, like which ASINs have ad spend but no organic sales, in one call. One statement, a 3s budget, 500 rows, scoped to your own data.
Changed
- When a new stream type ships, existing connections now receive its default automation on deploy — no more waiting on a hand-written backfill.
- Order history backfill now reaches back 10 years instead of 2. New sellers get the full span on onboarding; already connected sellers gain the earlier years on the next backfill run.
Fixed
- Marketing Stream subscriptions now retry automatically when Amazon rate-limits or hiccups during activation, instead of erroring out. Turning on an ads automation across many profiles no longer trips over its own request volume.
- Automation actions that set campaign budgets and ad group or keyword bids now send the unified Ads API's nested payload shapes; Amazon rejected the old flat fields. Setting state to archived fails fast with a clear error instead of a 400 from Amazon.
- Advertising reports are no longer marked complete when their rows can't be attributed to synced campaigns, ad groups, or keywords. Affected days now retry automatically each night for a week, so a sync hiccup heals itself instead of leaving silent gaps in your performance data.
- Advertisers connected before June 2026 now have their default ads automations; activating one starts hourly Marketing Stream data.
2026-08-26
Changed
- Event tool descriptions (listevents, getevent) document synthetic polled listing-detail reads alongside SP-API notifications and Marketing Stream records.
2026-08-25
Added
- A changelog: recent changes ride along in connection_status, the full history is the resource://pulsify/changelog.md MCP resource and the /changelog page.
- Advertising read tools over MCP: getadssummary, listcampaigns, and listkeywords report spend, sales, and performance per advertising profile.
Changed
- Sales freshness reports earliestorderat so agents can tell how far back the order data goes.
- Listing detail refreshes leave an audit trail.
Fixed
- Concurrent or retried reportbug and suggestidea calls no longer file duplicate reports.
2026-08-24
Added
- Sales read tools over MCP: getsalessummary and listsalesby_listing report revenue and units from order data.
Fixed
- The Amazon-managed min/max price sweep skips listings that are not buyable instead of failing on them.
2026-08-23
Fixed
- Account status and feed processing notifications parse again; Amazon cases field names differently per notification type.
2026-08-21
Changed
- The price publish guardrail trips on currency unit errors instead of price magnitude.
Fixed
- Report-driven data (listings, FBA inventory, planning) flows again after a regression had stalled report downloads since late June.
2026-08-20
Changed
- Amazon-managed min/max price bounds refresh on the report cadence, survive inverted bounds from Amazon, and are no longer overwritten by flat-file imports.
2026-07-17
Changed
- One flat plan: metered overage billing removed.
Fixed
- Automations fail loudly on unexpected event payload shapes instead of running on wrong data.
- Flat-file price bounds convert through the marketplace currency.
2026-07-13
Fixed
- Automation runtime prices convert through the marketplace currency.
2026-07-10
Fixed
- Prices no longer push to Amazon at 100x in zero-decimal currencies such as JPY.
2026-07-08
Fixed
- Advertising connections drop only when Amazon confirms the grant is dead, not on transient token errors.
2026-07-06
Added
- setamazonmanagedminmax_price MCP tool turns Amazon-managed pricing on or off for the account.
2026-07-05
Added
- Amazon Marketing Stream coverage expanded to more datasets and all regions.
2026-07-02
Added
- OAuth 2.1 for MCP clients: connect from claude.ai and other agents without pasting tokens.
Fixed
- Unknown listing statuses are reported honestly over MCP instead of guessed.
2026-07-01
Added
- MCP feedback tools: reportbug and suggestidea relay issues and ideas to the Pulsify team.
- Magic link sign-in.
- Automation run outcomes are visible over MCP: events show what each run did.
2026-06-29
Added
- Passkey sign-in.
2026-06-27
Added
- Webhook integrations retry failed deliveries, log activity, and support test pings.
- B2B order attributes surface in the UI and automation inputs.
2026-06-26
Added
- MCP automation tools: create, list, get, update, archive, duplicate, and run automations.
- MCP diagnostics and listing tools: liststreams, getevent, and list_listings.