Recent Bug Fixes

August 20, 2026 Bug fixes
  • Mapping a Skimmer product to a Heritage product could create two mapping records instead of one, leaving duplicate entries behind. Skimmer now checks for an existing mapping before saving, so each product links to its Heritage counterpart exactly once.
Skimmer Mobile 12.15.1 Bug fixes
  • Quotes PDF viewer showed a license error on mobile.  Viewing a quote's PDF on mobile showed a license key invalid message instead of the document. Skimmer now displays the PDF correctly.
  • Android app could hang on the splash screen.  When an Android user closed and reopened Skimmer, the app could get stuck on the splash screen with no way forward except closing and reopening it. Skimmer now handles this correctly, so the app loads as expected.
Skimmer Mobile 12.15 Bug fixes
  • Mobile app could silently skip its startup sync. When a route change sent a background notification to the app at the same moment it was syncing on startup, the notification claimed the sync lock first and the startup sync failed with no warning. Techs could open the app to outdated routes, work orders, or customer info with no sign anything was wrong, until they ran a manual sync. Skimmer now protects the startup sync so it completes even when a route-change notification arrives at the same time, so techs see current data as soon as they open the app.
  • Checklists showed up twice on some routes. Technicians working routes that existed before a recent update saw each checklist listed twice on mobile. Skimmer now shows each checklist once.
  • iOS app crashed when camera access was denied while attaching a video to a quote. On iOS, if a tech tried to attach a video to a quote without granting Skimmer camera access, the app crashed instead of asking for permission. Skimmer now asks for camera access instead of crashing, so techs can grant it and continue.
August 13, 2026 Bug fixes
  • A database client library change caused duplicate mobile sync records to fail silently instead of returning the expected "already exists" response, making duplicates harder to detect and handle correctly. Skimmer reverted to the previous database client, so duplicate record attempts once again return a clear "already exists" (409) response.
  • After logging out on the production site, pros landed on Skimmer's general marketing webpage instead of being returned to the login screen. Skimmer now returns pros to the login flow after logging out.
  • Skimmer forced the QuickBooks Online document number to match the Service Credit number, which caused a "Duplicate Document Number" error whenever that number was already in use. This meant some credit memos never made it into QuickBooks. Skimmer no longer forces the document number to match the Service Credit number, so credit memos now post to QuickBooks Online successfully.
  • The maximum allowed markup percentage on products was enforced differently depending on where it was set, the product catalog, file import, and the Public API each allowed different limits. Skimmer now enforces the same 999.99% markup cap everywhere a markup percentage can be set.
  • Skimmer updated the public API to address security vulnerabilities.
  • When a route stop was deleted, its related service note displayed with a blank customer and technician instead of the original information. Skimmer now retains and displays the original customer and technician on a service note even after the related route stop is deleted.
August 6, 2026 Bug fixes
  • When a customer deactivation request through the public API left out certain optional details, the request failed instead of completing. Skimmer now handles those optional details correctly, so deactivation completes even when they're left out.
  • Companies that don't use Heritage generated error logs every time they opened the Heritage Orders page, even though the page correctly told them Heritage isn't connected. Skimmer no longer logs an error for these companies.
  • Companies with a large customer base and a custom invoice day could have their scheduled invoices silently fail to generate, so those customers were never billed on their chosen day. Skimmer now generates these scheduled invoices reliably regardless of company size.
  • Skimmer resolved the following Stripe Capital issues:
    • When a Stripe Capital payout ran into a problem, it could leave the payout record stuck or show a deposit amount in QuickBooks higher than what was actually deposited. Skimmer now handles these failures cleanly, so payout records and QuickBooks deposit amounts stay accurate.
    • When Skimmer had trouble loading a user's account details, an owner opening the Capital page could see a "Page not found" message instead of the page itself. Skimmer now handles this correctly, so owners see the Capital page as expected.
    • Navigating straight to the Capital page, instead of clicking into it from elsewhere in Skimmer, could result in a blank page. Skimmer now loads the Capital page correctly no matter how it's reached.
    • If the financing information on the Capital page had trouble loading, the whole page could come up empty. Skimmer now displays the rest of the page even if financing details have trouble loading.
  • Skimmer resolved the following AI Insights issues:
    • When totaling chemical usage, AI Insights could add up quantities measured in different units as if they were the same, producing a meaningless total. Skimmer now keeps units of measure separate when totaling, so chemical usage totals are meaningful.
    • Asked how many different chemicals were used, AI Insights could report only the first page shown on screen as if that were the complete list. Skimmer now reports the true count of chemicals used, not just the first page shown.
    • Asking which pools would be serviced today could return zero results even when pools were scheduled, because routes that hadn't started yet weren't counted. Skimmer now includes scheduled-but-not-yet-started routes in this count, so the answer matches what's actually on the schedule.
    • Questions comparing past service to what's scheduled next could compare completed visits against a projected schedule rather than like-for-like data, producing a misleading comparison. Skimmer now compares consistent data on both sides, so these comparisons are accurate.
    • Asked for profit and labor cost together, AI Insights reported a combined labor-plus-chemical figure as if it were labor cost alone. Skimmer now separates labor cost from chemical cost, so each figure reflects only what it's supposed to.
    • At a service location with more than one pool, AI Insights could count and cost the same chemical dose multiple times — once for each pool at that address. Skimmer now matches each dose to its own pool, so dose counts and costs are accurate at multi-pool properties.
    • When asked a reading threshold question, AI Insights could ignore which reading type was actually asked about and count every reading type over that threshold instead. Skimmer now keeps the specific reading type in mind, so threshold questions return results for what was actually asked.
    • When a question combined two reading conditions, AI Insights could silently exclude pools where the two readings were logged by different technicians, undercounting the true result. Skimmer now correctly includes these pools, so combined-reading questions return the full, accurate count.
    • Certain reading questions were processed in a way that made them take roughly three times longer than expected, close to 70 seconds in some cases. Skimmer now processes these questions more efficiently, bringing response time back to normal.
    • Asked how many pools matched a question, AI Insights could report the count of just the first page of results shown on screen instead of the true total. Skimmer now reports the true total count, not just what's visible on the first page.
    • Asked about a monthly reading trend, AI Insights could apply a "latest reading only" filter across the whole time range instead of each month individually, making a declining trend appear to be rising. Skimmer now calculates each month's trend correctly, so the direction shown matches what's actually happening.
    • When a question returned no results, AI Insights gave the same generic "no data" message regardless of the reason. Skimmer now explains what it searched for when a question comes back empty.
    • The Revenue figure in AI Insights profit answers reflected service revenue only, leaving out billable chemical charges, so it didn't match the Profit figure or the Sigma Profit report. Skimmer now includes chemical revenue in this figure, so it reconciles with Profit and the Sigma Profit report.
    • Asking AI Insights to compare this year to last year could return $0 for every prior-year value, making a real comparison impossible. Skimmer now pulls both years' data correctly, so year-over-year comparisons return real numbers.
    • Asking AI Insights about a specific technician's profit required typing their exact full name; a partial name or how someone would naturally refer to them returned a false "no data" result. Skimmer now matches technician names more flexibly, so a natural way of referring to someone returns their results.
July 30, 2026 Bug fixes
  • When someone sent an invoice, Skimmer returned an Invoice sent message even though delivery could take several minutes behind the scenes. That gap made it hard to know whether an invoice had really gone out. Skimmer now shows a message that matches the invoice's actual delivery status.
  • The nightly job that sends invoice reminders processed every company in one long pass, which made it slow and caused it to intermittently fail before finishing — so some customers never got their reminder. Skimmer now runs this job faster and more reliably, so reminders go out consistently.
  • When someone typed a new customer's address by hand instead of choosing it from the autocomplete suggestions, Skimmer saved the location as 0,0, which could throw off mapping and routing for that customer. Skimmer now saves the correct location even when the address is typed manually.
  • Notes and photos entered in a work order's Work Performed section could fail to save on the web without any warning, so the technician's work was lost with no indication anything had gone wrong. Skimmer now saves this information reliably.
  • Asking AI Insights a chemical-usage question with an ambiguous name, like "Alkalinity," which could match more than one chemical, took around 41 seconds to answer, compared to about 11 seconds for a name with one clear match. AI Insights now resolves these ambiguous matches quickly.
  • In the Home page's Today's operations section, routes that hadn't started yet were missing their checkbox icon, making it harder to tell at a glance which routes were ready to go. Skimmer now shows the checkbox icon for routes that haven't started.
  • When a work order linked to a Heritage order was soft-deleted, some of its related records weren't cleaned up and stayed behind in the system. Skimmer now cleans up all related records when a work order is deleted.
  • After switching a customer to a different Heritage branch, an item that wasn't stocked at the new branch wasn't flagged as unavailable and still showed a cost, which could lead to ordering something that wasn't actually in stock. Skimmer now correctly flags unstocked items and zeroes out their cost after a branch switch.
  • The progress modal for the invoice generator stalled at 0% even though invoices were being created and emailed in the background, so it looked like the process hadn't started and risked someone running it again and sending duplicate invoices. Skimmer now reports progress correctly, so pros can see the process finish and avoid creating duplicates.
  • Larger service companies ran into slow performance and timing issues when exporting their data. Skimmer now handles larger data exports more effectively, so exports complete faster and more reliably.
  • The Items still needed section of the Home page was slightly off from its intended design: icon color, spacing, checkbox size, column widths, and how it displayed on mobile needed adjustment. Skimmer now displays this card exactly to spec across devices.
July 23, 2026 Bug fixes
  • In some instances, saving QuickBooks Online settings could skip sync validation and silently clear the Payment Deposit To Account setting, so payments started rerouting to Undeposited Funds without any warning. Skimmer now validates sync settings on save, so the Payment Deposit To Account setting stays protected and payments keep routing to the right place.
  • Invoices that were paid in full still displayed as Overdue, which could confuse customers and staff about the true state of an account. Skimmer now updates an invoice's status correctly once it's paid in full, so paid invoices no longer show as overdue.
  • Pros who only had work orders, with no scheduled routes, didn't see the Instant Payouts option on their Home page even when they qualified for it. Skimmer now shows Instant Payouts for these pros.
  • A work order could be deleted even while it was still linked to another record, which could leave that related record pointing at nothing. Skimmer now blocks deleting a work order while it's still linked, so those connections stay intact.
  • Skimmer resolved the following AI Insights issues:
    • Asking AI Insights about a customer name with an apostrophe, like "O'Brien," returned wrong or empty results because the search stopped at the apostrophe. AI Insights now reads the full name correctly, so these searches return accurate results.
    • Weekly average comparisons in AI Insights could come out slightly off when the date range didn't line up with a Sunday, and asking the same question twice sometimes produced different answers. AI Insights now calculates weekly averages consistently regardless of how the date range falls, so the same question gets an accurate answer every time.
    • When asked about scheduled service stops, AI Insights pulled from actual completed stops for a single date but from a different, projected data source for date ranges, so answers could contradict each other depending on how the question was phrased. AI Insights now uses one consistent data source for scheduled-stops questions, whether the question covers a single day or a range.
    • When asked about something like "the last Monday of each month," the supporting detail behind AI Insights' answer counted every stop for the whole month instead of just the stops on that specific weekday, so the numbers didn't match the answer. AI Insights now filters correctly down to the target weekday, so the detail lines up with the reported total.
    • When comparing "this quarter" numbers, AI Insights sometimes showed last quarter's date range alongside this quarter's figures, making the answer confusing or misleading. AI Insights now labels each quarter's figures with the correct date range.
    • When asked how many stops a tech would still service today, AI Insights counted stops that had already been skipped, overstating the number. AI Insights now excludes skipped stops from that count.
    • When a question included a specific number, like a dollar amount or count, AI Insights sometimes only picked up the first digit, leading to wrong answers. AI Insights now reads the full number correctly, so answers reflect the actual value asked about.
    • Certain last-month questions could get labeled as "month to date" instead of "last month," creating confusion about what period the answer covered. AI Insights now labels the time period correctly for these questions.
    • Asking AI Insights the same scheduled-stops question more than once could return different, sometimes contradictory answers. AI Insights now generates the same, correct answer every time for this type of question.
    • When asked about labor cost in profit reports, AI Insights included chemical and dosage costs in the total but labeled the whole amount as labor. AI Insights now reports labor cost on its own, separate from chemical and dosage costs.
July 16, 2026 Bug fixes
  • Generating invoices took longer than normal because the system scanned every service record for a company, including deleted ones. Skimmer now looks up only the relevant records, speeding up invoice generation.
  • The Day view option disappeared from the Schedule page whenever Scheduled was selected as the filter. Skimmer now shows the Day view option no matter which schedule filter is selected.
  • When a QuickBooks Online sync hit a record it could never successfully sync, the entire batch stalled. Skimmer now recognizes records that will never succeed, skips over them, and lets the rest of the batch finish and report its status correctly.
  • Under certain timing conditions, a payment sync to QuickBooks Online was dropped without any error, leaving the payment stuck showing In Process and never reaching QBO. Skimmer now handles that timing conflict so payment syncs reach QBO.
  • Skimmer resolved the following AI Insights issues:
    • Asking AI Insights to compare the next four weeks against the last four weeks returned a per-week average that was too low. Skimmer now calculates and displays the correct per-week average for that comparison.
    • When AI Insights searched for a specific product or text term, it built the search in a way that didn't follow Skimmer's standard method for handling user-provided text. Skimmer now uses that standard method for these searches.
    • AI Insights sometimes returned incorrect profit figures when a question spanned a date range that had to be split into multiple periods. Skimmer now calculates profit correctly across split date periods every time.
    • When AI Insights answered a profit question, the header sometimes displayed the wrong date range for the answer. Skimmer now shows the correct date range on profit answers.
    • AI Insights occasionally showed a technician's route assignment start date instead of the actual service date when listing daily route stops. Skimmer now consistently shows the correct service date for each route stop.
    • AI Insights displayed route-stop times in UTC instead of local time, putting them five hours off from Service History. Skimmer now displays route-stop times in local time in AI Insights Reports, matching Service History.
    • AI Insights treated scheduled, completed, and skipped service stops inconsistently, which could produce misleading counts. Skimmer now applies consistent logic across scheduled, completed, and skipped stops.
    • Asking AI Insights for a sales total could return very different numbers depending on whether it counted invoiced amounts or actual payments collected, sometimes even showing opposite year-over-year trends for the same question. Skimmer now applies one consistent, clearly defined sales total so results are reliable no matter how the question is phrased.
  • Skimmer resolved the following Embedded Bookkeeping issues:

    Note: These issues only affected pros signed up for the Embedded Bookkeeping Beta.

    • When Layer calculated sales tax on an invoice, rounding each line item separately could push the total a few cents above the tax total shown on the Skimmer invoice. Skimmer now calculates Layer's sales tax so it matches the invoice's tax total exactly.
    • When enrolling a batch of accounts in Layer, a single failed item could stop the whole batch without reporting the failure or retrying it. Skimmer now isolates failures so one problem account no longer stops the rest of the batch from enrolling.
    • A customer's payment was recorded, but the matching account credit was never applied, leaving the account balance incorrect. Skimmer now applies the account credit correctly whenever a payment is recorded.
    • A data export crashed whenever a customer activity log entry was missing an update timestamp. Skimmer now handles missing timestamps gracefully so the export completes successfully.
  • On the Schedule page, certain dropdown menus were hidden behind an overlay, making them unusable. Skimmer now displays Schedule dropdowns above the overlay so they're visible and usable.
  • In the Add Equipment Item window, the Type, Manufacturer, and Model dropdowns grew taller after a value was selected, shifting the rest of the layout. Skimmer now keeps these dropdowns a consistent height, so selecting a value no longer shifts the layout.
  • If a Stripe refund was canceled, the invoice still counted it as refunded, so the refund amount was counted twice. Skimmer now reverses a canceled refund correctly so the invoice reflects the accurate refunded amount.
  • When a technician started a route stop late, the started late indicator tooltip didn't appear. Skimmer now shows the started late tooltip whenever a route stop starts late.
July 9, 2026
  • The "No dosages/No readings entered for consecutive stops" alert email included customer details in the subject line and body, even though the email is meant for the technician's eyes only. Skimmer now strips customer info from these emails, leaving only what's relevant to the tech. 
  • Line items on invoice PDF attachments didn't show the date the service was performed. Skimmer now includes the service date under each line item description on the PDF. 
  • When a route assignment was added, changed, or removed from the mobile app, that change didn't appear in the customer's Recent Activity, leaving no record of who made the change or when. Skimmer now logs these changes so they show up in Recent Activity with who made them and when. 
  • When asking AI Insights for a report covering the last several months, the current month was left out, an extra unrequested comparison to a prior period was added, and the date range shown didn't match what was actually returned. Skimmer now includes the current month and labels the date range correctly. 
  • The same question could return different table results depending on which internal version of AI Insights answered it, producing inconsistent answers to identical questions. Skimmer now returns consistent results no matter which version handles the request. 
  • Exporting and re-importing your product list now correctly handles products that have been discontinued, instead of causing errors or unexpected results. 
  • When the Type, Manufacturer, or Model field on an equipment record had a long value, the text spilled into the next field on the screen instead of staying contained. Skimmer now keeps long values contained within their own field. 
  • Companies with a large number of QuickBooks Online customers could crash their browser when opening the sync mapping page. Skimmer now handles large customer lists on this page without crashing the browser. 
  • On the Customer Balance Summary report, customers with an outstanding balance showed $0 in accounts receivable, making it look like nothing was owed even though money was still due. Skimmer now calculates and displays the correct outstanding balance for these customers. 
July 2, 2026
  • The Service Rates print view sorted results by first name. In addition, pros could only print the report one page at a time. Skimmer now sorts correctly and prints the full report.
  • The Edit Order page displayed cost changes with an older visual style that didn't match the rest of the app. Skimmer now shows cost changes with the current styling.
  • New customer leads created through AI Phone weren't getting a location, so they landed at coordinates 0,0 and never appeared on the route map. Skimmer now geocodes these leads correctly so they show up where they belong.
  • The date filter on the Payouts Report excluded some rows that should have been included in the results. Skimmer now returns every row that falls within the selected date range.
  • We resolved the following AI Insights (Early Access) issues:
    • AI Insights built its underlying queries with incorrect start and end date values. Skimmer now generates the correct dates.
    • Start and complete times for route stops in AI Insights tables displayed in UTC rather than the user's local timezone. Skimmer now shows these times in local time.
    • When a pro asked AI Insights a question about a specific day of the week, like "how many stops did I do on the last Monday of each month," the answer reflected the wrong day. Skimmer now rejects an invalid weekday calculation instead of quietly correcting it to the wrong day, so "last weekday" questions return the day that was asked about.
    • Because service dates were stored with a time component, questions about a specific day (like "last Monday") returned zero matching results. Skimmer now matches on the date correctly, regardless of the stored time.
    • Questions about installed items pulled results from a customer tag with a similar name instead of actual installed-item records, returning payment data instead of item data. Skimmer now pulls from the correct installed-items data.
    • Filters like "stops after 3pm" compared against UTC time while the results displayed in local time, so the wrong stops came back. Skimmer now compares filters in local time so the results match what's shown.
    • AI Insights displayed a placeholder date of January 1, 2010 as the completion time for service stops that hadn't finished yet. Skimmer now leaves the completion time blank for stops that aren't done.
    • Questions about time spent on work orders pulled from an empty data source and always returned zero. Skimmer now pulls from the correct source and returns accurate durations.
June 25, 2026
  • Customer Invoices
    • Some customers' invoices appeared correctly in the Pool Service tab but not in the Invoices Preview section. We corrected the display logic so invoices now appear consistently in both locations.
  • AI Insights (Early Access)
    • The AI Insights column detector missed several money columns and incorrectly flagged some count columns as currency fields. We updated the detection algorithm to recognize additional money column patterns and reduce false positives.
June 18, 2026
  • AI Insights (Early Access)
    • When asking for data about a specific date, AI Insights sometimes ignored that date and returned results for a broader default range instead. AI Insights now respects the date specified when the data table is built.
    • In the expanded view of the AI Insights panel, the data table would jitter while text was typed in the prompt field. The layout no longer jitters when you type in the prompt field.
    • When an AI Insights query returned no matching data, an empty table was rendered instead of a clear no results message. The view now displays a no results message instead of an empty table.
  • Customer Search
    • When you searched by customer name in the Quotes or Invoices pages and then deleted the text from the search field, the filter was not cleared and the results list stayed filtered instead of resetting. These lists now refresh when the search field is emptied.
  • Data Imports
    • When importing products from a spreadsheet, any row with a markup percentage above 999.99 or an oversized cost or price value caused the entire import to fail with only a generic "Failed to import" message. The importer now validates those fields before saving and returns a clear message explaining which value is out of range.
    • When importing customers from a spreadsheet that included a Customer Status column, that column was ignored. Every imported customer was set to Lead, regardless of the value specified in the spreadsheet. The import now reads and applies the status value from the spreadsheet correctly.
  • Invoice Settings
    • The selection fields for reminder days and suspension days in Invoicing Settings didn't respond to taps on Safari for iPhone and iPad, making it impossible to update those settings on mobile. The fields are now fully usable on iOS Safari.
  • Quotes
    • Admin users could not approve quotes on behalf of customers, even when payment was not required at the time of approval. Admins can now approve quotes without a credit card being required. 
  • Work Orders
    • When a work order was linked to a customer registered as a business rather than an individual, the customer name displayed as "null null" instead of the company name. Company names now appear correctly on work orders.
    • When work orders on a job were moved to Scheduled, the parent job's status did not update and stayed stuck at "Not Started." The job status now recalculates correctly when work orders are scheduled.