Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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, and budget_cents fields. Reports use these to split CapEx from OpEx automatically.
  • Approval workflows built in. Time entries follow a Draft -> Submitted -> Approved lifecycle. 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:

FieldPurpose
capitalization_typeCapex or Opex — determines accounting treatment
development_phasePreliminary, AppDevelopment, or PostImplementation — ASC 350-40 phase
cost_center_idYour internal cost center code for GL mapping
budget_centsBudget in cents (e.g. 10000000 = $100,000.00)
budget_periodMonthly, Quarterly, Yearly, or Fixed
amortization_monthsUseful 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:

FieldDescription
budget_centsTotal budget for the period
budget_periodMonthly, Quarterly, Yearly, or Fixed
spent_centsApproved time cost for the period
budget_remaining_centsbudget_cents - spent_cents
budget_utilization_pctPercentage 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 TypeCapEx EligibleNotes
CodingYesCore development work
TestingYesWriting and running tests
CodeReviewYesPull request reviews
DesignYesUI/UX design work
ArchitectureYesSystem design decisions
DocumentationYesTechnical documentation
DeploymentYesCI/CD and release work
BugFixingYes (Development)Only during AppDevelopment phase
PMDependsCapitalizable during AppDevelopment
RequirementsPlanning onlyCapitalizable during Preliminary phase
MeetingsDependsContext-dependent
TrainingNoAlways OpEx
MaintenanceNoAlways 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:

  1. Request Viewer or Admin access — Viewer for read-only reports, Admin if you need to approve time entries or manage labor rates
  2. Verify cost centers — Ensure each project has the correct cost_center_id matching your GL chart of accounts
  3. Set capitalization fields — Confirm capitalization_type and development_phase on every project
  4. Configure labor rates — Set loaded rates for all team members with correct effective dates (POST /api/v1/labor-rates)
  5. Set budgets — Add budget_cents and budget_period to projects for budget tracking in reports
  6. Review submitted time — Check GET /api/v1/time-entries/submitted regularly and approve or reject entries
  7. Generate your first report — Run the capitalization report for the current period with include_budget=true
  8. Export CSV — Test the CSV export and verify it maps to your ERP import format
  9. Schedule automation — Set up cron jobs for weekly CSV exports and budget utilization alerts
  10. Tag for dimensions — Use tags like department:* and billable:* for multi-dimensional reporting

Further reading: