Skip to main content
T-shirt sizing is a relative estimation method that uses standardized categories (XS, S, M, L, XL, XXL) instead of precise hours. Each size represents a time range with a minimum, maximum, and average—providing flexibility while maintaining consistency.

The Size System

Every t-shirt size maps to a specific time range:
SizeTime RangeAverageWhen to Use
XS0-30 mins15 minsTrivial changes: fixing typos, updating text, tiny CSS tweaks
S1-2 hours1.5 hoursSmall work: simple component updates, straightforward bug fixes
M3-6 hours4.5 hoursStandard features: moderate complexity, typical task size
L8-16 hours12 hoursComplex features: multiple components, significant logic
XL24-40 hours32 hoursMajor features: substantial work spanning multiple days
XXL40-120 hours80 hoursVery large deliverables: multi-week projects, full modules
Averages are rounded to the nearest 15 minutes for clean scheduling. This ensures time allocations work smoothly with standard calendar increments.

Not Required

There’s also a Not Required option for requirements that don’t apply to a particular scope (e.g., design not needed for a backend-only task).

Why Ranges Instead of Fixed Hours?

Ranges acknowledge the inherent uncertainty in software estimation:
Everything goes smoothly
  • No unexpected complications
  • Clear requirements
  • Existing patterns to follow
  • Minimal QA issues
Example: M size minimum = 3 hours (when work flows perfectly)

What’s Included in the Size?

T-shirt sizes represent the total time needed to complete the deliverable, including:

Core Work (80%)

For Development:
  • Writing code
  • Implementing features
  • Building functionality
For Design:
  • Creating mockups
  • Designing interfaces
  • Visual work

QA & Feedback (20%)

For Development:
  • Internal QA review time
  • Fixing bugs found in QA
  • External QA feedback fixes
For Design:
  • Client feedback rounds
  • Revisions based on feedback
  • Design iteration cycles
QA time and client feedback are included in the t-shirt size, not added on top. A Medium task (3-6 hours) includes core work PLUS QA/feedback within that range.

The 80/20 Split in Practice

Internally, CharleOS splits the average time for scheduling purposes: Example: M size development (average = 270 minutes)
  • QA budget: 60 minutes (20% = 54 mins, rounded UP to 60)
  • Development: 210 minutes (270 - 60 = 210)
This split helps PMs allocate:
  • Core work → Assigned developer
  • QA fixes → Same developer, but scheduled separately
The 20% pool is shared across all QA/feedback:
  • Internal QA finds 3 bugs → Uses part of the 20%
  • Client UAT finds 2 more → Uses more of the 20%
  • Once the 20% is exhausted, additional time is overage (non-billable)
The 80/20 split is for internal scheduling only. Clients see the total t-shirt size, not the breakdown.

How to Choose a Size

Selecting the right t-shirt size requires considering multiple factors:

1. Complexity

  • Work is straightforward
  • Clear requirements
  • Existing patterns to follow
  • Minimal logic or edge cases
Examples:
  • Update footer links (XS)
  • Add a new field to a form (S)
  • Some technical challenge
  • Multiple components involved
  • Standard business logic
  • Normal testing needs
Examples:
  • Add product filtering (M)
  • Build contact form with validation (M)
  • Significant technical challenge
  • Multiple interconnected components
  • Complex business rules
  • Extensive testing required
Examples:
  • Multi-step checkout flow (L or XL)
  • Real-time collaboration features (XL or XXL)

2. Unknowns and Discovery

The more uncertainty, the larger the size:
Unknown FactorImpactExample
Clear requirementsNo change”Make button blue”
Some ambiguitySize up by 1”Improve navigation UX”
Significant unknownsSize up by 2, or do discovery first”Integrate with third-party API (unclear docs)“
Complete unknownDiscovery task first”Research best approach for real-time sync”
When unknowns are high, consider a separate discovery task (usually S or M) before estimating the implementation.

3. Dependencies

Dependencies increase risk and coordination overhead:
Self-contained work
  • No reliance on other work
  • Can be completed independently
  • Minimal coordination needed
Size as normal based on complexity.

4. Similar Past Work

Compare to completed tasks with similar scope:
1

Find Similar Tasks

Search for tasks with comparable requirements, complexity, and tech stack.
2

Review Actual Time

Check how long they actually took (not just the estimate). Look at the billable time and any overage.
3

Identify Patterns

  • Did they consistently overrun? → Size up
  • Were they efficient? → Similar size is safe
  • Did specific clients or codebases cause issues? → Account for that
4

Adjust for Differences

Is this task simpler or more complex than the reference? Adjust size accordingly.

Sizing Guidelines by Type

Design Work

SizeTypical WorkIncludes
XSIcon design, minor style tweaksQuick mockup, minimal feedback
SSingle page mockup1-2 feedback rounds
MMulti-page flow (3-5 screens)Full design + client revisions
LComplete section redesign (10+ screens)Multiple iterations, detailed feedback
XLFull site redesignExtensive revisions, stakeholder alignment

Development Work

SizeTypical WorkIncludes
XSTypo fix, config changeQuick test, deploy
SSimple CRUD endpoint, basic componentUnit tests, QA review
MStandard feature with UI + logicFull testing, bug fixes
LComplex feature with multiple componentsIntegration testing, multiple QA rounds
XLMajor feature or moduleComprehensive testing, extensive QA

Common Sizing Mistakes

Mistake 1: Not Accounting for QA/Feedback

Thinking: “The coding will take 3 hours, so I’ll size it S (1-2 hours)”Problem: Forgot to account for QA fixes and testing time.

Mistake 2: Ignoring Client or Codebase Factors

Thinking: “This is a standard feature, always size it M”Problem: Didn’t account for this client’s legacy Vue 2 codebase being painful to work in.

Mistake 3: Using XXL as a Catch-All

Thinking: “This is big and complex, so XXL”Problem: XXL becomes a black box—hard to schedule, hard to track progress, high risk.

Tips for Better Sizing

If you’re torn between S and M, choose M. It’s better to finish early (creating banked time) than to consistently overrun. Clients prefer positive surprises.
Reserve XS for truly trivial changes. If it requires any thought or testing, it’s probably S. Most work is S or larger.
XXL should be rare. If a requirement is XXL, consider splitting it into multiple smaller deliverables. This reduces risk and improves scheduling flexibility.
Review past tasks regularly to calibrate your estimates. Which sizes were accurate? Which consistently overran? Learn from patterns.
When estimating, note your assumptions:
  • “Assumes API docs are accurate”
  • “Includes 2 design feedback rounds”
  • “Based on similar product filter implementation”
This helps if scope changes later.

How Sizes Affect Billing

T-shirt sizes feed directly into the value-based billing formula:
Billable = MIN(maximum, MAX(average, actual))
Example: M size (3-6 hours, average 4.5 hours)
ScenarioActual TimeBillable TimeOutcome
Efficient3 hours4.5 hours (average)1.5 hrs banked (profit)
On Target5 hours5 hours (actual)No margin, fair
Overrun7 hours6 hours (maximum)1 hr overage (absorbed)
Key takeaways:
  • Minimum is never billed (you always bill at least the average if you finish early)
  • Average is billed when you finish faster than average
  • Maximum is the cap—client never pays more, even if you overrun
Consistent overruns hurt profitability. If you’re regularly exceeding the maximum, your sizing is too optimistic. Size up or improve scoping.

Using T-shirt Sizes in CharleOS

In Quotes

When creating quotes, each requirement block is assigned a t-shirt size:
  1. Open the quote
  2. Navigate to the requirement
  3. Select a size from the dropdown
  4. Optionally add sizing notes (e.g., “Assumes API is RESTful”)
  5. Save
The quote automatically calculates:
  • Minimum total time
  • Average total time (what client is quoted)
  • Maximum total time (the cap)

In Tasks

When quotes convert to tasks, the t-shirt sizes carry over:
  • Task inherits the estimate
  • Subtasks are created with the 80/20 split applied
  • Billing cap is set to the maximum
  • Actual time is tracked against the estimate

Viewing Size Info

Hover over any t-shirt size badge in the UI to see:
  • Time range (e.g., “3-6 hours”)
  • Average (e.g., “4.5 hours”)
  • What’s included (core work + QA/feedback)