Release Notes — June – July 2026
Spans 2026-06-10 → 2026-07-16. 16 commits across five themes: records as stage requirements (account, contact and products pickers when a lead or opportunity changes stage), two new import wizards (products and opportunities), a run of spreadsheet import fixes, an RBAC backfill for roles created before newer modules existed, and project subtask fixes.
One tenant migration ships in this period. Run it on every environment with:
npx ts-node apps/api/src/scripts/run-tenant-migrations.ts
| Migration | Adds |
|---|---|
| 084 | Backfills missing permission buckets — products, project_time_entries, targets, gamification, forms — on roles that never had them. Regular roles get view-only; admin roles (level ≥ 90) get full access. Roles that already have the bucket are untouched. |
Records as Stage Requirements
The Stage Fields modal (Lead Settings / Opportunity Settings → Stages → configure required fields) has a new Records section:
- Account and Products — for lead and opportunity stages.
- Contact — for lead stages.
When a user moves a record into such a stage, the change-stage modal shows the same searchable account and contact pickers and product picker used elsewhere in the app, instead of plain dropdowns. The picked values are saved with the stage change. For opportunities, each selected product becomes a line item (quantity 1, the product's base price) without duplicating lines that already exist.
The old plain-dropdown Account/Contact items were removed from the field picker; stages that already use them keep working.
See Pipelines & Stages, Opportunity Settings and Lead Pipeline & Stages.
New: Product Import & Export
- Import and Export buttons on the Products page, gated by the
products.import/products.exportpermissions. - A four-step import wizard: template download, upload, column mapping (auto-mapped, custom fields included), and duplicate handling — match on code, then name, with Skip / Update / Always import.
- Failed rows can be downloaded from the wizard or from Batch Jobs. Export writes
.xlsxusing the current filters.
New: Opportunity Import Wizard
- Three-step wizard on the Opportunities page, behind
opportunities.import. - Resolves pipeline, stage, account, primary contact, owner, team, priority, type and forecast category by name; supports record team members, tags and custom fields, plus default pipeline/stage settings.
- Duplicate handling: always import, or skip on the same name + account. Saved mapping templates, live progress and a failed-rows file.
Spreadsheet Import Fixes
.xlsximports and template downloads were failing at runtime — fixed (exceljs import).- Hyperlink, rich-text and formula cells imported as
[object Object]; they now import their displayed text. - CSV uploads are supported (later moved to a faster CSV parser — see the September notes).
- Account Import now saves mapped custom fields on accounts and contacts, and contacts get an Owner (Name or Email) column with a Team Name fallback.
See Import & Export and Account Import.
Contacts, RBAC and Projects
- Contact owner picker — the contact create/edit form has an Owner dropdown on the Other tab.
- "+ New" menu respects permissions — the header menu lists only modules the user can create, and hides when there are none.
- Project subtasks — subtasks (including subtasks of subtasks) nest under their parent in the project list view, and the list refreshes after a task is created or its status changes.
- Fix: transferring a user's projects no longer fails with an ambiguous
idcolumn.
See Roles & Permissions and Managing Projects.
Index of changes
dcfb11fextract AccountSearchableSelect + ContactSearchableSelect67c0969account / contacts / products as stage requirements (backend)1bebbefexpose account / contacts / products in StageFieldsModal11b3c34rich pickers in the change-stage modal47fe883qualify ambiguous id column in project transfer5624becnest subtasks under their parent in the task list40b99a1refresh project on task create + status change85ecf71recursively nest subtasks of subtasks4a45453migration 084 — backfill missing role permissions + gate header New button7a91c5aexceljs namespace import78485e2product import + export with mapping wizard620c06cdisplay text from hyperlink / rich-text / formula cellsf565b4fCSV uploads via exceljs csv reader7b7da0caccount import custom fields + contact owner2fa582eowner picker on contact create/edit5e24f84opportunity import wizard