FSManager 0.9 — pre-release
The 0.9 series is FSManager’s internal release-candidate line, run on the production hosting stack before the customer-facing 1.0 launch. No paying tenants are on this line — these notes are here primarily so the in-app What’s New dialog has something to show on the demo environment, and to dress-rehearse the customer-facing release-notes flow ahead of 1.0.
If you’re a paying customer, the release notes you care about live on FSManager 1.0.
What this line covers
The 0.9 deploys exercise everything that 1.0 will ship: multi-tenant infrastructure, Stripe-driven signup, the Admin app for tenant management, Cloudflare Access on the admin surface, automated GitHub Actions deploys, the production SQL and storage stack, Sentry error tracking, and the live demo at demo.fsmanager.co.nz . The feature surface itself is the Lite tier that 1.0 will ship — see FSManager 1.0 — Highlights for that scope.
Patches
0.9.7 — 2026-06-14
A polish-and-hardening release on top of 0.9.6, ahead of a wider demo push. The headline for admins is self-service subscription management; for everyone there’s a round of Job Manager dashboard, reporting, and onboarding improvements; and a lot of behind-the-scenes work on demo reliability and error tracking.
For all users (demo environment)
- Completed jobs auto-archive off the dashboard. Set a number of days in Job Settings and finished jobs drop off the Job Manager board that many days after they complete, keeping the view focused on live work — with a Show Archived toggle to bring them back any time. Off by default; the demo runs a 30-day window.
- Job Manager dashboard polish. Import Job Items is now on the row right-click menu; after you stop and save all your task clocks the board offers to clock you out for the day; a personal setting can show just the rep’s initials in the Sales Rep column; and JobPart/item lists are colour-coded (cancelled rows shown in italics).
- More reports. Two task-productivity reports — All Completed Tasks and Completed Tasks by Product Type — plus Open Quotes With Comments (open quotes grouped by sales rep with cost / sales / margin and the latest contact note, and a one-click “my open quotes” version). Production reports gain a preset date-range dropdown and a multi-select factory-worker filter.
- Bulk customer import from CSV. A new Import Customers action bulk-creates customers and their contacts from a CSV — including Xero’s contacts export format. Duplicates are skipped and reported; existing customers pick up any new contacts.
- Log a contact straight from a Job. An Add Contact Log quick-action records a customer call or email directly on a Job (it still appears in the CRM history) without navigating back to the opportunity.
- Smarter timesheets. Time claims can be edited from the Additional Time Manager (limited to the claim type until approved), and automatic sign-out now borrows a worker’s last working day’s hours when they have no rostered finish time.
- Editable job-part numbering. Job parts auto-number (P1, P2, P3 …) and the part suffix is now editable, so you can rename a part to suit — e.g. “B2L1” for Building 2, Level 1.
For admins
- Manage your subscription in-app. The Manage Subscription action on Company Settings is now an in-app popup, not just a jump to the billing page. Change your user-count band up or down within your plan (applied immediately, billed fairly — upgrades invoiced pro-rata now, downgrades credited to your next invoice; downgrading below your active-user count is blocked with a prompt to deactivate the extras first), update payment details or cancel via the Stripe portal, or register interest in Full/Pro (which sends a note to our team, since those tiers aren’t on sale yet).
Behind the scenes
- Demo usage insights. The Admin app now tracks how often each visitor opens the demo and how long each session lasts, on a new Demo Access analytics page.
- Demo reliability. An external health-check watches the nightly demo reset and raises an alert if it ever stops running — a safety net on top of the existing retry-and-alert.
- Cancellation awareness. When a customer schedules a cancellation, our team is alerted during the wind-down window (the customer keeps full access until their paid period ends).
- Sharper error tracking. Admin-side and demo-environment error reporting was tightened so genuine issues surface faster and routine noise is filtered out, and the tenant provisioning status now accurately reflects each stage of setup.
0.9.6 — 2026-06-11
A polish-and-reporting release on top of 0.9.5. The headline is a rebuilt Import Items wizard for JobParts; alongside it, a broad reporting pass, richer demo data, and a round of maintenance, ordering, and site-glazing fixes.
For all users (demo environment)
- Import Items is now a review wizard. Importing items onto a JobPart is no longer a blind one-click action. It now walks you through two steps: pick the source document (it lists every file attached to the JobPart, its Job, and the winning quote revision, auto-classifies them, and pre-selects the import file plus labour/BOM PDFs — or upload a new one), then review an editable preview showing exactly which items will be added, replaced, or removed before anything is applied. Applying it also rebuilds the labour tasks and recomputes the JobPart budget automatically, keeping any pinned cost lines.
- More production reports. A new Factory Performance dashboard, plus ported production analytics — Job Hours by Week, Job Productivity, Lead Time, and Jobs by Stage — and an Additional Tasks summary toggle. Several estimator/quote-performance reports were corrected (e.g. cancelled-job reversals are now excluded).
- Ordering & paperwork. The Order Information screen gains a Documents grid (row-click opens the document), Mark Received can capture a packing slip that’s filed against the job, supplier and order-due dates flow through correctly, and lead-time/due-date fields stay in sync.
- Maintenance. Maintenance requests show a computed site address, a setup check for a default assignee, and an Open Job shortcut.
- A round of HR/timesheet, leave-calendar, and contacts fixes (including the Additional Time Manager and a calendar that now populates on first open).
Behind the scenes
- Richer demo data — the demo now seeds job certifications, leave applications, warranty/PS3 documents, quote numbers on priced revisions, and realistic additional-time claims, so the demo environment better reflects a real tenant.
- Smoother deploys — production deploys are now zero-downtime (the new version is warmed up and swapped in, so the first user after a deploy no longer waits on a cold start), a full build-and-test gate runs before every release, and each tenant database automatically gets a long-term backup policy when it’s created.
0.9.5 — 2026-06-04
The biggest 0.9 release so far. Headline additions are a full payroll module, a Job Manager time-claiming overhaul, Non-Conforming Product tracking, the Factory Paperwork Manager, and Site Glazing scheduling — plus a major behind-the-scenes move of tenant provisioning into the Admin app.
For all users (demo environment)
- Payroll. A complete pay-week workflow: open a pay week, run it to roll up everyone’s claimed hours for the week, review, then export a CSV in your payroll provider’s format (MYOB, Smart, Smartly, PayHero or Crystal) and lock the week so it can’t be changed. Employees missing a payroll code are flagged before export so you’re not chasing blanks afterwards.
- Job Manager — reworked time claiming. Workers can run several task clocks at once; stopping them all splits the elapsed time across the tasks automatically. There’s a new retrospective Bulk Claim mode for entering a block of past time proportionally across tasks, an idle claim timeout with a visible countdown (and optional auto-save), a clearer Select Worker picker (always PIN-protected), a live “on the clock” indicator across the board, and a My Tasks tab showing what you’ve claimed today. You can also add an ad-hoc item straight from the dashboard.
- Non-Conforming Product (NCP). Record a non-conforming product against a job, part or supplier, attach photos/paperwork, and notify the supplier or mark the replacement received. While an NCP is open, the affected job/part is highlighted on the dashboard and held at its stage. An NCP can be converted into a maintenance job in one step.
- Factory Paperwork Manager. Scan a job’s factory paperwork as one PDF and the app splits and files each page against the matching task, glass or reveal — then view it back from the dashboard.
- Site Glazing. Schedule site-glazing work with a glazier (your own staff or a glazing supplier), generate a request form from a template, and get in-app reminders as the install date approaches. Jobs needing site glazing are held at the right stage until it’s complete.
- Attachments & document templates. Attachment categories can now be collapsed, with a full-screen search overlay for finding a file fast. Document templates can be uploaded, downloaded, copied, and edited from a blank starting point directly in the app.
- Capacity view. The dashboard capacity chart opens in its own window with a per-job tooltip and a bar/line toggle.
For admins
- Provisioning, demo reset, and migrations now run inside the Admin app. Creating a tenant, resetting the demo, and applying database migrations all run directly in the Admin app now (previously they launched a separate copy of the main app behind the scenes). The Admin Database Migrations page applies pending migrations to every tenant with one click, and the Tenant dashboard shows each tenant’s migration status, setup-check results, and last-login at a glance.
- Scheduled demo reset runs automatically at 3am NZ time and has been hardened against the intermittent failures seen earlier in the 0.9 line.
- Notification settings moved into their own dedicated settings page (out of Job Settings).
Behind the scenes
- A deep reporting pass, including a new per-month-per-rep Quote Performance Summarised report, and a refresh of several HR/timesheet reports so existing tenants pick up the latest layouts.
- Timesheet, break-reconciliation, and multi-tenant data-correctness fixes across the claiming and background-recalculation paths.
0.9.4 — 2026-05-23
The release that brings the billing and trial flow end-to-end on the 0.9 line — banner, reminder email, Stripe Customer Portal — alongside a substantial round of jobs, security, and demo-reset polish.
For all users (demo environment)
- Trial-ending banner. When a tenant is within 7 days of its trial end date, a strip appears at the top of every page with the days remaining. Colours grade as the date approaches: blue for the first few days, amber as it gets closer, red for the last day. Admins additionally see the upcoming charge amount and a Manage subscription button that opens the Stripe-hosted billing page.
- Site contact on Job, restructured. The single free-form “site contact” field is now split into name + email + phone, with a manual-entry toggle for the case where the site contact isn’t one of the customer’s listed contacts. Admin-managed fields are locked once the Job is set live.
- Pre-production ordering — defaults that match the spec. Mark Ordered on a Glass task pre-fills the supplier and lead time from the JobPart’s GlassType; Hardware tasks pre-fill from the HardwareType; everything else falls back to the chosen supplier’s standard lead time plus any current supply-delay days. A new Supplier Order Number column carries the supplier’s reference and cascades from the aggregate task onto child item-tasks. The Order Information popup gets an inline attachment uploader — drop a quote or order confirmation straight onto the task.
- Order Information popup — fits the screen now. Opens at 95% width and height (matching the Budget popup) and shows only Ordering rows; Receiving has its own worksheet so it doesn’t double up. The per-row “View Order Information” action is hidden when you’re already inside the popup.
- Timesheets — clearer hours format. Work hours now render as
0h 55minstead of0:55to disambiguate from columns that show decimal hours. Sign-in / sign-out time edits use a true time picker. - G13 Opportunities by Source — optional date filter. The report now accepts an optional Sales Date range so you can narrow the source breakdown to a specific period.
- G3 Print Budget — visible to Sales, Office, and Production. A multi-PR debugging saga concluded; the Print Budget toolbar action that disappeared for non-admin roles in earlier 0.9 builds is back.
For admins
- Database Migrations dashboard in the Admin app. New page at System → Database Migrations. Lists the system DB plus every tenant DB with applied / pending migration counts and a Run All Pending button. Replaces the old command-line
--migrate-allstep for release days — no more SSH or Kudu access required. Per-DB rows expand to show the applied + pending migration IDs, and a Re-run button is always available even on already-current DBs. - Notification emails on new tenant signups. When a Stripe checkout completes and a new tenant arrives, the admin recipient gets two emails: one when the provisioning worker picks the job up, one when it completes. Recipient configured per environment via a new App Setting; missing setting = silent no-op (no failure spam).
- Demo reset is more reliable. The overnight demo refresh used to fail intermittently with Azure SQL “single user mode” or “fsm_app is not able to access” errors. The recreate flow now explicitly kills active sessions on the demo DB before dropping it, then grants the
fsm_appuser db_owner on the fresh DB before the migration / seed step runs. Demo employees ship with a shared PIN (2026) so the kiosk view shows them. A comprehensive specification catalogue (Products, Glass, Colours, Hardware, Suppliers) is seeded so the demo no longer presents empty pickers on first sign-in. - Cancel Job / Cancel JobPart restricted to admins. Was visible to all roles in earlier 0.9 builds; now gated.
- Tenant Settings page — Manage Subscription button. Toolbar action on the Tenant DetailView opens the Stripe Customer Portal for the current tenant. Lets admins update payment details, view invoices, or cancel. Tier changes (more users, upgrade from Lite to Full to Pro) deliberately stay out of the portal — those are a custom in-app flow planned later.
Behind the scenes
- Trial reminder email pipeline. Stripe fires
customer.subscription.trial_will_endthree days before each tenant’s trial converts; FSManager Functions queues aTrialReminderJobrow; the Admin app’s background worker sends a warm, personal email pointing the tenant at the Manage Subscription button. (Requirescustomer.subscription.trial_will_endto be subscribed in the Stripe Dashboard webhook config — a manual one-time setup step.) - System database → tenant database sync. A long-standing wiring gap meant Stripe webhook updates to the system database (license tier, trial dates, suspension status) weren’t propagating to each tenant’s own database. Per-tenant features that read from the tenant DB — the new trial banner, the existing suspension gate — would have seen stale data forever in production. Wired in for all subscription and invoice events. Caught during local pre-release testing.
- Tenant database cost incident fix. New tenant databases are now created at Standard S0 (~NZ$25/month) instead of inheriting the Azure platform default (General Purpose Gen5 2-vCore at ~NZ$370/month each). The SKU is driven by configuration so future SKU changes are a config flip, not a code change.
- Pre-release recovery from the 0.9.3 revert. An earlier release was reverted wholesale due to a tenant-provisioning regression; this release forward-ports the safe content from that revert (controllers, Model Editor edits, the SQL grant script, infrastructure helpers).
- In-app help — F1 hotkey + embedded drawer. Pressing F1 anywhere now opens a context-aware help panel that fetches the matching
docs.fsmanager.co.nzpage based on the current view. - Architecture ratchet tests. Two new build-time guards: every Stripe webhook handler that writes synced tenant state must call the propagation helper (preventing the system-DB-to-tenant-DB sync gap from re-appearing); and every Settings-pattern entity has exactly one row per tenant (preventing duplicate-Settings drift).
0.9.2 — 2026-05-20
The release that put tenant provisioning on solid ground on the production stack, plus a deep stabilisation pass on the reporting suite.
For all users (demo environment)
- Reports — a stabilisation pass across the sales suite. Customer Quote Performance, Opportunity Conversion, Open Tenders, Sales By Category, and Sales vs Target all got layout and data-accuracy fixes — correct grouping and detail rows, accurate margin and attainment totals, and the pie-chart reports (Opportunities by Source, Lost Opportunities) no longer error on render. Landscape layouts and a handful of mislabelled fields were also cleaned up.
- Copying a predefined report is now correctly limited to users who have permission to create reports, and a copied report keeps its original category and is clearly named (rather than showing a raw identifier).
- Setup wizard — step 2 no longer blocks. Required-field validation was firing across the whole wizard at once, so untouched later-step fields could stop you advancing past the company-details step. Validation now applies per step.
Behind the scenes
- Tenant provisioning no longer crashes under memory pressure. The Admin app used to provision a new tenant by launching a second copy of the main application as a separate process — which, loading the full framework stack twice, ran the production host out of memory partway through. Provisioning now runs as an in-host call to the main application, with live progress streamed back to the Admin screen (“Building schema…”, “Running migrations…”, and so on). This is the root-cause fix behind the provisioning failures seen in the earlier 0.9 deploys.
- Auto sign-in reliability. An eight-PR investigation into an intermittent error during automatic kiosk sign-in finally landed its root-cause fix — a framework query-compiler quirk triggered by how one security relationship was declared. The earlier symptom-level workarounds are no longer load-bearing.
- Faster deploys. The CI pipeline now builds and deploys each app in parallel and caches package restores, cutting warm-build time noticeably.
0.9.1 — 2026-05-20
For all users (demo environment)
- JobPart budgets now have a multi-version history. When a quote is won, the quote-phase budget is copied onto the resulting JobPart, and any subsequent budget revisions are kept alongside it with one designated as the current budget. A new Set Current Budget action on the nested Budgets list lets administrators flip which revision is in effect.
- Pre-production ordering got a substantial rework. The Goods To Order / Goods To Receive worksheet now opens a job-level Order Information popup when you click a row — showing every order row across the whole Job, plus an attachments panel that surfaces every Order or Packing Slip attachment attached to the job’s parts and tasks. Order documents can now be attached directly to the task being ordered. Aggregate tasks no longer triple up in the worksheet when they have per-item children — only the aggregate row appears, and marking it Ordered or Received cascades the stamp onto every child item automatically.
- Lead times on Mark Ordered now pre-populate based on the task’s material — Glass tasks use the GlassType lead time, Hardware tasks use the HardwareType default, Aluminium and Reveals fall back to the supplier’s standard lead time plus any current supply-delay days.
- CRM Add Revision now correctly carries pinned optional extras forward to the new revision. (A regression introduced earlier in the 0.9 cycle had been dropping them.)
For admins
- Tenant provisioning from the Admin app now works against the production Azure SQL server. The previous behaviour failed with
fsm_app is not able to access the database "master"when issuingCREATE DATABASE. The fix uses the Admin app’s managed identity for the master connection and creates thefsm_appuser inside each new tenant database so the subsequent migration / seed step can connect. This unblocks both manual Admin provisioning and the Stripe self-serve path that 1.0 will ship on. - Hardware import in the Admin app now sets the
HardwareSupplierNamecorrectly when importing dieholder hardware. (Previously left blank.) - Demo seed data is now richer — stage-gate fields are seeded on Jobs and propagate to their JobParts, and sample CRM contact-log activity is seeded so the dashboards aren’t empty on a fresh demo.
Behind the scenes
- Production hotfixes from the 0.9.0-rc1 shakedown are formally captured in this release: DevExpress eval-banner fix (license key now injected at CI time), Cloudflare Access JWKS retriever wired correctly so the Admin app’s 403s are resolved, and DevExpress reports’ Skia rendering engine now reaches the publish output (was missing the
Skia.dlland causing 500s on report generation). - Two new internal rules added to the developer playbook: never edit an EF Core migration’s body after it has been applied (always add a follow-up migration); and a clarification of the soft-delete column convention used in the framework so it can’t be misread.
0.9.0-rc1 — 2026-05-19
Behind the scenes
First-ever deploy to Azure. Brought the whole production stack online for the first time — App Services for the Blazor / WebApi / Admin / Functions apps, the system database, the deploy workflow, Cloudflare Access for the admin surface, DataProtection key ring on blob + Key Vault, and Sentry tracking. No customer-visible feature changes; this RC existed to shake out the deploy pipeline end to end before the 1.0 launch.
Help and feedback
This is a pre-release line — the 0.9 series is primarily an internal test bed. For anything urgent, email support@fsmdevelopments.co.nz.