---
title: Upload a signed timesheet without counting hours twice
description: 'Upload a signed timesheet without counting hours twice: attach the PDF when you submit, or assign booked time records afterwards.'
author: Robert Reiz
published: '2026-11-13T09:52:04Z'
updated: '2026-11-13T09:52:04Z'
language: en
keywords:
- CreditNotes
- TimeRecording
canonical: https://zeit.io/en/blog/upload-a-signed-timesheet-without-counting-hours-twice
---

# Upload a signed timesheet without counting hours twice

ZEIT.IO, the time tracking and billing software for freelancers and agencies, no longer counts hours twice when a signed timesheet is uploaded for times that are already booked. Freelancers attach the PDF right when they submit, and organisations can assign booked time records to an uploaded timesheet afterwards – even once it is approved.

![Two duplicate stacks of hours merging into a single green timesheet with an attached document](https://public.zeit.io/2026-11-13-1794562545863-zio-timesheets-time-records.jpg)

**Booked time records and the signed timesheet now end up in one document – and the project budget counts every hour once.**

---

## How do hours end up counted twice in a project?

An example: Lena works as a freelancer on the project "Shop relaunch", which has a budget of 160 hours. In October she books 146 hours in ZEIT.IO and requests approval for them. Her client also wants the signed timesheet as a PDF.

Lena can't find where to attach the PDF to her existing timesheet. So she deletes it and creates a new one of type *Upload* – with the PDF and 146 hours. But the new timesheet contains none of her booked time records. The project now shows 146 hours twice: once from the time records, once from the upload. On paper the budget is overrun, even though the work was only done once.

The same happens when an organisation uploads a timesheet for a month and the times are only booked later.

---

## How it works

For freelancers, when submitting:

1. Open *Timesheets › Submit new timesheet* and choose *Default*.
2. Pick the period and the project. Below the table of time records you'll find the new field *Signed timesheet (optional)* for a PDF or Excel file.
3. Click *Request approval*. ZEIT.IO stores the file together with your booked time records in the same timesheet.

For organisations, afterwards:

1. Under *Timesheets*, open an uploaded timesheet.
2. Click *Assign time records*. The page shows the tabs, the uploaded file and the timesheet's header data, followed by all free time records of the project in the same period.
3. Select the matching time records and click *Assign selected*. A running total shows whether your selection matches the timesheet.

---

## Can I still upload the PDF later?

Yes. As long as a timesheet is neither approved nor declined, you can still add the file via *Upload* on the timesheet. If you submit without a file, the page you land on shows the hint *"You can optionally upload a signed timesheet here."* with an upload button. If your client requires a signed timesheet, it says *"A signed performance record still has to be uploaded."* instead.

If your client requires a signed timesheet and you attach it when submitting, there is no email asking you to send it later – approval is requested straight away.

---

## What if I choose the Upload type anyway?

The *Upload* type is meant for times you recorded in another system. That's why the Upload box on the selection page now says: *"Recorded your times on ZEIT.IO? Then please choose "Default", otherwise the hours are counted twice."*

If you already have booked time records for the selected project and period that aren't in a timesheet yet, the upload page also shows a warning with the exact number of hours and a link to submit your booked times instead. It is only a warning: you can still finish the upload if that's what you intend.

---

## What applies to a timesheet that is already approved?

An approved timesheet does not change when time records are assigned to it. ZEIT.IO only accepts the selection if the duration and the sales amount of the chosen time records match the timesheet exactly. Otherwise you see a message such as *"The summed duration of all selected time records (2.00 h) must match the duration of the timesheet (4.00 h)."*

If the selection matches, the time records are marked as approved. If the timesheet has already been invoiced, ZEIT.IO links the time records to the invoice to your client. If there is no invoice but exactly one approved incoming credit note from your client, the time records are linked to that. And if your supplier received exactly one valid [credit note](https://zeit.io/en/blog/one-credit-note-a-month-instead-of-ten) for the timesheet with the same duration, the time records are linked to it as well.

On a timesheet that is still open, any selection is allowed. Duration and amounts are then recalculated from the assigned time records.

---

## What stays the same

* Timesheets of type *Upload* for times from other systems work as before.
* The [approval workflow for timesheets](https://zeit.io/en/blog/timesheet-approval-made-easy:-how-the-approval-workflow-works-in-zeit-io) starts as usual – with or without a file.
* Like every upload in ZEIT.IO, uploaded PDFs are cleaned of active content such as JavaScript before they are stored. Excel files can still be [viewed right in your browser](https://zeit.io/en/blog/view-excel-timesheets-right-in-your-browser).

---

## At a glance

* **Available since:** 13 November 2026 (*Assign time records* for organisations)
* **Where:** freelancers under *Timesheets › Submit new timesheet › Default*; organisations under *Timesheets* › uploaded timesheet › *Assign time records*
* **Who:** freelancers when submitting; in organisations, members who can comment on, approve and reject timesheets, and administrators
* **Limits:** uploads as PDF, XLSX or XLS up to 5 MB. *Assign time records* is only available on uploaded timesheets that are not declined. On approved timesheets, duration and sales amount must match exactly.
* New in the organisation's upload form: the *Active contract* tab, to assign a timesheet straight to a running supplier contract.

---

## Frequently asked questions

### Do I have to upload a file when submitting?

No. The field is optional. You can add the file to the timesheet later, as long as it hasn't been approved or declined.

### Which file formats can I upload?

PDF and Excel (XLSX and XLS) up to 5 MB. ZEIT.IO rejects other formats before the timesheet is created.

### Does an Upload timesheet delete my booked time records?

No. The time records stay booked. They just aren't in any timesheet, which is why the project counts the hours twice until an organisation assigns them to the uploaded timesheet with *Assign time records*.

### Does an approved timesheet change when time records are assigned?

No. Duration and amount stay as they are. That's why ZEIT.IO only accepts a selection that adds up to exactly the same duration and sales amount.

---

## Why this matters

A project budget is only as good as the numbers behind it. When the same hours count once as booked time records and once as an uploaded timesheet, a healthy project suddenly looks overrun – and nobody trusts the report any more. With the upload at submission, the problem doesn't arise in the first place, and where it has already happened, an organisation clears it up in a few clicks. More about [time tracking and billing with ZEIT.IO](https://zeit.io/en/all_features).

**One hour, one timesheet, one budget.**
