For Finance Teams
Alloy provides API-first capitalization reporting, budget tracking, and time-entry approval workflows designed for finance teams responsible for ASC 350-40 / IAS 38 software cost accounting. This guide shows how to review time entries, generate capitalization reports, track budgets, export CSV data, and monitor cost center spend — all without logging into a project management UI.
1. Why Alloy for Finance
Traditional project management tools treat finance as an afterthought. Reports are buried in dashboards, export formats are inconsistent, and auditors end up chasing engineers for timesheets. Alloy flips that:
- Capitalization-aware from day one. Projects carry
capitalization_type,development_phase,cost_center_id, andbudget_centsfields. Reports use these to split CapEx from OpEx automatically. - Approval workflows built in. Time entries follow a
Draft -> Submitted -> Approvedlifecycle. Only approved entries appear in reports — no more unapproved hours sneaking into the numbers. - Labor rates with effective dates. Track loaded cost rates per employee over time. Rate changes are versioned, so historical reports stay accurate.
- CSV export for ERP import. One-click export produces a file ready for SAP, Oracle, NetSuite, or any spreadsheet workflow.
- API-first. Every query in this guide can be automated, scheduled, or wired into your existing financial systems.
2. Setting Up Cost Centers and Budgets
Finance teams rely on cost centers and budgets to allocate engineering spend. When creating or updating a project, set these fields:
curl -s -X POST "$BASE_URL/api/v1/projects" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d "{
\"org_id\": \"$ORG_ID\",
\"key\": \"PAY\",
\"name\": \"Payment Platform\",
\"description\": \"Payment processing rebuild\",
\"capitalization_type\": \"Capex\",
\"development_phase\": \"AppDevelopment\",
\"cost_center_id\": \"ENG-002\",
\"budget_cents\": 10000000,
\"budget_period\": \"Quarterly\",
\"amortization_months\": 36
}" | jq .
{
"id": "...",
"org_id": "...",
"key": "PAY",
"name": "Payment Platform",
"description": "Payment processing rebuild",
"ticket_counter": 0,
"capitalization_type": "Capex",
"development_phase": "AppDevelopment",
"cost_center_id": "ENG-002",
"budget_cents": 10000000,
"budget_period": "Quarterly",
"amortization_months": 36
}
Key fields for finance:
| Field | Purpose |
|---|---|
capitalization_type | Capex or Opex — determines accounting treatment |
development_phase | Preliminary, AppDevelopment, or PostImplementation — ASC 350-40 phase |
cost_center_id | Your internal cost center code for GL mapping |
budget_cents | Budget in cents (e.g. 10000000 = $100,000.00) |
budget_period | Monthly, Quarterly, Yearly, or Fixed |
amortization_months | Useful life for amortization scheduling |
Update finance fields on an existing project:
curl -s -X PATCH "$BASE_URL/api/v1/projects/$PROJECT_ID" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{
"budget_cents": 12000000,
"development_phase": "PostImplementation"
}' | jq .
{
"id": "...",
"org_id": "...",
"key": "PAY",
"name": "Payment Platform",
"description": "Payment processing rebuild",
"ticket_counter": 0,
"capitalization_type": "Capex",
"development_phase": "PostImplementation",
"cost_center_id": "ENG-002",
"budget_cents": 12000000,
"budget_period": "Quarterly",
"amortization_months": 36
}
See the Time Tracking & Finance guide for the full project setup flow including ticket creation.
3. Managing Labor Rates
Labor rates are the bridge between hours logged and dollar amounts in reports. Each user gets a loaded rate (salary + benefits + overhead) that takes effect from a specific date.
Set a labor rate for an employee:
curl -s -X POST "$BASE_URL/api/v1/labor-rates" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"user_id\": \"$USER_ID\",
\"org_id\": \"$ORG_ID\",
\"loaded_rate_cents\": 17500,
\"effective_date\": \"2026-01-01\"
}" | jq .
{
"id": "...",
"user_id": "...",
"org_id": "...",
"loaded_rate_cents": 17500,
"effective_date": "2026-01-01",
"created_at": "...",
"updated_at": "..."
}
A loaded_rate_cents of 17500 means $175.00/hour. When rates change
(promotions, annual adjustments), add a new rate with a future effective
date. The system uses the most recent rate on or before the time entry date:
curl -s -X POST "$BASE_URL/api/v1/labor-rates" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"user_id\": \"$USER_ID\",
\"org_id\": \"$ORG_ID\",
\"loaded_rate_cents\": 18500,
\"effective_date\": \"2026-07-01\"
}" | jq .
{
"id": "...",
"user_id": "...",
"org_id": "...",
"loaded_rate_cents": 18500,
"effective_date": "2026-07-01",
"created_at": "...",
"updated_at": "..."
}
View all historical rates for an employee:
curl -s "$BASE_URL/api/v1/users/$USER_ID/orgs/$ORG_ID/labor-rates" \
-H "Authorization: Bearer $TOKEN" | jq .
{
"items": [
{
"id": "...",
"user_id": "...",
"org_id": "...",
"loaded_rate_cents": 18500,
"effective_date": "2026-07-01",
"created_at": "...",
"updated_at": "..."
},
{
"id": "...",
"user_id": "...",
"org_id": "...",
"loaded_rate_cents": 17500,
"effective_date": "2026-01-01",
"created_at": "...",
"updated_at": "..."
}
],
"next_cursor": null,
"has_more": false
}
See the Time Tracking & Finance guide for more on rate management and how rates interact with reports.
4. Reviewing and Approving Time Entries
Finance teams need visibility into what has been submitted and what is still pending. List all submitted time entries awaiting approval:
curl -s "$BASE_URL/api/v1/time-entries/submitted" \
-H "Authorization: Bearer $TOKEN" | jq .
{
"items": [],
"next_cursor": null,
"has_more": false
}
When there are submitted entries, each item includes id, user_id,
ticket_id, project_id, date, duration_minutes, description,
activity_type, status (Submitted), and approved_by/approved_at
(both null until approved).
Approve a submitted entry (requires Admin or Owner role):
curl -s -X POST "$BASE_URL/api/v1/time-entries/$TIME_ENTRY_ID/approve" \
-H "Authorization: Bearer $TOKEN" | jq .
{
"id": "...",
"user_id": "...",
"ticket_id": "...",
"project_id": "...",
"date": "2026-03-28",
"duration_minutes": 120,
"description": "Implemented payment gateway integration",
"activity_type": "Coding",
"status": "Approved",
"approved_by": "...",
"approved_at": "...",
"created_at": "...",
"updated_at": "..."
}
Only Approved time entries are included in capitalization reports. The
status lifecycle is: Draft -> Submitted -> Approved (or Rejected).
See the Time Tracking & Finance guide for the full approval workflow including submission and rejection.
5. Capitalization Reports by Project
The primary report for finance teams — aggregate approved time with labor rates, grouped by project and broken down by activity type:
curl -s "$BASE_URL/api/v1/reports/capitalization?period=2026-03" \
-H "Authorization: Bearer $TOKEN" | jq .
{
"period": "2026-03",
"projects": []
}
When there are approved time entries with labor rates configured, each
project entry includes project_id, project_key, project_name,
capitalization_type, development_phase, cost_center_id,
total_hours, total_amount_cents, and a breakdown array with per-activity
activity_type, hours, and amount_cents.
Each project entry includes the capitalization_type and development_phase,
which determine whether hours are CapEx or OpEx under ASC 350-40. Activity
types like Coding, Testing, and Design during AppDevelopment are
typically capitalizable. Maintenance and Training are always OpEx.
6. Reports by Team with Budget Tracking
For cross-team budget oversight, group the capitalization report by team and include budget fields:
curl -s "$BASE_URL/api/v1/reports/capitalization?period=2026-03&group_by=team&include_budget=true" \
-H "Authorization: Bearer $TOKEN" | jq .
{
"period": "2026-03",
"teams": []
}
When teams have approved time entries with labor rates configured, each
team entry includes team_id, team_name, total_hours,
total_amount_cents, and a projects breakdown. The budget fields on
each project include:
| Field | Description |
|---|---|
budget_cents | Total budget for the period |
budget_period | Monthly, Quarterly, Yearly, or Fixed |
spent_cents | Approved time cost for the period |
budget_remaining_cents | budget_cents - spent_cents |
budget_utilization_pct | Percentage of budget consumed |
Group by user instead of team for individual contributor analysis:
curl -s "$BASE_URL/api/v1/reports/capitalization?period=2026-03&group_by=user&include_budget=true" \
-H "Authorization: Bearer $TOKEN" | jq .
{
"period": "2026-03",
"users": []
}
When there are approved time entries, each user entry includes user_id,
display_name, total_hours, total_amount_cents, and a projects
array. With include_budget=true, each project also includes
budget_cents, budget_period, spent_cents, budget_remaining_cents,
and budget_utilization_pct.
See the Time Tracking & Finance guide for additional filtering by cost center, activity type, and tag.
7. Exporting CSV for ERP and Spreadsheets
Export the capitalization report as CSV for import into SAP, Oracle, NetSuite, or any spreadsheet tool:
curl -s "$BASE_URL/api/v1/reports/capitalization/export?period=2026-03" \
-H "Authorization: Bearer $TOKEN" -o capitalization-2026-03.csv
The CSV includes these columns:
Period,Project,ProjectKey,Employee,Department,CostCenter,Hours,ActivityType,Phase,CapExOpEx,LoadedRate,Amount,Team,Tags,BudgetCents,SpentCents,Utilization
Filter exports by cost center for department-level reporting:
curl -s "$BASE_URL/api/v1/reports/capitalization/export?period=2026-03&cost_center_id=ENG-002" \
-H "Authorization: Bearer $TOKEN" -o eng-002-report.csv
Export with team grouping:
curl -s "$BASE_URL/api/v1/reports/capitalization/export?period=2026-03&group_by=team" \
-H "Authorization: Bearer $TOKEN" -o team-report.csv
Automation tip: Schedule CSV exports as a weekly or monthly cron job. The API is stateless, so the same curl command produces a fresh report each time it runs.
8. Filtering by Cost Center and Activity Type
Narrow reports to a specific cost center or activity type for detailed analysis:
curl -s "$BASE_URL/api/v1/reports/capitalization?period=2026-03&cost_center_id=ENG-002&activity_type=Coding" \
-H "Authorization: Bearer $TOKEN" | jq .
{
"period": "2026-03",
"projects": []
}
When there are approved entries matching the filters, each project includes the full breakdown by activity type with hours and amounts.
Use tags for even finer slicing. Tag time entries with metadata like
billable:true or client:acme-corp, then filter reports by tag:
curl -s "$BASE_URL/api/v1/reports/capitalization/export?period=2026-03&tag=billable:true" \
-H "Authorization: Bearer $TOKEN" -o billable-report.csv
See the Time Tracking & Finance guide for how to tag time entries and search by tag.
9. Understanding Activity Types for Capitalization
Activity types determine whether hours are capitalizable. Alloy defines 13 types used in reports:
| Activity Type | CapEx Eligible | Notes |
|---|---|---|
Coding | Yes | Core development work |
Testing | Yes | Writing and running tests |
CodeReview | Yes | Pull request reviews |
Design | Yes | UI/UX design work |
Architecture | Yes | System design decisions |
Documentation | Yes | Technical documentation |
Deployment | Yes | CI/CD and release work |
BugFixing | Yes (Development) | Only during AppDevelopment phase |
PM | Depends | Capitalizable during AppDevelopment |
Requirements | Planning only | Capitalizable during Preliminary phase |
Meetings | Depends | Context-dependent |
Training | No | Always OpEx |
Maintenance | No | Always OpEx |
The report automatically classifies each entry based on the activity type
and the project’s development_phase. During audits, filter by activity
type to verify correct classification.
10. Getting Started — Finance Team Checklist
Here is what to do when setting up Alloy for finance oversight:
- Request Viewer or Admin access — Viewer for read-only reports, Admin if you need to approve time entries or manage labor rates
- Verify cost centers — Ensure each project has the correct
cost_center_idmatching your GL chart of accounts - Set capitalization fields — Confirm
capitalization_typeanddevelopment_phaseon every project - Configure labor rates — Set loaded rates for all team members with
correct effective dates (
POST /api/v1/labor-rates) - Set budgets — Add
budget_centsandbudget_periodto projects for budget tracking in reports - Review submitted time — Check
GET /api/v1/time-entries/submittedregularly and approve or reject entries - Generate your first report — Run the capitalization report for the
current period with
include_budget=true - Export CSV — Test the CSV export and verify it maps to your ERP import format
- Schedule automation — Set up cron jobs for weekly CSV exports and budget utilization alerts
- Tag for dimensions — Use tags like
department:*andbillable:*for multi-dimensional reporting
Further reading:
- Time Tracking & Finance — full time entry lifecycle, labor rates, and reporting API
- Teams, Roles & Permissions — access control and role requirements
- Labels, Tags & Organization — tagging for reporting dimensions
- For Engineering Managers — the EM perspective on reporting and sprint tracking
- API Reference — complete endpoint documentation
- MCP Tools Reference — MCP automation for reports