Getting Started
The PM Billing Tracker helps you log time entries, track billable hours, and generate reports. It works with Clients, Matters, and PMs.
How to start: Go to Manage and add Clients, Matters, and PMs. Then use the ➕ Add Entry button on the Active Jobs page to log time or pin work in progress.
Features
- Add Entry — A popup on the Active Jobs page (➕ Add Entry button): log time with client, matter, PM, contact (required), hours, rate, job class (required), and description, and optionally attach an email file at the bottom of the modal. Then 💾 Save Entry to bill it directly (the email attaches to the entry) or 📌 Add to Active Jobs to pin it to the board (the email attaches to the job). Clicking 💾 Save Entry asks one last time first (and closing the modal with ✕ clears the form, so the next start is fresh) — you can still switch to — you can still switch to 📌 Add to Active Jobs or cancel back to the form
- Active Jobs — The main page. ➕ Add Entry opens the entry popup. Monitor work in progress: priorities, job class badges and filter, linked reply emails, and drag & drop email attachments. Choose 📏 Small / Medium / Large row size from the monitor toolbar (long descriptions collapse on Small/Medium — hover a collapsed description to read it all; your choice is remembered). The board auto-refreshes every 5 seconds (data only — no page reload), so jobs entered by anyone appear as soon as they are saved; pause it with the 🔁 Auto-refresh toggle or click 🔄 Refresh for an immediate update. Reassign a job to a different PM in one click with the PM: dropdown at the bottom-right of each job card — the job moves to that PM's group right away and the change is saved (no need to open ✏️ Edit). Double-click any job card to open the same ✏️ Edit popup. The bottom status bar shows the current month's entries, hours, and billed amount while you're on Active Jobs (totals on the other tabs — use Entries to filter history)
- Billing Descriptions — Preset descriptions with default time values
- Job Classes — Classify work (EDD, Hosting, or any class you create) on entries and active jobs. Create, rename, or delete classes in Manage → Job Classes
- Entries — Filter by client, matter, PM, job class, month, or a specific Day, plus search and sort. Double-click any row to open the Edit popup, and drag the edge of a column header to resize that column (widths are remembered)
- Manage — Add, edit, and delete clients, matters, PMs, and job classes ("Delete All" mass deletion is Admin-only)
- Reports — Filtered reports (including job class) with summary cards and Excel export. Drag the edge of a column header to resize that column (widths are remembered)
- Shutdowns — Track database shutdown requests with CSV export. Client and Matter are picked from your main Manage lists so they always match — choosing a Client narrows the Matter list to that client's matters. Double-click any row (or click ✏️) to open the edit popup, whose footer offers 📄 Shutdown Request Form and 📜 Certificate of Destruction PDF buttons — the same two buttons are also on each table row (the certificate adds the formal destruction language at the bottom)
- Admin — Commission calculator, user management (first & last name, email, role), expense reports, and entry cleanup (Admin role required)
- Session Security — You stay signed in across refreshes in the same tab, but are signed out when you close the tab or browser (sign in again when you reopen the app), and automatically signed out after 90 minutes of inactivity
- Email Viewer — Attached emails (.eml, .msg, .pdf) open in a popup viewer instead of downloading to your desktop: read the message in-app, use ✉️ Reply to open a pre-filled email to the sender, or ⬇ Download to keep the original file. Works from the Active Jobs 📧 chip, the Entries 📎 column, the Add Entry modal, and the Edit Entry modal — .msg and .eml are read locally in your browser (no internet needed)
- Mobile & Tablet — The app is fully usable on phones: tap the ☰ button to open the navigation menu (tap the dark backdrop or pick a page to close it), popups open full-screen, summary cards stack two across, and wide tables (Entries, Reports, etc.) scroll horizontally inside their panel
Active Jobs Workflow
Track a job from the moment the work starts until it is billed:
- Add to Active Jobs — Click ➕ Add Entry on the Active Jobs page, fill in the work, then 📌 Add to Active Jobs to pin the job to the board (it is not saved as a billable entry yet)
- Priority — Mark each job High (red), Medium (yellow), or Low (green) with the per-card dropdown, or select jobs and use the bulk priority bar. You can also sort the board by priority and filter by priority level or PM
- Attach the client email — Drag an email file (.eml, .msg, or .pdf, up to 25 MB) directly onto the job card. It appears as a 📧 chip — click the name to open the email in the in-app viewer (or click ⬇ to download it) so you can reply when the work is done, or click ✕ to remove it. You can also attach the email at the point of entry, at the bottom of the Add Entry modal
- Keep or discard on save — Clicking 💾 Save Entry on a job with an attached email asks whether to 📎 Keep it with the saved entry or to 🗑 Discard it. Kept attachments show a 📎 in the attachment column of Entries (click 📎 to open it in the viewer, ⬇ to download), and appear at the bottom of the Edit Entry modal where you can open it in the viewer, download it, or delete it — you can also drag an email file (.eml, .msg, .pdf) onto that 📎 area at any time to attach one to an entry later. If the job was created on a different day than today, saving asks whether the entry should use the 📅 Current Date or the job's 🗓 Date Created (no prompt when created and saved the same day)
- Reply-to email — Add a reply-to address in ✏️ Edit. Clicking it opens a new email with the subject already filled in as "Client – Matter"
- Job Class — Set the class (e.g. EDD, Hosting) when pinning from Add Entry, or change it anytime in ✏️ Edit. Use the All classes dropdown on the board to focus on one class
- Save Entry — When the work is complete, click 💾 Save Entry: the job becomes a billable entry (keeping its job class) and leaves the board. If an email is attached you choose to keep or discard it (above)
- Discard — Remove a job from the board with ✕ (its attached email is deleted with it)
- Edit — Reassign the PM, update the client, matter, description, time, rate, priority, job class, or reply email at any time
Importing Data
- File types: Excel (.xlsx / .xls) or any delimited file (comma, ;, tab, or |). The 📥 Import button imports exactly what the preview shows — with your mapping and skip choices applied
- Column mapping: Point each field (Client, Matter, Date, Time, PM, Contact, Description) at the matching column in your file, or set a field to — Skip — to leave it out completely. The preview table, new-item counts, and warnings update live as you change the mapping — a skipped column is neither imported into entries nor used to create clients/matters/PMs
- Blank values are allowed: Rows missing a client, matter, date, or time still import — a blank client/matter becomes Unknown Client / Unknown Matter (easy to spot and fix later), and a blank time becomes 0. Only completely empty rows are skipped. Matters are still linked to their client when both are present in the row
- Default rate: Optionally set one hourly rate that is applied to every imported entry
Tips
- Formatted Excel exports: Both the top-bar 📤 Export (where you choose the columns) and the Reports tab's 📤 Export download the same styled Excel file — a yellow bold header row, thin borders on every cell, newest dates first, dates shown as MM/DD/YYYY, and numbers right-aligned. The top-bar export also respects your active Entries filters
- Auto-fill rate: Selecting a Matter with a rate auto-fills the rate field
- Type to filter: In Add Entry, the Client and Matter boxes filter as you type — type a few letters and click the match (or use ↓/↑ + Enter) to pick it fast
- Billing Descriptions: Create presets tied to a Job Class (required) — in Add Entry, choosing a Job Class limits the description dropdown to that class's presets, which auto-fill description + time. Filter the Descriptions tab by class, and tick rows for Delete All Selected
- Bulk operations: Select entries with checkboxes for bulk edit/delete — Edit Selected can mass-update the Rate and/or Job Class on all selected entries (including clearing the class)
- Mass delete (Admin only): The All delete buttons in Manage (Clients / Matters / PMs) only appear for Admin users — regular users can still add, edit, and delete individual items
- Revoking user access: Deleting a user (✕ on the user row, or the red Revoke Access button in the Edit User dialog) removes the account on the server immediately. The user's open sessions are signed out within seconds with an “Access revoked” screen, and no open copy of the app can bring the user back. Re-creating the same email address later restores access
- User status (Enabled/Disabled) & steady credentials: Each user in Admin → Users shows an ENABLED/DISABLED badge. As an admin you can Disable a user (reversible) to block their sign-in and sign out any live session, or Enable them again. A user's password is now stable after it is set — it is only changed when you explicitly edit that user, or when the account is revoked (Delete / Revoke Access) and re-created. Saving entries, clients, or other data no longer overwrites another user's credentials
- Manage & Admin pages: Each category opens on its own sub-tab page — Manage: Clients, Matters, PMs, Job Classes · Admin: Commissions, Users, Expenses, Cleanup, Event Logs. Event Logs records every key operation (logins, saves, deletions, and any server error) with a timestamp and user — filter by date range, category, level, or text to troubleshoot. Clients and Matters have 📤 Export / 📥 Import (Excel or CSV) — imports add new items and automatically skip duplicates
- Expense PDF: Manage expense categories from the expense form, then select specific expenses (or all) to export to a branded PDF
- Commission PDF: Branded commission report with summary cards
- Email attachments: Stored per job and auto-deleted when the job is saved or discarded
- Live entries sync: Entry data refreshes every 5 seconds in the background (data only — no page reload), re-fetches the moment you land on the Entries screen or log in, and pauses while you're in another browser tab to save battery and bandwidth. The bottom status bar (entries / hours / billed) now updates live on every tab as teammates save, and the refresh never interrupts your typing and never overwrites a row you just saved
- Data persistence: Auto-saved to the server database — saves are multi-user safe (your save can no longer wipe another user's data). If two users save at the exact same moment and one hits a temporary database lock, the app quietly retries (up to 3 times, with a short randomized wait) before showing anything — only a genuine failure surfaces as an error instead of a false "Saved" message