> ## 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.

# Add a member directly, without an invite

> Put someone on your TimeTracker roster yourself – with their role, rates, groups and employment details – even if they have no email and will never sign in.

**Add member** puts a person on your roster straight away, with their role, rates, groups and employment details already filled in. You do not wait for them to accept anything.

The email is optional. Someone added without one still appears in reports and you can log time for them – they just cannot sign in yet.

## When to add directly instead of inviting

<CardGroup cols={2}>
  <Card title="Add directly when" icon="user-plus">
    The person has no email, or does not need a login. You are backfilling historic staff. You want their rates and employment details set before day one. You are logging time on someone else's behalf.
  </Card>

  <Card title="Invite when" icon="mail">
    The person will use TimeTracker themselves and you are happy for them to fill in their own details.
  </Card>
</CardGroup>

You can do both. Add someone now without an email, then add an email later to invite them. Their tracked time, rates and groups carry over untouched.

## How to add a member

<Steps>
  <Step title="Open the roster">
    Go to **Settings → Team Members**.
  </Step>

  <Step title="Click Add member">
    The dialog is titled **Add a team member**, with the text `Add someone to the roster with their role, rates and groups. An email is optional – without one they still appear in reports and you can log time for them, they just cannot sign in yet.`
  </Step>

  <Step title="Fill in the basics">
    **First name** is required. Everything else is optional.
  </Step>

  <Step title="Choose a role">
    The **Role** dropdown is required. Its placeholder reads `Choose a role`.
  </Step>

  <Step title="Add the extras you need">
    Groups, rates and employment details are all on the same dialog.
  </Step>

  <Step title="Save">
    Click **Add member**. It reads **Adding…** while it works.
  </Step>
</Steps>

## Every field on the dialog

### Identity

| Field                | Required | Notes                                                            |
| -------------------- | -------- | ---------------------------------------------------------------- |
| **Profile picture**  | No       | **Upload**, then **Replace** or **Remove**                       |
| **First name**       | **Yes**  | Validation: `Enter a first name.`                                |
| **Last name**        | No       |                                                                  |
| **Email (optional)** | No       | Leave blank for someone who will not sign in                     |
| **Role**             | **Yes**  | Excludes Owner and Client                                        |
| **Groups**           | No       | Multi-select. Placeholder `No groups`. Needs `member.changeRole` |

The email field carries its own hint: `Leave this blank for someone who does not need to sign in – they will still appear in reports and you can log time for them. You can add an email later to invite them.`

### Rates

| Field                   | Shown when                                 |
| ----------------------- | ------------------------------------------ |
| **Billing rate / hour** | You hold `rate.manage`                     |
| **Cost rate / hour**    | You hold `rate.manage` and `rate.viewCost` |

Both show your workspace currency in the label. Validation rejects anything that is not a plain amount: `Enter an amount like 120 or 120.50.`

### More details

This accordion appears if you hold `member.changeRole`.

| Field                | Notes                                                                                            |
| -------------------- | ------------------------------------------------------------------------------------------------ |
| **Job title**        | Free text                                                                                        |
| **Employment type**  | **Employee**, **Contractor** or **Part time**. Placeholder `Not set`                             |
| **Employee ID**      | Hint: `Your own staff or payroll number. Must be unique in this workspace.`                      |
| **Joining date**     | Placeholder `No joining date`                                                                    |
| **Termination date** | Placeholder `Still employed`. Hint: `For your HR record only – it does not remove their access.` |

<Warning>
  A termination date is a record, not an action. It does not remove access, deactivate anyone, or free a seat. To end access, deactivate or remove the person.
</Warning>

## What happens after you save

| You entered          | What you get                                         | Toast                                                                  |
| -------------------- | ---------------------------------------------------- | ---------------------------------------------------------------------- |
| A name and an email  | A roster row **and** an invite, sent to that address | `Jonas Bergman was added and invited by email.`                        |
| A name with no email | A roster row with no login                           | `Jonas Bergman was added. They cannot sign in until you add an email.` |

Someone with no email shows the status **No login** on the roster. Someone with an email shows **Invited** until they accept.

## Adding an email later

When you are ready to give a loginless person access:

<Steps>
  <Step title="Open their three-dot menu">
    On the roster, find their row.
  </Step>

  <Step title="Choose Add email & invite">
    The dialog is titled **Invite {name}** with the text `Add an email address and we'll send them an invite. Their tracked time, rates and groups stay exactly as they are.`
  </Step>

  <Step title="Send">
    Enter the address and click **Send invite**.
  </Step>
</Steps>

This only fills a blank. If they already have an email you get `They already have an email address on file.`, and if they already have an account you get `They already have an account, so there's nothing to send.`

## Example

Northwind Studio hires Ana Ferreira as a freelance copywriter. She works two days a week and does not want a login – Priya Raman logs her time.

<Steps>
  <Step title="Add Ana">
    Maya opens **Add member** and enters **Ana** / **Ferreira**, leaves the email blank, and picks **Contractor** as the role.
  </Step>

  <Step title="Set her rates">
    Billing rate `80`, cost rate `55`.
  </Step>

  <Step title="Fill in More details">
    Job title `Copywriter`, employment type **Contractor**, employee ID `NW-014`, joining date 1 February 2026.
  </Step>

  <Step title="Save">
    Ana appears on the roster with the status **No login**. Priya can now log time against her, and Ana's hours appear in reports at $80/hour billable and $55/hour cost.
  </Step>

  <Step title="Six months later">
    Ana needs to track her own time. Maya uses **Add email & invite** on Ana's row. Ana accepts, and every hour already logged for her stays exactly where it is.
  </Step>
</Steps>

## Permissions

| Action                            | Capability                         | Roles that hold it by default |
| --------------------------------- | ---------------------------------- | ----------------------------- |
| Add a member directly             | `member.create`                    | Owner, Admin                  |
| Set groups and employment details | `member.changeRole`                | Owner, Admin                  |
| Set a billing rate                | `rate.manage`                      | Owner, Admin, Project Manager |
| Set a cost rate                   | `rate.manage` plus `rate.viewCost` | Owner, Admin                  |

The permission list describes `member.create` as **Add members directly**: `Add someone to the group yourself – their name, role, pay rates and groups – instead of waiting for them to accept an invite. They can be added without an email, in which case they appear in reports and can have time logged for them, but cannot sign in.`

The **Add member** button is hidden if you do not hold `member.create`.

## Seats

A directly added person counts as a seat as soon as they exist, whether or not they have an email.

If you add them with an email, the invite is folded into their roster row rather than counted separately – so you use one seat, not two.

## Common questions

<AccordionGroup>
  <Accordion title="Can I really add someone with no email?">
    Yes. They appear on the roster with status **No login**, show up in reports, and you can log time for them. They cannot sign in until you add an email and they accept the invite.
  </Accordion>

  <Accordion title="Can I add a client portal contact this way?">
    No. A portal contact needs an email, and must be invited from their client company's record. Trying it returns `A client contact needs an email address, because that's how they reach the portal.`
  </Accordion>

  <Accordion title="Can I add an Owner?">
    No. The role dropdown excludes Owner. Ownership only moves by transfer.
  </Accordion>

  <Accordion title="What if the email is already in use?">
    You get `They're already a member of this workspace.` or `An invitation is already on its way to that address.`
  </Accordion>

  <Accordion title="What if the employee ID is taken?">
    You get `Another member already has that employee ID. Pick a different one.` Employee IDs must be unique in the workspace.
  </Accordion>

  <Accordion title="Does the termination date remove their access?">
    No. It is for your HR record only. Deactivate or remove them to end access.
  </Accordion>
</AccordionGroup>

## Troubleshooting

| Problem                                              | Cause                               | Fix                                     |
| ---------------------------------------------------- | ----------------------------------- | --------------------------------------- |
| No **Add member** button                             | You do not hold `member.create`     | Ask an owner or admin                   |
| No rate fields                                       | You do not hold `rate.manage`       | Ask for rate permissions                |
| No **More details** accordion                        | You do not hold `member.changeRole` | Ask an owner or admin                   |
| `Termination date can't be before the joining date.` | The dates are the wrong way round   | Fix the dates                           |
| The add is refused                                   | You are at the Free seat cap        | Upgrade to Pro, or free a seat          |
| They cannot sign in                                  | They have no email                  | Use **Add email & invite** on their row |

## Related guides

<CardGroup cols={2}>
  <Card title="Invite a member" icon="mail" href="/team/invite-a-member">
    The email invite route.
  </Card>

  <Card title="Member record" icon="id-card" href="/team/member-record">
    Everything you can set per person.
  </Card>

  <Card title="Groups" icon="users" href="/team/groups">
    Group people for reporting and schedules.
  </Card>

  <Card title="Set a person rate" icon="dollar-sign" href="/rates/set-a-person-rate">
    Billing and cost rates.
  </Card>

  <Card title="Track time for someone else" icon="clock" href="/time-tracking/track-time-for-someone-else">
    Logging hours for a loginless member.
  </Card>

  <Card title="Seats and billing" icon="credit-card" href="/team/seats-and-billing">
    What counts toward your plan.
  </Card>
</CardGroup>
