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

# Frequently asked questions

> The questions OnTime's actual behaviour raises most often, and the real answers.

## Attendance

<AccordionGroup>
  <Accordion title="Why is my punch pending?" icon="clock">
    You punched **outside your work location's geofence**. OnTime records the punch and marks it pending, because an out-of-zone punch needs a human to confirm it was legitimate. It goes to your direct manager along with the reason you picked.

    The punch is not lost and you do not need to punch again. See [Punching](/help/attendance/punching).
  </Accordion>

  <Accordion title="Why is a day still missing after I punched?" icon="calendar">
    Most likely the day has not been **closed** yet. A day is finalized after it is over, not at the moment of the last punch — so yesterday's final status lands the following morning.

    `Absent` in particular is never written to a day still in progress: someone who has not punched *yet* is not a no-show. See [The attendance day lifecycle](/help/concepts/attendance-day-lifecycle).
  </Accordion>

  <Accordion title="Where did my terminal punch go?" icon="fingerprint">
    Almost certainly your terminal user ID has not been **mapped** to your OnTime employee record. Punches from an unmapped terminal user are **parked**, never dropped — they sit waiting.

    When an administrator creates the mapping, the parked punches are replayed automatically and your days fill in. Ask them to check the unmapped queue.
  </Accordion>

  <Accordion title="Why was my punch refused as a duplicate?" icon="copy">
    You pressed the same direction twice within a minute. It is a double-tap guard. Check whether your first press registered — it almost certainly did.
  </Accordion>

  <Accordion title="Why does the live board disagree with the day report?" icon="activity">
    The live board shows **today**, which is provisional. The day report shows closed days, which are final. They are measuring different things and both are right.
  </Accordion>
</AccordionGroup>

## Approvals

<AccordionGroup>
  <Accordion title="Why can't I approve my own request?" icon="shield">
    Because the second pair of eyes is the point. The same-actor rule applies at every stage and to every request type, regardless of how senior you are.

    Rejection is different — anyone in scope can reject at any stage. A denial does not need the protection a grant does.
  </Accordion>

  <Accordion title="Why can't I approve this — I have the permission" icon="users">
    Permission and **scope** are two separate checks. `leave:approve` lets you approve leave; it does not say whose. You must also be the requester's **direct manager**, or hold `hr:approve` for organization-wide reach.

    Somebody two levels below you is not in your scope. See [Roles & permissions](/help/concepts/roles-and-permissions).
  </Accordion>

  <Accordion title="I approved it but nothing happened" icon="triangle-alert">
    If someone else decided it a moment before you, you are told it is no longer pending.

    If the request would rewrite a day inside a **frozen payroll month**, the whole decision is refused and rolled back — the request stays pending. That is deliberate: payroll has locked that month.
  </Accordion>

  <Accordion title="Why does this request need HR after me?" icon="git-branch">
    For **leave**, because that leave type is configured to require it. For a **regularization**, because it is a whole-day manual entry — the one correction with no underlying punch to check against.

    The HR step needs the `hr:approve` permission and cannot be performed by whoever approved at the manager step.
  </Accordion>
</AccordionGroup>

## Leave and pay

<AccordionGroup>
  <Accordion title="Why did my leave balance change at the start of the month?" icon="wallet">
    Monthly **accrual**. Leave types set to accrue monthly credit their rate on each run, and OnTime checks for due accruals once a day automatically.

    At the financial-year boundary you may also see **carry-forward** — up to the type's cap — and anything above the cap lapsing.
  </Accordion>

  <Accordion title="Why is my leave request costing fewer days than the dates I picked?" icon="calendar-check">
    Because it counts **working days**. Weekly offs and dates on the organization's holiday calendar are excluded. The quote shown before you submit breaks this down explicitly.
  </Accordion>

  <Accordion title="Why doesn't my payslip show for last month?" icon="receipt">
    A payslip is created when the payroll cycle is **disbursed**. Until then the numbers exist only inside the cycle and are not visible to employees. Ask whoever runs payroll where the cycle is.
  </Accordion>

  <Accordion title="My net pay is lower than I expected" icon="indian-rupee">
    Read the **attendance** section of the payslip first — paid days, loss-of-pay days, overtime. Pay is derived from attendance, so a surprising net almost always traces to a day that reconciled differently from what you expected.

    A missing holiday on the organization calendar is the classic cause: it makes a holiday read as `Absent`, and `Absent` is loss of pay.
  </Accordion>
</AccordionGroup>

## Configuration

<AccordionGroup>
  <Accordion title="Why can't I delete this leave type / role / location?" icon="trash">
    Because it is in use.

    * A **leave type** with any balance or request against it cannot be deleted.
    * A **role** with employees assigned cannot be deleted.
    * A **location or department** with employees assigned cannot be deleted.
    * The **four role presets** can never be deleted or edited.

    Reassign first. To retire a leave type that is in use, set its quota to zero instead.
  </Accordion>

  <Accordion title="Why can't I assign anyone to this shift template?" icon="calendar-clock">
    It is still a **draft**. Publish it — a draft template is invisible to the roster.
  </Accordion>

  <Accordion title="I published a roster but nobody can see it" icon="eye-off">
    Check you published rather than just assigning. Cells are drafts until the **week** is published, and publishing is a separate permission (`roster:publish`) from editing.
  </Accordion>

  <Accordion title="I changed the brand colour and nothing happened" icon="palette">
    Expected. The brand colour is stored but **not yet applied** to the interface — nothing reads the value. The panel says so.
  </Accordion>

  <Accordion title="I connected an integration but no data is syncing" icon="plug">
    Also expected. Integrations today are a **configuration registry**: connecting stores what you typed and marks the provider connected. It performs no authentication and moves no data. See [Integrations](/help/admin/integrations).

    For real data movement, use the public API or webhooks.
  </Accordion>
</AccordionGroup>

## Notifications and access

<AccordionGroup>
  <Accordion title="Why didn't I get an email about this?" icon="mail">
    Because OnTime does not send any. **Every notification is in-app only** — no email, SMS, WhatsApp or push, for any event including payslip publication and Form 16 availability.

    The bell is where you find out. For machine delivery to your own systems, use webhooks.
  </Accordion>

  <Accordion title="I revoked someone's role but they can still see things" icon="user-x">
    Role changes take effect immediately for permission checks, but **the person stays signed in**. If the change is urgent, revoke their sessions too — see [Sessions and devices](/help/admin/sessions-and-devices).
  </Accordion>

  <Accordion title="A new employee can't sign in" icon="key">
    If they were created through **CSV import**, they have a randomly generated password that was never displayed. Set a real password on their record and share it. OnTime sends no welcome or invite email to employees.
  </Accordion>

  <Accordion title="My webhook shows Failing but I wasn't told" icon="webhook">
    The status flips to `Failing` on the first failed attempt; the notification only fires once an event has exhausted all eight retries, roughly 22 hours later. Watch the badge rather than waiting for the alarm. See [API keys and webhooks](/help/admin/api-settings).
  </Accordion>
</AccordionGroup>
