Projects With One Invoice, Holidays & Time Off on the Calendar
Projects
Group related jobs into a Project from Job > Projects, or pick the Project on the job form. A project can include jobs for different customers
Every project gets its own invoice number (PINV-0001, PINV-0002, and so on) and one customer link that lists all of its job invoices, paid ones included, with running totals for Total Invoiced, Paid and Amount Due
Customers can click any job on the project page to open that job's own invoice, and pay the whole balance at once with Pay Balance Now
Send Invoice emails or texts the project link, and Record Payment takes one payment for the project and splits it across the unpaid job invoices, oldest first, with the option to change the split
Paying a job invoice on its own still works and lowers the project's amount due. Each job invoice page shows a link back to its project
The project page and PDF follow your Portal Template setting, Default or Modern
Projects can be put On Hold, Completed or Cancelled from the project form
Calendar
Add Holidays, Time Off and other events that are not jobs. They show on the Jobs calendar as striped bars and on the dashboard calendar for everyone
Import your country's public holidays in one click, including your state or province's own holidays, for customers in the USA and Canada. Holidays for this year and next year are also added automatically every month
When scheduling a job on a holiday, or with an installer who is off that day, the Schedule Job window shows a warning. The job can still be scheduled
The dashboard calendar's New menu now creates an Activity, Time Off or Holiday for the selected day, and its color legend sits below the calendar
Holidays & Time Off can also be found in the To-Do app
Boards
Redesigned cards with larger, easier to read text on the Jobs, To-Do, Procurement, Services, Documents, Customers and Products boards
Each card shows its key details at a glance, such as the schedule, project, amounts and assigned people, with a colored edge for its stage or priority
The Jobs list now shows the Project column
New
Set Approved Estimates Back to Draft, With Saved Revisions
Estimate
A new Set to Draft button on approved estimates moves the job back to Estimate Created, so the estimate can be edited and approved again. You are asked for a reason, which is also posted in the chatter
Before going back to draft, the approved estimate is saved as a locked revision (Rev 1, Rev 2, and so on) with all of its material, labour, equipment, subcontractor and permit lines, totals, terms and customer signature. Revisions can never be edited or deleted
When a job has earlier revisions, a single line at the top of the Estimates tab shows how many there are, with a View revisions link to open them
Payments already received stay on the job. The invoice is built from the revised estimate and deducts everything the customer has already paid
Set to Draft is available while the estimate is approved and before the job is queued, as long as no partial invoice has been created
Multiple Estimate Options
Setting an approved estimate back to draft reopens its options, so any of them can be selected for approval again. Options you rejected yourself stay rejected
The Add Options button label now stays on one line
Fixed
Restoring Lost Jobs Works Again
Estimate
Fixed an error that stopped a Lost job from being moved back to Estimate Created once its estimate had been approved
Restoring keeps all of your product, labour, equipment, subcontractor and permit lines; only the locked copy of the approved estimate is cleared, so the estimate can be edited and approved again
Improved
Edit Costs and Prices Straight From the Lists
Products & Services
Cost, Markup Factor, Sale Price and Taxes are now visible and editable directly in the product and service lists, so a price review no longer means opening every record in turn
Typing a cost recalculates the sale price from the markup factor, and each row carries an arrow to open the full record when you need it
The separate Product Pricing screen has been retired, as the main Products list now does the same job
Procurement
The Needs Ordering list shows cost, markup factor and sale price alongside the stock figures, so buyers can check pricing before raising a purchase
Inventory
Adjust Inventory now opens with the product already filled in and locked, instead of asking you to pick it again
Getting Started
The onboarding checklist gained two steps, customising your email templates and your SMS templates
New
Bot Protection on Website Forms & Account Safety
Website
Website contact forms are now protected by Cloudflare Turnstile, which blocks bot submissions without asking real visitors to solve anything
Users
Built-in system accounts are hidden from the user list and can no longer be edited or deleted, and the home dashboard gained a 'Create users' onboarding step
Company
Creating extra companies is disabled, since each subscription runs a single company
New
Bot Protection on Sign In & Voucher Codes at Checkout
Sign In & Registration
Login and registration are now protected by Cloudflare Turnstile, a privacy-friendly human verification that stops automated bot signups; most users simply see a brief 'Verifying...' check with no puzzle to solve
Verification is enforced on the server side of the authentication service, so automated scripts cannot bypass it by skipping the form
Checkout
Checkout now accepts voucher / promotion codes; click 'Add promotion code' on the payment page and the discount is applied to the subscription immediately
When a code covers the full amount, no credit card details are required to complete the subscription
Fixed new procurement orders showing 'New' as the reference instead of a real PO number; the PO sequence (PO00001, PO00002, ...) now generates correctly, and any existing orders left as 'New' are backfilled with proper numbers on update
Backups
Daily database backups now save reliably inside each instance's own data storage; this removes the folder-permission and missing-directory errors that could silently stop the nightly backup from running
Backups continue to be kept for 7 days on the instance, ready to be synced offsite
Timesheet
Timesheets are now entered as hours only and organised as a day-sheet with Regular, Shop, and Stat lines; each day rolls up into Regular, Overtime, Shop, and Stat hour totals
Overtime is calculated automatically using Alberta's 8/44 rule (hours over 8 in a day or over 44 in a Sunday-to-Saturday week, whichever is greater), so staff never enter OT manually
Statutory holidays come seeded with Alberta dates and a daily process auto-generates an 8-hour Stat block for eligible employees; bookkeepers can add or edit the holiday list
Fixed the Send Purchase Order wizard pre-filling the greeting as 'Dear PO00009' (the order reference) instead of the supplier's name; the default body now reads 'Dear <first name>' pulled from the supplier record, with a 'Hi' fallback when the partner has no name on file
Fixed procurement emails being delivered twice to the recipient; the wizard now logs the message to the chatter as an internal note (mail.mt_note) and the actual send goes through a single mail.mail.create().send(), matching the pattern the estimate and invoice wizards already use
Email & SMS Templates
Removed the hardcoded product-brand mentions from seeded email and SMS templates; references like 'Postech Screw Piles' and 'Thanks for choosing Postech' now use {{ company.name }} so each tenant's own company name is rendered automatically
Affected templates: Job Estimate - New Customer (subject + body), Job Post Job - Thank You (subject + body + signature line), Estimate Ready SMS, and the legacy Send Estimate SMS
Existing tenant-customised templates are not overwritten by the seed (noupdate flag), so dealers who have edited their templates keep their wording; the change only affects fresh installs and the seeded examples
New Restore to Estimate button on jobs marked Lost; reverts state to Estimate Created and clears the lost reason so a customer who comes back can pick up where they left off
New Return to Queue button on Job Scheduled jobs; clears the schedule dates, installer assignments, and any open Field Service todos so a delayed job goes back into the unscheduled pool without leaving stale calendar entries behind
Manual payment recording (Approve Estimate, Record Manual Payment, and Estimate Manual Payment wizards) now posts a Manual Payment Recorded note to the job chatter with amount, type, method, date, and any reference / notes so the audit trail is captured automatically
Estimate & Invoice Portal
Customer-facing portal URLs are now /estimate/<id>/<token> and /invoice/<id>/<token>; the legacy /postech/... links from older emails keep working indefinitely so nothing already sent breaks
New You Saved row in the totals box on both estimate and invoice portals (legacy and modern templates) shows the total discount in dollars whenever any line carries a Disc. %, including per-option estimate cards and per-invoice totals on Invoice 2 / 3
Discount column on the portal now shows for both Materials and Labor whenever any line on the document has a discount; previously the Labor table could hide the column even when discounts were applied elsewhere
Calendar
Job calendar event titles now render as Customer Name - Job Name (eg Jennifer Forrester - Deck Addition @ 9 Fir Close) instead of just the job name; the same format applies to Field Service and Follow-Up todos linked to a job
Order Template
Applying an Order Template to an estimate no longer shuffles sections and lines around on save; sequence values are now assigned uniquely above existing lines so the order you see while editing is the order you get after saving
Follow-Up Activities
Follow-up reminder activities created by Send Estimate / Send Invoice now use the date the user actually picked in the wizard; previously the reminder could land one day before the chosen due date because of how the start/end time was computed
Sending an estimate or invoice now closes any prior open follow-up reminder for that job before creating the new one; previously a re-send could leave stale activities behind, making it look as if the new due date had been ignored
SMS Templates
Hard-coded SMS bodies for Post Job Thank You, Day Before Appointment Reminder, and Mark as Lost cancellation (installer + customer) are now editable records under Apps -> SMS Templates
Calendar drag-and-drop reschedule SMS now reuses the existing Field Service Schedule - Installer (Reschedule) template so wording stays consistent with the Schedule Job wizard
Naming
Main app menu renamed from Postech to Job; the same rename was applied to module names (Job Theme, Job Demo Data, Job CRM, Job Main Dashboard, Job Settings, Job Documents, Job Dashboard, Job Timesheet, Job Website Bridge, Job SaaS Connector), settings section title, model descriptions, payment journal labels, sequence names, paper format, email and SMS template names, and the user-visible labels on the user-preferences and timesheet screens
Technical record URLs and model names (eg postech.job in /web?model=...) also migrate to fsm.* on existing databases via an automatic pre-migration script so chatter, followers, attachments, M2M relations, and tax/discount data are all preserved through the rename
New Create Partial Invoice button on the job header, visible in Estimate Approved / Job Unscheduled / Job Scheduled, restricted to the invoice group; lets staff bill engineering, test piles or other pre-completion services without waiting for job completion
Invoice tab now appears whenever a partial invoice exists, even before the main invoice is created; Invoice 1 sub-page stays hidden until Create Invoice fires so users only see what is actually billable at each stage
Estimate / Invoice line tables (Materials and Labor, including all option tabs and Field Service / Invoice) no longer auto-create a new product or service when an unmatched internal reference is entered and Enter is pressed; users must explicitly use Create and edit to add a new record
Show Job Documents and Internal Documents fields into Field Service so installers see every attachment relevant to the job in one place
Vendor Invoice field on the procurement Other Info tab now uses a proper file-upload widget with filename preservation, replacing the broken binary input that did not surface an Upload button
Profit Calculator
New Overhead row sits between Total COGS and Revenue in all three Profit Calculator panels (Confirmed Estimate, every Option 1-5, and Invoice); reads the Target Overhead (%) field from Revenue Settings and shows the dollar amount being deducted
Profit is now Revenue minus COGS minus Overhead so the headline number reflects what actually flows to the business after indirect costs
Margin (%) renders as a coloured badge: green when current margin is at or above the Target Gross Margin (%) from Revenue Settings, red when below, no colour when the target is blank; a small 'target X%' caption sits next to the badge for quick reference
Email Signature
{{ user.signature }} placeholder is now resolved everywhere it appears in mail templates rendered by the Send Estimate, Send Invoice, Send Procurement and Send Post-Job wizards; pulls the HTML signature from the user's Preferences
Send-email wizards auto-append {{ user.signature }} to the body when a template is selected and the placeholder is not already in the template, so legacy templates carrying a hardcoded sign-off still pick up the per-user signature
Seeded mail templates (Estimate New Customer, Existing Customer, Followup, Invoice, Purchase Order, Post Job) replaced their hardcoded user.name / phone / website / company.name block with a single {{ user.signature }} block; fresh installs ship with this layout
Schedule Wizard SMS
Hardcoded installer and customer scheduling SMS bodies removed; the Schedule Job wizard now reads from postech.sms.template records so staff can edit the wording from the SMS Templates menu without touching code
Four seeded templates ship out of the box: Field Service Schedule - Installer (New), Installer (Reschedule), Customer (New), Customer (Reschedule); the wizard auto-picks the right pair based on whether the job is being scheduled for the first time or rescheduled
Wizard renders {{ first_name }}, {{ object.name }}, {{ object.client_info }}, and {{ date_range }} placeholders at send time so the messages personalise per recipient
Portal & Preview
Estimate portal sign-prompt copy updated to 'Please sign below to approve this estimate and accept the conditions of installation.' on both classic and modern templates
Estimate Preview and Invoice Preview tabs in the job-form bottom panel gain a Print button next to Refresh; opens the browser print dialog against the iframe content so staff print the customer-facing view directly without any backend chrome
Settings & UI
Preferred View setting in User Preferences gains a Calendar option alongside List and Kanban; the chosen view becomes the default for every menu action whose view list includes it, with graceful fallback for actions that do not ship a calendar view
Preferred view fix for mobile: the action service patch now reorders action.views and view_mode at load time and falls back to switchView after open, so the preference applies on small screens (emulated and real)
Issued By dropdowns on Postech Job and Estimate Options now exclude the notifications system user via a login != 'system' domain so it cannot accidentally be selected as the deal owner