SIGNALS Documentation
API Reference

Rate Definitions

Configure how products are priced over time using composable rate definitions, calculation strategies, and modifiers.

Overview

A rate definition describes how a charge is calculated over a rental window — it does not hold a price itself. Prices live on product rates, which attach a rate definition (and an amount) to a product. This separation lets one definition such as "Daily Rate" drive pricing for thousands of products, each at its own price.

Every rate definition is composed from three parts:

Part Description
Calculation strategy How elapsed time becomes chargeable units — period-based, fixed, or hybrid
Base period The granularity of a chargeable unit (half-hourly, hourly, daily, weekly, monthly)
Modifiers Optional adjustments applied after the base charge — duration multipliers and quantity factors

Signals ships 11 presets that replicate common industry-standard RMS engine types so migrating users see familiar names. Presets are just pre-filled, fully-editable configurations — there is no special preset behaviour beyond a starting point.

Note: Rate definitions are managed in the admin settings area, not the main catalogue. They are configuration intended for a small number of administrators, not a daily tool. Assigning rates to individual products happens on the product detail page.

Calculation Strategies

Strategy Behaviour Base period
Period-based Charges the unit price for each chargeable unit in the rental window Required (any)
Fixed A single flat charge regardless of duration None
Hybrid A fixed charge for an initial number of units, then a per-unit charge thereafter Required (daily, weekly, monthly)

Base Periods

A base period defines the length of one chargeable unit.

Period Unit length
Half-Hourly 30 minutes
Hourly 60 minutes
Daily 1 day
Weekly 7 days
Monthly 30 days

Note: Monthly is simplified to a fixed 30-day month in this version; calendar-month length is a planned refinement. Half-hourly and hourly periods are measured against the wall clock, while daily and longer periods are counted as whole calendar days.

Modifiers

Modifiers adjust the base charge after units are counted. They are applied in priority order: multipliers first, then factors.

Modifier Configuration Effect
Multiplier A tiers table of decimal multipliers, one row per period position Scales the unit price by tier as the rental lengthens. The last row inherits forward, so longer rentals keep the final tier's multiplier
Factor A ranges table of {from, to, factor} rows Scales the per-unit subtotal based on the order quantity. An open-ended final range (to = null) covers everything above

Multiplier tiers and factor ranges are stored as decimal strings to preserve precision; the engine performs all intermediate arithmetic losslessly and rounds only at final assembly.

Time Options

Period and hybrid strategies expose options that refine how elapsed time is counted:

Option Description
Day type Count elapsed clock time, or only minutes within configured business hours
Business hours Daily start/end times used when day type is Business Hours
Rental days per week Treats a "week" as this many chargeable days (e.g. a 5-day working week)
Leeway minutes Grace period before an extra unit is charged
First day cutoff A pickup later than this time still bills the first day in full
Last day cutoff A return earlier than this time drops the final partial day

Presets

Preset Strategy Base period Modifiers
Daily Rate Period-based Daily
Daily Multiplier and Factor Period-based Daily Multiplier, Factor
Hourly Rate Period-based Hourly
Hourly Multiplier and Factor Period-based Hourly Multiplier, Factor
Half Hourly Rate Period-based Half-Hourly
Weekly Rate Period-based Weekly
Monthly Rate Period-based Monthly
Monthly Multiplier and Factor Period-based Monthly Multiplier, Factor
Fixed Rate Fixed
Fixed Rate and Factor Fixed Factor
Fixed Rate and Subs Days Hybrid Daily

Presets are seeded on install. They can also be re-seeded from Admin → Database Seeders.

Rate Definitions Admin

Route: /admin/settings/rate-definitions

Browse all rate definitions in a table that distinguishes presets from custom definitions and shows how many product rates use each one.

  • Presets are read-only starting points and cannot be deleted.
  • Custom definitions can be edited and deleted (deletion is blocked while product rates still reference them).

Create / Edit

Route: /admin/settings/rate-definitions/create or /admin/settings/rate-definitions/{id}/edit

Creating a definition starts with a choice: pick a preset to pre-fill the form, or start From Scratch. The form is schema-driven — choosing a strategy constrains the available base periods, and enabling a modifier reveals its configuration table (tier or range rows you can add, remove, and reorder). Fields appear and hide based on other field values (for example, business-hours fields only show when day type is Business Hours).

Duplicate

Any definition — including a preset — can be duplicated to produce an editable custom copy named "{name} (Copy)".

Product Rates

Route: /products/{id}/rates

Each product has a Rates tab listing the rate assignments for that product. A product rate combines:

Field Description
Rate definition The calculation behaviour to apply
Transaction type Rental, Sale, or Service
Unit price The amount, in the rate's currency
Currency ISO 4217 currency code
Store Optional store scope (blank = all stores)
Valid from / to Optional date window the rate applies within
Priority Higher priority wins when multiple rates overlap

Rates are added and edited on a dedicated form page (/products/{id}/rates/create); removal uses a confirmation modal. When a saved rate overlaps another rate of the same priority, type, and date window, a non-blocking warning banner is shown — overlapping rates are allowed and resolved by priority at calculation time.

Permissions

Rate definitions and product rates are governed by the rates.* permission group: rates.access, rates.view, rates.create, rates.edit, and rates.delete. The admin area additionally requires admin access. The corresponding API abilities are rates:read and rates:write.