PageSourceSearch

https://onplana.com/assets/ProfessionalServices-BfrQv8eH.js

js onplana.com collected 2026-10-02 00:09:27 UTC 23,218 bytes, 1 lines download raw bytes

1import{r as l,j as e,S as b,H as c,c as r,D as y,P as d,L as h,l as f}from"./index-CaSTCFYu.js";import{L as o}from"./react-BjkLiG0F.js";import{a as w,s as v}from"./servicesLaunch-BfBfB5yP.js";import{o as j,A as n,n as N,j as k,p as S,bD as C,U as E,at as O,bE as P,d as T,f as R,a4 as I,bF as q}from"./icons-B2HTAfh9.js";const F="https://app.onplana.com",A=[{icon:N,color:"text-indigo-700 bg-indigo-50",name:"IT consultancies and MSPs",body:"Fixed-fee and time-and-materials engagements running side by side, often for the same client, with utilization targets per grade."},{icon:k,color:"text-rose-700 bg-rose-50",name:"Digital and creative agencies",body:"Retainers plus project work, where scope creep shows up as unbilled hours long before anyone reopens the contract."},{icon:S,color:"text-amber-700 bg-amber-50",name:"Engineering consultancies",body:"Long programs with staged deliverables, subcontractors, and a schedule the client reviews as closely as the invoice."},{icon:C,color:"text-emerald-700 bg-emerald-50",name:"Advisory and management consulting",body:"Small senior teams at high rates, where a few unlogged days a month is the difference between a good quarter and an average one."},{icon:E,color:"text-sky-700 bg-sky-50",name:"In-house delivery teams that bill internally",body:"Shared-service and transformation teams charging back to business units, which needs the same rate and utilization machinery."}
1],W=[{icon:O,title:"Get the hours in",tier:"Timesheets Pro; capture apps every plan",body:"Hours land against the task, not a separate timesheet app nobody opens. Approval chains route to whoever actually signs off, and the browser extension, desktop apps and phone companions make logging a ten-second act rather than a Friday afternoon.",shot:"/product/capacity-planner.webp",alt:"Onplana capacity planner showing weekly utilization per person across projects"},{icon:P,title:"Price them properly",tier:"Rate cards every plan",body:"Three scopes, per user, per role and org default, with date ranges and overlap validation so two cards cannot silently disagree. Each card carries a cost rate and, separately, a billable rate or a markup, which is what makes margin a number rather than an estimate. Multi-currency throughout, with the exchange rate snapshotted at entry time so last quarter does not move when today's rates do.",shot:"/product/project-finance-evm.webp",alt:"Onplana project Finance tab showing earned value metrics, cost and revenue columns, and an S-curve"},{icon:T,title:"See utilization before the month ends",tier:"Pro",body:"Billable versus total hours per person per week, a four-week forward forecast, and over-allocation visible before you commit someone to a third engagement. Industry benchmarks put average billable utilization just under 70%, which means most firms are looking for a few points, not a transformation, and a few points only show up if you can see the week you are in.",shot:"/product/cross-project-reports.webp",alt:"Onplana cross-project report builder with columns grouped across multiple client projects"},{icon:R,title:"Report to the client and the partners",tier:"Cross-project reports every plan; dashboards Pro",body:"Cross-project reports normalize mixed currencies and share by link without a seat for the recipient. Earned value gives the client a defensible position on a fixed-fee job, and the dashboard builder gives each partner the view they keep asking for instead of a monthly spreadsheet.",shot:"/product/custom-dashboard.webp",alt:"Onplana custom dashboard assembled from utilization, financial and delivery widgets"}],m=[{step:"1",name:"Visibility",tier:"Pro",body:"Compliance shows who is behind, by how many hours, and what that gap costs at their rate. Nothing is blocked and nobody is chased automatically. For a lot of firms this is the whole fix, because the problem was never that people refused, it was that nobody could see it until invoicing."},{step:"2",name:"Reminders",tier:"Pro",body:"A nudge to the person the hour before their deadline, and a Monday digest to whoever owns the number. Timed against the organization's own working week rather than a fixed UTC hour."},{step:"3",name:"Escalation",tier:"Enterprise",body:"A staged chain over days: the person, then their approver, then the owner. Three templates ship, from a light two-nudge chain for creative teams to a strict one for firms under audit obligations, so you are picking a posture rather than building a workflow."},{step:"4",name:"Hard lock",tier:"Enterprise",body:"New work is blocked until the prior week is submitted. Exempt roles and date-bounded exceptions handle sick leave and onboarding, and the gate deliberately fails open, because a transient error must never stop a whole firm working. Most firms should never turn this on; it exists for the ones whose obligations require it."}],U=[{tier:"Every plan, including Free",items:"Rate cards in all three scopes with the cost-versus-billable split and markup, multi-currency with historical FX snapshots, cross-project reports with shareable links, the capture apps, and the AI assistant."},{tier:"PRO",items:"Timesheets and approval chains, resource capacity with the billable view, forward forecast and booked time off, compliance visibility and reminders, earned value, and the dashboard builder."},{tier:"BUSINESS",items:"Portfolios with RAG rollup across the client base, goals, advanced AI for risk detection and portfolio insight, webhooks and integrations for the finance system."},{tier:"ENTERPRISE",items:"The enforcement layer: escalation chains, hard-lock mode, date-bounded compliance exceptions, Revenue at Risk, and audit-grade evidence export with a read-only token for an external auditor."}],z=a=>[{q:"We invoice from Xero and QuickBooks. Does this replace that?",a:"No, and it should not try to. Onplana owns the delivery side, which is where the numbers are made: who worked, on what, at which rate, against which engagement, and what margin that produced. It feeds the accounting system through exports and webhooks rather than competing with it. Firms that expect a PM tool to also be their ledger usually end up with a worse version of both."},{q:"Our consultants already resist timesheets. Will another tool help?",a:"Not on its own, which is why the honest sequence starts with visibility rather than enforcement. Hours are logged against the task people are already looking at, and captured from a browser extension, a desktop app or a phone, so the act takes seconds. Then compliance shows the gap and its cost before invoicing rather than after. Escalation and hard-lock exist, but a firm that opens with them is usually solving a visibility problem with a discipline tool."},{q:"What does the margin number actually come from?",a:"Each rate card carries a cost rate and either an explicit billable rate or a markup percentage, and the resolver reports which of the three derivations produced the figure, so a rate with no margin configured is visibly that rather than silently equal. Cost comes from logged hours against the cost rate; revenue from the same hours at the billable rate. Where a project is not billable you mark it so, and it stops flattering the utilization figure."},{q:"We work in several currencies. Does last quarter change when rates move?",a:"No. The exchange rate is snapshotted on each timesheet entry when it is created, and historical reporting uses that snapshot rather than today's rate, so a closed quarter stays closed. Live views use current rates, which is the correct behavior for a forward-looking number and the wrong one for a past one."},{q:"Can an external auditor get at the evidence without a full seat?",a:"Yes, on Enterprise. Evidence export runs to CSV or JSON and there is a dedicated read-only token scope for exactly this, so an auditor can pull compliance evidence without being able to read projects, tasks or members. Granting an auditor a normal account is the usual workaround and it hands over far more than the engagement needs."},{q:"Which plan do we actually need?",a:"Pro for most firms: it carries timesheets, approvals, capacity with the billable view and forecast, earned value and dashboards. Rate cards, multi-currency and cross-project reports are on every plan including Free, so the margin question can be explored before spending anything. Enterprise is for the enforcement and evidence layer, and is worth it when an obligation rather than a preference is driving the decision."},{q:"Where does this fall short for a services firm?",a:`There is no invoicing, no accounts receivable and no payroll, by design. ${a.mentionFaq} And the resource planner works in hours and allocation rather than modelling a bench with skills matching, so firms whose core problem is staffing a bench against skills will find that part thinner than the financial side.`}];function H({launch:a=v()}={}){const i=z(a),p=l({utm_content:"solutions-professional-services"}),x=l({utm_content:"solutions-professional-services-final"});return e.jsxs("div",{children:[e.jsx(b,{title:"Professional Services Project Management | Onplana",description:"For firms whose product is billable time: rate cards with cost and billable rates, utilization and forecast, timesheet compliance, and margin per engagement.",path:"/solutions/professional-services"}),e.jsxs(c,{children:[e.jsx("script",{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:[{"@type":"ListItem",position:1,name:"Home",item:"https://onplana.com/"},{"@type":"ListItem",position:2,name:"Onplana for professional services",item:"https://onplana.com/solutions/professional-services"}]})}),e.jsx("script",{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"FAQPage",mainEntity:i.map(t=>
1({"@type":"Question",name:t.q,acceptedAnswer:{"@type":"Answer",text:t.a}}))})})]}),e.jsx("section",{className:"section bg-gradient-to-b from-slate-50 to-white text-center",children:e.jsxs("div",{className:"container-lg",children:[e.jsxs("div",{className:"badge bg-emerald-100 text-emerald-800 mb-6 inline-flex",children:[e.jsx(j,{className:"w-3.5 h-3.5"})," For firms that bill their time"]}),e.jsx("h1",{className:"text-4xl md:text-5xl font-extrabold text-gray-900 mb-5 leading-tight",children:"Know the margin before the invoice"}),e.jsx("p",{className:"text-xl text-gray-500 max-w-3xl mx-auto mb-10",children:"Cost rates and billable rates on the same card, utilization you can see mid-month, and timesheet compliance that starts by showing you the gap rather than blocking anyone. Rate cards and cross-project reports are on every plan, including Free."}),e.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-center gap-4",children:[e.jsxs("a",{href:p,onClick:()=>r.ctaClick("Start free","solutions-ps-hero"),className:"btn-primary text-base px-8 py-3.5",children:["Start free ",e.jsx(n,{className:"w-4 h-4"})]}),e.jsx(o,{to:"/contact",onClick:()=>r.ctaClick("Talk through your setup","solutions-ps-hero"),className:"btn-secondary text-base px-8 py-3.5",children:"Talk through your setup"})]}),e.jsx(y,{location:"solutions-ps",className:"mt-5 text-sm text-gray-600"}),e.jsx("div",{className:"max-w-5xl mx-auto mt-12",children:e.jsx(d,{src:"/product/project-finance-evm.webp",alt:"Onplana project Finance tab with cost and revenue columns, margin, and an earned-value S-curve",caption:"Cost from logged hours at the cost rate, revenue from the same hours at the billable rate, and the gap between them as a number.",eager:!0})})]})}),e.jsxs(c,{children:[e.jsx("script",{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"VideoObject",name:"See project margin before you invoice: cost vs billable rates",description:"A rate card in Onplana holds two numbers rather than one: what a person costs the firm and what the firm charges for them. Hours logged against the task price at both, so cost and income sit side by side with the gap between them as a real number, before the bill goes out rather than after.",thumbnailUrl:"https://i.ytimg.com/vi/54g50w3xByE/hqdefault.jpg",uploadDate:"2026-09-07T12:00:00-04:00",duration:"PT2M19S",contentUrl:"https://www.youtube.com/watch?v=54g50w3xByE",embedUrl:"https://www.youtube-nocookie.com/embed/54g50w3xByE",publisher:{"@type":"Organization",name:"Onplana",logo:{"@type":"ImageObject",url:"https://onplana.com/logo.svg"}}})}),e.jsx("script",{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"VideoObject",name:"When do you find out a job lost money? Margin while you can still act",description:"Most services firms find out whether a job made money after it is finished, or at the next renewal when the price has already been set. One period of a services book: margin per engagement worst first, how each hour was priced, a retainer over its included hours reported beside the row, and cost at risk on time nobody has logged yet, attributed to the people who owe it.",thumbnailUrl:"https://i.ytimg.com/vi/VhUWaSdhxjI/hqdefault.jpg",uploadDate:"2026-09-11T12:00:00-04:00",duration:"PT55S",contentUrl:"https://www.youtube.com/watch?v=VhUWaSdhxjI",embedUrl:"https://www.youtube-nocookie.com/embed/VhUWaSdhxjI",publisher:{"@type":"Organization",name:"Onplana",logo:{"@type":"ImageObject",url:"https://onplana.com/logo.svg"}}})})]}),e.jsx("section",{className:"pb-16 bg-white",children:e.jsx("div",{className:"max-w-4xl mx-auto px-4",children:e.jsx(h,{videoId:"54g50w3xByE",title:"See project margin before you invoice: cost vs billable rates",location:"solutions-ps-hero",caption:"Two rates on a card, hours logged against them, and the gap between cost and income as a number."})})}),e.jsx("section",{className:"section bg-white px-4",children:e.jsxs("div",{className:"container-lg",children:[e.jsx("h2",{className:"text-3xl font-bold text-gray-900 text-center mb-3",children:"Written for five kinds of firm"}),e.jsx("p",{className:"text-gray-500 text-center max-w-2xl mx-auto mb-12",children:"All of them share one property: the thing being sold is people’s time, so utilization and rate are not reporting details, they are the business model."}),e.jsx("div",{className:"grid md:grid-cols-2 lg:grid-cols-3 gap-6",children:A.map(t=>{const s=t.icon;return e.jsxs("div",{className:"rounded-2xl border border-gray-200 bg-white p-6 hover:shadow-lg transition-all",children:[e.jsx("div",{className:`w-10 h-10 rounded-lg ${t.color} flex items-center justify-center mb-4`,children:e.jsx(s,{className:"w-5 h-5"})}),e.jsx("h3",{className:"font-bold text-gray-900 mb-2",children:t.name}),e.jsx("p",{className:"text-sm text-gray-600 leading-relaxed",children:t.body})]},t.name)}
1)})]})}),e.jsx("section",{className:"section bg-slate-50 px-4",children:e.jsxs("div",{className:"container-lg",children:[e.jsx("h2",{className:"text-3xl font-bold text-gray-900 text-center mb-3",children:"Hours in, margin out"}),e.jsx("p",{className:"text-gray-500 text-center max-w-2xl mx-auto mb-12",children:"Four steps, in the order they actually have to happen. The tier is on each one, because a services firm reads tiers before it reads features."}),e.jsx("div",{className:"space-y-16",children:W.map((t,s)=>{const u=t.icon,g=s%2===1;return e.jsxs("div",{className:`grid lg:grid-cols-2 gap-10 items-center ${g?"lg:[&>*:first-child]:order-2":""}`,children:[e.jsxs("div",{children:[e.jsx("div",{className:"w-10 h-10 rounded-lg bg-emerald-50 text-emerald-700 flex items-center justify-center mb-4",children:e.jsx(u,{className:"w-5 h-5"})}),e.jsx("h3",{className:"text-2xl font-bold text-gray-900 mb-2",children:t.title}),e.jsx("div",{className:"text-xs font-semibold uppercase tracking-wider text-emerald-700 mb-4",children:t.tier}),e.jsx("p",{className:"text-gray-600 leading-relaxed",children:t.body})]}),e.jsx(d,{src:t.shot,alt:t.alt})]},t.title)})})]})}),e.jsx("section",{className:"section bg-white px-4",children:e.jsxs("div",{className:"container-lg max-w-5xl",children:[e.jsx("h2",{className:"text-3xl font-bold text-gray-900 text-center mb-3",children:"Start at visibility, not enforcement"}),e.jsx("p",{className:"text-gray-500 text-center max-w-2xl mx-auto mb-12",children:"Four rungs, and most firms should stop on the first or second. They are listed in order so you can pick the lowest one that solves your actual problem."}),e.jsx("ol",{className:"space-y-4",children:m.map((t,s)=>e.jsxs("li",{className:"rounded-2xl border border-gray-200 bg-gradient-to-br from-white to-slate-50 p-6 flex gap-5",children:[e.jsxs("div",{className:"flex flex-col items-center flex-shrink-0",children:[e.jsx("div",{className:"w-9 h-9 rounded-full bg-emerald-600 text-white flex items-center justify-center text-sm font-bold",children:t.step}),s<m.length-1&&e.jsx("div",{className:"w-px flex-1 bg-gray-200 mt-2"})]}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[e.jsx("h3",{className:"font-bold text-gray-900",children:t.name}),e.jsx("span",{className:"text-xs font-semibold text-emerald-700 bg-emerald-50 rounded-full px-2.5 py-1",children:t.tier})]}),e.jsx("p",{className:"text-sm text-gray-600 leading-relaxed",children:t.body})]})]},t.name))}),e.jsxs("div",{className:"mt-12 rounded-2xl border border-gray-200 bg-white p-6 md:p-8",children:[e.jsx("h3",{className:"font-bold text-gray-900 mb-4",children:"Plan tiers, plainly"}),e.jsx("ul",{className:"space-y-3",children:U.map(t=>e.jsxs("li",{className:"flex items-start gap-3 text-sm",children:[e.jsx(I,{className:"w-4 h-4 text-emerald-600 mt-0.5 flex-shrink-0"}),e.jsxs("span",{className:"text-gray-600 leading-relaxed",children:[e.jsxs("span",{className:"font-semibold text-gray-900",children:[t.tier,": "]}),t.items]})]},t.tier))}),e.jsxs("p",{className:"text-xs text-gray-500 mt-5",children:["Per-seat prices and the full matrix are on ",e.jsx(o,{to:"/pricing",className:"underline hover:text-emerald-700",children:"the pricing page"}),"."]})]})]})}),e.jsx("section",{className:"section bg-slate-50 border-y border-gray-100 px-4",children:e.jsxs("div",{className:"container-lg max-w-4xl text-center",children:[e.jsx("h2",{className:"text-3xl font-bold text-gray-900 mb-2",children:"The first rung, on screen"}),e.jsx("p",{className:"text-gray-600 max-w-2xl mx-auto mb-6",children:"One period of a services book: margin per engagement with the worst first, a retainer running over its included hours, and the time nobody has logged yet already priced at what those hours cost. Nothing is blocked and nobody is chased."}),e.jsx(h,{videoId:"VhUWaSdhxjI",title:"When do you find out a job lost money? Margin while you can still act",location:"solutions-ps-compliance",caption:"Recorded in Onplana. Every figure is computed from approved time and expense."})]})}),e.jsx("section",{className:"section bg-slate-50 px-4",children:e.jsx("div",{className:"container-lg max-w-3xl",children:e.jsx(f,{})})}),e.jsx("section",{className:"section bg-white px-4",children:e.jsxs("div",{className:"container-lg max-w-3xl text-center",children:[e.jsx(q,{className:"w-10 h-10 text-emerald-700 mx-auto mb-4"}),e.jsx("h2",{className:"text-3xl font-bold text-gray-900 mb-4",children:"Walk the ladder against your own approval process"}),e.jsx("p",{className:"text-gray-600 max-w-2xl mx-auto mb-8 leading-relaxed",children:"Bring how your firm approves time today, who signs off, and what your obligations actually require. We will map it onto the rungs above and tell you which one to stop at, including when that answer is the free one."}),e.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-center gap-4",children:[e.jsxs(o,{to:"/contact",onClick:()=>r.ctaClick("Talk through your setup","solutions-ps-mid"),className:"btn-primary text-base px-8 py-3.5",children:["Talk through your setup ",e.jsx(n,{className:"w-4 h-4"})]}),e.jsx(o,{to:"/features",className:"btn-secondary text-base px-8 py-3.5",children:"See the full feature set"})]}),e.jsxs("p",{className:"text-sm text-gray-500 mt-6",children:["Clients open shared documents and reports without an account, and guests are free up to your plan's allowance: see the"," ",e.jsx(o,{to:"/features/team-collaboration",className:"text-primary-600 underline",children:"team collaboration guide"}),"."]})]})}),e.jsx("section",{className:"section bg-slate-50 px-4",children:e.jsxs("div",{className:"container-lg max-w-3xl",children:[e.jsx("h2",{className:"text-3xl font-bold text-gray-900 text-center mb-3",children:"What operators ask us"}),e.jsx("p",{className:"text-gray-500 text-center max-w-2xl mx-auto mb-10",children:"Including where it falls short, which is the one worth reading first."}),e.jsx("div",{className:"space-y-3",children:i.map((t,s)=>e.jsxs("details",{className:"border border-gray-200 rounded-xl overflow-hidden group bg-white",children:[e.jsxs("summary",{className:"px-6 py-4 font-semibold text-gray-900 text-sm cursor-pointer hover:bg-gray-50 transition-colors list-none flex items-center justify-between",children:[e.jsx("span",{children:t.q}),e.jsx("span",{className:"text-gray-400 group-open:rotate-180 transition-transform",children:"▾"})]}),e.jsx("div",{className:"px-6 pb-5 text-sm text-gray-600 leading-relaxed border-t border-gray-100 pt-4",children:t.a})]},s))}),e.jsxs("p",{className:"text-center text-sm text-gray-500 mt-8",children:["Clients, pipeline and margin live in"," ",e.jsx(o,{to:"/services",className:"text-primary-600 font-medium hover:underline",onClick:()=>r.servicesCta("Professional Services FAQ","solutions-professional-services"),children:"Onplana Services"}),", ",a.mentionFooter,a.mentionCta&&e.jsxs(e.Fragment,{children:[" ",e.jsx("a",{href:w(),className:"text-primary-600 font-medium hover:underline",onClick:()=>r.servicesCta(a.mentionCta,"solutions-professional-services"),children:a.mentionCta}),"."]})]})]})}),e.jsx("section",{className:"section bg-primary-600 text-white text-center px-4",children:e.jsxs("div",{className:"container-lg",children:[e.jsx("h2",{className:"text-4xl font-bold mb-4",children:"Put your rates in and look at a real month"}),e.jsx("p",{className:"text-primary-200 text-lg max-w-2xl mx-auto mb-10",children:"Rate cards, multi-currency and cross-project reports run on the free plan, so the margin question is answerable before you spend anything."}),e.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-center gap-4",children:[e.jsxs("a",{href:x,onClick:()=>r.ctaClick("Start free","solutions-ps-final"),className:"bg-white text-primary-700 font-bold px-8 py-3.5 rounded-xl hover:bg-primary-50 transition-colors inline-flex items-center gap-2",children:["Start free ",e.jsx(n,{className:"w-4 h-4"})]}),e.jsx(o,{to:"/pricing",onClick:()=>r.ctaClick("See pricing","solutions-ps-final"),className:"border-2 border-white/40 text-white font-semibold px-8 py-3.5 rounded-xl hover:bg-white/10 transition-colors",children:"See pricing"})]}),e.jsxs("p",{className:"text-primary-200 text-sm mt-6",children:["Already set up? ",e.jsx("a",{href:`${F}/rate-cards`,className:"underline hover:text-white",children:"Open rate cards"})," to add a billable rate."]})]})})]})}export{H as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.