Examples

Explore internal tools for your team's work.

See how equipment requests, onboarding tasks, expense approvals and maintenance reports can become software shaped around your company's rules—and keep evolving as those rules change.

Illustrative applications you can build and adapt with Soda OS.

View CanLangBack to app
EquipmentRequests.canExcerpt

Approval and recorded delivery

When
 crud Equipment by=coordinator fields=name,category,active delete=none
 crud Request by=members fields=equipment,reason when=row.requested_by==actor and row.status==requested delete=none
 # Review another teammate's request against the equipment catalogue.
 scenario approve(request:Request) by=reviewer
  require request.status==requested and request.requested_by!=actor
  require request.equipment.active
  do set request {status=approved,approved_by=actor,approved_at=now}
 # Record the physical asset when approved equipment reaches the requester.
 scenario deliver(request:Request,asset_tag:text) by=coordinator
  require request.status==approved and trim(asset_tag)!=""
  do set request {status=delivered,asset_tag=trim(asset_tag),delivered_at=now}

Equipment · App preview

Equipment
EQ-1042 · Avery

Standing desk

Approved
Alex approved14 Oct · details locked
Asset tag · 15 OctDESK-001
Delivered

Illustrative application interface · sample records.

A reviewer can approve another person's request; self-approval is refused.

Equipment requests

Keep catalogue selection, requests, separate approval and recorded delivery connected.

Then the business changes

Add a separate Finance approval above an illustrative €1,000 threshold.

Explore equipment requests
View CanLangBack to app
Onboarding.canExcerpt

Task completion and reassignment

When
 crud Starter by=hr fields=name,employee,start_date,department delete=none
 crud Task by=hr fields=starter,title,responsible,due_date when=not row.done delete=none
 # The teammate responsible for a task records its completion.
 scenario complete(task:Task,note:text?) by=members
  require task.responsible==actor and not task.done
  do set task {done=true,completed_at=now,completion_note=note}
 # HR can hand unfinished work to another teammate.
 scenario reassign(task:Task,responsible:user) by=hr
  require not task.done
  do set task {responsible}

Onboarding · App preview

Onboarding

Sam

Operations · Starts 8 Mar
1 / 3complete
  • Prepare equipmentAlex · 5 Mar · Unfinished
  • Read safety handbookSam · 8 Mar · Completed
  • Welcome sessionTeam lead · 18 Mar · Unfinished

Illustrative application interface · sample records.

Only the current assignee completes their unfinished task.

Employee onboarding

Make each joining task's owner, deadline and completion visible.

Then the business changes

Align unfinished relative deadlines with the start date, protecting fixed dates and completed work.

Explore employee onboarding
View CanLangBack to app
Expenses.canExcerpt

Approval and payment records

When
 crud CostCentre by=finance fields=code,name,active delete=none
 crud Expense by=members fields=purpose,amount,cost_centre update=none delete=none
 # A reviewer approves someone else's positive expense claim.
 scenario approve(expense:Expense,note:text?) by=reviewer
  require expense.status==submitted and expense.submitted_by!=actor
  require expense.cost_centre.active
  do set expense {status=approved,decision_note=note,approved_by=actor,approved_at=now}
 # Finance records a payment only after the claim is approved.
 scenario record_payment(expense:Expense,reference:text) by=finance
  require expense.status==approved and trim(reference)!=""
  do set expense {status=paid,payment_reference=trim(reference),paid_at=now}

Expenses · App preview

Expenses
EXP-0085 · Sam

Client travel

€85
Cost centre
CLIENT
Review
Alex · Approved
External payment ref.TRAVEL-001
Paid

Payment recorded only; no money transferred.

Illustrative application interface · sample records.

Approval belongs to a separate reviewer; submitted claim details stay protected.

Expense approvals

Give submitted expenses a clear review decision and record of external payment.

Then the business changes

Return a mistaken claim with a reason and review one linked replacement while retaining the original.

Explore expense approvals
View CanLangBack to app
Maintenance.canExcerpt

Work notes and resolution

When
 crud Location by=technician fields=name,building,floor delete=none
 crud Ticket by=members fields=location,issue,priority update=none delete=none
 # Append a visit or diagnostic note while a ticket is open.
 scenario record_work(ticket:Ticket,note:text) by=technician
  require ticket.status==open and trim(note)!=""
  do create WorkNote {parent=ticket,note=trim(note)} as work_note
 # Resolve the issue with a description of the repair.
 scenario resolve(ticket:Ticket,resolution:text) by=technician
  require ticket.status==open and trim(resolution)!=""
  do set ticket {status=resolved,resolution=trim(resolution),resolved_by=actor,resolved_at=now}

Maintenance · App preview

Maintenance
MT-042 · Sam · 6 MarOpen

Air conditioning is not cooling

Jordan · Work note

Supply air is warm. Checking cooling controls.

Illustrative application interface · sample records.

Employees see their own reports; technicians can read the maintenance queue.

Maintenance tickets

Turn reported issues into a queue technicians can investigate and resolve.

Then the business changes

Link a new occurrence to an earlier resolved ticket at the same location, preserving both histories and access.

Explore maintenance tickets

A useful first version, and the next change.

Follow the people, rules and decisions behind a workflow. See what a useful first version does, how the factory develops a reviewed change, and how the same Project supports the next request.

  1. 01Agree the workPeople, records and rules
  2. 02Develop and reviewAn exact candidate, checked against the request
  3. 03Keep it fittingThe next rule, with existing work protected
Follow the equipment-request story

Start with a process your team knows.

Who owns the result? Which rules and exceptions matter? What would count as a useful first version?