Approvals: policies and board
Define who approves what by type and conditions, and track requests on a board with chain and history.
Approvals let you require the sign-off of one or more people before something moves forward, for example a discount above a limit.
Policies (Settings → Approvals)
The rule of who approves what lives in DATA, not in code: each policy has a type (discount, proposal, contract, expense…), an optional condition as a range (e.g., discount between 20% and 100%) and an ordered CHAIN of approvers (by user or by role).
- Multiple levels: level 1 approves, it moves up to level 2, and so on to the last.
- The highest range wins: with a 0-20% policy (manager) and another 20%+ (director), a 30% discount falls under the director's.
- Editing a policy creates a NEW version. Approvals already made stay valid under the version in effect at the time.
Approvals board
In the side menu, "Approvals" lists requests by status (pending, approved, rejected). Opening one, you see the context, the chain with the current level highlighted, the decision history and, if you are the current level's approver, the Approve/Reject buttons with a notes field.
Advanced approvals (v2 engine)
For richer rules, turn on Advanced approvals in Settings → Approvals. It is a per-company switch that starts OFF: nothing changes until you enable it, and everything that already exists keeps working.
- By object and event: pick the object (e.g. opportunity) and when to evaluate (on create or on update).
- Composite rules: combine several conditions over the record fields (e.g. discount ≥ 20% AND margin < 15%), with 'all' (AND) or 'any' (OR).
- Multi-level chain: each level can require any one, all, or the majority of approvers; use people, roles, the requester's manager, the team lead, or the record owner.
- SLA and escalation: set a deadline in business hours; on breach the request is escalated (notifies admins) or auto-rejected, per the policy.
- Tamper-evident trail: every decision is stored in a hash-chained history; self-approval is blocked by default.
- Versioning: editing creates a new version; older requests keep the version in force at the time.