Changelog
Everything we ship in Keel HQ. Releases go out daily.
Releases
122
Days since last
0
Current
v1.71.0
Releases over time
122 total
Added
- cash: buy-plan cash preview - what a PO does to the lowest cash week
- cash: European CSV amounts by explicit choice, and serialize imported-account removal with imports
- costs: richer variable cost bases, and costs that count as ad spend
- cash: supplier purchase orders with payment schedules (deposits, balances and net terms), so what you owe suppliers shows up in the cash forecast in the week it's due
- cash: a weekly reminder, by email and as a banner, to update the balances of accounts you track by hand or by statement import; you can turn it off in Cash Settings
- settings: an Activity tab for admins that records who deleted what (raw materials, suppliers, pipeline products, flash sales, monthly reports, debts and purchase orders), with a snapshot of what was removed
- cash: import bank statements (OFX, QFX or CSV) from any bank to set balances and transactions for accounts outside Mercury
- inventory: suppliers with lead time, minimum order and payment terms, plus "reorder by" dates in the action queue
- cash: choose which bank accounts count toward the forecast's opening cash, add manual balances for accounts outside Mercury, and set a minimum cash line
- ai: bring your own OpenAI key as an alternative to Anthropic for the Helm and every AI feature
- layout: your brand's logo and name now sit at the top of the sidebar
- sync: manual Shopify syncs, Meta ad pulls and ShipStation backfills now run in the background and show their progress
- profile: a generated pixel avatar is everyone's default profile picture until they upload one
- costs: detect payment gateways and estimate their fees from editable rates
- costs: import Shopify Payments fees per order, with no double count against manual processing costs
- costs: start and end dates and a history for business costs
Changed
- ui: migrate more forms onto usePendingMutation (follow-up to #1253)
- site: a faster mobile homepage, and a little ASCII ship above the waitlist
- Behind-the-scenes security and reliability improvements, and groundwork for choosing your own AI provider.
Fixed
- cash: an undated counted account makes the forecast's opening balance stale
- overview: top products connection state per window, no link for removed products, demo runway from /cash
- inventory: stock is now counted at every Shopify location; products stocked in more than 10 locations were under-counted
- ads: score only delivering ads, and group turned-off ads apart
- team: billing and the AI spend cap are admin-only, only the owner can change or remove an admin, and sign-in links can no longer send you to another site
- cash: settle Shopify payouts as received or cancelled so the Incoming KPI counts only cash still to come
Added
- overview: see your top products for the selected period, sortable, with margin where cost is known
- inventory: set launch quantities per product in a drop, and see sell-through from units actually sold
Changed
- ui: dropdowns, inputs and text fields look and behave the same across every form
Fixed
- cash: the forecast counts sales as cash only once the Shopify payout arrives, and no longer double-counts the current week
- cash: the 14-week forecast now counts every recurring bill and debt payment
- klaviyo: campaign and flow reporting syncs again for every Klaviyo account, using each account's own Placed Order metric
- settings: creating an API token and inviting a teammate with access to only some modules work again
Added
- shopify: connect a second Shopify store to the same workspace at no extra cost, with stores named "Shopify store 1" and "Shopify store 2"
- overview: Today and Yesterday on the key metrics, with a Refresh button for the latest numbers
Changed
- marketing: the privacy page lists Cloudflare R2, Resend and PlanetScale as sub-processors
- platform: faster first page load on mobile
Fixed
- integrations: connecting Postscript now says when your Postscript plan doesn't include API access, instead of blaming the key
- overview: shipping, returns, warehouse and overview totals stay exact past 1,000 orders
- cash: two workspaces can connect the same Mercury account
- team: an invite that failed to send no longer blocks inviting that address again
- security: stronger protection for connected stores and webhooks, and Shopify tokens are now stored only in encrypted form
- ui: better text contrast and screen-reader labels across the app
- email: welcome, team-invite and AI spend alert emails now send reliably
- team: the invitation accept and confirm pages now use the full Keel design, and a brief outage no longer uses up the invite link
Added
- integrations: show Shopify review and Meta coming-soon status to beta testers
Fixed
- cash: scope provider-ID upsert keys to the org so one org can't overwrite another's rows
- cash: actionable warning when Shopify payouts need read_shopify_payments_accounts
- inventory: Create Drop modal fit, reusable search input with clear button, Ads filter labels and table cards
- ui: Keel HQ brand constant, shadcn RadioGroup, external Changelog link
Added
- overview: % change and sparklines for Ad Spend, Blended ROAS and MER from daily ad spend
- overview: explain withheld margins with a fix list, and show Fixed OpEx against its goal
Fixed
- auth: stop the legacy bootstrap fallback assigning orgless logins to a merchant org
- costs: P&L import lock ordering, replacement duplicate recheck, and amount ceiling
- security: read Shopify tokens only from the encrypted column
- security: stop org members reading Shopify credentials through the API; extend the isolation suite
- platform: show a temporary service message instead of signing users out
- shopify: refuse cross-workspace stores before picker and enforce connect modes
Added
- billing: per-tier billing portals and in-app plan upgrades
- billing: founder-friend invite links with an extended free trial
- billing: Stripe subscriptions for direct signups
- costs: P&L import review and atomic commit
- overview: show CM1 / CM2 / CM3 margin layers
Fixed
- shopify: use expiring offline tokens with refresh for public-app stores
- shopify: connect stores through Shopify instead of a typed store domain
- shopify: drop the localhost OAuth redirect from the production app config
- shopify: encrypt pre-existing store tokens automatically on the daily cron (#901, step 0)
- ux: staff land on Super Admin, clearer Create user copy, Help opens from the sidebar
Added
- admin: Keel Super Admin — orgs list, provisioning and feature flags (#729, 2/2)
- admin: staff gate, audit log, and user actions (#729, 1/2)
- billing: Shopify managed pricing for App Store installs
- marketing: describe the audience as five- to seven-figure DTC brands
- costs: AI-assisted P&L mapping and import analyze route (#719, 2/3)
- marketing: /screencast redirect to the unlisted demo video
- marketing: pricing page with Harbor / Coastal / Open Seas tiers
- marketing: public /support page for the Shopify App Store listing
- marketing: public changelog at keelhq.io/changelog
- mcp: every MCP result says when each source last synced
- team: enforce per-module access for team members
- reports: real COGS and CM1 / CM2 / CM3 margin layers
- team: limit a member to chosen modules from the team page
Changed
- marketing: homepage copy in content/marketing/home.json (#874, step 2)
- reports: monthly storefront totals now follow your business timezone
Fixed
- ads: widen meta_ads ratio columns and keep one extreme ad from failing a pull
- auth: render invite and signup email links without a branch in the URL context
- postscript: route each webhook event only to its own org
- shopify: encrypt store access tokens at rest — expand step
- shopify: OAuth before any Keel UI on install; sign up after
- shopify: register app/uninstalled per shop via the Admin API
- ads: record an empty successful Meta pull so spend reads $0, not the previous pull
- costs: cost zero-priced lines and read report revenue and COGS in one statement
- fail closed on read errors in settings, reports, journal and warehouse shipping
- marketing: fail closed on kanban, posts, archive and carousel reads; tell a failed calendar save from demo
- overview: MER and Blended ROAS use one revenue basis everywhere and are defined apart: Blended ROAS is net revenue ÷ ad spend, MER is net revenue ÷ total marketing spend
- shopify: App Store compliance — GraphQL-only payouts, drop unused scopes, 200 for unknown-shop compliance webhooks
- shopify: redact a storefront in one locked transaction; keep the old shop's redact resolvable
- ads: Ad Library and cash actions now use only your latest Meta data
- security: access tokens and invites now follow their creator's current permissions
- cash: forecast edits stay in sync with what was saved
- cash: keep hand-edited forecast inputs and surface failed week edits
- costs: COGS reversals from refunded, restocked line items — not order status
- overview: show unknown ad spend as unknown, never $0
- reports: readable delta badges — right precision, and a surface over the sparkline
- reports: show report percentages at the right scale
Added
- ads: open the Ads module to every org (Beta) — retire the Meta Ads entitlement gate
- mcp: phase 2 — product, ad spend and monthly report tools, resources, install UX
- costs: P&L import engine — rules mapping, basis derivation, dedupe (#719, 1/3)
Changed
- auth: run the request-path auth round trips in parallel
- nav: link the sidebar straight to each section's first tab
- overview: load alert inputs once and stop re-reading alerts on every page
- ui: stream dashboard sections independently — phase 3b
- ui: stream dashboard sections independently — phase 3c
- ads: batch meta_ad_tags lookups and upserts
- ui: stream dashboard sections independently — phase 3a
- ui: stream dashboard sections independently — phase 2
- ui: stream dashboard sections independently — phase 1
Fixed
- ads: provision ad_settings for every org, new and existing
- security: tightened permission checks on MCP connection testing
- security: consistent role-based permissions on every change you make
- changelog: release-type badge from version, one card per day, daily releases
- klaviyo: raise the sync time limit to 300 s and report timeouts clearly
- marketing: stop reading google-font-metadata from disk on the Brand page
- reports: archived reports no longer block Generate
- ads: settle MER as revenue ÷ ad spend and add a MER target
- security: only workspace members can edit costs
- costs: require a cost context and aggregate cost totals server-side
- auth: make provisioning invites visible to the pending-invite claim
Added
- cash: add Mercury nightly cron
Changed
- inventory: prune current state after a complete run
- inventory: materialize current state
Fixed
- ads: source category controls from per-org taxonomy
- ads: match classifier hooks and formats on word boundaries
- cash: calculate runway from active debt
Changed
- db: index the key latest_inventory sorts on
- shell: reduce dashboard critical path
Fixed
- ads: align decision metrics with verdict window
- cash: sync Mercury transactions for every account
- ads: derive taxonomy from org catalog
- meta: surface invalid token expiry metadata
- meta: rebuild paged requests from initial URL
- bug-report: stamp deployed commit SHA and environment
- inventory: paginate catalog reads
- inventory: use shared currency formatter
- meta: use Business System User token directly
- security: tightened database access permissions
- security: internal reporting views can no longer be reached from the browser
Added
- security: integration credentials are now encrypted at rest (AES-256-GCM)
- overview: add per-org dashboard goals
Fixed
- auth: grant team membership only after invitation acceptance
- security: stricter session checks on account and settings actions
- auth: more reliable workspace selection when you sign in
- security: integrations now use only your workspace's own credentials
- security: integration credentials are strictly scoped to your workspace
- privacy: add Meta deletion instructions
- security: report generation is strictly scoped to your workspace
Added
- security: bot protection on every sign-in and sign-up; sign-up is invite-only during beta
- auth: provision an org without Shopify OAuth
- email: brand every auth email and send a welcome on first sign-in
Changed
- security: completed a workspace data-isolation audit
Fixed
- security: hardened workspace creation
- demo: resolve every demo surface through one demo clock
- security: Postscript now uses only your workspace's own credentials
- security: the Overview dashboard uses only your workspace's connected credentials
Changed
- privacy: disclose Help Scout / Loops / GitHub subprocessors (post-#494)
- privacy: disclose Vercel Web Analytics on dashboard pages (post-#494)
- privacy: merchant/customer data section for Shopify PCD approval
- security: security incident response policy
Fixed
- cash: strict dashboard reads in regenerateForecast (post-#485)
- overview: only zero MTD day-1 for current window, not prior (post-#470)
- shopify: delete payout cash_incoming rows on shop/redact (post-#486)
- shopify: preserve storefront on install retry when state cookie expired (post-#495)
Added
- analytics: accuracy hardening — pagination fixes, test suite, Shopify reconciliation
- marketing: go-live — keelhq.io → main, landing page polish (#444 #445 #447)
- marketing: swap landing commit-graph green ramp for Keel blue
Fixed
- analytics: correct ad-spend columns + keyset pagination for mutable tables
- auth: distinguish 'no active org' from query errors in org-context
- auth: drop private-beta error substitution
- security: Meta campaign history is now strictly isolated per workspace
- demo: return null for non-matching months in getMonthlyReport — closes #413
- marketing: add og:image and twitter:image to landing metadata
- security: hardened demo mode so it can never show live data
Added
- demo: public demo deploy with email gate
- loading skeletons + module empty states for sub-page nav UX (#285 RC1, #326)
- returns tracking dashboard
- ui: Alpha pill on rougher feature surfaces (Brain, Carousel, Pipeline, Seasonal, Reports)
Fixed
- supabase: index 14 unindexed foreign keys
Added
- changelog: redesign /changelog page with grouped Added/Changed/Fixed sections
- reports: stepped progress modal for monthly report generation
- shopify: GDPR mandatory webhooks for Partner app review
- ads: beta-gate Meta Ads live-data layer
- ai-usage: log Anthropic calls from Ads Studio, Flash Sales, Carousel, and Monthly Report Narrative
- ai: per-org monthly cap for Anthropic-backed features
- ai: Phase 2 — threshold email alert + passive UI alert + cap-hit banner
- brain: empty state when Anthropic credential is missing
- brain: gate starter prompts by satisfied setup gates
- brain: persistence layer + Prior Chats tab
- overview: empty state when integrations not connected
- password reset — forgot password flow + callback handler + reset form
- profile picture upload + brand logo file uploader
- route bug reports to GitHub Issues + capture browser context
- save and sync now on first integration connection
- settings: right-align card footer actions via SettingsCardFooter
- signed-in transition screen after auth
- user menu in sidebar — sign out + profile link
Fixed
- security: authentication hardening
- security: stricter workspace scoping on cost edits
- security: sign-in now uses the PKCE flow for stronger session protection
- security: hardened server-side authentication
- ShipStation sync resilience — auto-recover missed labels, better schema error
- shopify: distinguish stale sync_error from disconnected; retry transient failures
- use gross revenue for product/storefront metrics
Added
- funky-shadow dithered shadows on hero screenshot and module cards
- in-app bug report button
- landing: grain texture, marquee integration strip, terminal cursor
- onboarding checklist — Get Started panel in sidebar
- private beta messaging
- simulated commit graph in founder section
Fixed
- move opengraph-image to app root — route group prevented Next.js from picking it up
- OG image — load brand fonts for sharpness, hero headline treatment, remove price
- OG image — TTF fonts, Phosphor pill icons, hero headline treatment, remove price
- swap default Next.js favicon.ico for svg favicon
- use new brand svg as icon.svg for Next.js favicon metadata
Added
- OG/Twitter meta tags + dynamic opengraph-image for landing page
- landing page overhaul — deep feature showcase for all modules
- pipeline phase 2 — detail drawer, sample rounds, tasks
- product margin calculator + margin settings
- product pipeline kanban — DnD board, CRUD, drops, filters
- Shopify OAuth connect flow — replace manual token entry
Fixed
- restore alternating dark/light pattern across all 9 modules
Added
- Klaviyo email tab for Marketing module
- per-storefront filtering on consumption rules
- Postscript integration — API credential setup (#184 PR 1)
- raw materials & supplies module with auto-consume + reorder intelligence
- shipping geo analytics — choropleth map + state breakdown
- shipping goals — per-org targets with reactive KPI cards
- ShipStation store breakdown on shipping page
- SMS tab in Marketing — subscriber chart, campaign log, cron + webhooks (#184 PR 2)
- variable cost basis types + gateway cost category
- warehouse module — shipping analytics (Shopify base + ShipStation add-on)
- warehouse shipping phase 2 — delivery metrics, cost % of revenue, env-cred fix
- warehouse shipping phase 3 — net margin, storefront margin, delivery backfill
Fixed
- spin Products and Orders buttons when Sync All is running
Added
- add/edit debts with AI screenshot extraction
- exclude zero-dollar orders from analytics
- hotfix: add massive clipped wordmark to footer bottom
- hotfix: center footer wordmark, pixelate globe via SVG filter
- hotfix: remove globe from footer wordmark, text only
- hotfix: fix footer wordmark clipping, add spacing above
- hotfix: crop footer wordmark 1/4 instead of 1/3, full width
- hotfix: revert footer wordmark crop back to 1/3
- hotfix: redesign founder quote as full-bleed image card with bottom quote overlay
- revert: restore founder quote to original card design
- profile settings view/edit toggle
- role-based UI gating for settings and catalog
- searchable creditor combobox with known company list
- Settings > AI Usage log
- Shopify Bulk Operations + bundle handling
Fixed
- fixed a rare error creating your workspace on first sign-in
- fixed an error loading team memberships
Added
- carousel builder — AI-powered Instagram carousel generator
- scheduled syncs now run for every workspace
Changed
- restore founder quote to original card design
Fixed
- separate reveal wrapper from card div, add unoptimized to image
- use explicit CSS class for testimonial card height so image renders
- use plain img tag for testimonial background — next/image fill was not rendering
- faster permission checks on dashboard queries
Added
- brand settings page for marketing manager
- Hey Brian — animated AI assistant MVP
- landing page copy — founder quote, stack comparison, vibe-code FAQ
- revenue chart improvements — area gradients + YAxis clipping fix
- Settings → Alerts tab with configurable thresholds
- team management (issue #113)
Fixed
- add Storefront icon to Shopify config cards
- increase reveal threshold and add rootMargin to fix early scroll animations
- Number() conversion for warn_fixed_costs_stale_days
- security: database access-policy hardening
Added
- add toast feedback across all major user actions
- Settings Goals tab — configure margin and ad targets
- add search to inventory catalog
- Mercury transaction matching on action completion
- design: use duotone weight for large decorative Phosphor icons
- wire forecast revenue to Shopify sales_snapshots
Fixed
- replace text-danger with text-danger-foreground for readable contrast
Added
- add info tooltips to KPI cards
- remove Kleio dependency, build in-app financial analytics
- add signup + fix dark input text on login page
- product images in inventory catalog
- Shopify product link + sync UX feedback
- product exclusion rules by vendor and tag
Fixed
- show error when magic link is rejected or expired
- product name truncation + filter $0 orders
Added
- add /landing route accessible regardless of auth state
- add color, icons, and hover effects to marketing page
- add pricing comparison section vs Triple Whale
- add scroll reveal animations to marketing page
- add X/Twitter link to footer + FAQ access answer
- eased scrim gradient utility, replace harsh linear fade
- enable smooth scroll site-wide
- marketing landing page
- marketing landing page at root route
- overview: wire dashboard to real Supabase data
- multi-workspace support with per-workspace data isolation
- add Shopify OAuth routes for token exchange
Fixed
- FAQ access answer with X link, restore Vandelay Industries name
- hero gradient from warm neutral → teal → blue for more contrast
- preserve session cookies on middleware redirects
- reveal animations not triggering on page load
- simplify hero headline to white + gradient accent
- add read_locations scope + reduce GraphQL page sizes
- service client cookie fix, login password mode, balance column
Added
- apply font-mono to all tabular-nums + create <Num> component
- overview: KPI cards with sparklines, time tabs, pace bar
- replace plain pace text with MetaBadge pill on KPI cards
- move notification bell to sidebar, remove desktop topbar
- inventory: Drop Detail page + is_restock field
- inventory: Phase 1 follow-up — categories, design polish, demo fixes, simplify
- inventory: Phase 1 — Inventory Module
- style(inventory): status bucket counts use font-mono instead of font-pixel
- style: shift warning palette to true orange (hue 50-62, was yellow-green/amber)
- style(inventory): stronger KPI card hover — solid border, /15-20 bg, lift
- style(inventory): channel names uppercase (DTC, B2B)
- style(inventory): sell-through rate gets a pace-zone-colored mini progress bar
- shopify: Shopify GraphQL integration + Settings UI
Fixed
- Android hamburger menu not opening
Added
- changelog: timeline UI — cards + vertical connector
- favicon + replace arbitrary Tailwind values with tokens
- icons: replace lucide-react with @phosphor-icons/react
Fixed
- overview: MTD label on vitals + chart hydration fix
- mobile-nav: use SheetTrigger for reliable mobile touch handling
Added
- marketing: Phase 3 — Performance Tracker
- marketing: Phase 1 — Calendar + Kanban board
- cash: Phase 3 — Cash Intelligence
- cash: Phase 2 polish — refresh button, scenario impact, variance, journal filters, Shopify Capital
- cash: Phase 2 — 14-week forecast, Shopify pull, CSV import
- cash: Phase 1 — Cash Command Center
- ads: Phase 4 — MER, cron, CSV, performance polish
- ads: Ads Intelligence Phase 1+2 — Performance, Library, Settings
- dark sidebar with white active pill using design system tokens
- add changelog page with typography rendering and sidebar link
Fixed
- increase sidebar inactive text from neutral-400 to neutral-300 for legibility
- lighten sidebar to neutral-800, fix disabled opacity and collapse button tokens, unify shell bg with sidebar
- sidebar background uses bg-sidebar token not bg-shell