Skip to main content

Project Profitability & Time Estimation

When creating or updating a project, the Profitability section controls how time and income are estimated. These settings are sent as part of POST /projects and PUT /projects/{project_id}.
These fields are unrelated to the Project Estimates endpoints (/projects/{project_id}/project_estimate), which manage budget line items with a title, cost, and optional fee association.

Time estimation modes

Projects support three mutually exclusive time estimation modes. Only one should be active at a time.

1. Total hours (default)

Send a single estimated_time value (in hours). Do not set estimated_by_position or estimation_by_categories.

2. Estimation by positions

Set estimated_by_position: true and provide a users_positions array where each entry contains a unified position id and its estimated_time in hours.
When estimated_by_position is false, you may still send users_positions with only the id field to associate positions to the project without per-position hour estimates.
On update (PUT), positions that exist in the project but are absent from the users_positions array will have their estimated_hours set to 0. If no hours have been logged against them, they are soft-deleted.

3. Estimation by categories

Set estimation_by_categories: 1 (or true) and provide a categories array with id and estimated_time.

Income types and ratecards

The income_type field determines how the project revenue is modeled: When using hourly_rate, set estimated_by_hourly_rates: true and assign a ratecard:
The ratecard_id field is an alias for user_positions_header_id — either name is accepted, but ratecard_id takes precedence if both are sent. Use GET /ratecards to list available ratecards for your company.

Reading profitability data

When you fetch a single project with GET /projects/{project_id}, the response includes:

Field reference