Help & Guide
Everything you need to understand how this tool works β workflow, sync, calculations, and role visibility.
π 1. What this tool is and how it's structured
This is a shared cloud-based operations hub for your client services team. It has two distinct purposes that deliberately live in the same place:
- External reporting β generating the WhatsApp message you send to management daily
- Internal tracking β monitoring your team's time, tasks, projects, billing and performance
The tool has 8 modules:
- Daily Entry β each person fills their own numbers every day
- WhatsApp Report β auto-generated consolidated message, copy-paste ready
- Team Dashboard β your internal view of everyone's activity, filterable by date
- Insights β auto-generated flags, risks and observations based on the data
- Projects & POs β project registry with PO details, timelines, and planned billing schedules
- Invoices β actual invoices raised against each project
- Billing Tracker β planned vs actual billing per project per month with deviation and reasons
- Settings β manage team member names and roles
π₯ 2. Roles and who sees what
There are three roles. Everyone opens the same tool β there is no separate login or separate link. Role differences are about intent and responsibility, not technical access restriction.
Manager (you)
- Fill daily entry
- View all tabs
- Set up projects & POs
- View team dashboard
- Read all insights
- Manage billing tracker
- Add/remove team members
Project Coordinator
- Fill daily entry
- View projects (read)
- Add invoices
- View billing tracker
- Cannot edit team members
- Cannot edit projects
Team Member
- Fill daily entry only
- Select own name
- Log tasks + hours
- Tag tasks to projects
- Cannot view others' data directly
β οΈ Important: The tool does not enforce role restrictions technically β anyone who opens it can navigate to any tab. Role definitions above are the intended usage. If you want stricter separation, a future version could add PIN-based role locking.
Visibility matrix
| Tab | Manager | Coordinator | Team member | Notes |
| Daily Entry | Full | Full | Own entry only | Each person selects their name β they can technically select anyone's name |
| WhatsApp Report | Full | Read | Not needed | Only Manisha copies and sends this |
| Team Dashboard | Full | Read | Not needed | Shows everyone's data consolidated |
| Insights | Full | Read | Not needed | Auto-generated, no input needed |
| Projects & POs | Edit | Read + add invoice | Not needed | Only manager and coordinator should set up projects |
| Invoices | Full | Full | Not needed | Coordinator manages invoices day-to-day |
| Billing Tracker | Full | Read | Not needed | Read-only view, data comes from invoices |
| Settings | Full | Avoid | Avoid | Only manager should add/remove members |
π 3. Sync, storage and the shared cloud β your biggest concern
This tool uses Cloudflare KV (Key-Value store) as its database, accessed via a Cloudflare Pages Function at /api/storage. Every save writes to KV β anyone who opens the tool reads from and writes to the same store.
How data is stored
There are 4 KV keys β think of them as 4 tables:
ops_v5_shared β all daily entries, keyed by date β member name
ops_v5_members β team member list with names and roles
ops_v5_projects β all projects with PO details and billing schedules
ops_v5_invoices β all invoices raised
What happens when two people save at the same time
This is the most important thing to understand. The storage system uses last-write-wins. Here's what that means in practice:
- Person A opens the tool and starts filling their entry at 9:00 AM
- Person B opens the tool and saves their entry at 9:05 AM β this writes the full
ops_v5_shared object to the cloud
- Person A saves at 9:07 AM β this also writes the full object, but only contains what was in their browser when they loaded the page
- Risk: If Person A's browser loaded before Person B saved, Person A's save will overwrite and lose Person B's entry
β οΈ To avoid data loss: Each person should open the tool, fill their entry, and save promptly β ideally within a few minutes. Don't open the tool early in the morning and leave it open all day before saving in the evening. If someone forgets to save, their data is not in the cloud yet.
How to recover if data is overwritten
- The tool does not have version history β once overwritten, the previous save is gone from the cloud
- Best practice: if you suspect a conflict, the manager should re-enter the missing person's data manually from their WhatsApp report or verbal update
- A future improvement could be to save each person's entry as a separate key (e.g.
daily_2026-05-29_Manisha) to fully eliminate conflicts β this is the safest architecture change if conflicts become a real problem
How refresh works β background sync
The tool now syncs automatically in the background every 90 seconds. You can see the sync status in the bottom of the sidebar β it shows either "β³ Syncingβ¦", "β Synced HH:MM", or "β Sync failed".
Here is exactly what happens on each background sync cycle:
- All four data stores (daily entries, members, projects, invoices) are re-fetched from the cloud
- The fetched data is compared to what's currently in memory
- If data has changed β the current tab re-renders automatically and silently. No page reload, no lost work
- If data hasn't changed β nothing happens, no visual disruption
- The member dropdown in Daily Entry is also refreshed so new names appear without a page reload
β This means: if Person A updates their name in Settings and saves, Person B will see the updated name within 90 seconds β without having to do anything.
βΉοΈ What background sync does NOT do: It does not save your in-progress entry. If you are mid-way through filling your daily entry and a sync fires, your unsaved inputs are untouched. Sync only reads from the cloud β it never writes unless you explicitly click Save.
The concurrent save risk β still relevant
Background sync reduces the window of risk significantly but does not fully eliminate the concurrent save problem. Here's the updated picture:
- Every 90 seconds, everyone's browser pulls the latest state from the cloud
- If two people happen to click Save within the same 90-second window and both have stale data, the last save still wins
- In practice this window is very narrow β the team fills entries at different times of day
- The safest behaviour remains: open β fill β save promptly, not open early and save hours later
What is and isn't saved automatically
Saved only when you click Save: Daily entries, Projects, Invoices, Team members
Never saved (computed live each time): Report text, Team dashboard view, Insights, Billing tracker view
Persists across sessions: Everything in the 4 storage keys above
π
4. Daily workflow β step by step
Morning routine (team members + coordinator)
1
Open the tool β Daily Entry tabSelect your name from the dropdown. Pick today's date (it defaults to today).
2
Fill your numbersUtilisation (hours worked), demos, calls/meetings/proposals, renewal activity, new business activity.
3
Log your tasksAdd each task you worked on. For each: description, which project it belongs to (or "No project"), category (active delivery / revenue hunting / etc.), and status (on track / at risk / delayed / done).
4
Click Save β doneYour entry is written to shared cloud storage immediately. This takes 1β2 seconds.
End of day routine (Manisha)
1
Team Dashboard β click RefreshPulls the latest entries from all team members. Check who has and hasn't submitted.
2
WhatsApp Report tabVerify the numbers look correct. The "Today" view auto-calculates consolidated totals. The reference section (not copied) shows utilisation and deal closures for your eyes only.
3
Click Copy β paste into WhatsAppOnly the top section (demos + proposals) is copied. Utilisation and deal data stays on screen.
4
Check Insights tabReview any flags β delayed tasks, billing shortfalls, utilisation dips, approaching deadlines.
Project / billing routine (Manisha + Coordinator)
1
New project β Projects & POs tabAdd project name, client, PO number, PO value, start/end dates, owner, and the planned monthly billing schedule row by row.
2
When an invoice is raised β Invoices tabAdd invoice number, value, actual date, planned date, deviation reason (if late/early), and notes. This feeds directly into the Billing Tracker.
3
Monthly review β Billing Tracker tabFilter by project or view all. Each month shows planned vs actual with deviation and reasons. The year-level total deviation is shown at the top of each project card.
π’ 5. All calculation logic explained
Utilisation
Per person per day: hours worked Γ· 8.5 Γ 100 = utilisation %
Team utilisation for a date range: sum of all hours logged Γ· (8.5 Γ number of members Γ number of days with entries) Γ 100
Colour coding: β₯85% = green, β₯60% = amber, below 60% = red
Note: Days where no entry is submitted are not counted in the denominator β so if someone doesn't submit, it doesn't drag the team average down (but Insights will flag the missing entry separately)
MTD / QTD / YTD
MTD: All dates in the current calendar month up to and including the selected date
QTD: All dates from the start of the current quarter (Q1=Jan, Q2=Apr, Q3=Jul, Q4=Oct) to selected date
YTD: All dates from Jan 1 of the current year to selected date
Source: Only dates that have at least one saved entry are included β empty days are ignored
WhatsApp report β what's included vs reference-only
Copied to WhatsApp: Physical demos, virtual demos, MTD demo totals, proposals sent today, MTD proposals, MTD proposal value
Reference only (visible but not copied): Utilisation %, team hours, renewals closed, new biz closed, total closed value
Invoice date deviation
deviation (days) = actual raise date β planned raise date
Positive = raised later than planned (shown in red)
Negative = raised earlier than planned (shown in green)
Zero = on time
Monthly billing deviation
deviation = actual invoiced in month β planned for month
Positive = billed more than planned (shown in green β ahead)
Negative = billed less than planned (shown in red β shortfall)
Actual invoiced = sum of all invoice values where the invoice date falls in that month
Planned = the amount entered in the billing schedule for that month
PO utilisation
PO utilisation % = total invoiced across all invoices for the project Γ· PO value Γ 100
Shown in Billing Tracker. Colour: β₯90% red (approaching ceiling), β₯60% amber, below 60% green
Project timeline deviation
If actual end date is set: deviation = actual end date β estimated end date (in days)
If no actual end and project is Active: overdue by = today β estimated end date
If project is Active and within 14 days of estimated end: flagged as approaching deadline in Insights
π 6. Projects, POs and billing schedules
What each field means
- Project name β free text, used everywhere as the display label
- Client / Company β the pharma company this project is for
- Assigned to β one person owns this project; their name appears in team task breakdowns
- Category β what type of work this project represents (active delivery, renewal, new biz, etc.)
- PO Number β the client's purchase order reference
- PO Value β the total contracted value in βΉCr. This is the ceiling for fixed-price projects
- Start / Estimated end dates β the agreed project timeline
- Actual end date β fill this only when the project is truly complete. Leave blank if ongoing
- PO deviation reason β why the project timeline or PO scope changed from original. This is project-level, not invoice-level
- Planned monthly billing schedule β month by month, how much you planned to invoice. This is the baseline against which actuals are compared
π‘ Tip: Set up the billing schedule at project start. Even if months change later, having the original plan lets you accurately track deviation over time.
How tasks connect to projects
When a team member logs a task in Daily Entry, they can tag it to a project from the dropdown. This project dropdown is populated from whatever projects exist in the Projects & POs tab. If a project isn't set up yet, tasks will show as "No project" in the team dashboard.
β οΈ Set up your projects first before the team starts logging tasks β otherwise tasks can't be linked and you lose the project-level visibility.
π§Ύ 7. Invoices and deviation tracking
Invoice fields
- Project β which project this invoice belongs to. Required for billing tracker to work
- Invoice number β your internal or client-facing invoice reference
- Invoice value β in βΉCr
- Actual raise date β the date the invoice was actually raised
- Planned raise date β the date you originally planned to raise it (from the billing schedule). Used to calculate date deviation
- Deviation reason β why actual date differs from planned. Options: Scope change, Client delay, Delivery delay (our side), Payment hold by client, PO amendment, Other
- Deviation notes β free text to give more detail on the reason
- Status β Raised / Submitted / Paid / Overdue
How deviation reasons flow to the Billing Tracker
The Billing Tracker groups invoices by the month of their actual raise date. For each month, it collects all unique deviation reasons from invoices in that month and displays them in the Reason column. So if two invoices in March both had "Client delay", it shows "Client delay" once.
β‘ 8. How auto-insights are generated
Insights are computed fresh every time you open the Insights tab or change the date range. They are not stored β they're generated from the live data. Here is every rule the system checks:
Utilisation flags
π΄ Critical underutilisation: person's utilisation below 50% in the period
π‘ Below target: utilisation between 50β70%
π‘ Possibly overloaded: utilisation above 110%
π‘ No entries: member has zero entries in the selected period
Time drain flags
π‘ High admin ratio: more than 40% of a person's tasks are tagged "Internal/admin"
βΉοΈ Fully in delivery mode: all tasks are Active project delivery, zero revenue-hunting
βΉοΈ Fully in revenue-hunting mode: all tasks are revenue-facing, zero delivery β check if projects are being managed
Project health flags
π΄ Project overdue: project is Active, today is past estimated end date, no actual end recorded
π΄ Project ended late: actual end date is after estimated end date
π‘ Deadline approaching: 14 days or fewer to estimated end, project still Active
π’ Delivered early: actual end date is before estimated end date
Billing flags
π‘ Monthly billing shortfall: for any past month in a project's schedule, actual invoiced is less than 80% of planned amount
Task flags
π΄ Delayed tasks: any task with status "Delayed" in the period β count shown
π‘ At-risk tasks: any task with status "At risk" in the period β count shown
Positive signals
π’ Revenue closed: if total closed value (renewals + new biz) is greater than zero, shown as a positive signal
π 9. How to think about future changes
When you want to modify how the tool works, here are the key things to think about:
Adding a new field to daily entry
- Add the input in the Entry tab HTML
- Add the field to
defEntry() with a default value
- Add it to the
loadEntry() function to populate on load
- Add it to
saveEntry() to collect and save it
- If it should appear in the WhatsApp report, add it to
renderReport()
- If it should appear in insights, add logic to
renderInsights()
Changing the utilisation target (currently 8.5h)
- Find the constant
const TARGET=8.5 near the top of the script and change the value
- This flows automatically to utilisation %, colour coding, and insights
Adding a new deviation reason category
- Find the
<select> dropdowns for deviation reasons in both the project modal and invoice modal
- Add a new
<option> to each
Changing what's copied to WhatsApp vs reference-only
- In
renderReport(), the copyText variable is what gets copied
- The
refText variable is the reference section
- Move lines between the two variables to change what's included in the copy
Fixing the concurrent save conflict (most important future improvement)
Currently all daily entries are stored in one shared object. The safest fix is to change the storage key to be per-person per-day, e.g. daily_2026-05-29_Manisha. This means each person's save is completely independent and cannot overwrite anyone else's. The trade-off is slightly more storage reads when consolidating β but fully eliminates conflicts.
Adding a new project category
- Find the
CATS array in the script β add your new category string there
- Also add it to the
<select> in the project modal
β 10. Common questions
Someone forgot to submit today β can I fill it for them?
Yes. Go to Daily Entry, select their name from the dropdown, pick the date, fill in their numbers and save. The data will be stored under their name for that date.
Can someone edit a past day's entry?
Yes. Go to Daily Entry, select their name, change the date to the past date, make edits, and save. It will overwrite whatever was previously saved for that person on that date.
Can a team member see what their colleagues entered?
Not directly from their own entry form β they only see their own fields. But if they navigate to the Team Dashboard tab, they can see everyone's data. There is no technical restriction preventing this.
What happens if I rename a team member in Settings?
Their past daily entries will be orphaned β the entries are stored under the old name and won't link to the new name. Do not rename members once they've started submitting data. If a name is misspelled, fix it before the first entry is saved.
The Billing Tracker shows zero for a month even though I raised an invoice
Check that the invoice's project is correctly set, and that the invoice date falls in the month you're expecting. The tracker uses the actual raise date (not the planned date) to determine which month an invoice belongs to.
Insights are blank / not showing anything
Insights are generated from the date range set at the top of the Insights tab. If the range has no daily entries, no insights will generate. Make sure the date range covers days where entries have been saved.
How do I export all data for backup?
Go to Settings β click "Export all data (JSON)". This downloads a JSON file with all four data stores. Keep this as a backup β if the cloud storage is ever cleared, this file can be used to restore data (requires manual re-import currently).