---
title: "Add or edit service"
description: "Create or edit a chargeable service such as delivery or setup: its name, price, price type, and whether discounts apply to it."
canonical_url: "https://requiply.com/docs/en/guides/services/add-or-edit"
---
# Add or edit service

> Create or edit a chargeable service such as delivery or setup: its name, price, price type, and whether discounts apply to it.

The **Add or edit service** page is where you create a new priced service offering or update the name and price of an existing one. Services created here become available in the booking builder so staff can attach them to bookings, and they feed the booking total, invoices, emails, and analytics.

You can reach this page two ways:

- **Add** — under **Main menu → Services → Add service**, at `/services/add`. Also opened from the *No services yet* call-to-action on [Manage services](https://requiply.com/docs/en/guides/services/manage).
- **Edit** — by clicking the pencil icon on a row in [Manage services](https://requiply.com/docs/en/guides/services/manage), which opens `/services/edit?id={serviceId}`.

> **Access:** Requires the **Service Management** permission. Users without this permission do not see the Services menu and the routes are blocked at the auth middleware. Admins have this permission by default; other roles only get it if it was explicitly enabled on their account.

---

## Why this page matters

Services are one of the two building blocks of a booking in Requiply (the other being inventory items). Anything you save here flows directly into the rest of the product:

- **Bookings** — services saved here become selectable in the booking flow's multi-select picker.
- **Booking total price** — each service's price and price type drive the auto-calculated booking total.
- **Booking emails and invoice PDFs** — both render line items from the same service records.
- **Analytics** — revenue and bookings reports aggregate by service.
- **Workflows** — server-side workflow handlers acting on booking events read the service list of the affected booking.

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

---

## Who can use this page

- Users with the **Service Management** permission (admin or staff with the appropriate role). Users without that permission do not see the menu entry and the routes are blocked.
- The page is gated by the auth middleware, so a signed-in user with an active organization context is required.
- Service count is not capped on this page — there are no plan limits surfaced here.

---

## What you'll see

The page uses a two-pane layout shared between the Add and Edit modes.

**Left pane — the form (scrollable)**

A **General info** section:

- **Name** — required free-text. Used as the human-readable label everywhere the service appears.

A **Pricing** section:

- **Price type** — a segmented selector with four options. *Per day* is selected by default for new services.

  - **Per hour**
  - **Per day**
  - **Per month**
  - **Quote**
- **Price** — a numeric input shown only when the price type is *not* Quote. Has increment / decrement buttons, two decimal places, currency-aware step size (the step adjusts based on the organization's currency), and a minimum of 0.
- **Default price**: shown instead of **Price** when **Quote** is selected. It is optional, with a minimum of 0, and its info icon explains: *Prefilled when staff add the service to a booking and charged when a customer switches it on at online checkout. Each booking can still change it.*

A submit button anchored to the bottom right of the form:

- **Add** mode shows **Save**.
- **Edit** mode shows **Save changes**, and the button is disabled until at least one field has actually changed.

**Right pane — live preview (sticky)**

A card that mirrors what the service will look like as a tile once saved, including a briefcase icon, the service name, the formatted price, and the per-hour / per-day / per-month / Quote suffix. The preview updates as the user types.

While the form is submitting, the entire page is blocked by an overlay and the submit button shows a loading spinner.

---

## How Add and Edit differ

The two modes share the same layout and validation rules, but a few behaviors change:

<table>
<thead>
  <tr>
    <th>
      Behavior
    </th>
    
    <th>
      Add mode
    </th>
    
    <th>
      Edit mode
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <strong>
        Source of initial values
      </strong>
    </td>
    
    <td>
      Empty form, <em>
        Per day
      </em>
      
       selected by default.
    </td>
    
    <td>
      Pre-filled from the existing service record.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Price type selector
      </strong>
    </td>
    
    <td>
      Visible and editable.
    </td>
    
    <td>
      <strong>
        Hidden
      </strong>
      
       — price type is locked once a service is saved.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Price field for Quote-type services
      </strong>
    </td>
    
    <td>
      Hidden when <em>
        Quote
      </em>
      
       is selected; the <strong>
        Default price
      </strong>
      
       field shows instead.
    </td>
    
    <td>
      <strong>
        Default price
      </strong>
      
       is shown and editable if the original service was created as Quote.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Submit button
      </strong>
    </td>
    
    <td>
      <strong>
        Save
      </strong>
      
      . Always enabled when validation passes.
    </td>
    
    <td>
      <strong>
        Save changes
      </strong>
      
      . Disabled until at least one field differs from the original.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Cancel / back navigation
      </strong>
    </td>
    
    <td>
      No explicit cancel — the menu/back nav returns to wherever the user came from.
    </td>
    
    <td>
      A <strong>
        Cancel
      </strong>
      
       button returns to <a href="https://requiply.com/docs/en/guides/services/manage">
        Manage services
      </a>
      
      .
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Bad service ID
      </strong>
    </td>
    
    <td>
      Not applicable.
    </td>
    
    <td>
      If the <code>
        id
      </code>
      
       in the URL doesn't resolve to a service, the user sees a <em>
        service not found
      </em>
      
       toast and is redirected back to <a href="https://requiply.com/docs/en/guides/services/manage">
        Manage services
      </a>
      
      .
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        On success
      </strong>
    </td>
    
    <td>
      Success toast <em>
        service added
      </em>
      
      , then redirect to <a href="https://requiply.com/docs/en/guides/services/manage">
        Manage services
      </a>
      
      .
    </td>
    
    <td>
      Success toast for the saved changes, then redirect to <a href="https://requiply.com/docs/en/guides/services/manage">
        Manage services
      </a>
      
      .
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        On failure
      </strong>
    </td>
    
    <td>
      Generic error toast; the form stays open so the user can retry.
    </td>
    
    <td>
      Same — error toast and form stays open.
    </td>
  </tr>
</tbody>
</table>

---

## Empty state

This is a creation/edit page, not a list page, so it has no traditional empty state. The preview card simply renders the placeholder *Item name* until the user types one, and the price area shows the formatted zero amount (or the Quote info message) until a value is entered.

---

## Main actions

### Adding a service

1. Enter a **Name**.
2. Pick a **Price type** — *Per hour*, *Per day*, *Per month*, or *Quote*.
3. If the price type is not *Quote*, enter a **Price**. The minimum accepted value is 0.01; the step size matches the organization's currency. For a *Quote* service, optionally enter a **Default price**.
4. Click **Save**.

On success the user sees a *service added* toast and is redirected to [Manage services](https://requiply.com/docs/en/guides/services/manage), where the new row appears in the table.

### Editing a service

1. From [Manage services](https://requiply.com/docs/en/guides/services/manage), click the pencil icon on the row you want to change.
2. Update the **Name** and the **Price**, or the **Default price** for a quote service. The price type cannot be changed.
3. Click **Save changes**. The button stays disabled until something has actually changed, so a no-op submit is prevented automatically.

On success the user is redirected back to [Manage services](https://requiply.com/docs/en/guides/services/manage). On failure the form stays open and an error toast appears.

### Switching to a Quote-based service

When **Quote** is picked in Add mode, the **Price** field is hidden and **Default price** shows instead. Switching from another price type to Quote also clears any price the user had entered, so accidentally toggling between modes does not leak a stale catalog price into a quote service.

A quote service is charged once per booking, not per day or month, at the price set on that booking:

- When staff add it to a booking, its price starts at the **Default price**, and they can change it for that booking, see [Edit services](https://requiply.com/docs/en/guides/bookings/changing/services).
- When a customer switches it on at online checkout, the **Default price** is charged. A quote service without a default price shows as *Price on request* there and is added at no charge, see [Checkout services](https://requiply.com/docs/en/guides/online-booking/portal-settings#checkout-services).
- Without a default price, the service starts at no charge until staff enter the agreed price.

---

## Forms and fields

<table>
<thead>
  <tr>
    <th>
      Field
    </th>
    
    <th>
      Where
    </th>
    
    <th>
      Required
    </th>
    
    <th>
      Notes
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <strong>
        Name
      </strong>
    </td>
    
    <td>
      Add, Edit
    </td>
    
    <td>
      Yes
    </td>
    
    <td>
      Plain text. Validated as a non-empty string; submitting blank shows an inline validation message.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Price type
      </strong>
    </td>
    
    <td>
      Add only
    </td>
    
    <td>
      Yes
    </td>
    
    <td>
      One of <code>
        hour
      </code>
      
      , <code>
        day
      </code>
      
      , <code>
        month
      </code>
      
      , or <code>
        quote
      </code>
      
      . Defaults to <code>
        day
      </code>
      
      . Cannot be changed once the service is saved.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Price
      </strong>
    </td>
    
    <td>
      Add and Edit (only if type ≠ Quote)
    </td>
    
    <td>
      Yes when shown
    </td>
    
    <td>
      Currency-formatted, two decimals, must be ≥ 0.01. Step size depends on org currency. Submitting 0 or empty fails validation.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Default price
      </strong>
    </td>
    
    <td>
      Add and Edit (only if type = Quote)
    </td>
    
    <td>
      No
    </td>
    
    <td>
      Currency-formatted, minimum 0. Prefills the price on staff bookings and is charged at online checkout. Each booking can change it.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Exclude from discounts
      </strong>
    </td>
    
    <td>
      Add, Edit
    </td>
    
    <td>
      No
    </td>
    
    <td>
      Toggle, off by default. See <a href="#exclude-from-discounts">
        Exclude from discounts
      </a>
      
      .
    </td>
  </tr>
</tbody>
</table>

A quote service without a default price has no price stored and shows a **Quote** tag instead of a number.

## Exclude from discounts

Under **Properties**, a toggle labelled **Exclude from discounts** with the tooltip *"Client percentage discounts will not be applied to this service. Use it for services with a fixed cost, such as subcontractors."*

Some services should never be discounted. A subcontracted driver, a courier fee, an insurance premium: the cost is fixed and you do not control it, so shaving 15% off it comes out of your margin rather than the supplier's. Turning this on keeps the service **outside the discount base**.

### How the total is composed

With the toggle on, a booking's total is built like this:

1. **Items total** plus **discountable services** form the base the client's percentage discount applies to.
2. The **excluded services** are added afterwards, at full price.

So a booking of 1,000 in equipment, a 200 discountable service, and a 300 excluded service, for a client with a 10% discount, comes to `(1000 + 200) × 0.9 + 300 = 1,380`. The discount line on the booking shows what it was actually calculated on, so the numbers reconcile rather than looking arbitrary.

This composition is used everywhere a total appears: the booking page, the price summary, invoices, exported documents, and the recalculations behind [Edit booking dates](https://requiply.com/docs/en/guides/bookings/changing/dates) and [Edit booking items](https://requiply.com/docs/en/guides/bookings/changing/items).

### Where it shows

The services table carries a **Discounts** column reading **Applied** or **Excluded**, so you can audit the whole list at a glance.

<note>

Existing bookings are not re-priced when you flip the toggle. A booking stores what its services were at the time it was made, so history stays intact; the change applies to bookings made from then on.

</note>

<warning>

**Heads up:** This only affects **client percentage discounts**. It has nothing to do with [pricing tiers](https://requiply.com/docs/en/guides/settings/pricing/pricing-tiers), which apply to equipment rather than services.

</warning>

---

## Billing, plans, and limits

This page does not display plan-limit or upgrade UI in its own template. Service count is not metered by the subscription plan. Access depends on the **Service Management** account permission only.

---

## How this page connects to the rest of Requiply

<table>
<thead>
  <tr>
    <th>
      Feature
    </th>
    
    <th>
      How this page affects it
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <strong>
        Manage services
      </strong>
    </td>
    
    <td>
      Newly added or edited services appear here immediately. Both Add and Edit redirect back here on success.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Bookings
      </strong>
    </td>
    
    <td>
      Saved services become selectable in the booking builder's multi-select chip picker via the <code>
        reservation_services
      </code>
      
       join table.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Booking total price
      </strong>
    </td>
    
    <td>
      The chosen price type and price feed <code>
        calculateBookingTotalPrice
      </code>
      
      , which multiplies the service against the booking's date range. Quote services are added once per booking at the price set on the booking (the <strong>
        Default price
      </strong>
      
       to start with).
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Booking emails
      </strong>
    </td>
    
    <td>
      The booking email template renders attached services using the name, price, and price type stored here.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Invoice PDFs
      </strong>
    </td>
    
    <td>
      The invoice generator reads from the same service records when building line items.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Analytics
      </strong>
    </td>
    
    <td>
      Revenue and booking analytics 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>
        Currency and org settings
      </strong>
    </td>
    
    <td>
      Price formatting and the input step size follow the organization's currency, so changing currency in org settings affects how prices entered here are displayed.
    </td>
  </tr>
</tbody>
</table>

---

## Common scenarios

### Setting up the first service

A new organization lands on [Manage services](https://requiply.com/docs/en/guides/services/manage), sees the empty state, and clicks the call-to-action. They open this page, 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.

### Raising an hourly rate

An admin opens [Manage services](https://requiply.com/docs/en/guides/services/manage), clicks the pencil on the relevant row to land on this page in Edit mode, updates the price, and saves. *Save changes* stays disabled until the value is actually different, then submitting redirects back to the manage list. Future bookings use the new rate; existing ones keep their original totals.

### Renaming a service

The same flow as raising the rate, but updating the **Name** field instead. The new name appears immediately in the manage list and on all *future* bookings, emails, and invoices. Historical bookings continue to show the name they were saved with.

### Quote-only services

For work where the final amount depends on scope (custom builds, large jobs), the admin creates a service with price type **Quote**. Staff attach it to a booking and enter the agreed amount on that booking; it is charged once, not per day. Give it a **Default price** if most jobs cost about the same, or if customers may add it at online checkout.

### Trying to convert a service's price type

There is no UI for this — once a service is saved, its price type is locked. To switch a service from per-day to per-hour, create a new service with the desired type and remove the old one from [Manage services](https://requiply.com/docs/en/guides/services/manage).

---

## 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 rather than expecting to convert it.

> **Tip:** Use **Quote** for anything where the final amount is negotiated or charged once per booking, such as delivery. Each booking carries its own agreed price, starting from the **Default price**.

> **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:** In Edit mode, **Save changes** is disabled until something actually differs from the saved record. If the button looks stuck, double-check that the value in the form is genuinely different from the original.

> **Heads up:** Switching the price type to **Quote** in Add mode clears any price you had entered. If you change your mind and switch back, you'll need to re-enter the price.


## Sitemap

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