Working with timesheets
Overview
The Timesheets API allows you to programmatically submit, review, and track hourly work for time-based contractor contracts. Both contractors and clients can create timesheets, which are then reviewed and included in the next invoice for the payment cycle.
This guide covers the complete timesheet workflow from creation through approval and payment tracking.
When to use this workflow
Use the Timesheets API when you need to:
- Submit hourly work logs for time-based contracts
- Review and approve contractor-submitted timesheets
- Track billable hours for project-based work
- Automate timesheet creation from time-tracking systems
- Manage hourly report presets for recurring work types
Prerequisites
Before you begin, ensure you have:
- A valid API token with
timesheets:writeandtimesheets:readscopes - The
contract_idof the time-based contractor contract - Work details including date, hours worked, and description
- (Optional) A timesheet preset ID if using predefined hourly rates
Timesheets can only be created for time-based contracts. Fixed-price and milestone contracts do not support timesheet submission.
Step-by-step workflow
This example demonstrates submitting 40 hours of backend development work for a contractor’s weekly timesheet.
Identify the contract
First, retrieve the contract ID for the time-based contractor. You can list contracts and filter by type.
Response:
Save the id field - this is your contract_id for timesheet creation.
Create a timesheet entry
Submit the hours worked with a clear description of the work performed.
Include specific details in the description to help reviewers understand the work performed. This aids in approval and provides context for invoicing.
Response:
The timesheet is now created with pending status, waiting for review.
Using hourly report presets
For recurring work types, create reusable presets with predefined rates and descriptions.
Once created, use the preset ID when submitting timesheets:
The preset automatically applies the rate and description, streamlining timesheet submission.
Review and approve timesheets
Clients can review and approve submitted timesheets. This step moves them from pending to approved status.
The reason field is optional but recommended. It creates an audit trail and helps explain approval or rejection decisions.
To reject a timesheet, set status to "rejected":
Common scenarios
Scenario 1: Submitting multiple days of work
For contractors tracking work across multiple days, submit separate timesheet entries for each day.
This creates individual timesheet entries for each day, making it easier to track daily work breakdown.
Scenario 2: Auto-approved timesheets
For pre-authorized work or trusted contractors, use auto-approval to bypass manual review.
The timesheet is created with approved status immediately, bypassing the manual review workflow.
Only use auto-approval for pre-authorized work or established contractors with a proven track record. Manual review provides an important control point for verifying hours and work quality.
Scenario 3: Updating a timesheet before approval
Correct errors in pending timesheets before they are reviewed.
You can only update timesheets in pending status. Once approved or paid, timesheets cannot be modified. If you need to correct an approved timesheet, contact Deel support or create an adjustment.
Scenario 4: Listing all timesheets for a contract
Retrieve timesheet history for reporting and tracking purposes.
This retrieves all approved and paid timesheets for the contract, allowing you to calculate total billable hours.
Best practices
Detailed work descriptions
- Be specific: Include what was accomplished, not just general work categories
- Link to deliverables: Reference pull requests, tickets, or project milestones when applicable
- Use consistent formatting: Establish a description template for your team
- Avoid vague entries: “Worked on project” is less useful than “Implemented OAuth2 authentication flow”
Timing and submission cadence
- Submit regularly: Daily or weekly submissions prevent backlog and ensure accurate time tracking
- Respect payment cycles: Submit timesheets early in the cycle to ensure inclusion in the current invoice
- Track in real-time: Use time-tracking tools and sync to Deel API to maintain accuracy
- Review before submission: Verify hours and descriptions before creating timesheets
Preset management
- Create presets for common work: Set up presets for recurring work types (development, design, consulting)
- Use descriptive titles: Make preset titles clear and specific for easy selection
- Update rates regularly: Keep preset rates current with contract amendments
- Document preset usage: Maintain internal documentation on when to use each preset
Approval workflow
- Review promptly: Approve or reject timesheets within 24-48 hours to maintain contractor trust
- Provide clear feedback: When rejecting, explain exactly what needs to be corrected
- Use auto-approval selectively: Reserve for established contractors with proven accuracy
- Maintain audit trail: Include approval reasons for compliance and record-keeping
Error handling
- Validate contract type: Ensure contracts are time-based before attempting timesheet creation
- Check scopes: Verify your API token has required
timesheets:writeandtimesheets:readscopes - Handle rejections gracefully: Implement retry logic for rate limits and temporary failures
- Log all operations: Track timesheet IDs and statuses for debugging and reconciliation
Reporting and analytics
- Track by status: Regularly query pending timesheets to ensure timely reviews
- Monitor payment cycles: Correlate timesheet submission dates with invoice generation
- Calculate utilization: Use contract timesheet data to analyze contractor productivity
- Export for accounting: Integrate timesheet data with finance systems for reconciliation
Troubleshooting
Timesheet not appearing on invoice
Verify that the timesheet is approved and that the submission date falls within the current payment cycle. If the invoice has already been generated, the timesheet will appear on the next invoice. Check the payment cycle dates using the contracts endpoint.
Cannot create timesheet for contract
Timesheets can only be created for ongoing_time_based or fixed_term_time_based contracts. Verify the contract type using GET /rest/v2/contracts/{contract_id}. For fixed-price contracts, use milestones or invoice adjustments instead.
Insufficient scope error
Your API token must have timesheets:write scope to create or update timesheets, and timesheets:read scope to retrieve them. Generate a new token with the required scopes in the Developer Center.
Cannot update approved timesheet
Timesheets can only be modified while in pending status. Once approved, they are locked for audit purposes. If you need to correct an approved timesheet, contact Deel support or create an invoice adjustment for the difference.
Preset not found error
Ensure the hourly_report_preset_id exists and belongs to the specified contract. Use GET /contracts/{contract_id}/timesheets/presets to list available presets for the contract. Presets are contract-specific and cannot be shared across contracts.
Review rejected without reason
When rejecting a timesheet, always include a reason field to explain the rejection. This helps the contractor understand what needs to be corrected. If a timesheet was rejected without reason, contact the reviewer or check the timesheet details for any reviewer remarks.