Budget Summary
Service revenue
€ {{ fmt(totalServiceRevenue) }}
Hours × billing rate
PTC (pass-through)
€ {{ fmt(totalPTC) }}
Recharged at cost
Personnel costs
€ {{ fmt(totalPersonnelCost) }}
Internal hourly cost
Gross margin II
{{ pct(grossMargin) }}
After personnel costs
P&L Overview
| Service revenue | € {{ fmt(totalServiceRevenue) }} |
| PTC revenue | € {{ fmt(totalPTC) }} |
| Total revenue | € {{ fmt(totalRevenue) }} |
| − Material costs | (€ {{ fmt(totalMaterialCost) }}) |
| Gross profit I | € {{ fmt(grossProfitI) }} |
| − Personnel costs | (€ {{ fmt(totalPersonnelCost) }}) |
| Gross profit II | € {{ fmt(grossProfitII) }} ({{ pct(grossMargin) }}) |
Revenue breakdown by section
| Section | Revenue | Personnel cost | Margin | Share |
|---|---|---|---|---|
| {{ s.name }} | € {{ fmt(s.revenue) }} | € {{ fmt(s.cost) }} | {{ pct(s.margin) }} |
{{ totalRevenue>0?pct(s.revenue/totalRevenue):'-' }}
|
Cohort overview
Cohort {{ i+1 }}
{{ c.subjects }} subjects
€ {{ fmt(cohortRevenue(c)) }}
{{ c.active?'Active':'Inactive' }}
Hours per role per month
Set project dates and phase dates to show hours per role.
{{ r.role }} {{ r.name }}
| Role | {{ m.label }} | Total |
|---|---|---|
| {{ r.role }} {{ r.name }} | {{ Math.round(getMonthRoleHours(mi, r.role)) || '–' }} | {{ Math.round(getTotalRoleHours(r.role)) || '–' }} |
| Total | {{ Math.round(rates.reduce((s,r)=>s+getMonthRoleHours(mi,r.role),0)) || '–' }} | {{ Math.round(rates.reduce((s,r)=>s+getTotalRoleHours(r.role),0)) || '–' }} |
Project information
Rates & roles
Billing rate = what the client pays. Hourly cost = internal personnel cost (salary + social costs ≈ 51.4%).
| Abbreviation | Role name | Billing rate (€/h) | Hourly cost (€/h) | Utilization | Effective cost (€/h) | Margin |
|---|---|---|---|---|---|---|
| = {{ r.utilization>0?Math.round(r.utilization*100)+'%':'–' }} | {{ r.utilization>0 ? Math.round(r.hourlyCost/r.utilization) : '–' }} | {{ r.hourlyCost>0 ? (r.billingRate/r.hourlyCost).toFixed(2)+'x' : '–' }} |
Start-up & Close-out
Start-up phase
Revenue: € {{ fmt(sectionTotal(startup).revenue) }} | Personnel cost: € {{ fmt(sectionTotal(startup).cost) }}
| Activity | Role | Hours | Qty | Distribution | Revenue (€) | Personnel cost (€) | |
|---|---|---|---|---|---|---|---|
| {{ item.name }} | |||||||
{{ ((item.timing.t1||0)+(item.timing.t2||0)+(item.timing.t3||0)).toFixed(1) }}%
|
{{ fmt(calcRevenue(item)) }} | {{ fmt(calcCost(item)) }} | |||||
Close-out phase
Revenue: € {{ fmt(sectionTotal(closeout).revenue) }} | Personnel cost: € {{ fmt(sectionTotal(closeout).cost) }}
| Activity | Role | Hours | Qty | Distribution | Revenue (€) | Personnel cost (€) | |
|---|---|---|---|---|---|---|---|
| {{ item.name }} | |||||||
{{ ((item.timing.t1||0)+(item.timing.t2||0)+(item.timing.t3||0)).toFixed(1) }}%
|
{{ fmt(calcRevenue(item)) }} | {{ fmt(calcCost(item)) }} | |||||
Clinical phase – cross-cohort activities
Recruitment, screening, PM activities, EOS and PK periods that apply across all cohorts.
Activities
Revenue: € {{ fmt(sectionTotal(clinicalWork).revenue) }} | Personnel cost: € {{ fmt(sectionTotal(clinicalWork).cost) }}
| Activity | Role | Hours/unit | Qty | Unit label | Distribution | Revenue (€) | Personnel cost (€) | |
|---|---|---|---|---|---|---|---|---|
| {{ item.name }} | ||||||||
{{ ((item.timing.t1||0)+(item.timing.t2||0)+(item.timing.t3||0)).toFixed(1) }}%
|
{{ fmt(calcRevenue(item)) }} | {{ fmt(calcCost(item)) }} | ||||||
Cohorts
Pre-dose night
Dosing PK-day
Monitoring (24h)
Discharge
Follow-up
Gap period
Cohort {{ ci+1 }} – {{ c.subjects }} subjects
{{ c.startDate }} → {{ cohortEndDate(c) }}
{{ cohortDuration(c.plan) }} days total
€ {{ fmt(cohortRevenue(c)) }}
Cohort inactive — activate to edit visit plan and activities.
| {{ visitCfg.label }} | |
|---|---|
| {{ dt.label }} | |
No days defined
| Role |
{{ DS_SHORT[d.type] }}{{ d.num }}
Library available
{{ item.role||'—' }}
{{ item.name }}
{{ item.hours }}t×{{ item.qty }}
|
Total |
|---|---|---|
| {{r.role}} |
{{ r.role }} · {{ DAY_LABEL[d.type] }}
{{ act.name }}
{{ act.hours }}t × {{ act.qty }}
= {{ ((act.hours||0)*(act.qty||0)).toFixed(0) }}t
✏️ click the pencil icon to edit
|
{{ cohortDaySchedule(ci).days.filter(d=>d.visit===(vi+1)).reduce((s,d)=>s+(cohortDaySchedule(ci).cells[d.idx+'_'+r.role]?.value||0),0).toFixed(0) }}t |
| Total | {{ cohortDaySchedule(ci).roles.reduce((s,r)=>s+(cohortDaySchedule(ci).cells[d.idx+'_'+r.role]?.value||0),0).toFixed(0) }}t | {{ cohortDaySchedule(ci).roles.reduce((rs,r)=>rs+cohortDaySchedule(ci).days.filter(d=>d.visit===(vi+1)).reduce((s,d)=>s+(cohortDaySchedule(ci).cells[d.idx+'_'+r.role]?.value||0),0),0).toFixed(0) }}t |
{{ cellEdit[ci].role }}
{{ DAY_LABEL[cellEdit[ci].dayType] }}
— activities driving hours in this column
No activities linked to this column yet.
t ×
= {{ ((act.hours||0)*(act.qty||0)).toFixed(0) }}t
{{ (act.timing.t1||0)+(act.timing.t2||0)+(act.timing.t3||0) }}%
From library — click to add:
{{ act.name }}
{{ act.hours }}t × {{ act.qty }}
unlinked
{{ item.name }}
{{ item.hours }}t × {{ item.qty }} {{ item.qtyLabel }}
{{ tpl.name }}
Templates for {{ DAY_LABEL[cellEdit[ci].dayType] || 'all day types' }}
No templates yet.
Create templates in Activity library →
Blue text = activity-driven ·
Blue background = manually overridden ·
Clear cell to reset to reference value
Revenue: € {{ fmt(sectionTotal(c.activities).revenue) }}
Personnel cost: € {{ fmt(sectionTotal(c.activities).cost) }}
Margin:
€ {{ fmt(sectionTotal(c.activities).revenue - sectionTotal(c.activities).cost) }}
Activity library
A template is a package of activities for one day type — e.g. "Standard dosing PK-day" with SN 8h + MD 2h + NN 8h.
Templates are applied from Cohorts → ✏️ (cell) → From library, and all activities are copied in and can be edited per cohort.
No templates yet. Click New template to create your first.
#{{ ti+1 }}
{{ DAY_LABEL[tpl.dayType] }}
{{ (tpl.items||[]).length }} activit{{ (tpl.items||[]).length !== 1 ? 'ies' : 'y' }}
| Role | Activity name | Hours | Qty | Unit | |
|---|---|---|---|---|---|
| No activities yet — add one with the button below. | |||||
Materials & Pass-through costs (PTC)
Materials
PTC: € {{ fmt(totalPTC) }} |
Own mat.: € {{ fmt(totalOwnMaterials) }} |
Mat. revenue: € {{ fmt(totalMaterialRevenue) }}
| Item / service | Category | Unit price (€) | Qty | PTC | Overhead % | Revenue (€) | Cost (€) | |
|---|---|---|---|---|---|---|---|---|
| {{ item.name }} | ||||||||
| {{ fmt(calcMaterialRevenue(item)) }} | {{ fmt(item.unitPrice*item.qty) }} | |||||||
Gantt & phase settings
Set dates for start-up and close-out. Cohort dates are set in "Cohorts".
Phase dates
Start-up
{{ daysBetween2(project.startDate, schedule.startupEnd) }} days
Clinical work (shared)
{{ daysBetween2(schedule.clinicalStart, schedule.clinicalEnd) }} days
Cohort {{ i+1 }}
To:
{{ cohortEndDate(c) || '(set day plan)' }}
{{ cohortDuration(c.plan) }} days
Close-out
{{ daysBetween2(schedule.closeoutStart, project.endDate) }} days
Gantt chart
Set the project start and end date in Project info to show the Gantt.
{{ m.label }}
{{ phase.name }}
{{ phase.name }}
(€ {{ fmt(phase.revenue) }})
Today
Cohort {{ ci+1 }} – {{ c.subjects }} subjects
{{ c.startDate }} → {{ cohortEndDate(c) }}
{{ cohortDuration(c.plan) }} days total
| {{ visitCfg.label }} | |
|---|---|
| {{ dt.label }} | |
No days defined
| Role |
{{ DS_SHORT[d.type] }}{{ d.num }}
|
Total |
|---|---|---|
| {{r.role}} | {{ cohortDaySchedule(ci).days.filter(d=>d.visit===(vi+1)).reduce((s,d)=>s+(cohortDaySchedule(ci).cells[d.idx+'_'+r.role]?.value||0),0).toFixed(0) }}t | |
| Total | {{ cohortDaySchedule(ci).roles.reduce((s,r)=>s+(cohortDaySchedule(ci).cells[d.idx+'_'+r.role]?.value||0),0).toFixed(0) }}t | {{ cohortDaySchedule(ci).roles.reduce((rs,r)=>rs+cohortDaySchedule(ci).days.filter(d=>d.visit===(vi+1)).reduce((s,d)=>s+(cohortDaySchedule(ci).cells[d.idx+'_'+r.role]?.value||0),0),0).toFixed(0) }}t |
Blue = manually overridden · Clear cell to reset to reference value
Updates hours and qty in "Cohorts" based on the day plan.
Monthly distribution
Costs and revenues distributed evenly over each phase's duration. Requires dates to be set in "Gantt & phases" and "Cohorts".
Set the project start and end date (Project info) to show monthly distribution.
Monthly revenue vs. cost
{{ m.label }}
Revenue
Personnel cost
Details per month and phase
| Phase | {{ m.label }} | Total |
|---|---|---|
| {{ row.name }} |
{{ fmt(val.revenue) }}
{{ fmt(val.cost) }}
–
|
{{ fmt(row.totalRevenue) }}
{{ fmt(row.totalCost) }}
|