# Timesheet completion board for your ConnectWise PSA techs

> See every technician's logged hours day by day before you bill, close the gaps without opening ConnectWise, and nudge whoever is still short in Slack.

- Workflow type: app
- Services: ConnectWise PSA (Manage), Slack
- Categories: Operations, Finance
- Published: 2026-08-17

## What it does

- Shows a week grid with one row per technician and one column per day, where each cell is the hours they logged that day against your daily target, colour coded so empty and short days stand out immediately.
- Keeps a running count of how many technician days are still missing, plus a summary strip for the week with total hours, the billable versus non billable split, and the percentage of expected time actually logged.
- Lets you click any day to see that person's entries with the ticket, customer, hours and billable flag, so you can spot eight hours logged to the wrong place.
- Adds a missing entry inline against a real open ticket and saves it straight into ConnectWise, so the gap closes without anyone logging into the PSA.
- Sends a Slack direct message to any technician listing exactly which days are missing and how many hours short they are, one at a time or to everyone still incomplete.

## What you'll need

- A ConnectWise PSA account, with permission to view members, service tickets and time entries, and to add new time entries
- A Slack workspace you can connect, used to send the nudge messages
- The Slack member ID for each technician you want to be able to nudge, which you paste in once on the settings screen
- A daily hours target, for example 8 hours, which you can override per technician

## Prompt

Build me a timesheet completion board that our service manager opens before every billing run. The job it replaces is chasing technicians for missing time in ConnectWise PSA, which is the most annoying recurring task we have. The whole point is to see which technician days are incomplete, close the small gaps myself, and chase the rest, all before anyone trusts the time data enough to invoice from it.

The main surface is a week grid. One row per technician, loaded from ConnectWise PSA List Members, and one column per day of the week. Each cell shows the total hours that technician logged on that day, pulled from ConnectWise PSA List Time Entries filtered by member and date range for the visible week. Colour code each cell against the daily target: a day with zero hours is the strongest alert state, a day below target is a warning state, and a day at or above target is neutral or positive. Use semantic status colours rather than decorative ones, because the entire value of this screen is that empty and short days jump out at a glance. Put a row total on the right of each technician row and a column total under each day, with a team total for the week in the corner.

The daily target is something I set, defaulting to 8 hours, and I need to override it per technician for part timers and apprentices. I also need to choose which days count as working days so weekends are shown but not counted as missing. Store the global target, the per technician overrides and the working day configuration in the app's own persistence, because none of that lives in ConnectWise.

I need to move between weeks with previous, next and this week controls, and the grid should always show a running count of how many technician days are still missing in the visible week. Treat a missing day as any working day where logged hours are below that technician's target, and track days with nothing logged separately from days that are merely short, since those are different conversations.

Across the top, add a summary strip for the visible week showing total hours logged, the billable versus non billable split, and the percentage of expected time actually logged. Expected time is the sum of each technician's daily target across the working days in that week, so the percentage tells me how close the team is to a complete timesheet.

Clicking any cell opens a detail panel for that technician and that day, listing their individual time entries. Each entry shows the ticket it was booked to, the customer or company, the hours, whether it is billable, and any notes. Resolve company names with ConnectWise PSA List Companies if the time entry records do not already carry a readable company name. This is how I catch someone logging eight hours to completely the wrong place, so the ticket and customer need to be obvious, not buried.

From that same panel I want to add a missing entry inline. Let me pick the technician, search our open service tickets using ConnectWise PSA List Service Tickets and attach the entry to one, then enter hours, a billable flag and notes, and save it with ConnectWise PSA Create Time Entry. Once it saves, refresh the grid so the cell, the row total, the missing count and the summary strip all update immediately.

This is an important constraint you must respect: the app is read plus append only where time is concerned. There is no update or delete operation for ConnectWise time entries available, only List and Create. Do not build inline editing of existing entries, do not build a delete action, and do not design any flow that implies existing time can be corrected in place. Corrections happen by adding the missing entry and nudging the technician to fix the original themselves. Make that obvious in the interface so nobody goes looking for an edit button that cannot exist.

The second half of this app is chasing. Give me a Nudge button per technician that sends them a Slack direct message spelling out exactly which days are missing and how many hours short they are for the visible week, and a Nudge all button that does the same for everyone still incomplete. Send with Slack Send a Message. Because the ConnectWise member record and the Slack account are different systems, include a small settings screen where I paste each technician's Slack member ID against their ConnectWise member once, and store that mapping in the app's persistence. To send, resolve the direct message channel with Slack Open a Conversation using that member ID, then send the message to the channel it returns. Write the message in Slack formatting, name the specific dates and the shortfall per day rather than a vague reminder, and disable the Nudge button for anyone with no Slack ID mapped instead of hiding it, so it is clear what is missing.

Record when each technician was last nudged for a given week and show it next to their row, so I do not nudge the same person three times in an afternoon and so Nudge all can skip anyone already chased recently.

Finally, let the board be filtered down to a single technician so someone can self serve their own gaps, seeing just their own row, their own missing days and the same day detail panel. Make that filtered view directly linkable so I can send a technician straight to their own board.

On performance: fetch the week's time entries for all technicians in as few calls as possible using a date range filter rather than one call per technician per day, and cache the member and company lookups for the session. The grid should feel instant when I move between weeks.

## How to customize

- Set the daily hours target globally and override it per technician for part timers, apprentices or anyone not on a standard day
- Choose which days count as working days, so weekends and public holidays are not counted as missing time
- Reword the nudge message, and decide how short a day has to be before it counts as missing rather than close enough
- Filter which technicians appear on the board, for example only a single service board, location or department

## FAQ

### Can it fix or delete time that was already logged wrongly?

No, and that is deliberate. The board can read existing time and add new entries, but it never edits or deletes history. If someone logged hours to the wrong ticket, you add the correct entry and nudge the technician to sort the original in ConnectWise, so your audit trail stays intact.

### Will technicians be able to see everyone else's hours?

The board can be filtered down to a single person, so a technician can open it on just their own row and work through their own gaps. The full team view is what the service manager works from.

### Does the Slack nudge come from me or from a bot?

It arrives as a direct message from the Slack account you connect, so it reads like a person asking rather than an automated reminder. In practice that is usually the service manager, which is exactly who the technician expects to hear from about missing time.

### What counts as a missing day?

Any working day where a technician logged less than their daily target. The board separates days with nothing at all from days that are simply short, because those two problems need different conversations.

### Do we have to enter the ticket number by hand when adding time?

No. You search your open service tickets from inside the panel and pick one, so the entry is always attached to real work and the customer is filled in for you.

### Will this work if our technicians book time to projects as well as tickets?

The inline add is built around service tickets, which is where most unlogged reactive time goes missing. Project time still appears in the grid totals and in the day detail, so the numbers stay accurate even though you attach new entries to tickets.

Use this prompt in General Input: https://www.generalinput.com/prompts/timesheet-completion-board-for-your-connectwise-psa-techs