Changelog

Track all updates and improvements to ZenBot

v0.2.22

A real run of the landing-page funnel on DEV kept the chosen plan through the ClickUp OAuth trip, then lost it on the last onboarding step: once the Telegram bot was verified, the visitor was sent to the dashboard. The Telegram step now returns them to the plan they picked (869f30ezx).

Follows v0.2.21.

v0.2.21

ClickUp returns from OAuth to a fixed /onboarding address, so the redirect carrying the plan picked on the landing page was lost there, and a finished onboarding sent the visitor to the dashboard. Onboarding now remembers the target for the browser tab and returns the visitor to the chosen plan once setup is done (869f30ezx).

A member without the admin role who followed a plan link was silently moved to Notifications. Billing now keeps them on the page and says that the organization admin changes the plan.

Follows v0.2.20.

v0.2.20

A tenant admin whose organization was never connected reached the Stripe checkout with a plan picked on the landing page. The billing page acted on the deep link as soon as it mounted, while the only onboarding check was a client effect in the sidebar, and the checkout won that race.

Whether setup is still needed is now decided in the /app layout, on the server, before anything renders. The detour to /join or /onboarding keeps the chosen plan, which it previously lost because the billing page had already stripped it from the URL (869f30ezx).

Follows v0.2.19, which carried the plan through registration and login.

v0.2.19

A visitor who picks a plan on the landing page now reaches its confirmation whatever path they take in. The login link on the register page keeps the target, billing sends someone without an organization to create one instead of dumping them on Notifications, and /join and /onboarding return them to the plan afterwards (869f30ezx).

Follows 869eyttcg, which carried the billing period out of the landing page, and 869eyu05r, which sent signed-out visitors to /login.

v0.2.18

Signed-out visitors on any /app path now reach /login instead of the rendered application shell, carrying the URL they asked for so the plan picked on the landing page survives the login (869eyu05r).

The billing period chosen on the landing page now reaches the confirmation dialog, which used to always open on Monthly (869eyttcg).

v0.2.17

ClickUp 869etga4q.

  • charge.refunded and charge.dispute.created are handled; before this nothing was subscribed to either
  • refunded token pack: the batch is taken back in proportion to the refund; tokens already spent are recorded as refundShortfall on the purchase instead of driving the balance negative
  • full refund of the current subscription invoice ends the plan and resets the allowance; a partial refund or one against an older invoice leaves the plan in place and is only recorded
  • chargeback unwinds like a refund and suspends the account

234 integration tests pass.

v0.2.16

Closes the QA round under ClickUp 869eh1e6j.

  • money values Stripe cannot charge are refused at Save (869ej2uw5, 869ej4q0w)
  • editing a synced plan/package invalidates its Stripe price, and checkout re-checks the price before opening (869ej3ryj)
  • subscriptions store the price actually charged, so a subscriber sees their own number (869ej4aky)
  • duplicate plan slug is refused, and an existing one fails loudly instead of activating the wrong plan (869ej54eu)
  • token allowance and usage stay coherent after a downgrade, including a plan that grants 0 tokens (869ej4dqy)
  • "upgrade to a paid plan" no longer shown to someone already on one (869ej26b1)
  • admin: Subscriptions tabs and folded Stripe sync fields (layout only, data unchanged)
  • dev-only billing test panel, disabled unless ENABLE_DEV_BILLING_PANEL=true

227 integration tests pass.

v0.2.15

Money-path: SERVER_URL checkout redirects, USD adaptive-pricing off, idempotent payment_failed, wired past_due, downgrade keeps tokens (zen-tests model), cancel-at-period-end + reactivate, portal return_url fallback. Billing-events audit + unified Billing History page. Admin validation with clear messages. UI redesign on design tokens. Real-Stripe test suite (13).

v0.2.14

Rebuild with the changelog @ts-expect-error restored. Ships test Stripe publishable key for tester QA.

v0.2.11

Billing: Stripe split into an operational runtime key and a catalog admin key (least-privilege). Subscription plans auto-provision their Stripe Product and monthly/yearly Prices from the admin on save. Webhook handlers read both old and new (2026 API) event shapes. Adds a Google sign-up button on the register form and points the landing Get Started button to /register.

v0.2.10

Fix Asana 403 on listing projects: request teams:read (needed to read projects under teams in an org) and stories:read (task comments). Requires enabling both scopes in the Asana app developer console (OAuth > Permission Scopes); existing Asana connections must reconnect.

v0.2.9

Resolves the remaining medium and low findings from the project audit: token-purchase webhook idempotency and ordering, no duplicate token balances, correct proration on downgrade, inline subscription cancellation, tighter access control on notifications/media/tenants/ticket collections, bot container restart picks up fresh tokens, hardened set-cookie/cron/asana/clickup routes, and a batch of frontend correctness fixes (open-redirect, upload awaiting, double-submit, broken link, object-URL leaks).

v0.2.8

Closes the critical and high findings from the project audit: lock the user roles field to app admins (was a public admin-registration hole), authenticate the billing transactions endpoint, case-insensitive invite email matching, require tenant-admin on provider/token routes, stop workspace-select from wiping provider tokens, and move the Statistics redirect out of render.

v0.2.7

Require at least two alphanumeric characters in an organization name, so a mostly-special-character name with a single stray digit is rejected while normal names still pass.

v0.2.5

Tenant role model

  • User = bot sysadmin (Dashboard/bot control, Employees, Groups, History, Statistics); Admin = owner (+ Bot Customization, Manage People, Billing).
  • Fixed: a regular member could assign admin roles / edit org settings & provider tokens. Roles, tenant settings and secret tokens are now admin-only (server + UI).

Auth

  • Redesigned split-screen login/register with password policy + strength meter, show/hide, placeholders; inline wrong-password/lockout errors; register submit gated on valid form.

Validation

  • Organization name must contain at least one letter/number.

Infra

  • date-fns dependency, pnpm allowBuilds, dockerode native externals, bot image auto-pull, ClickUp proxy path fix, stripe pinned to 10.x.
v0.2.3

Added live demo

v0.2.2

Added invite emails, and encryption to all restricted info in database (all private tokens)

v0.2.1
  • Fixed issue with importing employees due to missing tenant cookie.
  • UI Improvments.
v0.2.0

Task managers support

  • Added support for task managers, other than Clickup.
  • Added Asana task manager provider (beta)
v0.1.6

Enhacned Support system

  • Added base templates for all ticket types
  • Added better filtration on ticket list page
  • Removed selection ticket type from creation page
  • Added button to create each type of ticket
v0.1.5
  • Added parentTitle to variables
  • Support for conditional syntax for notification template for more advanced customization
v0.1.4
  • Group notification customization
v0.1.3
  • Added transaction field for Task history
v0.1.2
  • Small additions to Billing API endpoints
  • Extended API docs with all custom endpoints
v0.1.1
  • Fixed changelog automatic creation & added proper version in VersionTag
v0.1.0

First release with changelogs

  • Added changelogs
  • Removed some deprecated fields from database
  • Removed dead code from billing
  • Billing portal
  • Billing batches fixes ( not logged properly etc)
  • Small UI/code fixes