---
title: "Services"
description: "The non-inventory extras you charge for alongside rentals, such as delivery, pickup, setup, cleaning, insurance, or labor, and how they reach a booking total."
canonical_url: "https://requiply.com/docs/en/guides/services"
---
# Services

> The non-inventory extras you charge for alongside rentals, such as delivery, pickup, setup, cleaning, insurance, or labor, and how they reach a booking total.

**Services** in Requiply are the priced, non-inventory offerings your business sells alongside its rental items — things like delivery, on-site setup, installation labor, or custom quote-based work. They sit next to inventory as the second building block of a booking, and anything saved in this section flows into the booking flow, the auto-calculated total, booking emails, invoice PDFs, and analytics.

You'll find this section under **Main menu → Services**.

> **Access:** The whole **Services** menu group is gated by the **Service Management** account permission. Admins have it by default; other roles only get it when an admin explicitly enables it on their account. Users without the permission don't see the menu entry, and direct navigation to `/services/manage`, `/services/add`, or `/services/edit` is blocked at the auth middleware.

---

## Why services matter

Services are how Requiply represents *work and add-ons that aren't tracked as physical units*. Because they share the booking pipeline with inventory items, anything in your service catalog feeds straight into:

- **Bookings** — services attach to a booking through a multi-select chip picker via the `reservation_services` join table.
- **Booking total price** — `calculateBookingTotalPrice` multiplies each service's price by the booking's date range according to its price type. *Quote* services contribute 0 to the auto-calculated subtotal so they don't pollute the math.
- **Booking emails and invoice PDFs** — both render service line items from the same records.
- **Analytics** — revenue and bookings reports group results by service.
- **Workflows** — server-side workflow handlers acting on booking events have access to the service list of the affected booking.

Existing bookings keep the snapshot of services they were created with. Edits made in this section only affect *future* bookings.

---

## Who can use this section

- **Admins** can always manage services.
- **Other accounts** can manage services only if an admin has turned on the **Service Management** permission for that account in Organization settings.
- There is no read-only variant — if a user can see the section, they can add, edit, and delete services.

A user without **Service Management** can still attach existing services to a booking if their booking permission is on; they just can't curate the catalog itself.

---

## What a service actually is

Every service in Requiply has the same minimal shape. The catalog is intentionally flat.

Key fields on a service:

- **Name** — the human-readable label used everywhere the service appears (bookings, emails, invoices, analytics).
- **Price type** — one of `hour`, `day`, `month`, or `quote`. Drives how the price is multiplied into the booking total. Locked once the service is saved.
- **Price** — currency-formatted number (two decimals, currency-aware step size, minimum 0.01). Stored as `null` for *Quote* services.
- **Archive flag** — `is_archived`. Hidden from Manage services and from the booking picker but kept around so historical records still resolve.

Services do **not** have availability windows, duration rules, location scoping, or an assigned-employee field. They are pure priced line items — any link to staff or scheduling lives on the booking that the service is attached to, not on the service itself. Services also can't be booked on their own: a booking always needs at least one inventory item, and services ride along with that item selection.

---

## Pages in this section

<table>
<thead>
  <tr>
    <th>
      Page
    </th>
    
    <th>
      What it's for
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <a href="https://requiply.com/docs/en/guides/services/manage">
        <strong>
          Manage services
        </strong>
      </a>
    </td>
    
    <td>
      The day-to-day catalog — paginated table of all active (non-archived) services with global search, plus row-level edit and delete actions. Empty state for organizations that haven't created a service yet, with a call-to-action to add the first one.
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://requiply.com/docs/en/guides/services/add-or-edit">
        <strong>
          Add or edit service
        </strong>
      </a>
    </td>
    
    <td>
      The two-pane creation / editing form (form on the left, live preview tile on the right). Add mode lets you pick the price type; edit mode locks the price type and only lets you change the name and (for non-quote services) the price.
    </td>
  </tr>
</tbody>
</table>

The two pages are tightly linked: pencil and trash actions on Manage services drive directly into Add or edit service or into the delete confirmation, and both Add and Edit redirect back to Manage services on success.

---

## How delete actually works

Removing a service from [Manage services](https://requiply.com/docs/en/guides/services/manage) is not always a hard delete — Requiply protects historical bookings automatically:

- If the service has **never been referenced** by a booking, the trash action **hard-deletes** it. The row vanishes with no archive trail.
- If the service **has been used** on at least one booking (past or present), the trash action **archives** it instead (`is_archived = true`). It disappears from Manage services and from the booking picker, but the record stays so old bookings, invoices, emails, and reports keep resolving the right name and price.

The success toast is the same in both cases. There is no in-product UI to view archived services or to restore them.

---

## Pricing model at a glance

Each service has exactly one price type, picked when the service is created and locked thereafter.

<table>
<thead>
  <tr>
    <th>
      Price type
    </th>
    
    <th>
      What it does on a booking
    </th>
    
    <th>
      Price field
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <strong>
        Per hour
      </strong>
    </td>
    
    <td>
      Multiplied by the booking's hours.
    </td>
    
    <td>
      Required, ≥ 0.01.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Per day
      </strong>
    </td>
    
    <td>
      Multiplied by the booking's days. The default for new services.
    </td>
    
    <td>
      Required, ≥ 0.01.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Per month
      </strong>
    </td>
    
    <td>
      Multiplied by the booking's months.
    </td>
    
    <td>
      Required, ≥ 0.01.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Quote
      </strong>
    </td>
    
    <td>
      Contributes 0 to the auto-calculated subtotal. The final amount is agreed manually with the client and handled outside the calculator.
    </td>
    
    <td>
      Hidden. Stored as <code>
        null
      </code>
      
      . Renders as a <strong>
        Quote
      </strong>
      
       tag everywhere a price would normally appear.
    </td>
  </tr>
</tbody>
</table>

If you need to switch a service from one price type to another, the only way is to create a new service with the desired type and remove the old one — the price-type lock is by design so historical totals stay reproducible.

---

## How this section connects to the rest of Requiply

<table>
<thead>
  <tr>
    <th>
      Feature
    </th>
    
    <th>
      How services interact with it
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <a href="https://requiply.com/docs/en/guides/bookings/manage">
        <strong>
          Bookings
        </strong>
      </a>
    </td>
    
    <td>
      Services are picked through a multi-select chip control on the booking form and attached via <code>
        reservation_services
      </code>
      
      . A booking must have at least one inventory item — services ride along with that item selection rather than standing on their own.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Booking total price
      </strong>
    </td>
    
    <td>
      Each attached service's price and price type feed <code>
        calculateBookingTotalPrice
      </code>
      
      . Quote services contribute 0; everything else multiplies against the booking's date range.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Booking services table
      </strong>
    </td>
    
    <td>
      The booking detail and preview views show attached services in a table that mirrors the same columns (name, price, price type) as Manage services.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Booking emails
      </strong>
    </td>
    
    <td>
      Email templates render attached services using the stored name, price, and price type.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Invoice PDFs
      </strong>
    </td>
    
    <td>
      The invoice generator reads the same service records when building line items.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Analytics
      </strong>
    </td>
    
    <td>
      Revenue and bookings reports aggregate by service. Renaming a service or changing its price affects how <em>
        future
      </em>
      
       bookings appear in reports — historical bookings keep their snapshot.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Workflows
      </strong>
    </td>
    
    <td>
      Server-side workflow handlers acting on booking events have access to the service list of the affected booking.
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://requiply.com/docs/en/guides/settings/organization/accounts/permission-groups">
        <strong>
          Permission groups
        </strong>
      </a>
    </td>
    
    <td>
      The <strong>
        Allow services management
      </strong>
      
       permission toggles whether a user can see and use this section. It does not affect their ability to attach existing services to a booking.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Currency and org settings
      </strong>
    </td>
    
    <td>
      Price formatting and the input step size in <a href="https://requiply.com/docs/en/guides/services/add-or-edit">
        Add or edit service
      </a>
      
       follow the organization's currency. Changing currency in org settings affects how prices are displayed here.
    </td>
  </tr>
</tbody>
</table>

---

## Common scenarios

### Setting up the first service

A new organization opens [Manage services](https://requiply.com/docs/en/guides/services/manage), sees the empty state, and clicks the call-to-action. They land on [Add or edit service](https://requiply.com/docs/en/guides/services/add-or-edit), name the service (for example, *On-site installation*), pick **Per hour**, set the rate, and save. From that point on, staff creating bookings can pick that service from the multi-select.

### Adjusting an hourly rate

An admin opens [Manage services](https://requiply.com/docs/en/guides/services/manage), clicks the pencil on the relevant row, updates the price, and saves. *Save changes* stays disabled until the value is genuinely different. Future bookings use the new rate; bookings that already exist keep their original totals.

### Retiring an offering

A service is no longer offered. The admin clicks the trash icon and confirms. Because the service has past bookings, Requiply archives it instead of deleting it — the service vanishes from the booking picker, while past records, invoices, and reports still display the original name and price correctly.

### Cleaning up a never-used service

An admin created a test service that was never attached to a real booking. Clicking trash and confirming hard-deletes it; the row disappears with no archive trail.

### Quote-only work

For jobs where the final amount depends on scope (custom builds, large projects), the admin creates a service with price type **Quote**. Staff can still attach it to a booking, but the booking total only reflects the other services and items; the quoted amount is handled outside the automatic calculation.

### Restricting who can change services

An admin opens an employee's account in Organization settings and turns off **Service Management**. That employee no longer sees the Services menu and cannot reach `/services/manage`, `/services/add`, or `/services/edit` — but they can still attach existing services to bookings if their booking permission is on.

---

## Tips and cautions

> **Tip:** Decide on price types early. Once a service is saved, its price type is locked — if you later need a different model, create a new service and remove the old one.

> **Tip:** Use **Quote** generously for anything where the final amount is negotiated. The service stays visible in the booking picker without polluting auto-calculated totals.

> **Heads up:** Services can't be booked on their own. A booking always needs at least one inventory item; services ride along with that item selection.

> **Heads up:** Editing a service's price changes what *future* bookings charge. It does not retro-update existing bookings, invoices, or emails that already reference the older value.

> **Heads up:** Deleting a service that has never been used removes it permanently. There is no undo and no archived-services view to recover it from.

> **Heads up:** If an employee reports *I can't find the Services page*, they most likely need the **Service Management** permission turned on for their account by an admin.


## Sitemap

See the full [sitemap](https://requiply.com/docs/sitemap.md) for all pages.
