Skip to main content
Services represent billable work your business offers — things like consulting, installation, or maintenance. Unlike products, services do not have associated stock levels or inventory records. They are tracked only by name, description, and price.
Services don’t have inventory. Only products have stock levels tracked in the Inventory module. Use services for any offering that doesn’t require physical stock.
Use services for any billable work that doesn’t require stock tracking — for example, labor charges, delivery fees, or recurring subscriptions.

Service data model

The Service model in the database schema:
model Service {
  id          String   @id @default(uuid())
  name        String
  description String?
  price       Float
  tenantId    String
  tenant      Tenant   @relation(fields: [tenantId], references: [id], onDelete: Cascade)
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt
}
The description field is optional. All other fields are required.

Viewing services

Navigate to Services in the sidebar. The page displays your service catalog in a table with columns for Service Name, Description, Price, and Actions. Services are loaded from the backend via GET /api/services, with results filtered to your tenant.

Adding a service

1

Open the add service form

Click the Add Service button in the top-right corner of the Services page.
2

Fill in the service details

Complete the form fields:
  • Service Name — required. A clear, descriptive name for the service.
  • Description — optional. Additional context about what the service includes.
  • Price — required. The price charged for this service.
3

Save the service

Click Save Service. The backend creates the service record scoped to your tenantId and returns the new service object.

Editing a service

Click Edit in the Actions column of any service row. The edit action sends a PUT request to /api/services/:id with the updated name, description, and price fields:
router.put("/:id", async (req: Request, res: Response) => {
  const { id } = req.params
  const { name, description, price } = req.body

  const service = await prisma.service.update({
    where: { id },
    data: { name, description, price },
  })
  res.json(service)
})

Deleting a service

Click Delete in the Actions column. This sends a DELETE request to /api/services/:id and removes the service record from your catalog.

API reference

MethodEndpointDescription
GET/api/servicesList all services for your tenant
POST/api/servicesCreate a new service
PUT/api/services/:idUpdate an existing service
DELETE/api/services/:idDelete a service
All endpoints require a valid JWT in the Authorization: Bearer <token> header.

Build docs developers (and LLMs) love