Equipment Loans
Loan equipment to a customer at no charge — reserve it, check it out, and get it back — with full availability and due-date tracking.
An equipment loan lets you hand equipment to a borrower at no charge and get it back — think demo units, courtesy loaners, or trial gear. A loan is operationally the same as a rental, just without the billing.
Loans live in the Inventory module, so any plan that includes Inventory can use them — you don't need the Rentals module.
In this section #
Detailed guides for everything covered here:
- Loan Agreements — A loan agreement tracks a free equipment loan from creation through reserve, check-out, and return — with availability enforcement and a full audit trail, but no billing.
When to use a loan vs. a rental #
- Loan — free, no invoice. You still track who has it, when it's due back, and whether a unit is available.
- Rental — paid, with rates, deposits, and an invoice on close.
Both reserve a unit over a date window, so a single piece of equipment can never be double-promised across a loan and a rental at the same time.
The loan lifecycle #
A loan agreement moves through a simple set of states:
- Draft — you're still building it.
- Reserved — the equipment is held for the loan's date window.
- Checked out — the units are physically out with the borrower.
- Partially returned — some, but not all, of the units are back; the rest are still out.
- Returned — everything is back in stock.
- Cancelled — the loan was voided before or during the loan period and will not proceed.
You can check out directly from Draft if you're handing equipment over on the spot; reserving first is optional.
Per-unit tracking and partial returns #
Knowledge tracks the life of every individual inventory unit, so checking out a loan always hands out specific units — even when a line is a quantity of a Product (5 of a Product checks out 5 real units) or a kit (every component unit is checked out). Each unit is linked back to its loan line.
Because of that, you don't have to return a loan all at once. When equipment comes back, choose which units to check in and pick the destination bin:
- Return a subset and the loan becomes Partially returned — the returned units go back to stock and become available again, while the rest stay out.
- Return the last outstanding unit and the loan flips to Returned.
A loan line is marked returned once its final unit is back, so a multi-unit line can be brought back in several trips.
Creating a loan #
- Go to Inventory → Loans and create a new loan.
- Choose the borrower (a customer, contact, or staff user) and the loan's start and expected-return dates.
- Add the equipment — specific units, Products, or kits.
- Optionally fill in any custom fields and link an appointment.
- Reserve to hold the equipment, then Check Out when it leaves, and Return it to a bin when it comes back.
Availability #
While a loan is reserved or checked out, its equipment is unavailable for the overlapping dates — to other loans and to rentals. The availability check is shared, so you can trust a single answer to "is this unit available?"
Doing it from the API #
The same lifecycle is available over the REST API: create a loan agreement, add
line items, then POST to /reserve, /check-out, and /return.
# Create a loan agreement for a customer
curl -X POST https://your-domain.com/api/v1/loan-agreements \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"borrower_type": "customer",
"borrower_id": "<customer-id>",
"start_date": "2026-06-01",
"end_date": "2026-06-08"
}'
# Check the equipment out
curl -X POST https://your-domain.com/api/v1/loan-agreements/<loan-id>/check-out \
-H "Authorization: Bearer $TOKEN"
A checked-out loan exposes the units still out as out_units, each with a
checkout_id. To return everything, POST to /return with just a bin_id. To
do a partial return, also pass the checkout_ids of the units coming back —
the loan stays partially returned until the last one is in.
# Return only two specific units
curl -X POST https://your-domain.com/api/v1/loan-agreements/<loan-id>/return \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"bin_id": "<bin-id>",
"checkout_ids": ["<checkout-id-1>", "<checkout-id-2>"]
}'