=== PaintClarity ===
Contributors: paintops
Tags: painting, contractor, estimates, scheduling, invoicing
Requires at least: 6.2
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 1.2.079
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Run your painting business from WordPress: quotes to invoices, crews, scheduling, customers, photos, profit reports, optional AI and card payments.

== Description ==

**PaintClarity turns your WordPress site into the back office for your painting business.** *(PaintClarity was formerly known as PaintOps. Same plugin, same team, same data.)* Build professional quotes, send them to customers who can view, e-sign, and pay a deposit online, schedule crews on a calendar, track every job from request to invoice to payment, and, on Pro, see your real profit per job, per crew, and per worker.

It was built by a painter, for painters. The quote builder understands painting scope: interior/exterior components, standard inclusions and exclusions, and the disclaimer language that keeps you out of disputes. Your data lives in your own WordPress database, not locked inside someone else's SaaS, and the free plugin is a complete system on its own.

= Quote to invoice, start to finish =

* **Quotes, estimates & bids**: a scope-aware builder with reusable inclusions/exclusions, itemized or lump-sum pricing, trade calculators that add their numbers straight to the quote, printable output, and email delivery. **Preview Online Quote** shows you exactly what the customer will see before you send it.
* **A professional customer page**: your customer opens a clean, branded page (your logo, your terms & conditions) and accepts by typing their name, an e-signature-grade record with timestamp. They can also decline with a reason, or ask a question, and you're notified either way. You see when the quote was viewed.
* **Acceptance converts the quote to a job automatically**, whether they paid a deposit online or you shook hands, and a "Mark as Won" button covers the phone call.
* **Invoices**: numbered invoices for the balance (full or partial), emailed or shared by link, payable online (Pro + Stripe) or marked paid for check/cash. Invoicing more than the job is billing asks first, so a number never slips past you.
* **Payments**: every job has a Payments page. Record cash, check, or in-person card payments and refunds, and see Billed, Paid, and Still Owed at a glance. A payment flips the matching invoice to paid, so balances always agree.
* **Sales tax, one or two**: a default rate plus any number of additional rates, each stamped on the job when it is created so a later rate change never rewrites old paperwork. Provinces that charge GST and PST (or GST and QST) on the same work can enter both, and quotes and invoices print each tax on its own line.
* **Communication History**: every email the plugin sent, every call or text link tapped, and every conversation you logged by hand, in one place per job, each marked by how much it can be trusted: sent by PaintClarity, link opened, or recorded by hand.
* **Receivables at a glance**: unpaid invoices surface on your dashboard with amounts and age, and a quote that has gone quiet shows up under Needs Your Attention with a one-tap follow-up email or text.
* **Request Performance**: how often your quotes turn into jobs, counted per job rather than per revision, so three rounds of edits before a yes count as one win, not two losses.

= Running the work =

* **Jobs, two ways**: a row view with Requests, Upcoming, Active, and Completed sections (unpaid balances right on the Completed section), and a **board / pipeline** view, Quote → Active → Completed, plus a lost-leads drawer with the customer's decline reason so you can revive the ones worth re-working.
* **Follow-up visits** without re-entering the job: schedule a callback, a punch list, or approved add-on work (with its own price and balance) against the original job in a short form. It lands on the calendar, the board, and the crew's phones like any other job.
* **Scheduling calendar** with crew filtering, worker badges, time-off, and a subscribe link for Google/Apple/Outlook. Add your own recurring holiday labels.
* **Crews**: group your painters into named, colored crews; staff a job with one tap and filter the calendar and reports by crew.
* **A real app for your painters**: install-to-home-screen (PWA), a "My Jobs" home, one-tap directions (Google/Apple/Waze), per-job check-in/out that works offline and syncs, photo/receipt/note logging, a "My Hours" view of their own time and pay, and a "Mark Job Complete" button that notifies the office. Workers see only what their permissions allow, never your numbers.
* **Production Rates**: the one number every quote leans on and most shops only half-remember. PaintClarity already holds the hours and the paintable area of every completed job, so this screen divides one by the other over your recent jobs and shows the work, per job and as a median, measured from your own crews. It measures; it never changes a quote behind your back.
* **Business Checkup**: nine read-only scans of the whole business on one page: completed jobs with a balance due, jobs past their end date not marked complete, won jobs never scheduled, started jobs with no hours or no expenses logged, requests waiting more than two weeks, requests with no quote document, expenses missing a receipt image, and open records with no phone or email. Every line links to the record so it can be fixed in two clicks. It also tells you when the site is not on HTTPS and which features that holds back.
* **Customers**: a directory with contact details, lifetime value, job history, and **multiple service addresses per customer**, built for landlords, realtors, property managers, and GCs whose one account means a dozen properties.
* **Bring your existing records**: import customers, and jobs and quotes, from a CSV under Settings. The importer recognizes exports from Joist, Housecall Pro, and Jobber as well as a plain spreadsheet, and shows you the column match and exactly what will happen before anything is written.
* **Business Notes**: a simple notebook for vendor account numbers, insurance renewal dates, and reminders, plus "Add a Note to a Job" to drop a note onto any open job's log without leaving the page.
* **Before/After photos** with camera alignment overlay and a compare slider.
* **Color Visualizer**: load a photo of the house or the room, select the surface, and turn a color wheel until it is the color you are proposing. The wall changes color and keeps its own shading, grain and texture. Select by fill, by matching color, or by dragging a box over a big flat wall. Handles stucco, siding, brick, concrete block and interior drywall, takes the Sherwin-Williams or Benjamin Moore number alongside it, and prints or saves the render for the customer. The Manual tab runs entirely in your browser: no photo is uploaded anywhere.
* **AI Visualizer** (Pro): the other tab. Upload or take a photo, pick colors by brand and name from the Sherwin-Williams and Benjamin Moore books, add a note like "paint the stone wall too, in Alabaster", and get back a realistic repainted photo to show the customer. This tab sends the photo to OpenAI under your own API key (Settings > AI), billed to your OpenAI account at a few cents per render. Renders can be saved to the job's photos. Colors on screen are approximate; brand and color names are trademarks of their owners and PaintClarity is not affiliated with any paint manufacturer.
* **Trade calculators, paint-color tracking, and resource links.**
* **A choice of visual themes** (light, dark, industrial, and more) with a modern app-style navigation bar on desktop and phone, or a full-screen sidebar layout that hides the site's header and footer.
* **Works with your browser's translation.** The app's own text is English. Chrome, Safari and Edge page translation, and front-end translation plugins, are supported: customer names, addresses, amounts, dates, job numbers and paint color codes are marked so they stay exactly as entered.
* **Help built in**: a five-minute walkthrough video with chapter links, a setup checklist, and a Setup Health panel that says what is still missing before the first quote goes out.

= What Pro adds =

* **Job financials & profitability**: costs, materials, labor hours; gross, expenses, profit, and margin per job; a Profits dashboard with profit-by-classification, profit-per-hour rankings, and **profit by crew and by worker** (allocated by logged hours).
* **Job Pulse**: one page that answers "how is this job doing?" in whatever terms apply right now: a quote waiting on the customer, a job about to start, a job that is running (hours against the quote's labor, payroll against the price), or a finished job's after-action review.
* **Expenses & receipts** against any job, plus business-level and vehicle expense tracking, spend by vendor, and a duplicate-receipt check.
* **Business Financial Report** for your accountant: income and expenses for the year, with **sales tax to remit by filing period**, one table per tax name and rate, by quarter or by month, on a cash basis following the payment date.
* **A quote request form for your website**: the `[paintops_quote_form]` shortcode files each request on a Leads screen, with Cloudflare Turnstile and built-in spam checks so junk never becomes a lead. Convert to Request builds the request with the customer attached, and asks first only when someone in your directory already looks like this person.
* **Online payments**: deposits on quote acceptance and invoice balances through Stripe Checkout, recorded automatically.
* **AI tools (bring your own OpenAI key)**: estimate dimensions, gallons, and a Description of Work from a photo; scan receipts to auto-fill expenses; get feedback on or a rewrite of your quote wording; draft a payment reminder for an unpaid invoice.

Pro is a paid upgrade handled through Freemius. The free plugin is fully functional on its own; Pro is optional.

== Bundled artwork ==

The four ready-made logos offered under Business > Logo URL (assets/img/logos/) are AI-generated original artwork created for this plugin. They carry no third-party rights and are distributed under the same GPLv2-or-later license as the rest of the plugin. They are optional, off by default, and carry no PaintClarity branding or link.

== External services ==

This plugin can connect to the following third-party services. Some are optional and only run when you enable and configure the corresponding feature.

**OpenAI (Pro AI features, optional).** When you use an AI feature (Photo Estimate, Receipt Scan, Description-of-Work Feedback or Rewrite), the plugin sends the relevant input, the photo you choose to upload and/or the quote text you are working on, to the OpenAI API using **your own** OpenAI API key, and receives the generated result. No data is sent unless you click one of these buttons. PaintClarity does not store the photo. Requests go to https://api.openai.com. See OpenAI's Terms (https://openai.com/policies/terms-of-use) and Privacy Policy (https://openai.com/policies/privacy-policy).

**Stripe (Pro online payments, optional).** If you enable card payments and a customer pays online, the plugin creates a Stripe Checkout session and verifies Stripe's webhook using your own Stripe keys. Order/amount details are exchanged with Stripe to process the payment. Requests go to https://api.stripe.com. See Stripe's Services Agreement (https://stripe.com/legal/ssa) and Privacy Policy (https://stripe.com/privacy).

**Google Maps Platform (optional).** If you add a Google Maps API key, address fields use Google Places/Geocoding for autocomplete and validation, and job locations may be shown on an embedded map. The address text you type is sent to Google to return suggestions. Requests go to https://maps.googleapis.com and related Google Maps endpoints. See Google's Terms (https://cloud.google.com/maps-platform/terms) and Privacy Policy (https://policies.google.com/privacy). (One-tap turn-by-turn Directions for your crew use keyless map links and need no API key.)

**YouTube and Vimeo (Resources page video embeds, optional).** The Resources page (staff-facing, inside your admin area) lets you save links to training videos, and seeds a starter list of publicly available painting tutorials on YouTube. When a staff member clicks a saved YouTube or Vimeo link's play button, the video is embedded on the page via the provider's standard embed player (www.youtube.com / player.vimeo.com), which loads content from that provider and is subject to its terms; no data is sent until the play button is clicked, and you can delete any or all saved links. See YouTube's Terms (https://www.youtube.com/t/terms) and Google's Privacy Policy (https://policies.google.com/privacy), and Vimeo's Terms (https://vimeo.com/terms) and Privacy Policy (https://vimeo.com/privacy).

**Freemius (licensing & updates).** PaintClarity uses the Freemius SDK to manage Pro licenses, deliver Pro updates, and (optionally) collect anonymous usage diagnostics you can opt out of. Site and license information is exchanged with Freemius. See Freemius's Terms (https://freemius.com/terms/) and Privacy Policy (https://freemius.com/privacy/).

You control every one of these by whether you enter the corresponding API key and enable the feature. With no keys entered, PaintClarity runs entirely on your own site.

== Privacy ==

Your customers' details live in your own WordPress database. PaintClarity's author never sees them, and nothing is sent to a PaintClarity server. That also means you, not the plugin, are the one a customer asks when they want to know what you hold about them, so the plugin's job is to make sure you can answer.

**Quote and invoice pages are blocked from search engines.** Those pages are reached by a long private link rather than a password, and a link can be forwarded, pasted into a chat, or picked up from a referrer header. Every customer-facing document PaintClarity serves is marked no-index, no-archive at both the page and the header level, so a link that escapes cannot turn into a search result.

**Data requests work out of the box.** Under Tools -> Export Personal Data and Tools -> Erase Personal Data, WordPress can search PaintClarity by email address. Export collects the customer record, their jobs, quotes, invoices, payments, and the emails you sent them. Erase removes their details from all of it.

**Erasing does not destroy your books.** Quotes, invoices and payments are kept and stripped of the name, address, phone, email, typed signature and IP address instead of being deleted, because a business is required to keep financial records for years and data protection law allows exactly that. Any quote or invoice link previously sent to that customer stops working. Job photos are left for you to review yourself rather than deleted automatically.

**Suggested privacy policy wording** for what PaintClarity stores and which services can receive data is added to Settings -> Privacy -> Policy Guide.

**Three optional limits, all off by default**, under PaintClarity -> Settings -> Privacy & Customer Data: delete the emailed-communication log after N months, forget the IP address recorded when a quote was signed online after N months, and make quote and invoice links stop working after N days. A business working only in the United States can leave all three off and nothing changes.

None of this is Pro. It is all in the free plugin.

== Installation ==

1. Install PaintClarity from the Plugins screen (Plugins → Add New → search "PaintClarity"), or upload the plugin ZIP under Plugins → Add New → Upload Plugin. Activate it.
2. Create a WordPress Page and add the shortcode `[paintops_app]`. This one page is your whole PaintClarity app; it routes internally.
3. Go to **PaintClarity → Settings** and set your Company Profile (business name, logo, country, currency), and review the Setup Health panel.
4. (Optional) Add team members under **PaintClarity → Painters/Helpers**, set their permissions, and group them into Crews.
5. (Optional) Add your Quote Terms & Conditions under Business Settings so customers see and sign against them.
6. (Optional, Pro) Under **Settings → AI Settings** connect OpenAI, under **Stripe Payments** add your Stripe secret key AND webhook signing secret (both are required before online payment buttons appear), and add a Google Maps API key for address autocomplete.

== Frequently Asked Questions ==

= Do I need a paid account to use it? =
No. The free plugin runs entirely on your own WordPress site and lets you quote, schedule, and manage unlimited jobs. Pro is an optional upgrade.

= What happens to my data if I deactivate or delete the plugin? =
Nothing is deleted. Your jobs, quotes, customers, payments, hours, and photos stay in your WordPress database, so nothing is lost if you deactivate temporarily or reinstall later. If you truly want the data gone, delete the plugin's tables and its uploads from your database and media library.

= Does it work without OpenAI, Stripe, or Google Maps? =
Yes. Those are optional integrations. If you don't enter their keys, the related features simply stay off and everything else works, including keyless turn-by-turn directions for your crew.

= Can my customers really sign a quote online? =
They accept by typing their full name, which is stored with a timestamp and IP address alongside your Terms & Conditions, a solid acceptance record. They can also decline with a reason, and change their minds later.

= Who pays for the AI usage? =
You do, through your own OpenAI account and key, typically a fraction of a cent to a few cents per action. PaintClarity adds per-month usage caps you control so costs stay predictable.

= Can my painters log in without seeing my numbers? =
Yes. Painters/Helpers get a dedicated role with opt-in permissions and their own app view: My Jobs, My Hours (their own time and pay only), directions, check-in/out, photos and receipts. Financial figures are owner-level and hidden from workers unless you explicitly grant access.

= Does it work in the field with bad reception? =
The app installs to a phone's home screen, and Time Clock check-in/out keeps working offline and syncs when a connection returns.

= Where is my data stored? =
In your own WordPress database. PaintClarity doesn't host your business data on an external server.

= Can I bring in my customers and jobs from another app? =
Yes. Settings has two importers, Import Customers and Import Jobs and Quotes, that take a CSV file. Exports from Joist, Housecall Pro and Jobber are recognized by their column names, and any spreadsheet with a name column works. You match the columns, see exactly what will be created, and then import. Both are in the free plugin.

= I charge two taxes on the same job (GST and PST). Can PaintClarity do that? =
Yes. Under Business > Pricing Rules, each tax rate takes an optional second tax name and rate. A job created with that pair carries both, and quotes and invoices print the two lines separately. Shops with one tax see no change.

= Is the app available in other languages? =
The app's own text is English. It is built to work with your browser's page translation (Chrome, Safari, Edge) and with front-end translation plugins: customer names, addresses, amounts, dates, job numbers and paint color codes are marked so they are never altered by the translation.

== Screenshots ==

1. The quote/estimate builder with scope components and inclusions/exclusions.
2. The customer's accept page: branded, e-signed, with online deposit.
3. The scheduling calendar with crews, worker badges, and holiday labels.
4. A painter's phone view: My Jobs, directions, and offline check-in.
5. The Profits dashboard (Pro) with profit by crew and worker.
6. An invoice with online payment and mark-as-paid.
7. Settings: Company Profile, Appearance themes, Stripe, and AI.
8. The Color Visualizer: select a surface in the customer's photo and turn the wheel until it is the color you are proposing.

== Changelog ==
= 1.2.079 =
* Updated Freemius SDK to the latest version.
* Fixed: "Copy customer link" on the invoice page and the reminder's Copy email and Copy SMS buttons now copy on every connection and say so only when they did. Where copying is blocked, the text is shown in a field to select and copy by hand.
* Added: the review card on Checkup also links to PaintClarity's Capterra listing.
* Fixed: "Last Updated On" on the job page and the day counts behind the follow-up alerts now read the database's time stamp in the site's own time. On most hosts the database runs on UTC, so a US site saw times a few hours ahead.
* Added: two taxes on one job, for provinces that charge GST and PST (or GST and QST) on the same work. Business > Pricing Rules takes a second tax name and rate on the default rate and on any additional rate; a job stamped with the pair carries both; quotes and invoices print the two lines separately; the year report files each tax under its own name with the shared taxable amount. One-tax shops see no change.
* Changed: three labels. The Jobs page's top button reads "New Request / Job" (the menu already says New; this one goes straight to the form). The Jobs rows' menu reads "Job actions", the lead cards' menu "Lead actions" and the crew column "Painters": the single words translated badly in Chrome ("Actions" came back as behaviour, "Crew" as crowd), the two-word labels translate as meant.
* Added: Checkup tells administrators when the site is not on HTTPS, lists the features that depend on it (home-screen install, offline mode, online payments, encryption) and what to do. The same check has lived in Settings > Setup Health since July.

= 1.2.078 =
* Added: a review card at the foot of Checkup, for administrators, with a link to leave an honest WordPress.org review and the two steps to get a free WordPress.org account. It appears once the site has completed three jobs or used PaintClarity for a month; "I already reviewed" hides it for good, "Maybe later" for sixty days. Reviews are never paid or rewarded.
* Changed: the link at the foot of the menu that read "WP Admin" is now "Settings" and opens PaintClarity > Settings. Administrators only, as before.
* Added: Help now opens with "Watch the walkthrough", a link to the five-minute video tour in the Help Center, with chapter links to jump to any part of the app.
* Fixed: the Jobs rows keep their layout when the browser translates the page. The Actions toggle used to grow across the Job Value figure, crew initials were translated and spilled out of their circles, and the "Job Value" header, the section counts and "Tomorrow" stayed English. The toggle is now capped to its column, initials and crew names are left alone, and the labels, counts and "Tomorrow" translate. Lead rows pin the contact and the received date the same way.
* Fixed: on Production Rates, "Add area" on a completed job that has no paintable area now opens a one-field Save form right in the row, the same form the completion confirmation uses, and the job's rate appears as soon as it is saved. It used to send you to Edit Job.
* Fixed: "Add hours" on Production Rates now opens the job's Hours page, where hours are entered. It used to open Job Pulse, which only shows them.
* Fixed: new jobs, quotes and invoices are stamped with the site's own date and time. They used to take the database server's clock (UTC on most hosts), so on a US site a quote or invoice created in the evening carried the next day's date, and an invoice's balance could read low for a few hours after another invoice on the same job was marked paid. Records created before this update keep their original stamp.
= 1.2.077 =
* Improved: PaintClarity now works cleanly with your browser's translation (Chrome, Safari, Edge) and with front-end translation plugins. Customer names, addresses, phone numbers and emails, job numbers, amounts, dates, paint colour names and codes, and the PaintClarity name are marked so translators leave them exactly as they are, while labels and sentences translate. This covers the Jobs rows and board, the job page, Customers, Profits, Business, Pulse, Payments, the quote document, the online quote and invoice pages, and the Visualizer colour picker.
* Fixed: the public quote, detail and payment pages, the invoice page and the printable reports declared English regardless of the site's language. They now declare the site language, so browsers detect it correctly and offer translation when it applies.
= 1.2.076 =
* Changed: calculator measurements start blank. Interior square feet, baseboard length, exterior perimeter, wall area, cabinet counts, trim length and the Labor Days area no longer open with an example size filled in; the example shows as grey placeholder text instead. A section you never touch adds nothing to the quote or to the job's paintable area. Rates, ceiling height, coats and coverage keep their starting values.
* Added: when a calculator's line looks like one already on the quote (a paint line you typed by hand, say), "Add These Numbers to Quote" asks whether to add it as a new line or replace the existing one, then lists exactly what was added or replaced and highlights the changed rows. Nothing gets counted twice by accident.
* Changed: the Business page tile "Total Deductions" is now "Materials, Vehicle and Overhead", with a note that crew wages are not in it and that the Financial Report adds them. The arithmetic is unchanged.
* Added: marking a job completed that has no paintable area shows "Paintable area is missing" in the confirmation, with a show/hide holding one field and a Save button, so the number can be added right there and the job counts in Production Rates. Completion itself stays one tap. The Jobs rows view now also prints the confirmation sentence for any stage move; it used to show nothing.
* Changed: after "Note added" on Notes & Photos, the log opens with the new entry on top, marked "Just added", so the text, time and author can be checked at once.
* Changed: an interior-only job (Interior ticked, Exterior not) no longer pre-fills the "Weather (exterior work)" clause, even when that clause is on by default. The quote document's "What's Next?" and the online detail page now both point to accepting online; the "reply with I accept" wording is gone.
* Changed: inside a job, "Customer History" is now "Communication History". The customer's work history stays under Customers.
= 1.2.075 =
* Fixed: the Resources list's stylesheet and script loaded on every page of the site and every wp-admin screen, whether or not a resource list was on it. They now load only where a list renders (the app's Resources page and pages using the [paintops_resources] shortcode). The small Pro-unlicensed upgrade-button script was scoped the same way. Ordinary pages of the site carry no PaintClarity assets at all.
* Changed: the PaintClarity app page is no longer added to a menu that has "Automatically add new top-level pages" turned on, and it stays out of a theme's automatic page lists (the no-menu fallback and the Page List block). It still shows under Pages and in the menu editor, so adding it to a menu on purpose works as before.
= 1.2.074 =
* Added: Business Notes has an "Add a Note to a Job" accordion. Pick an open request or job, write the note, and it lands on that job's Notes & Photos log with the time and your name, without leaving the page.
* Added: "Preview Online Quote" on the quote screen opens the page the customer will see, in a new tab. Opening it while logged in as staff never counts as a customer view: no "Viewed by customer" badge, no owner notification, no history line, and the quote is not marked sent.
* Changed: on the Free plan the Visualizer opens on the Manual tab, where the working tool is. The AI tab is still one tap away with its upgrade details. Pro is unchanged.
= 1.2.073 =
* Changed: the crew initials on a Jobs row are the whole control; the "Show names" / "Hide names" text is gone. Click or tap the initials to list the full names, again, outside, or Escape to collapse. Screen readers hear "Show crew names" / "Hide crew names".
= 1.2.072 =
* Improved: one name for new work. The Jobs page button reads "+ New", and the menu item, the New Customer page buttons and the form heading all read "New Request / Job". The Quote / Estimate / Bid / Job pills and the remembered choice are unchanged.
* Fixed: after creating a job the cleared form still carried the paintable square feet and the "Exclude this job from financial reports" box. Both now clear, with the exclusion back to off.
* Improved: crew names on a Jobs row. The initials sit in a plain control with a "Show names" label beside them; a click, tap, Enter or Space lists every crew member's full name on its own line underneath and the label reads "Hide names". Clicking again or outside collapses it. Hover titles on desktop stay, and the row's Actions menu and links are untouched.
* Improved: the amount column on the owner's Jobs rows is labeled "Job Value". The painter view is unchanged.
= 1.2.071 =
* Fixed: on the quote screen, pressing "Save ... as this job's paintable area" re-rendered the calculator from its starter values (1,500 sq ft, 600 ft of baseboard) while still showing them as results, so a room entered as 224 sq ft with no baseboards offered Interior Painting at 1,239 sq ft and $1,290 of baseboards to the quote. The typed values now survive that press.
* Changed: each calculator's green button adds only that calculator's numbers to the quote ("Add These Numbers to Quote"). It used to add every calculator on the page at once, including one calculated earlier with its starter values and never touched again.
* Fixed: Job Pulse compared payroll with the "labor rate" setting divided by this job's observed hours per day, which on a short day turned a $575 day into $172.50 an hour and reported more "charged" than the whole job. It now holds payroll against the quote's own labor line; when the quote has none, the setting is named as a suggestion, per standard day, never as what the quote charged. Settings calls it "Suggested labor cost" throughout.
* Fixed: on Profits, "Profit By Job Classification" and "Profit by Crew / Worker" covered every job ever, including upcoming and Not Won, under a "year to date" heading. They now cover the same jobs as the year's totals (that year, started, not Not Won) and say so.
* Improved: the Profits year block says how many jobs have no hours or expenses logged yet and how much of their revenue is counted as profit only because no costs are on the books.
* New: the manual Visualizer tab offers the job's existing photos as thumbnails, the same strip the AI tab has, so an original never has to be uploaded twice; the job stays attached when switching tabs. Thumbnails on both tabs carry a caption (the photo's note, or Before / After / Photo with the day and time).
* New: on the manual Visualizer, a "Next tap on the photo" switch (New surface, Add to it, Take away) replaces having to know Shift-click and Alt-drag, so a selection that spread onto the floor can be corrected by touch. Undo now reverses the last tap rather than removing the whole surface.
* Changed: colors spotted in the AI Visualizer notes are shown as suggestions with an "Add to a surface" action, and only colors on a surface reach the render. A sentence that says what to keep, leave or not paint is never read as a color to use, and a plain color word such as "white" is not matched to a catalog color unless its brand or code is beside it.
* Fixed: after saving an AI preview to a job, "Open job photos" pointed at a WordPress admin address; it now opens the job's Notes & Photos inside the app.
* Improved: Before / After pairing on Notes & Photos picks from thumbnails with captions and ids instead of "Photo #12, timestamp" dropdowns, so two photos from the same minute can be told apart.
* Improved: a Cloudflare Turnstile key pair that cannot work now shows on the Quote Request Form summary line ("Turnstile NOT WORKING, requests filed under Spam") and as its own row on the Setup Health board, instead of only inside the section. Saving a bad pair has been refused since 1.2.066.
* Fixed: the Appearance summary line described the app bar and mobile display while the sidebar layout was on, which replaces both. It now states the effective layout, and the overridden controls say "Not in effect".
* Fixed: a job marked completed before its scheduled start still showed "Arrive in N days" on the job page. A completed job shows "Completed <date>".
* Improved: more than 16 hours for one person on one date (usually a double entry) is called out on Job Pulse and badged on the job's Hours page and on the Financials hours editor, rather than carried into the per-day figures without comment.
* Fixed: a whole-dollar total that the arithmetic left a hair under the whole number (14,689.999...) printed as $14,690.00 on the dashboard tiles, where cents are shown only when there are cents.
= 1.2.070 =
* Improved: the Jobs page reads the same in row view and board view. The row view's "Quotes Out" is now "Requests", matching the board's first column, and a collapsed "Completed" section joins it below Upcoming, with the same count and the same "N unpaid, $X outstanding" note the board shows. Finished jobs with a balance read "Balance due" with a Collect link; the Actions menu offers the same moves as the board.
* Improved: Production Rates shows each job's Started date instead of Completed. A scheduled job always has a start date, while the completed date is only stamped by Mark Completed, so most rows read "No date".
* Fixed: a job marked "exclude from financial reports" was left off the Production Rates list. That flag is about money; a production rate is hours over area, so every completed job now counts.
* Fixed: in the sidebar layout, hovering WP Admin or Sign out turned the text dark against the dark rail; a theme's own link hover was winning.
* Removed: the "Waiting on payment" list on the Jobs row view. The Completed section now carries the unpaid count and total with a Collect link per job, and Needs Your Attention lists the same balances with Mark As Paid and Record Payment, so a third list with no actions was clutter.
= 1.2.069 =
* Fixed: the last wide accent bars are gone: the Business Checkup summary box, Job Pulse tiles, calendar entries, the form section labels, the About panel on Business, the admin-only note above the profit summary and the vivid theme's extra-wide label edge. Where a colour carried meaning (red for attention, green for clean, tile tone) it now colours the box's regular 1px border instead.
= 1.2.068 =
* Fixed: AI Visualizer renders came back zoomed in, with the ceiling and floor cut off. The photo is fitted to the model's frame by extending its edges; the flat grey bars used for that read as letterboxing to the model, which zoomed the photo to fill them. The extension is now a mirrored copy of the photo's own edges, so there is nothing to fill in and the render lands back on the real photo.
* Fixed: the render on the right showed larger than the photo on the left. Both are now capped at the same height so they sit side by side at one size.
* Fixed: a plugin that queues a script late in the page (an SEO toolbar, for one) could still reach the app page past the "other plugins" setting. The check now runs as each tag is printed, whenever it was queued.
= 1.2.067 =
* New: Payments on the Free plan. Every job has a Payments page for anyone who can see money: record cash, check or in-person card payments and refunds, remove a mistake, and see Billed, Paid and Still owed. Payments recorded here flip the job's invoices to paid when they cover the job, the same as on Pro. On Pro the Payments action opens the Financials payments drawer.
* New: invoicing more than the job is billing now asks first. An invoice above what is left to invoice comes back as a question with the numbers; confirm it and the invoice is created and Billable on the job is raised to match, with a line in Customer History saying so.
* New: the year-end report adds "tax to remit, by filing period": one table per tax label and rate, by quarter, with a by-month view for monthly filers. Cash basis, following the payment date.
* New: the quote form holds its Request a Quote button until Cloudflare Turnstile hands over a token, so a person cannot send the form before the check passes.
* New: quote form submissions that are plainly automated (the hidden field filled in, or no Turnstile token while Turnstile is on) are dropped without creating a row. The Leads screen shows one line, "N automated submissions dropped in the last 30 days", instead of a Spam tab full of them. Softer rejections keep their rows so Not spam stays possible.
* New: a pattern check on the quote form for sites without Turnstile: first name equal to last name (or names with digits and underscores), a message mostly in non-Latin script on a US, CA, GB, AU, NZ or IE business, and links in the message. Two of the three together flag a request as spam; one alone never does.
* Improved: a Financials save no longer restamps every payment with the person saving and the current time; a payment that did not change keeps who recorded it and when.
* Improved: the AI photo estimate shows metres, square metres and litres on a business set to metric, and the write-up is asked for in metric too.
* Fixed: the AI Visualizer's result box scrolled under the sticky header when a render started, cutting the progress spinner in half.
* New: other plugins' scripts and styles stay off the app page. SEO toolbars, chat widgets, cookie banners and page-builder bundles have no job on the private app screens and can make them jump (Rank Math's Frontend Stats Bar inserted and removed a bar on every screen). Your theme, WordPress itself and anything loaded from another site are not affected, and the rest of your site is untouched. Settings > Appearance > Navigation has the switch and an exceptions box by plugin folder.
= 1.2.066 =
* Fixed: on the Quote Request Form settings, a browser's password manager could fill the Cloudflare Turnstile fields with your WordPress username and password when you pressed Save, because a text field followed by a password field looks like a login form. The widget then failed on every visit and every real request was filed under Spam without a word. Secret fields across the plugin (Turnstile, Stripe, OpenAI) are now masked text fields that password managers leave alone, and a Turnstile key that is not a key is refused at save with a message naming the field.
* Fixed: a Turnstile widget that cannot complete no longer fails silently. Two requests in a row arriving without a Turnstile token put a warning at the top of Leads and on the settings page, saying what usually causes it and how to turn Turnstile off; administrators viewing the form also see a note under the widget when Cloudflare reports it did not load. A saved key that is not a Turnstile key is called out the same way.
* Improved: the quote form's validation messages are plain: "Some fields are missing or need a correction" and "First name is required", instead of "A few fields need a moment".
* Improved: the City, State and Zip fields on the quote form no longer show example values.
* Improved: notices and banners across the app lose their thick left accent bar and keep an ordinary border (the same rule that took the top rule off the stat tiles).

= Earlier versions =
* Releases before 1.2.066 (back to 1.0) are listed in changelog.txt, which ships in the plugin folder. This section keeps the recent releases so the WordPress.org page stays within its 5,000-word changelog limit.
