Skip to content
pulsify
Pulsify
09 / Changelog Menu +

09 / Changelog

Changelog

2026-10-05

Fixed

  • Report downloads in European marketplaces no longer fail with invalid_url when Amazon serves the document from its Zaragoza (eu-south-2) storage, as seen with promotion performance reports for France and Spain.

2026-10-02

Changed

  • patch_listing now defaults product_type to PRODUCT when every patch targets purchasable_offer, so price patches no longer fail on listings whose own type Amazon rejects for offers. Requests that patch any other attribute still default to the listing's known product type, and an explicit product_type always wins.
  • context.store now keeps a value for 7 days after it's written, up from 1 day.

Fixed

  • The Any Offer Changed template no longer cycles between climbing and suppression when a competitor is priced above the point where Amazon suppresses the Buy Box. It remembers the price it was suppressed at for 7 days, stays under it whatever the competitor charges, and heads back for the last price that won instead of halving toward your floor. Unedited saved copies of the template were updated in place, so a copy that predates the 2026-09-18 runaway repricing fix now has it too. Edited copies keep their code.
  • Repricing automations now send price patches under Amazon's PRODUCT type. Amazon rejected them for listings whose own product type, such as ABIS_DVD for media, does not accept offer patches. The pricing templates and every saved automation that used context.listing.productType || "PRODUCT" in its payload were updated in place.

2026-09-21

Added

  • An operator switch can stop Pulsify accepting new Amazon write requests without disturbing requests already queued. queue_mutations, request_report and patch_listing answer admissions_disabled while it is set, and nothing already queued is cancelled or replayed. Set to refuse only qualified catalog actions, typed actions keep working. A refused call writes no receipt and no idempotency record, so retrying the same idempotency_key once writes are accepted again queues the batch normally.
  • The documentation reference now lists every Amazon operation Pulsify runs, grouped as live reads, queued requests and queued writes, with the catalog revision to pin, coverage counts per provider, the gaps in Amazon's published contracts, current approval gaps, and the failure codes each stage returns. It renders from the deployed catalog, so it changes with each revision.

Changed

  • Sponsored Products request validation now reads its schemas from the pinned Amazon operation catalog instead of a separate vendored copy. The same tighter rules apply: closed objects, profile currency, ownership and reference checks. Payload shapes are unchanged.

Fixed

  • The "Your session expired" notice now appears on the sign-in page. Toasts render above the page, and the notice survives a browser prefetch or prerender of the sign-in page instead of being consumed before you see it.

2026-09-20

Added

  • Saved automations can react to finalized selling and Ads reports, coordinate observations from the same account, and request reviewed catalog operations with saved dependency pins. Dry runs validate the same output budgets and authorization without applying changes; receipts expose execution and report-chain correlation.

  • Request supported Amazon reports through MCP and follow their receipts to protected results that expire after 24 hours. Data Kiosk results expose sealed continuations for explicit next-page requests.

  • Qualified Amazon catalog writes now queue. Name the reviewed listing patch operation or any of the 12 reviewed Sponsored Products write contracts as a queue_mutations action, with the current catalog_revision, native { path, query, headers, body } parameters and an idempotency_key. Typed actions keep working unchanged.

  • queue_mutations accepts an idempotency_key, a string you choose for one batch. A retry carrying the same key and the same input returns the first call's receipts and rejections with replayed: true and queues nothing more; the same key with different input returns idempotency_conflict and queues nothing at all. The response carries idempotency.expires_at, 30 days out, after which the key may be forgotten and a retry is no longer safe. A qualified action requires a key; anything else is safer with one.

  • get_mutation returns one receipt with its payload, provider response and, for a receipt your own client admitted, its idempotency block, and list_mutations pages receipts newest first, filtered by account, status, target, operation or idempotency key. Both read by account rather than through a target, so a receipt whose listing or campaign was deleted, or that never had a local one, still reads back.

  • Reviewed Amazon operations now publish effective caller schemas alongside native schemas, including derived identity, scope restrictions and single-entity Sponsored Products inputs.

  • Workflow recipes over MCP: the ad_waste_audit, margin_repricing and restock_protection prompts walk an agent through auditing advertising spend, holding a margin floor while repricing, and protecting stock from selling out, each ending in a draft automation you activate yourself. Every argument is optional, and resource://pulsify/workflows.md carries the same recipes as text for clients without a prompt picker. Retrieving a recipe reads nothing and changes nothing.

  • Amazon operation discovery over MCP: search_amazon_operations finds Selling Partner API and Amazon Ads operations by name, family, method or free text, and get_amazon_operation returns one operation's method, path, native bindings and request or response schema. The same definitions are readable as resources under resource://pulsify/amazon-catalog. Discovery describes Amazon's published contracts; it runs nothing.

  • read_amazon_operation runs 1 page of a reviewed Amazon read live: 5 Selling Partner API reads (Listings Items, Catalog Items, Reports metadata) and 6 Amazon Ads reads (campaigns, ad groups, ads, targets, advertiser accounts, report status). Results are transient and never update stored data. Continue with the sealed next_cursor, which works only for the same operation and target. Account-level Ads reads take an Advertiser target, and an Ads report's download link is never returned. connection_status now returns each connection's id, the target id for SellingPartner and Advertiser reads. get_amazon_operation's live_read.omitted lists response fields a read never returns.

  • describe_data documents everything query_data can read: each view's columns with units and nullability, the grain a row is at, freshness and retention, and the join graph with its fan-out warnings. Call it with no arguments for the map, view for one view's columns, and coverage: true to check whether an account has any of that data yet. The same catalog is also published as the resource://pulsify/data-dictionary.json resource for clients that read resources.

  • MCP audit rows now exist for a templated resource read, such as fetching one Amazon operation's schema by URI, and mask token-like arguments (refresh_token, access_token, client_secret and similar) wherever they appear in a tool call. A static resource like the changelog stays unaudited.

Changed

  • New mutation receipts pin their Amazon operation, schema, provider identity and dispatch contract. Existing typed actions keep their payload shapes.
  • Connection emergency switches now apply to every queued listing and advertising write. Switching back on never releases blocked requests. Automations can change only their own account, even when the same user owns several.

  • Amazon calls made for an agent over MCP now share rate budgets with Pulsify's background crawls, reports, Ads refreshes and submissions, and can take at most half of each Amazon usage plan, so an investigation cannot starve ingestion. When a budget is spent, get_product_type_schema answers rate_limited with retry_after_seconds; wait that long before retrying.

  • A throttle from Amazon now pauses every Pulsify caller on that connection until Amazon's retry time passes, instead of each job retrying on its own clock. Queued changes stay queued without spending an attempt while the budget is spent.

  • query_data's description now points to describe_data for column-level detail instead of listing every view's columns inline, shrinking from 10,190 to 2,277 bytes.

  • 7 catalogued Amazon operations now have reviewed authorization policies. The catalog distinguishes executable reads from reviewed operations still awaiting adapters and unreviewed operations; review alone grants no execution permission.

  • The Amazon catalog manifest (resource://pulsify/amazon-catalog) reports structure_revision and no longer reports the placeholder policy_revision. The catalog revision, and every catalog resource URI that pins it, now changes whenever Pulsify's own execution policy changes, not only when Amazon updates its specifications.

Fixed

  • Recover report completion after missed notifications or a transfer worker crash without submitting the request again. Scheduled ingestion retries use the same protected result; uncertain customer queries cannot enter legacy observation ingestion.
  • Ambiguous Amazon server errors and unknown provider outcomes remain uncertain instead of replaying or settling a write. Changed ownership, provider identity or currency blocks dispatch; reconciliation cannot attribute a creation under a changed profile.
  • Batched mutation audit redactions apply independently to each item; malformed UTF-8 is refused without losing valid sibling requests.

  • MCP initialization now describes the current { target, action, payload } mutation contract, native Ads updates and parent-targeted creation, and directs agents to get_mutation_schema for supported payloads.

2026-09-19

Added

  • Automations and agents can create Sponsored Products campaigns, ad groups, product ads, and positive or negative keyword and product targets. A creation targets its parent with Amazon's native create object: create_campaign on an advertising profile, create_ad_group on a campaign, create_ad on an ad group, and create_target on an ad group or, for an exclusion, on a campaign. Pulsify derives adProduct and the parent ID.
  • A creation returns nothing synchronously. Once Amazon confirms it, the parent's receipt carries created with the new entity's type, local ID and Amazon ID, and created is a valid target for the next step. A listing's context reaches what its own automation created before any ad links it to the listing.
  • A creation whose reply is lost is never sent twice. It stays uncertain without holding back the parent's other requests while Pulsify asks Amazon what exists, then settles as accepted, absent or unresolved. An identical creation is refused while one is pending.
  • context.advertisingProfiles and list_ads_entities with target_type: "AdvertisingProfile" list the parents of new campaigns with their receipts. get_mutation_schema publishes each create schema.
  • A tested recipe builds a paused campaign for a listing across runs and leaves activation to you.
  • queue_mutations, get_mutation_schema and list_ads_entities let agents inspect native Sponsored Products data, discover supported payloads, and queue updates or archives for campaigns, ad groups, ads and all target categories.
  • Amazon vendors can connect Vendor Central. Amazon approved Pulsify for vendor accounts, so choosing Connect next to Vendor in Settings no longer gets turned down at consent. A vendor account has no listings, so agents get vendor analytics through query_data and the seller tools stay hidden.
  • query_data has 2 new seller-only views. v_coupon_performance has one row per coupon, and v_promotion_performance has one row per promotion per included ASIN, with promotion totals repeated on each ASIN row (sum the product_ columns, not the promotion_ ones). Totals are lifetime as of reported_at, and money is minor units, except discount_amount on an amount-off coupon, which is in major units.
  • Listing and campaign automations get context.listing.deals and context.campaign.deals: the coupons and promotions active now for the listing's ASIN, or for the ASINs a campaign advertises, with Amazon's report keys under data. deals is null until Amazon's coupon and promotion reports have both synced and [] when nothing is active. dealsReportedAt says when the reports last synced, and each deal carries its own reportedAt for when its totals were last refreshed. Both reports need the Brand Analytics role, so nothing appears until it is granted.
  • A new agentic BI page on the site explains how your agent investigates Amazon data with query_data and acts on what it finds with queue_mutations, with prompts to paste, a worked example and answers to common questions.

Changed

  • Negative keywords and negative product targets are now synced, at ad-group and campaign level. They appear in negativeTargets in context and in list_ads_entities, never in targets or keywords, and carry no bid or metrics because Amazon reports none. list_targets and list_keywords stay positive-only. Update and archive exclusions like any target.
  • mutations now shows the latest settled receipt of each attempted creation on a parent, up to 50 per target, so a rejected creation stays visible beside a confirmed one.
  • Listing and advertising writes now use { target, action, payload }. Context targets carry explicit types and local IDs; listing updates carry productType and native patches, Ads updates carry native fields, and Ads archives use an empty payload. Listing and Marketing Stream automations share the same target support and validation, including dry runs.
  • Mutation receipts now report queued, submitting, submitted, blocked or uncertain delivery separately from automation decisions and observed Amazon data. Decisions stay for 1 year; submitted and blocked receipts stay for 30 days; unresolved requests remain until resolved, including after a target is deleted.
  • Activity loads quickly for accounts with hundreds of thousands of events. It pages with Previous and Next links instead of numbered pages, since counting every page is what made it slow.

Fixed

  • Ambiguous, interrupted and partially successful submissions stop later requests for that target instead of being blindly retried. Accepted requests update observed Ads data only from a matching, current entity representation returned by Amazon.

2026-09-18

Added

  • The automation context exposes the listing's marketplace id as marketplace.marketplaceId, matching the MarketplaceId Amazon sends on region-wide events. Automations can now pick the entry for their own listing without reading it out of raw listing data.

Changed

  • A campaign's Automation switch now withholds every automated change to that campaign and its ad groups, ads and keywords, including changes from selling-event automations such as a stock or suppression rule. Withheld changes appear in list_automation_actions as blocked and are never sent, even after you switch automation back on.
  • Automations now see every offer notification, including one that still shows a price you just changed, and every request they make is sent, even one that repeats an earlier request. The shipped pricing templates skip a price Amazon already shows and wait up to 40 seconds for an accepted price to appear. Stored copies of those templates you never edited now carry these checks.
  • Automations name a mutation target one way: the object the context gave you, such as context.listing or an entry from listing.campaigns. Explicit target type and id fields, string targets, attribute/value, properties and params no longer apply, and the dry-run result drops its duplicate modifications copy.
  • create_automation and update_automation no longer run your code against sample data as a side effect of saving, and no longer return missing_field_reads. Call run_automation to dry-run the code before activating; its missing_field_reads catches a wrong payload shape.
  • Documentation and this changelog have their own look: a plain monospace layout with a numbered sidebar, previous and next links, a menu on small screens, and dark mode. The blanket work-in-progress notice is gone; the events and agent pages now say exactly what they don't cover yet.
  • Documentation has a new operating guide and reference: how an event becomes a run, staying in control, what to check when something goes wrong, and tested recipes. The reference lists every MCP tool, event type (Amazon Marketing Stream included), context field, error, limit and retention window straight from the running code. Old Events, Automations, Guardrails and Webhooks links redirect to their new sections.
  • Docs onboarding now follows your agent: Introduction, Connect your agent, Connect Amazon, and Your first automation, which builds the pause-ads-on-stockout automation step by step on the demo. Connect your agent covers Claude, Claude Code, Codex and ChatGPT. /docs/overview, /docs/setup and /docs/mcp redirect to their replacements.
  • list_automation_actions now reports asin, sku, marketplace_id and title for Ad targets, the same identity fields Listing targets carry, so you can tell which ads an automation changed without a separate lookup.

Fixed

  • The Any Offer Changed template no longer walks your price up in 1% steps. It compares you against every featured offer whatever its fulfillment channel and, when you're not the Buy Box winner, never prices above the Buy Box for your condition. A loss stays on record after later wins, so the price settles between your highest win and lowest loss instead of climbing again, and each raise or cut reaches its target in a single change. Existing saved automations keep their code.
  • The console's Activity and listing pages load again for large accounts instead of timing out. Account activity and the overview's 24-hour count now show the events your own Amazon connection received; a catalog content change delivered to your listing through another seller's subscription appears on that listing's activity and event page instead.
  • When Amazon accepts an automation's change to a campaign, ad group, ad or keyword, the next run sees the state Amazon reports back, so listing.ads reads a just-paused ad as paused instead of waiting for the daily Ads reading. A change Amazon refuses inside its reply is now failed with Amazon's reason in list_automation_actions, not applied.
  • create_automation and update_automation reject code that fails syntax checks with a structured invalid error and the reason, instead of an opaque internal error.
  • archive_automation, and archiving or restoring an automation in the console, no longer error when the automation's already-saved code fails today's syntax check. Archiving and restoring never touch code, so only code you're actually changing or activating is checked, and activating an automation no longer fails because a different automation it deactivates has stale code.
  • create_automation, update_automation and duplicate_automation refuse REPORT_PROCESSING_FINISHED and DATA_KIOSK_QUERY_PROCESSING_FINISHED: Pulsify processes both internally, so an automation saved or activated for either never ran. describe_stream_type no longer lists them as automatable.
  • Advertising events (budget usage, campaign, ad group, ad and target changes, hourly metrics) no longer count as handled the moment they're stored. If a run fails after the event is recorded, the retry now finishes the entity refresh, the automation run and the queued campaign actions instead of skipping them, and a completed event is never run twice.
  • query_data exports no longer return a working-looking URL when the upload fails. A missing S3 configuration or a failed upload now returns query_failed instead of a link that never had data behind it.
  • query_data runs only on a database connection authenticated as its restricted query role. If that connection reaches the database as any other role, or cannot be made at all, the call returns unavailable and no SQL runs. Environments without the role no longer fall back to the application's own credentials, and each deploy revokes any grant the role holds beyond the curated views.
  • Documentation stays open while you're signed in, so the console's setup guide link no longer sends you back to the console. The copy buttons on the agent setup page work again.
  • listing.fba.agedInventory and data.fba.aged_inventory update daily again. A scheduler migration on August 30 stopped the report that fills them from being requested; the last automatic download before this fix was August 23.
  • The demo MCP endpoint moved to https://demo.pulsify.dev/mcp; the old https://pulsify.dev/mcp/demo is gone. Serving it from pulsify.dev let Codex, and possibly other MCP clients, discover the real endpoint's OAuth metadata and wrongly prompt for sign-in on the demo.

2026-09-17

Added

  • Connected apps in Settings lists every agent and app you've authorized, with the date you connected it, and revokes access in one click.

Changed

  • connection_status now reports Amazon connections only in accounts. The top-level sp_api and ads copies of the first account are removed; read accounts[].sp_api and accounts[].ads instead.

  • The console no longer edits Amazon Ads. Campaign budget and state editing, ad group and target bid and state editing, bulk pause and resume, and a listing's "Pause all" ads action are gone, along with the 30-day advertising rollups and spend and sales charts on those pages. Campaign, ad group, and target pages stay as read-only inspection. The per-campaign automation switch and the listing block switch still stop Pulsify from submitting changes. Agents keep every advertising read tool and dataset, and automations still change campaigns, ad groups, ads, and targets.

  • The unused live Buy Box lookup at /listings/:id/buy_box_winners is removed. Buy Box status still arrives with offer notifications and stays on the listing.

  • data.notifications.statuses is gone from listing rows, as announced on 2026-09-12. A listing's status is its own field, written by the catalog crawl and Amazon's status notifications, and notifications now holds only the latest notification envelopes.

  • The get_catalog_item tool announced on 2026-09-03 was never served over MCP and is withdrawn. Catalog metadata, gtin, and identifiers stay available in v_catalog_items through query_data.

  • An automation's code on its detail page now shows as plain escaped text instead of a syntax-highlighted viewer. The code was already read-only; editing has never been possible from the console.

  • Connecting a seller or advertiser account no longer creates a draft automation for every event type. Automations now only appear when you or your agent creates one, from a stream's template or create_automation. Existing drafts are unaffected.

  • Automations no longer get an AI-generated description when their code changes. description is dropped from list_automations, get_automation, and the automation detail page; a title and the code itself are what describe an automation now.

2026-09-15

Changed

  • Reviewer sessions now open with a review-specific prompt, avoiding a builder role mismatch warning in Claude Code.
  • Listings Amazon reports as deleted are removed nightly, along with their queued and submitted changes. Sales and economics history for the SKU stays, and reconnects if you relist the same SKU.

Fixed

  • Account switches in the console stick. A link preloading under your pointer could quietly switch you back to the previous account.
  • Seller Economics and daily sales now include every SKU Amazon reports, including unpriced items and SKUs with no listing in Pulsify. Their rows used to be dropped.

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.