> ## Documentation Index
> Fetch the complete documentation index at: https://docs.timetracker.in/llms.txt
> Use this file to discover all available pages before exploring further.

# Pending invitations

> Manage open invitations in TimeTracker – resend, change the role, or revoke – and understand why an unaccepted invite already counts as access and a seat.

An invitation that has not been accepted is still live access. Anyone holding the link can join.

That is why you manage invitations exactly like you manage people – on the same roster, with the same care.

## An invite is not a person

These are two different things, and knowing the difference explains most of the page.

|                  | An invitation                        | A member                                                 |
| ---------------- | ------------------------------------ | -------------------------------------------------------- |
| What it is       | An open link to a workspace          | A person on your roster                                  |
| Status           | **Pending**                          | **Active**, **Deactivated**, **Invited** or **No login** |
| Can sign in      | Not yet                              | Yes, unless deactivated                                  |
| Counts as a seat | **Yes**                              | **Yes**                                                  |
| Ends by          | Being accepted, revoked, or expiring | Being removed                                            |

Someone can appear as an invitation first and as a member later. TimeTracker never counts them twice.

<Note>
  When you add someone directly with an email, they get a roster row **and** an invite. The invite is folded into their row, so you see one line, not two – and you use one seat, not two.
</Note>

## Where invitations appear

On the roster at **Settings → Team Members**.

| Row type                       | Name column                 | Status      |
| ------------------------------ | --------------------------- | ----------- |
| A member with a pending invite | Their name and email        | **Invited** |
| A standalone invite            | `–` above the email address | **Pending** |

A standalone invite is an address you invited that has no roster row yet.

## Invitation statuses

| Status       | Meaning                                   |
| ------------ | ----------------------------------------- |
| **Pending**  | Live. The link works and the seat is held |
| **Accepted** | They joined. They are now a member        |
| **Revoked**  | You cancelled it. The link is dead        |
| **Expired**  | Seven days passed. The link is dead       |

## Invitations expire after seven days

An invite is valid for **seven days** from the moment it is sent.

After that, the recipient sees **Invitation Expired or Revoked** with the text `This invitation link is no longer valid. Please reach out to an admin of the workspace to request a fresh invite.`

<Note>
  The same card is shown for an expired, revoked, already-accepted or unknown invite. An outsider cannot learn which one it was.
</Note>

## Resend an invite

Resending gives them a fresh link and another seven days.

<Steps>
  <Step title="Find the row">
    On the roster, look for **Pending** or **Invited**.
  </Step>

  <Step title="Open the three-dot menu">
    Choose **Resend invite**.
  </Step>
</Steps>

<Warning>
  Resending kills the old link. The same invitation is re-armed with a new token, so anyone still holding the previous URL can no longer use it. That is useful if a link went to the wrong inbox.
</Warning>

If the invite is no longer pending, you get `That invitation can't be sent again. Withdraw it and send a new one instead.`

## Change the role before they accept

You do not need to revoke and start over.

<Steps>
  <Step title="Open the three-dot menu">
    On a standalone invite row, choose **Change role**.
  </Step>

  <Step title="Pick the new role">
    The dialog is titled **Change role for {email}**, with the helper `They'll get this role when they accept. Their invite link keeps working.`
  </Step>
</Steps>

The link is unchanged. They get the new role when they join.

**Change role** is disabled on a client invite – a portal contact's role is fixed.

If the invite is not pending: `An invitation that is {status} can't have its role changed. Withdraw it and send a new one.`

## Revoke an invite

Revoking withdraws access. The link stops working immediately.

<Steps>
  <Step title="Open the three-dot menu">
    Choose **Revoke invite**.
  </Step>

  <Step title="Read the dialog">
    **Revoke invite?** – `{email} will no longer be able to use this link. Anyone already on the roster stays on it – they just can't claim a login until you invite them again. This can't be undone.`
  </Step>

  <Step title="Confirm">
    The seat is freed straight away.
  </Step>
</Steps>

Note what the dialog says carefully: revoking an invite does **not** remove a roster row. Someone added directly with an email keeps their roster row, their rates and their groups – they just cannot claim a login until you invite them again.

If it was already dealt with, you get `That invitation has already been dealt with, so there's nothing to withdraw.`

<Warning>
  Revoking is how you withdraw access from someone who has not joined yet. Do it as soon as you know an invite went to the wrong address – until you do, the link is a working key to your workspace.
</Warning>

## Removing a person revokes their invites too

When you remove someone from the workspace, every outstanding invitation for their email is revoked in the same step.

This is deliberate. Removing the roster row but leaving the invite alive would leave a back door open. See [remove a member](/team/remove-a-member).

## Invitations and seats

An outstanding invitation counts toward your seat total, because it is access.

The seat meter on the roster spells it out, for example:

> `8 of 8 seats – 3 members, 4 client contacts, 1 pending invite`

Three rules follow from that:

| Rule                                                     | Detail                                             |
| -------------------------------------------------------- | -------------------------------------------------- |
| An invite holds a seat from the moment you send it       | Not from when it is accepted                       |
| Accepting an invite is **never** blocked by the seat cap | Once the invite is out, the person can always join |
| An expired invite stops holding a seat                   | It is no longer pending                            |

<Note>
  An invite whose email already belongs to an active member is not counted twice. One person, one seat.
</Note>

## Example

Maya Ellis invites two people to Northwind Studio.

<Steps>
  <Step title="Two invites go out">
    `jonas@northwind.studio` as **Member** and `dan@northwind.studio` as **Finance**. The roster now shows two **Pending** rows, and the seat count goes up by two.
  </Step>

  <Step title="Jonas joins">
    He accepts the next day. His row becomes a member with status **Active**. The seat count does not change – he was already counted.
  </Step>

  <Step title="The wrong address">
    Maya realises Daniel's address is `daniel@`, not `dan@`. She revokes the `dan@` invite, which frees a seat, and invites the right address.
  </Step>

  <Step title="A week passes">
    Daniel has not accepted. Maya uses **Resend invite** to give him a fresh link and another seven days. The old link stops working.
  </Step>
</Steps>

## Permissions

| Action                         | Capability      | Roles that hold it by default |
| ------------------------------ | --------------- | ----------------------------- |
| Send an invite                 | `member.invite` | Owner, Admin, Project Manager |
| Resend an invite               | `member.invite` | Owner, Admin, Project Manager |
| Change a pending invite's role | `member.invite` | Owner, Admin, Project Manager |
| Revoke an invite               | `invite.revoke` | Owner, Admin, Project Manager |

The permission list describes `invite.revoke` as **Revoke pending invites**: `Cancel an invite that was sent but not accepted yet.`

## Common questions

<AccordionGroup>
  <Accordion title="Does a pending invite count as a seat?">
    Yes. An open invite is access, so it holds a seat until it is accepted, revoked or expired.
  </Accordion>

  <Accordion title="Is someone counted twice if they show as both an invite and a member?">
    No. When you add someone directly with an email, their invite is folded into their roster row. One person, one row, one seat.
  </Accordion>

  <Accordion title="How long does an invite last?">
    Seven days. Resend it for a fresh seven days and a new link.
  </Accordion>

  <Accordion title="Does resending change the link?">
    Yes. The old link stops working the moment you resend.
  </Accordion>

  <Accordion title="Can someone accept an invite with a different email?">
    The link authorises the join, so yes. Revoke an invite that went to the wrong place rather than relying on the address.
  </Accordion>

  <Accordion title="Does revoking an invite remove the person from the roster?">
    No. Someone added directly keeps their roster row, rates and groups – they just cannot claim a login until you invite them again.
  </Accordion>

  <Accordion title="Can I accept an invite when the workspace is at its seat cap?">
    Yes. Accepting is never blocked. The cap only stops a new invite or a new direct add.
  </Accordion>
</AccordionGroup>

## Troubleshooting

| Problem                                                                        | Cause                              | Fix                                            |
| ------------------------------------------------------------------------------ | ---------------------------------- | ---------------------------------------------- |
| The recipient sees **Invitation Expired or Revoked**                           | It expired or was revoked          | **Resend invite**, or send a new one           |
| The invite email never arrived                                                 | Delivery problem                   | Use **Copy invite link** and send it directly  |
| `That invitation has already been dealt with, so there's nothing to withdraw.` | It was already accepted or revoked | Nothing to do                                  |
| `That invitation can't be sent again. Withdraw it and send a new one instead.` | It is no longer pending            | Send a fresh invite                            |
| No **Revoke invite** item                                                      | You lack `invite.revoke`           | Ask an owner or admin                          |
| Your seat count looks too high                                                 | Pending invites are counted        | Revoke any invites you no longer want          |
| **Change role** is greyed out                                                  | It is a client invite              | Revoke it and re-invite from the client record |

## Related guides

<CardGroup cols={2}>
  <Card title="Invite a member" icon="mail" href="/team/invite-a-member">
    Send an invite in the first place.
  </Card>

  <Card title="Seats and billing" icon="credit-card" href="/team/seats-and-billing">
    How invites are counted.
  </Card>

  <Card title="Remove a member" icon="user-minus" href="/team/remove-a-member">
    Removal revokes invites too.
  </Card>

  <Card title="Add a member directly" icon="user-plus" href="/team/add-a-member-directly">
    Roster row plus invite in one step.
  </Card>

  <Card title="Change someone's role" icon="shield" href="/team/change-someones-role">
    Roles for members and invites.
  </Card>

  <Card title="Invite a client contact" icon="briefcase" href="/portal/invite-a-client-contact">
    Portal invites are different.
  </Card>
</CardGroup>
