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.mutations rewrite are re-seeded from their current template. Code that still called the removed listing.set could 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_listings searches 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_item is exactly what the Listings Items API last returned. data.notifications.statuses is a copy of that field kept for one more release and then removed. list_listings and 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 enabled switch is now blocked, 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_listing and list_listings carry blocked instead of enabled, patch_listing reports a blocked listing rather than queueing, and query_data can read blocked from v_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 NotFound errors 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 BUYABLE and DISCOVERABLE statuses. Listings with unknown status stay uninitialised, even with stock. Missing SKUs keep their last readings; list_listings omits inferred_inactive.
  • Listing condition comes from Amazon's listing item. Automation context and list_listings expose conditionType (such as used_very_good) and its derived condition family. subcondition is removed. Condition stays null until the listing item reports it.
  • Offer-change events no longer trigger a synchronous pricing call. A listing's shipping comes 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_listing or automation context.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_listing and the console edit form now save only the local enabled switch. Use patch_listing to change Amazon attributes, including bounds.
  • listing.deleted is now null in automation context when Amazon has not reported listing status, matching buyable and discoverable.
  • Listing reads no longer expose a single quantity. Automations use context.listing.data; list_listings returns 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_automation accepts listing_id for 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_schema returns 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 marked simulated: true, so nothing reaches Amazon.
  • run_automation takes code and stream_type as an alternative to automation_id, so an agent can dry-run JavaScript against a sample or real event before saving it as an automation.
  • v_listing_mutations view for query_data exposing listing mutation history (sku, marketplaceid, accountid, status, payload, submissionid, submittedat, created_at), session-scoped to authorized selling partners.
  • listing.mutations in the automation context so handlers can inspect in-flight and recently submitted requests.
  • patch_listing queues native Amazon patches for any writable listing attribute, with an optional product_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 take patches formatted as Amazon JSON Patch operations; ad mutations specify target and action ("pause" or "resume"). Pulsify drains the outbox and applies changes after the handler returns.
  • run_automation returns the queued mutations array from execution and dry runs alongside modified and actions.
  • 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_listing and patch_listing expose 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_listing reports queued for Amazon writes and saved for changes to Pulsify's enabled switch.
  • 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_inactive reason 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-team records 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_listing and context.listing.set write four more offer fields on listings you fulfil yourself: quantity, handling_time (Amazon's lead_time_to_ship_max_days), restock_date and shipping_group (the merchant shipping template id). list_listings and update_listing echo them, plus fba, so agents read what they can write.

Changed

  • Dropped the listings columns the data column 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 the listings_reports table, 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 data column 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 asin column from listings; a listing's ASIN now comes from its catalog item's product. v_listings and v_seller_economics read asin from products, with the same column name and shape as before. The unused status and suppressed columns 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_lines and list_sales_by_listing keep 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) and CatalogItem (marketplace-scoped entity) models extract catalog metadata from Listing, establishing a normalized 3NF parent entity for inventory and advertising models with cascading deletions.
  • get_catalog_item MCP tool looks up Amazon catalog metadata and raw payload data by ASIN or SKU for connected selling partners and advertisers.
  • v_catalog_items curated SQL view in query_data exposes catalog items joined with listings for sellers and ads for advertisers.
  • Real-time BRANDED_ITEM_CONTENT_CHANGE notifications record 1 audit event on CatalogItem while evaluating automations across all active seller listings.
  • Ad models link to CatalogItem via 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 an identifiers map (EAN, UPC, GTIN, ISBN) merged from every marketplace's catalog item. get_catalog_item and v_catalog_items expose 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_actions reads 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) from listings. v_listings and v_sales_lines now join catalog_items to select title.
  • catalog_items stores full SP-API payloads in a data JSONB column instead of discrete columns, populated asynchronously via SyncCatalogItemDataJob.

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_bug and suggest_idea MCP tools accept structured diagnostic fields (what_happened, expected, tool_name) alongside title. FeedbackReport formats them into structured markdown sections with tool context on GitHub issues and discussions.
  • The seven session-scoped query_data views (v_sales_lines, v_ad_performance, v_advertised_products, v_listings, v_search_query_performance, v_seller_economics, v_vendor_metrics) expose an account_id column so queries across connected accounts can group and filter by account.
  • MCP tools take an optional account argument for users with more than one connected Amazon account. connection_status lists every account with its id and name. Read tools span every account by default and label each row with account_id and account_name; pass account to read one. create_automation and update_listing ask you to pick an account when more than one is connected. Tools addressed by id, such as run_automation and update_automation, work the account out from the record. One connected account behaves exactly as before.
  • Automation code can read context.account (id and name) to tell which connected account it is running for.
  • TypeScript definitions published in @lineofflight/pulsify-automations declare context.account (id and name) 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_bug or suggest_idea.
  • query_data views cover every connected account by default. Each row is labeled with account_id, or pass account to 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 /activity as a focused audit log.
  • query_data MCP tool now supports CSV URL pointer exports. Result sets over 500 rows (or queries with export: 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_data MCP tool result limit increased from 500 to 1,000 rows.

Fixed

  • Pin redis gem to ~> 5.4 to 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_metrics directly. 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 of handle(event, context) before you connect an account.
  • query_data can read seller economics. A v_seller_economics view 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 plus other_fees always 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_status reports 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_type now publishes the portfolio half of the BUDGET_USAGE contract. Portfolio budget alerts have always handed automations a context.portfolio object, 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, and scope is 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_type returns 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-mcp covering 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-servers sets 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 in llms.txt.

  • MCP clients can now authenticate with a Client ID Metadata Document: point client_id at 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_data now includes v_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.dev is agent-readable: /llms.txt and /pricing.md give AI agents plain-text context and pricing, robots.txt explicitly allows GPTBot, ClaudeBot, PerplexityBot, Google-Extended, and Bingbot, and every marketing page carries Organization and WebSite JSON-LD; pricing adds SoftwareApplication, and both FAQ sections emit FAQPage, plus short self-contained answer blocks for "What is Pulsify?" and "How much does Pulsify cost?".

  • A comparison page at /amazon-seller-assistant sets 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 carry FAQPage JSON-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_listing sets 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_reads catches shape mistakes inside loops over context.listing.campaigns and 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 (since after until) with an invalid_window error, 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. /automations redirects 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_price tool, the Data sync setting it mirrored, and the amazon_manages_min_max_price field on connection_status and list_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 /playground demo and the in-browser code editor. Automations are written and tried out through your own agent now: update_automation to change the code, run_automation to 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_automation can now replay a real campaign, ad group, ad, or target change event. It used to fail with an internal error; the replayed context now carries context.change exactly 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 budgetPolicy now 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.

  • buyable and discoverable on context.listing are null, not false, 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_events gains until and takes exact asin and sku arguments (replacing asin_or_sku); list_listings gains since/until on when a listing was added and an order_by to force newest-first past keyword relevance. Bare dates cover whole UTC days, timestamps are exact instants, and a bad window comes back as a clear invalid_window error instead of a protocol failure. Both tools now report total (matches before limit), so counting questions no longer pull rows, and listing rows state their currency outright.
  • 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_data MCP 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.