Actuals (timesheets)
Overview
In a budget-constrained environment, timesheets are a critical measurement of how much time has been spent. Knowing this means that Runn can forecast when a project will be completed, how much it is going to cost to deliver it and what the total bill will be.
Runn calculates forecasts using two key ingredients:
Scheduled Work: the hours that have been assigned to people in Runn.
Actual Work: the actual hours that people have recorded in their timesheet.
Runn can still forecast without Actual Work, we do this by assuming that all the Scheduled Work was done exactly as planned. However, the forecast will be far more accurate when Actual Work hours are available.
Options for recording actual work hours in Runn
There are 4 options for recording your Actual Work hours in Runn:
- You can enter them directly into Runn using our built-in timesheet tools.
- You can import them into Runn using our CSV importer.
- You can use one of our pre-built integrations (Clockify and Harvest).
- You can use Runn’s API to automate the syncing of data from your existing time tracking tool.
Use Runn's API to enter actuals
Guide
- Use the following guide alongside the API reference for Actuals
Below we discuss how to use Runn's API to enter actuals. The key benefits of this approach are:
- No change management. If your team is already using a timesheeting tool, having to move everyone over to a new tool could be painful. By syncing data using our API, your team can keep using the tools they are used to.
- Streamlined operations. Timesheeting tools often manage a similar set of data to Runn: such as people, projects, clients, hours worked, etc. Integrating your tools with Runn keeps that data connected and in sync.
- Easier migrations. Even if you plan to fully migrate to Runn’s timesheeting solution in the future, by keeping the two tools in sync, you can take your time running both in tandem till you are ready to decommission the old one.
POST /actuals/
Creates an 'actual' which is the total time spent on a project for a given date. Actuals are matched on date, project, person, role, and workstream.
- the /actuals/ endpoint will overwrite any existing actual for the same
projectId,personId,roleId, andworkstreamId. - The /actuals/ endpoint will auto fill 0 hours work for dates between two submitted actuals. For example, if you submit an actual for Monday and Friday. We will automatically insert 0 hours for Tuesday, Wednesday & Thursday. This can be overwritten at any time.
- The /actuals/ endpoint will auto fill 0 hours work for any days where assignments exists before the first submitted actual. For example, if someone had an assignment for Monday to Friday, and the first submitted actual was on Wednesday. We will automatically fill Monday and Tuesday with 0 hours. This can be overwritten at any time.
- Please ensure there is a delay between each entry for the same person/project/role/date. Either wait for the response or add 100ms delay. You may receive a Too many requests error otherwise.
TipsIf you have started adding actuals half-way through a project, and do not plan to fill in the history: Use the UI to create the first actual for each person/project/role. In that case we will not auto fill before this entry.
If there is not actual for a certain date, Runn will use the assigned hours in place of the actual. This is why we auto fill 0 for you when using the API. So that you do not need to add 0 for days that someone was not working.
POST /actuals/bulk/
Create or update up to 100 'actuals' in a single API call.
- Use this endpoint if you are syncing a batch of data rather than an API call for each actual.
- Each actual is matched the same way as
POST /actuals/: on date, project, person, role, and workstream. See Workstreams below. - If there is a validation error with any entry in your API request none of the actuals will be entered.
POST /actuals/time-entry
Creates a time_entry that is added to an actual. This allow you to submit multiple entries for a single date/project/person/role/workstream and have them added together into a single actual.
- Entries are matched on date, project, person, role, and workstream, the same as the other actuals endpoints. See Workstreams below.
- Please ensure there is a delay between each entry for the same person/project/role/date/workstream. Either wait for the response, or add 100ms delay.
- We do not store these submissions, we simply add the time to the existing actual (or create a new actual where none exists).
- You cannot remove time through this endpoint. Instead you must update the existing actual with either the new total time, or with 0 and then re-submit the time entries.
- Too many requests error occurs when you send multiple requests for the same person/project/role/date/workstream before we have finished writing the initial data to the database.
billableNoteandnonbillableNoteoverwrite rather than accumulate. Each time entry replaces the note on the actual while adding to its minutes. Leave the note fields out to keep the existing note.
Workstreams
- Send
workstreamIdon every request if the project uses workstreams. Omit it and the actual is created with no workstream, where it appears under No Workstream on the project.- Omitting
workstreamIdand sending"workstreamId": nulldo different things. Omitting it matches an actual on any workstream and leaves that workstream unchanged. Sending null matches only an actual with no workstream, so an existing actual on a workstream is skipped and a second actual is created for the same day with no workstream.- If multiple actuals already exist for the same day on different workstreams, omitting
workstreamIdupdates the oldest one and leaves the others untouched.- To fix duplicates, find them with GET /actuals, which returns the
idand other attributes per entry, then delete the wrong ones with DELETE /actuals/{actualId}.
Updated 25 days ago
