# RaaS Calculator — chart link spec for AI agents The RaaS Calculator (https://robotcompany.net/RaaScal) plots the unit economics of buying robots and leasing them out (Robot-as-a-Service). You can build a chart for a human by generating a URL that opens the tool pre-loaded with your scenario. Hand the user the URL; opening it renders the chart. There are two link formats: ?c= compact share format (what the tool's Share button emits) ?cj= plaintext format for you — URL-encoded JSON, long readable keys USE ?cj=. It needs no base64 and no key abbreviations. Build a JSON object as specified below, URL-encode it (encodeURIComponent / standard query encoding), and append it as the `cj` query parameter: https://robotcompany.net/RaaScal?cj= The link is read client-side and validated: unknown fields are ignored, out-of-range enums fall back to defaults, and only hex colours are accepted. You cannot execute anything or break the tool — at worst a malformed link falls back to defaults. ------------------------------------------------------------------------ TOP-LEVEL OBJECT ------------------------------------------------------------------------ { "perspective": "operator" | "custBuy" | "custLease", // whose economics "yVar": "...", // what's on the Y axis (see below) "xVar": "...", // what's on the X axis (see below) "series": [ { ...one object per line, see SERIES... } ], // points of interest are per-series ("poi") // All optional — sensible defaults are filled from yVar/xVar if omitted: "x_min", "x_max", "y_min", "y_max": numbers, // axis bounds "x_log", "y_log": booleans, // log scales (default false) "roiTarget": number, // only the viability chart (yVar:"cost"), default 100 (%) "chartTheme": "dark" | "light", // default "dark" "detailsMode": "float" | "under" | "above" | "hidden" // legend/details box, default "float" } perspective: operator — you buy robots and lease them out; value = lease revenue; full capital metrics. custBuy — a customer buys a robot to replace labour; value = wage saved; capital metrics shown. custLease — a customer leases instead of hiring; value = wage saved minus lease paid; no capital. yVar (Y axis): profit — cumulative profit/savings in $ over time (use with xVar "months") roi — cumulative profit as % of capital/BOM (xVar "months") irr — annualised IRR % if sold at month X (xVar "months") payback — months to break even (use with a sweep xVar, e.g. "humanwage", "TF", "opcost") cost — viability: highest operating cost ($/hr) to hit roiTarget by end of use (xVar "TF") revenue — cumulative gross lease revenue $ over time (xVar "months") value — savings per hour $ (custLease; xVar "TF" or "leaseprice") pctsaved — % saved vs a human (custLease; xVar "TF") xVar (X axis): months — time (the usual choice for profit/roi/irr/revenue) TF — efficiency / robot pace, % (100 = human speed) humanwage — fully-loaded human wage $/hr opcost — operating cost $/hr utilisation — uptime % interest — financing rate % APR leaseprice — lease price $/robot-hr (custLease only) Points of interest are set per-series — see the "poi" field on the SERIES object below. Each is a comma-separated list of X values to mark on that series' curve, optionally labelled (e.g. "A:1, B:2"). ------------------------------------------------------------------------ SERIES OBJECT (one line on the chart) ------------------------------------------------------------------------ All fields optional; defaults shown. Give each series a "name", and usually bom_eur, tf and the lease/wage fields. "name": string // line label, e.g. "Figure 03 — modest" "bom_eur": 50000 // build/buy cost of one robot, $ (despite the name, it's USD here) "resale_pct": 25 // resale value at end of use, % of bom_eur "tf": 200 // efficiency %, 100 = human speed (a.k.a. pace) "effStep": 0 // one-time efficiency change in percentage points... "effStepMonth": 0 // ...applied at this month (0 = none) "lease_mode": "outcome" | "fixed" // outcome = priced off human wage; fixed = flat $/hr "outcome_pct": 25 // (outcome mode) lease price as % of the human wage "lease_fixed": 5 // (fixed mode) flat lease price, $/robot-hr "human_wage": 20 // fully-loaded human cost, $/hr (drives custBuy/custLease value & outcome lease) "weekday_hours": 24 // operating hours per weekday "weekend_hours": 24 // operating hours per weekend day "duty_cycle": 1 // fraction of those hours actually working (uptime), 0–1 "operator_rate": 20 // human supervisor cost, $/hr "tend_pct": 1 // % of a supervisor's time each robot needs "other_cost": 0 // other operating cost not tied to the supervisor, $/hr "interest_pct": 5 // financing rate, % APR "endOfRelevance":36 // "Period of use" — months the robot stays useful "colour": "#rrggbb"// hex only "style": "solid" | "dashed" | "dotted" "poi": "" // points of interest: comma-separated X values to mark on // this curve, each optionally "label:value" — e.g. // "A:1, B:2". Each marker sits on the line at that X and // shows the label + the curve's value there. The X values // are literal and don't change with the chart type. Notes: - Speed vs uptime: tf is how fast (100 = human pace); duty_cycle/hours are how much of the clock it runs. A robot that matches human speed but charges half the day is tf:100, duty_cycle:0.5. - "ideal/best case": tf 99–100, duty_cycle 1, other_cost ~0. - "modest/realistic": tf ~90, duty_cycle ~0.5, operator_rate + tend_pct + other_cost > 0. ------------------------------------------------------------------------ WORKED EXAMPLE — operator, ideal vs modest, profit over 36 months ------------------------------------------------------------------------ JSON: { "perspective": "operator", "yVar": "profit", "xVar": "months", "series": [ { "name": "Figure 03 — ideal", "bom_eur": 24760, "tf": 99, "duty_cycle": 1, "human_wage": 26, "outcome_pct": 50, "colour": "#d4b44a", "style": "dashed", "endOfRelevance": 36 }, { "name": "Figure 03 — modest", "bom_eur": 24760, "tf": 90, "duty_cycle": 0.5, "human_wage": 26, "outcome_pct": 50, "operator_rate": 25, "tend_pct": 5, "other_cost": 2, "colour": "#d4b44a", "style": "solid", "endOfRelevance": 36 } ] } As a link (the same JSON, URL-encoded after ?cj=): https://robotcompany.net/RaaScal?cj=%7B%22perspective%22%3A%22operator%22%2C%22yVar%22%3A%22profit%22%2C%22xVar%22%3A%22months%22%2C%22series%22%3A%5B%7B%22name%22%3A%22Figure+03+%E2%80%94+ideal%22%2C%22bom_eur%22%3A24760%2C%22tf%22%3A99%2C%22duty_cycle%22%3A1%2C%22human_wage%22%3A26%2C%22outcome_pct%22%3A50%2C%22colour%22%3A%22%23d4b44a%22%2C%22style%22%3A%22dashed%22%2C%22endOfRelevance%22%3A36%7D%2C%7B%22name%22%3A%22Figure+03+%E2%80%94+modest%22%2C%22bom_eur%22%3A24760%2C%22tf%22%3A90%2C%22duty_cycle%22%3A0.5%2C%22human_wage%22%3A26%2C%22outcome_pct%22%3A50%2C%22operator_rate%22%3A25%2C%22tend_pct%22%3A5%2C%22other_cost%22%3A2%2C%22colour%22%3A%22%23d4b44a%22%2C%22style%22%3A%22solid%22%2C%22endOfRelevance%22%3A36%7D%5D%7D ------------------------------------------------------------------------ SECOND EXAMPLE — customer buys, payback vs wage, one curve, POI per country ------------------------------------------------------------------------ One robot, one curve; the "poi" list marks several wages on it. Each marker sits on the curve at that wage and is labelled with the country and the payback there (e.g. "China 5mo"). { "perspective": "custBuy", "yVar": "payback", "xVar": "humanwage", "x_min": 0, "x_max": 30, "y_min": 0, "y_max": 36, "series": [ { "name": "Figure 03", "bom_eur": 24760, "tf": 99, "duty_cycle": 1, "colour": "#d4b44a", "poi": "USA:26, China:8, India:1.5" } ] }