Hydra logoHydra · Hydra Support

Configuration

Business hours and holidays

Set your team's weekly schedule and holidays so SLA timers and auto-replies know when you're reachable.

Business hours and holidays

Business hours tell Hydra when your team is staffed. Once configured, they're used by:

  • SLA timers — first-response and resolution clocks pause outside business hours so a Friday-evening conversation doesn't burn through its target overnight.
  • Out-of-hours auto-replies — channels can be configured to send an automatic acknowledgement when a customer messages outside hours. See the section below.
  • Anything else that calls isInBusinessHours() — the helper is shared, so future features (smart routing, on-call escalation, etc.) all read the same source of truth.

The setting lives at Settings → Business Hours.

Setting your weekly schedule

The page shows seven rows — Monday through Sunday — each with an Open/Closed checkbox and two time pickers.

  • Tick the checkbox to mark a day as open. Untick it for closed days.
  • For each open day, pick the open and close times in 24-hour clock format. Close must be after open.
  • The whole schedule is interpreted in the timezone dropdown at the top. We auto-suggest your browser's timezone on first load.

If you have a lunch break or split shift (e.g. 09:00–12:00 and 13:00–17:00), the underlying schema supports it but the v1 UI only shows one window per day. Contact us if you need split-shift entry — the helper handles it correctly already.

Overnight windows (e.g. 22:00 → 02:00 the next day) are not supported in v1. If you operate overnight, encode it as two rows on consecutive weekdays — the close at 23:59 on day N and the open at 00:00 on day N+1.

Holidays

Holidays are entire days marked closed regardless of the weekly schedule. Use them for fixed dates that override your weekly hours.

  • Pick a date and give it a name (e.g. "New Year's Day").
  • Add as many as you need.
  • Holidays are interpreted in your business-hours timezone, so a January 1 holiday closes you all day in that zone.

Recurring holidays (every Christmas, every July 4) need a fresh row each year — there is no "every December 25" rule in v1. You can add a year's worth of rows at once and they'll all save together.

What happens with no config

If you save the page with every day unchecked and zero holidays, Hydra treats your tenant as always open. SLA timers won't pause; auto-replies won't fire on any message. This is the right default — it's an opt-in feature.

To turn business hours back off, simply uncheck every day and clear the holidays list, then Save.

Permissions

  • Any teammate can view the schedule on Settings → Business Hours.
  • Only admins and owners can change it.

Changes are recorded in Team → Audit log as "Changed business hours" with the row count, holiday count, and timezone.

Per-channel overrides (deferred)

The schema supports per-channel hours overrides — e.g. a "European Support" channel can be Mon-Fri 09:00–17:00 in Europe/London while the rest of the workspace is on US hours. The v1 UI only edits the tenant default; per-channel overrides will land in a follow-up. The helper already reads them correctly.

Frequently asked questions

What if a customer messages right before close? Their conversation will appear in the inbox normally. If the SLA policy on that channel has Pause timer outside business hours enabled, Hydra holds the timer at close and resumes it at the next open — see SLAs for the toggle.

Do business hours affect when the bot responds? No. The bot replies 24/7 — it doesn't read this config. Hours only gate features that need to know whether humans are reachable.

My team works 24/7 but takes US holidays. How do I set that up? Check every day, set 00:00–23:59 on each. Then add the holiday rows. The weekly schedule is "always open"; the holidays close the specific days you list.

Is the helper available for custom flows or integrations? Yes — isInBusinessHours(tenantId, channelId?, now?) is exported from lib/business-hours/check.ts and returns { open, nextOpenAt, nextCloseAt, source }. Future flow nodes that need to check hours will call it.


Out-of-hours auto-replies

When a customer reaches out outside your configured business hours, Hydra can automatically reply with a short "we're closed" acknowledgement so they're not left wondering. Configured per-channel, off by default.

Where to enable it

Open Team → Channels → [your channel]. The "Out-of-hours auto-reply" card has the toggle and the template editor. Enabling it without a non-empty template is a no-op — the dispatch helper bails with no_template rather than sending a blank message.

Template variables

The template is plain text with curly-brace tokens substituted at send time:

VariableResolves to
{{customer.name}}The full name on file. Falls back to there if no name.
{{customer.first_name}}First whitespace-separated token of the name. Falls back to there.
{{tenant.name}}Your workspace's display name.
{{next_open}}The next open business-hours window, formatted like Monday at 9:00 AM. Falls back to as soon as we're back if no future window can be computed (e.g. you have no business hours configured at all — though in that case, auto-reply won't fire).

A typical template:

Hi {{customer.first_name}} — thanks for reaching out! Our team is offline right now and will be back {{next_open}}. We'll respond as soon as we can.

When it fires (and when it doesn't)

The auto-reply dispatch checks four conditions before sending:

  1. The channel has auto_reply_enabled = true and a non-empty template.
  2. The current time is outside business hours (per isInBusinessHours() — the same gate SLA pausing uses).
  3. This conversation has not received an auto-reply in the last 24 hours (rate-limit guard against reply-storm loops).
  4. For email channels: the channel has a verified email_address to send from.

If any check fails, the auto-reply is silently skipped and the regular inbound flow continues uninterrupted.

Behavior with a bot configured

If the channel has a bot wired up, the auto-reply fires on top of the bot — the customer receives the closure acknowledgement first, and the bot still answers their message normally. The bot's context window includes the auto-reply, so it won't redundantly tell them "we're closed" again. Use case: customer knows humans aren't available for escalation, but the bot can still help with the immediate question.

If you want the bot to own the OOH messaging instead, leave the auto-reply toggle off and put the closure language directly into your bot's system prompt or persona.

Email vs widget delivery

  • Email channels — auto-reply goes out via Resend from the channel's email_address with Re: [original subject] and full RFC 5322 threading headers, so it lands in the same email thread as the customer's original message. Mirrored into both email_messages (outbound) and messages (assistant) so the inbox renders it like any other reply.
  • Widget channels — auto-reply lands in the conversation as an assistant message. It's visible in the widget on the customer's side and in the inbox on yours.

What's NOT supported (yet)

  • Inside-hours auto-replies ("Thanks, we got it; expect a reply in 4h"). v1 only fires outside business hours.
  • Per-conversation overrides. The 24h rate-limit is uniform — no admin override to send a second auto-reply early.
  • HTML templates. Plain text only in v1. The variable-substitution helper is pure and can render to HTML when needed.

Audit trail

Auto-reply config changes (toggle, template) flow through the standard channel-update audit log entry — visible at /team/audit-log as "Updated channel" with auto_reply_enabled and/or auto_reply_template in the changed-fields diff.