# Software

URL: /products/app/software · Id: `page:products/app/software`

> Software keeps a Customer's records and the rules that change them, defined once as Nouns and Verbs and reached through every Interface.

[Software](/business/nouns/software) is a [Product](/business/nouns/product) that keeps a [Customer](/business/nouns/customer)'s records and the rules that change them. [SoftwareBuilder](/code/builders/software) builds it from one definition, headless first, and every [Interface](/business/nouns/interface) serves the same behavior.

## One definition
A Software Product is a set of [Nouns](/business/nouns/noun) and [Verbs](/business/nouns/verb). A Noun is a type of record with properties and relationships. A Verb is an action on a Noun, with inputs, outputs, and one [Event](/business/nouns/event) when it completes.

Everything else is compiled from that set. Take clinicshift.app, a [Startup](/business/nouns/startup) that sells shift scheduling to clinics. Its definition names `Shift`, `Clinician`, and `Swap`, with Verbs such as `Shift.assign` and `Swap.request`.

Add `Swap.approve` to the definition, and one merge produces its API route, SDK method, CLI command, and MCP call. The same merge adds the [App](/business/nouns/app)'s button, the webhook Event, and the reference row. No Interface carries a second definition, so no two Interfaces disagree.

## Rules live in Verbs
A rule belongs to the Verb that enforces it, never to a field or a screen. `Swap.approve` is legal only from `requested`, and only when the incoming clinician holds the license the shift requires. A call that breaks a rule returns a `refused` [Action](/business/nouns/action) naming the rule, on every Interface.

Every call becomes an Action: `pending`, `done`, `failed`, `canceled`, or `refused`. The Action records who acted, for whom, and on which [Thing](/business/nouns/thing) at which [Version](/business/nouns/version). A [Dashboard](/business/nouns/dashboard), a webhook, and an audit read that one record.

The [Function](/business/nouns/function) behind a Verb never shows. Code, a model, an [Agent](/business/nouns/agent), or a person can run `Swap.approve`, and the caller sees the same Action either way.

## Stateful and stateless
Stateful Software owns records and moves them through their lifecycles. A `Swap` keeps its history from `requested` to `approved` or `declined`.

A stateless Verb transforms an input and stores nothing: `Roster.optimize` takes a week of shifts and returns a better assignment. A lookup against reference data looks the same on the wire. It belongs to a [Dataset](/business/nouns/dataset), which owns the truth of the answer.

Classify a Verb by who owns the truth, never by its URL. A stateless Verb states its transformation and its errors. A stateful Verb states its preconditions and its effects.

## Tenants and Entitlements
Every Customer gets its own [Tenant](/business/nouns/tenant), created by [provision](/business/nouns/tenant/provision) when it accepts an [Offer](/business/nouns/offer). The Tenant holds that Customer's records apart from every other Customer's. No Verb reads across Tenants.

An [Entitlement](/business/nouns/entitlement) grants one Verb on one Noun inside the Tenant, and a [Limit](/business/nouns/limit) can bound it. clinicshift.app's starter Offer grants `Shift.assign` for up to 40 clinicians. The 41st assignment waits on an [Approval](/business/nouns/approval) for the clinic's owner.

A [Meter](/business/nouns/meter) counts `done` Actions only. A `refused` or `failed` call never reaches an invoice.

## Apps on the same API
An App is an Interface with screens over the same API, never a Product of its own. Each App serves declared [Personas](/business/nouns/persona): clinicshift.app has one App for clinic managers and one for clinicians on their phones.

SoftwareBuilder compiles an App from its Personas and the Verbs each one may run. A screen's buttons are the record's available Verbs for that caller, so an App never holds a rule the API lacks. A button and an Agent's call always agree.

One address serves three renderings: HTML for the App, JSON for code and native clients, and Markdown for an Agent's context. The record behind all three is the same.

## Product Templates
Three [Product Templates](/business/nouns/product-template) start a Software Product with its Nouns, Verbs, and Offers in place.

| Product Template | What it sells |
| --- | --- |
| [Headless SaaS](/products/templates/headless-saas) | Software with no App, for developers and their Agents |
| [SaaS](/products/templates/saas) | Headless SaaS plus an App, seats, and onboarding |
| [Marketplace](/products/templates/marketplace) | Matching buyers with [Suppliers](/business/nouns/supplier), for a take rate |

## Next
[Datasets](/products/data/datasets) covers the Product that sells the truth of its records.