Introduction to Cost Capitalization

Last updated: October 27, 2026

Cost capitalization in Span shows how much engineering effort, and what estimated cost, went into work your finance team classifies as capitalizable. Span measures the effort from real activity, your team classifies the work, and finance exports the schedule.

Why it matters

Finance teams usually ask engineering managers to estimate, in spreadsheets, how much time went into capitalizable work. That takes time and depends on each manager's memory. Span replaces the estimate with effort measured from commits, pull requests, reviews, and tickets.

  • For finance: a downloadable report of FTE-days and estimated cost per person, per epic, initiative, or project, per month, stored as a dated snapshot.

  • For engineering leaders: one place to review and classify work, with a log of every classification change.

Span produces the evidence. Your finance team and advisors decide what to capitalize under your accounting policy.

How it works

1. Span measures effort in FTE-days. Each person's active day is worth 1.0 FTE-day, split across the issues and pull requests they touched. If your organization has an out-of-office source, Span drops any effort it inferred on a day the person is marked OOO. See FTE & FTE-d Calculation.

2. Effort rolls up to a container. Your organization picks one classification mode in Settings → DevFinOps:

Mode

Container

Rows for work Span can't place

By Epics from Project Management System (default)

The issue's top-level epic

Unlinked Pull Requests, Unlinked Issues

By Initiatives from Project Management System

The epic's initiative

Unlinked Pull Requests, Unlinked Issues, Unlinked Epics

By All Issues from Project Management System

Each issue, grouped under its epic

Unlinked Pull Requests, Unlinked Issues

By AI-inferred Workstreams (Refined)

The project a workstream is mapped to

Not mapped, Out of cohorts

By AI-inferred Workstreams (Raw Top-Level)

Span's top-level workstream

Unlinked Workstream

The three Project Management System modes need an active Jira integration. With Linear or another tracker, use one of the workstream modes and classify workstreams by hand.

3. Your team classifies each container. Each container has:

  • Status: Capitalized, Uncapitalized, or N/A (excluded). A container with no status is Uncategorized, meaning nobody has decided yet.

  • Capitalization %: the share of the container's effort that counts as capitalized. Blank means 100%. The percentage applies to the whole container, not to individual people, levels, or roles.

  • Start and end dates: the capitalization window. Effort outside the window is excluded.

You can set these inline in the work table, or let Span read them from Jira. In Epics or Initiatives mode, map a Jira field to Status: Capitalized and Status: Uncapitalized values, plus start and end date fields. In All Issues mode, map an issue-level field; the epic still supplies the dates. A manual edit in Span always beats the synced Jira value, and the cell shows that the synced value was overridden.

4. Span handles excluded work. Effort on an N/A container, or dated outside a container's window, is excluded. Under How to handle excluded work, choose:

  • Redistribute where possible, otherwise show as Uncapitalized (the default): Span moves the excluded time onto the same person's other work in the redistribution window. If they had no other work, the time stays in the totals as Uncapitalized.

  • Mark as Uncapitalized: excluded time counts as Uncapitalized. Nothing is redistributed.

  • Redistribute where possible, otherwise hide (reduces totals, not recommended): leftover time drops out of totals and reports. A banner shows how many FTE-days were lost.

The redistribution window is By Day (default), By Week, By Month, or By Quarter. A wider window gives Span more of the person's work to spread excluded time across.

Under How to handle uncategorized work, you can show Uncategorized work as Uncategorized (default) or as Uncapitalized. This changes labels on the chart, Status column, and CSV, not the numbers.

5. Effort comes from Span or from managers. Under How to calculate FTE-days, choose Infer from observed events (default) or, in the refined workstreams mode, Use supervisor-approved FTE-days. With approved effort, managers review and correct each report's effort per project in the Cycles tab, and approved effort replaces Span's inference.

6. Span estimates cost. If an admin has entered salaries, Span estimates cost per row:

Capitalized cost = annual salary / 260 × FTE-days × Capitalization %

Salaries come from Settings → Investment → Cost Estimates: a default salary plus salaries by job level or by job title. Span reads title and level from your HR system or roster but never reads salaries from it.

7. Finance exports the report. In the Reports tab, click Generate Report for a date range. Span stores each report as a snapshot with who generated it and when. Each row is one person, one container, one month, with developer-days and developer-months columns. See Understanding Developer Days and Developer Months.

Setup

  1. Turn on the program. In Settings → DevFinOps, under Active Programs, make sure Cost Capitalization is on. You need the Manage Cost Capitalization permission.

  2. Pick a classification mode under How to classify work.

  3. Map Jira fields (Jira modes only): the status field, its Capitalized and Uncapitalized values, and the start and end date fields. Changes apply on the next sync.

  4. Choose how to handle excluded and uncategorized work, and the redistribution window.

  5. Choose how to calculate developer-months for the report.

  6. Enter salaries in Settings → Investment → Cost Estimates if you want cost columns. Editing salaries needs the Manage Cost Estimates permission.

  7. Optional: connect an out-of-office source in Settings → Org Calendar so time off drops out of capitalized effort. See Connecting an OOO Data Source in Span.

Then open Dev FinOps → Cost capitalization. The Overview tab shows Capitalized, Uncapitalized, and Uncategorized FTE over time, and a work table you can switch between containers, Teams, and People. Use Display settings to show Jira initiatives, Jira story points, or cost estimates.

Things to know

  • Unlinked rows start Uncategorized. Work on a pull request with no issue, or an issue with no epic, lands on an Unlinked row. Set that row to Uncapitalized to count it as non-capitalizable, or to N/A to exclude it and redistribute it. Linking pull requests to issues shrinks these rows.

  • No per-role rates. To treat roles differently, classify separate containers or adjust in your own schedule.

  • Out-of-office days are whole days. With an OOO source, a day is either OOO or not, and OOO days drop out before classification. The exclusion setting doesn't apply to them.

  • Cost is an estimate. It uses annual salary divided by 260 working days, with no benefits, bonus, or equity. Changing a salary reprices live pages; reports you already generated keep their numbers.

  • Who sees what. Viewing the program needs Manage Cost Capitalization. Dollar figures also need the Investment Cost Estimates permission.

  • Every classification change is logged with who changed the status, percentage, or dates, and when.

  • R&D tax credits and grants are separate programs. Turn on R&D Tax Credits (Qualifying / Non-Qualifying) or R&D Grant Treatment (Eligible / Ineligible) under Active Programs. They reuse the same effort data, and your team classifies each container by hand. Capitalizing work doesn't by itself make it eligible for a tax credit.

Worked example

An engineer's salary is $156,000, so one FTE-day costs $156,000 / 260 = $600. In March she has 10 FTE-days on Epic A, marked Capitalized at 60%, and 5 FTE-days on Epic B, marked Uncapitalized.

  • Capitalized: 10 × 60% = 6 FTE-days, or $3,600.

  • Uncapitalized: 4 FTE-days from Epic A plus 5 from Epic B = 9 FTE-days, or $5,400.

  • Her Capitalization Rate for March is 6 / 15 = 40%.

On one Monday she worked only on Epic C, marked N/A. With the default settings and a By Day window, she had no other work that day to absorb it, so that day shows as Uncapitalized. With a By Week window, Span spreads it across her other work that week.

Related articles

Understanding Developer Days and Developer Months in Reports

Connecting an OOO Data Source in Span

Allocation Guide: Refining Your Workstreams

FTE & FTE-d Calculation

Roles & Permissions in Span

Need help?

Contact your Span account team or reach out to support@span.app.