Appearance
Vendors & Liabilities
Vendors are external contractors or agencies tracked in VERA. Liabilities are fixed payment commitments to those vendors.
Vendor users
A vendor is a user with employment_type = "vendor".
add_user name="Dev House X" employment_type="vendor"Vendor users are like regular users in the system — they appear in list_users, can be allocated to projects, and have time logged against them. The difference is:
- PMs log hours on their behalf — vendor users don't message the bot themselves
- Cost is typically governed by a liability rather than an hourly rate
- Revenue is the same as direct labor — hours × billing_rate
Liabilities
A liability is a fixed payment commitment to a vendor on a specific project.
Example: "We agreed to pay Dev House X $5,000 to build the authentication module on Project Rambo."
This is recorded as a liability with:
vendor_user_id— Dev House X's user IDproject_id— Project Ramboagreed_amount— $5,000agreed_hours— 80 (the contracted scope in hours)description— "Authentication module development"
Why liabilities exist
Without a liability, VERA calculates vendor cost as hours × hourly_cost. But for fixed-fee vendor engagements, that's wrong — you've agreed to pay $5,000 regardless of how many hours are logged.
A liability overrides the hourly calculation entirely. When a liability is active for vendor X on project Y, the cost for that vendor on that project is agreed_amount, not hours × rate. The two methods are never mixed.
Vendor hours and the project budget
agreed_hours captures the contracted scope in hours. Because vendors don't log time themselves, VERA cannot know their actual pace — so it assumes even delivery from the liability creation date to the project deadline:
implied_hours_today = agreed_hours × (days_elapsed / total_days)This implied figure is added to the team's logged hours when computing budget burn, health status, and proactive alerts. The project deadline is the 100% mark; at the deadline, all agreed_hours count in full. A cancelled liability contributes zero implied hours.
Both the agreed_hours value and the accrued implied_hours_to_date appear in the list_liabilities response. The project's deadline must be set before a liability can be created.
Revenue still comes from hours
Liabilities only affect cost. Revenue is still recognised from time entries in the normal way (hours × billing_rate for T&M, or percentage-of-completion for Fixed Price).
Liability lifecycle
create_liability → active
↓
cancel_liability → cancelled (not deleted)Cancelled liabilities are kept for audit trail. When listing liabilities, filter by status = "active" to see open commitments only.
Permissions
| Action | Owner | Manager | User |
|---|---|---|---|
| Create liability | ✅ | ❌ | ❌ |
| View liabilities | ✅ (all) | ✅ (own projects) | ❌ |
| Cancel liability | ✅ | ❌ | ❌ |
P&L cost rule (vendor summary)
For vendor X on project Y:
If active liability exists:
cost = liability.agreed_amount
Else:
cost = hours_logged × hourly_cost (from Rate History, effective on entry date)This rule is applied when calculating project cost and margin in generate_monthly_report and the reporting sheet's financial tabs.
Common vendor workflow
- Add the vendor:
add_userwithemployment_type="vendor" - Create a liability:
create_liabilitywith the agreed amount, contracted hours, and description — the project must have a deadline set - PM logs hours:
log_timewith the vendor's user ID — this tracks delivery against the engagement (optional but recommended) - View cost: The liability's
agreed_amountappears as cost in financial reports, regardless of hours logged - Budget burn: The vendor's
agreed_hoursaccrue linearly against the project budget — no manual entries needed for the hours story to stay accurate
If the engagement grows beyond the original liability, cancel the old one and create a new one with the updated amount.