How Revenue is Calculated
Understanding how Rize calculates revenue is essential for accurate billing and profitability tracking. This guide explains the revenue calculation logic for each billing type and how time entries contribute to revenue.
Revenue Components
Revenue in Rize comes from two sources:
- Hourly Revenue: Calculated from billable time entries with hourly rates
- Retainer Revenue: Calculated from active retainers' daily allocations
Total revenue for any period = Hourly Revenue + Retainer Revenue
Time Entry Rate Logic
How Rize sets hourly rates on time entries depends on the client's billing type and whether the entry is billable.
Billable Entries
For billable time entries, the hourly rate is determined as follows:
Hourly Billing (or no billing type set):
- Hourly rate is set from (in priority order):
- Project hourly rate
- Client hourly rate
- Team member hourly rate
- Revenue = hours × hourly_rate
Retainer Billing:
- Hourly rate =
nil(no hourly rate) - Revenue comes only from retainer daily allocation
- Time still contributes to costs
Hybrid Billing:
- Hourly rate =
nil(no hourly rate) - Revenue comes from retainer base + overage calculation
- Overage is calculated at period end, not per entry
Non-Billable Entries
Non-billable entries always have hourly_rate = nil and contribute $0 to revenue, regardless of billing type.
Image placeholder description: A flowchart or decision tree diagram showing the rate logic. The image should show:
- Start: "New Time Entry"
- Decision: "Is entry billable?" (Yes/No branches)
- If No: "hourly_rate = nil, Revenue = $0"
- If Yes: Decision: "Client billing type?"
- Three branches:
- Hourly/None: "Set hourly_rate from project/client/member → Revenue = hours × rate"
- Retainer: "hourly_rate = nil → Revenue from retainer only"
- Hybrid: "hourly_rate = nil → Revenue from retainer + overage"
- Visual flow with clear decision points and outcomes
Hourly Billing Revenue
For hourly billing clients, revenue is straightforward:
Revenue = Sum of (hours × hourly_rate) for all billable entries
Rate Priority
When multiple rates are available, Rize uses this priority:
- Project Rate: If the project has an hourly rate set, use it
- Client Rate: If no project rate, use the client's hourly rate
- Member Rate: If neither project nor client rate exists, use the team member's hourly rate
Example
You have three billable entries:
- Entry 1: 2 hours at $150/hour (project rate) = $300
- Entry 2: 3 hours at $100/hour (client rate) = $300
- Entry 3: 1 hour at $120/hour (member rate) = $120
Total Revenue = $300 + $300 + $120 = $720
Image placeholder description: A detailed view showing hourly revenue calculation. The image should show:
- A table or list of time entries with columns:
- Date/Time
- Hours
- Rate source (Project/Client/Member)
- Hourly rate
- Revenue (hours × rate)
- A summary showing total revenue
- Visual indicators showing which rate source was used for each entry
- Maybe color coding or icons for different rate sources
Retainer Billing Revenue
For retainer billing clients, revenue comes entirely from the retainer's daily allocation:
Daily Revenue = Retainer Budget Amount ÷ Days in Billing Period
Total Revenue = Sum of Daily Revenue for all days in period
Key Points
- Time entries have
hourly_rate = nil - Revenue is recognized daily, even on days with no time entries
- Each day gets an equal share of the retainer budget
- Time entries still contribute to costs and profitability
Example
A client has a $3,000 monthly retainer (30-day month):
- Daily Revenue = $3,000 ÷ 30 = $100/day
- If you work 40 hours or 0 hours, daily revenue is still $100
- Total monthly revenue = $3,000 (regardless of hours worked)
Image placeholder description: A calendar or daily breakdown view showing retainer revenue. The image should show:
- A calendar view or daily list showing:
- Each day of the month
- Daily retainer revenue ($100/day in this example)
- Time entries (if any) showing no hourly rates
- A summary showing:
- Retainer budget amount
- Number of days
- Daily revenue calculation
- Total revenue
- Visual consistency showing the same revenue amount each day
- Maybe highlight days with time entries vs days without
Hybrid Billing Revenue
Hybrid billing combines retainer base revenue with overage revenue:
Total Revenue = Base Retainer Revenue + Overage Revenue
Base Retainer Revenue
Calculated the same as pure retainer billing:
Daily Base Revenue = Retainer Budget Amount ÷ Days in Period
Overage Revenue
Calculated at the end of the billing period:
- Sum total billable hours for the period
- Calculate overage hours = max(total_hours - hours_included, 0)
- Calculate overage revenue = overage_hours × overage_hourly_rate
- Allocate overage revenue proportionally across days based on hours worked each day
Example
A client has:
- $2,000/month retainer
- 20 hours included
- $150/hour overage rate
- 30 hours worked in the month
Base Revenue:
- Daily base = $2,000 ÷ 30 = $66.67/day
- Total base = $2,000
Overage Calculation:
- Overage hours = 30 - 20 = 10 hours
- Overage revenue = 10 × $150 = $1,500
- Daily overage allocation = proportional to hours worked each day
Total Revenue:
- Total = $2,000 + $1,500 = $3,500
Image placeholder description: A detailed breakdown showing hybrid revenue calculation. The image should show:
- A billing period summary with:
- Retainer base amount
- Hours included vs hours worked
- Overage hours calculation
- Overage rate
- Overage revenue
- Daily breakdown showing:
- Base daily revenue (consistent)
- Hours worked each day
- Overage allocation per day (proportional)
- Total daily revenue (base + overage)
- Visual indicators showing which days contributed to overage
- A summary showing total base + total overage = total revenue
Daily Statistics Calculation
Rize calculates revenue daily through statistics models. Here's how it works:
Step 1: Fetch Day Entries
day_entries = time_entries.active.where(start_time: day range)
Step 2: Calculate Hourly Revenue
Only billable entries with hourly rates contribute:
hourly_billable_entries = day_entries.where(billable: true).where.not(hourly_rate: nil)
billable_amount = Σ(hours × hourly_rate)
Note: Retainer and hybrid entries have hourly_rate = nil, so they don't appear in hourly revenue.
Step 3: Calculate Retainer Revenue
retainer_amount = team.retainers.active.covering_date(day)
.sum { |r| r.daily_revenue_for(day:) }
For hybrid retainers, daily_revenue_for includes both base and overage allocation.
Step 4: Total Revenue
total_revenue = billable_amount + retainer_amount
Image placeholder description: A visual representation of the daily stats calculation process. The image should show:
- A day's time entries listed
- Two sections:
- Hourly Revenue: Entries with rates showing hours × rate
- Retainer Revenue: Daily retainer allocation
- A calculation showing: Hourly Revenue + Retainer Revenue = Total Revenue
- Visual separation between the two revenue sources
- Maybe a breakdown showing which entries contributed to which revenue type
Revenue Recognition Timeline
Hourly Billing
- Revenue is recognized when time entries are created
- Each entry contributes revenue immediately
- No revenue on days without entries
Retainer Billing
- Revenue is recognized daily, regardless of time entries
- Daily background jobs ensure revenue is recorded even on days without work
- Consistent daily revenue throughout the billing period
Hybrid Billing
- Base revenue is recognized daily (like retainer)
- Overage revenue is calculated at period end and allocated retroactively
- Daily stats are updated when overage is calculated
Image placeholder description: A timeline or calendar view showing revenue recognition patterns. The image should show:
- A calendar or timeline view
- Three sections or examples:
- Hourly: Revenue only on days with entries (sparse, variable amounts)
- Retainer: Consistent revenue every day (even days without entries)
- Hybrid: Consistent base revenue daily + overage allocation at period end
- Visual indicators showing when revenue is recognized
- Maybe different colors or patterns for each billing type
Project and Member Revenue Allocation
For retainer revenue, Rize allocates the client's daily retainer amount to projects and members based on their share of billable time:
Project Share = Project Billable Seconds ÷ Client Total Billable Seconds
Project Retainer Revenue = Client Daily Retainer × Project Share
This ensures that retainer revenue is distributed proportionally based on actual work performed.
Image placeholder description: A visual breakdown showing revenue allocation. The image should show:
- Client-level retainer revenue (e.g., $100/day)
- Breakdown by project showing:
- Project name
- Billable hours/seconds
- Percentage share
- Allocated revenue
- Breakdown by member showing similar information
- Visual representation (pie chart or bar chart) showing the allocation
- Total should sum to the client's retainer amount
Common Scenarios
Scenario 1: Hourly Client with Multiple Rates
- Client has $100/hour rate
- Project A has $150/hour rate
- Project B uses client rate ($100/hour)
- Revenue = (Project A hours × $150) + (Project B hours × $100)
Scenario 2: Retainer Client with Variable Hours
- $3,000/month retainer = $100/day
- Work 40 hours one week, 10 hours the next
- Revenue = $100/day every day (consistent)
- Profit varies based on costs
Scenario 3: Hybrid Client Going Over Included Hours
- $2,000/month retainer, 20 hours included, $150/hour overage
- Work 25 hours total
- Base revenue = $2,000
- Overage = 5 hours × $150 = $750
- Total revenue = $2,750
Next Steps
- Learn about Cost Rates and Team Member Costs to understand the full profitability picture
- Explore Profitability Metrics to see how revenue contributes to profit
- View Profitability Reports to see revenue calculations in action