Transitions instead of fields
In Covex nobody — not a user, an integration or the driver app — writes a status straight into a field. Instead a transition is triggered, and it can be rejected.
-- A transition is requested — it can be rejectedselect request_transition( shipment_id => '…', to_status => 'delivered', source => 'driver');Everything is traceable
Every change is logged with who, when and from where: user, driver, job or API. The log can only be appended to, and it is written by the database itself, so nothing can change without leaving a trace.
Facts carry their basis with them, so it is always clear whether a figure is confirmed, extracted, derived or predicted.
Row-level access
Every table carries a tenant, and policies in the database decide access from the user's membership and role. It is the database that enforces who sees what — not just the interface.
- Roles: dispatcher, finance, transport manager, driver, portal.
- Two-factor sign-in with a code from an authenticator app.
- Data retention with deadlines per data type, enforced daily.

