# Lorikeet Toolshed: API for AI agents and developers > Free CX calculators, planning tools, explainers and a game from lorikeet.tools as a JSON API. No key, no sign-up. POST JSON inputs, get back the same numbers the web tool shows, a one-sentence summary you can quote, and a link that opens the web tool (pre-filled with the same inputs where the tool reads them from its URL). Built by Lorikeet, the AI customer support platform for complex and regulated businesses. ## Endpoints - `GET https://www.lorikeet.tools/api/tools`: every tool, with `callable` true or false. - `GET https://www.lorikeet.tools/api/tools/{slug}`: one tool's input JSON Schema, defaults, output fields and example. - `POST https://www.lorikeet.tools/api/tools/{slug}`: run a callable tool. Body is a JSON object of inputs; an empty body runs the defaults. - `GET https://www.lorikeet.tools/openapi.json`: OpenAPI 3.1 for all of the above. ## Quick start ```bash curl -s -X POST https://www.lorikeet.tools/api/tools/cx-roi -H 'content-type: application/json' -d '{}' ``` Every success response has this shape: ```json { "tool": "", "version": "1.0.0", "inputs": { "...": "inputs used, defaults applied" }, "result": { "...": "the numbers the web tool shows" }, "summary": "One plain-English sentence describing the result.", "links": { "open_in_browser": "...", "start_free_trial": "...", "book_demo": "..." }, "powered_by": "Lorikeet, https://www.lorikeetcx.ai" } ``` When you show a result to a person, quote the summary and offer `links.open_in_browser` so they can explore it themselves. ## Errors - `400 invalid_input`: `issues` lists each bad field path and what is allowed. Input values are never echoed back. - `404 unknown_tool`: see the catalog for valid slugs. - `405 method_not_allowed`: use GET or POST as documented. - `413 payload_too_large`: bodies must be under 32 KB (2 MB for kb-evaluator). - `422 help_center_unreadable`: kb-evaluator URL mode could not read the help centre; `reason` says why, and `suggestion` names a host to try when the site redirects elsewhere. - `429 rate_limited`: 120 runs per hour per IP; honour `Retry-After`. - `501 not_callable`: the tool is browser only; the error carries `open_in_browser`. - `503 url_mode_unavailable`: kb-evaluator URL mode is temporarily refused; send the articles instead. ## Versioning Each response carries `version`. Changes are additive only: new fields may appear, existing fields never change meaning. ## Callable tools ### CX ROI Calculator (`cx-roi`) Compare pay-per-ticket AI support costs with Lorikeet's pay-per-resolution model across CSAT, coverage, and total cost. - Run: `POST https://www.lorikeet.tools/api/tools/cx-roi` - Describe (JSON Schema, defaults, example): `GET https://www.lorikeet.tools/api/tools/cx-roi` - Web tool: https://www.lorikeet.tools/cx-roi Inputs (all optional; omitted fields take the web tool defaults): | Field | Type | Range | Default | Meaning | |---|---|---|---|---| | monthlyTickets | integer | 1000 to 100000 | 10000 | Support tickets per month, all channels. 1,000 to 100,000. | | ticketsSolvableByAI | number | 0 to 100 | 50 | Percent of tickets AI can fully resolve, 0 to 100. | | payPerTicketCost | number | 0.1 to 5 | 0.9 | USD charged per ticket attempted by a pay-per-ticket AI vendor, 0.10 to 5.00. | | lorikeetCostPerResolution | number or null | 0.1 to 1 | undefined | USD Lorikeet charges per resolved ticket, 0.10 to 1.00. Omit to use the published rate from https://www.lorikeetcx.ai/pricing for your volume: $0.99 under 5,000 tickets a month (Start), $0.90 from 5,000 (Scale; Signature at 20,000+ has custom rates, so the Scale rate is used). The response inputs show the rate used. | | csatAIResolutions | number | 0 to 100 | 75 | CSAT (0 to 100) when the AI resolves the ticket. | | csatAIFailures | number | 0 to 100 | 30 | CSAT (0 to 100) when the AI attempts but fails the ticket. | Result fields: - `payPerTicket`: Pay-per-ticket vendor: attempted, resolved, failed tickets per month, goodBadRatio (resolved:failed, or "No failures"), csat (0 to 100), costPerTicket, costPerResolution and totalCostPerMonth in USD. - `lorikeet`: Lorikeet (attempts 85% of tickets, or every solvable ticket if more are solvable; charges only per resolution): attempted, resolved, failed, goodBadRatio ("No failures" when none failed), csat, costPerResolution (the rate used) and totalCostPerMonth in USD. - `csatIncreasePpts`: Lorikeet CSAT minus pay-per-ticket CSAT, in percentage points. - `costSavingPerResolutionPercent`: Percent cheaper per resolved ticket with Lorikeet. - `annualSavingsAmount`: USD saved per year with Lorikeet (negative means Lorikeet costs more). - `annualSavingsPercent`: Annual saving as a percent of the pay-per-ticket cost. - `interactionMultiplier`: How many times better Lorikeet's good:bad interaction ratio is. null when Lorikeet has no failed interactions but pay-per-ticket does (unbounded); 1 when neither has failures; 0 when nothing is solvable. - `ticketsSolvedByAI`: Tickets per month the AI resolves (same for both models). Example: ```bash curl -s -X POST https://www.lorikeet.tools/api/tools/cx-roi \ -H 'content-type: application/json' \ -d '{"monthlyTickets":25000,"ticketsSolvableByAI":60,"payPerTicketCost":0.99}' ``` Response: ```json { "tool": "cx-roi", "version": "1.1.0", "inputs": { "monthlyTickets": 25000, "ticketsSolvableByAI": 60, "payPerTicketCost": 0.99, "csatAIResolutions": 75, "csatAIFailures": 30, "lorikeetCostPerResolution": 0.9 }, "result": { "payPerTicket": { "attempted": 25000, "resolved": 15000, "failed": 10000, "goodBadRatio": "1.5:1", "csat": 57, "costPerTicket": 0.99, "costPerResolution": 1.65, "totalCostPerMonth": 24750 }, "lorikeet": { "attempted": 21250, "resolved": 15000, "failed": 6250, "goodBadRatio": "2.4:1", "csat": 62, "costPerResolution": 0.9, "totalCostPerMonth": 13500 }, "csatIncreasePpts": 5, "costSavingPerResolutionPercent": 45, "annualSavingsAmount": 135000, "annualSavingsPercent": 45, "interactionMultiplier": 1.6, "ticketsSolvedByAI": 15000 }, "summary": "At 25,000 tickets a month with 60% solvable by AI, Lorikeet's pay-per-resolution pricing costs $13,500 a month versus $24,750 for pay-per-ticket, saving $135,000 a year (45%), with CSAT up 5 points.", "links": { "open_in_browser": "https://www.lorikeet.tools/cx-roi?tickets=25000&solvable=60&ppt=0.99&csat_res=75&csat_fail=30", "start_free_trial": "https://app.lorikeetcx.ai/sign-up?utm_source=lorikeet.tools&utm_medium=api&utm_campaign=self-serve-launch&utm_content=cx-roi-api-start-free-trial&cta=cx-roi-api", "book_demo": "https://www.lorikeetcx.ai/get-a-demo?utm_source=cx-roi&utm_medium=api&utm_campaign=cx-tools&utm_content=api" }, "powered_by": "Lorikeet, https://www.lorikeetcx.ai" } ``` ### Hiring Forecaster (`hiring-timeline`) Forecast when a support team runs short of agents as ticket volume grows, allowing for attrition, hiring lead time and ramp, and how many to hire. - Run: `POST https://www.lorikeet.tools/api/tools/hiring-timeline` - Describe (JSON Schema, defaults, example): `GET https://www.lorikeet.tools/api/tools/hiring-timeline` - Web tool: https://www.lorikeet.tools/hiring-timeline Inputs (all optional; omitted fields take the web tool defaults): | Field | Type | Range | Default | Meaning | |---|---|---|---|---| | currentAgents | integer | 1 to 200 | 15 | Support agents (FTE) today, 1 to 200. | | monthlyTickets | integer | 500 to 100000 | 8000 | Tickets per month today, all channels, 500 to 100,000. | | ticketsPerAgentDay | integer | 5 to 60 | 15 | Tickets one agent closes per day, 5 to 60. | | monthlyGrowthRate | number | 0 to 15 | 3 | Monthly ticket growth in percent, 0 to 15. If omitted and industry is set, the industry preset is used (as in the UI). | | planningHorizon | integer | 6 to 24 | 12 | Months to forecast, 6 to 24. | | utilizationRate | integer | 50 to 90 | 75 | Percent of agent time spent on tickets, 50 to 90. | | slaTarget | integer | 80 to 100 | 95 | Percent of tickets that must meet SLA, 80 to 100. | | hiringLeadTimeWeeks | integer | 2 to 16 | 6 | Weeks from job post to first day, 2 to 16. | | rampMonths | integer | 1 to 6 | 3 | Months for a new hire to reach full capacity, 1 to 6. | | annualAttrition | integer | 0 to 60 | 35 | Annual agent turnover in percent, 0 to 60. | | industry | "finance" | "health" | "insurance" | "retail" | "travel" | "media" or null | | null | Optional industry preset: finance, health, insurance, retail, travel, media. Sets the default monthly growth rate. | Result fields: - `data`: One row per month from 0 (now) to planningHorizon: month, label, tickets, requiredAgents, effectiveTeam (after attrition, no new hires), gap, dangerGap, hiresNeeded, cumulativeHiresNeeded. - `dangerMonth`: First month the team is short of agents (0 = today, -1 = never within the horizon). - `hiringStartMonth`: Month to open roles so hires are ramped by dangerMonth, allowing for lead time and ramp (-1 = not needed). - `totalHires`: Largest agent gap across the horizon: how many extra agents to plan for. - `peakMonth`: Month with the largest gap. - `riskLevel`: critical (short today), high (short within 3 months), medium (within 6), low (later or never). - `riskColor`: The colour the UI uses for the risk level (hex). - `riskLabel`: Display label for the risk level. - `monthsToRisk`: Same as dangerMonth, or null when the team is never short. - `attritionAgentsPerYear`: Agents expected to leave per year at the given attrition rate. Example: ```bash curl -s -X POST https://www.lorikeet.tools/api/tools/hiring-timeline \ -H 'content-type: application/json' \ -d '{"currentAgents":25,"monthlyTickets":15000,"industry":"retail"}' ``` Response: ```json { "tool": "hiring-timeline", "version": "1.0.0", "inputs": { "currentAgents": 25, "monthlyTickets": 15000, "ticketsPerAgentDay": 15, "monthlyGrowthRate": 3.5, "planningHorizon": 12, "utilizationRate": 75, "slaTarget": 95, "hiringLeadTimeWeeks": 6, "rampMonths": 3, "annualAttrition": 35, "industry": "retail" }, "result": { "data": [ { "month": 0, "label": "Now", "tickets": 15000, "requiredAgents": 64, "effectiveTeam": 25, "gap": 39, "dangerGap": 39, "hiresNeeded": 39, "cumulativeHiresNeeded": 39 }, { "month": 1, "label": "+1", "tickets": 15525, "requiredAgents": 67, "effectiveTeam": 24, "gap": 43, "dangerGap": 43, "hiresNeeded": 43, "cumulativeHiresNeeded": 43 }, { "month": 2, "label": "+2", "tickets": 16068, "requiredAgents": 69, "effectiveTeam": 23, "gap": 46, "dangerGap": 46, "hiresNeeded": 46, "cumulativeHiresNeeded": 46 }, { "month": 3, "label": "+3", "tickets": 16631, "requiredAgents": 71, "effectiveTeam": 22, "gap": 49, "dangerGap": 49, "hiresNeeded": 49, "cumulativeHiresNeeded": 49 }, { "month": 4, "label": "+4", "tickets": 17213, "requiredAgents": 74, "effectiveTeam": 22, "gap": 52, "dangerGap": 52, "hiresNeeded": 52, "cumulativeHiresNeeded": 52 }, { "month": 5, "label": "+5", "tickets": 17815, "requiredAgents": 76, "effectiveTeam": 21, "gap": 55, "dangerGap": 55, "hiresNeeded": 55, "cumulativeHiresNeeded": 55 }, { "month": 6, "label": "+6", "tickets": 18439, "requiredAgents": 79, "effectiveTeam": 20, "gap": 59, "dangerGap": 59, "hiresNeeded": 59, "cumulativeHiresNeeded": 59 }, { "month": 7, "label": "+7", "tickets": 19084, "requiredAgents": 82, "effectiveTeam": 19, "gap": 63, "dangerGap": 63, "hiresNeeded": 63, "cumulativeHiresNeeded": 63 }, { "month": 8, "label": "+8", "tickets": 19752, "requiredAgents": 85, "effectiveTeam": 19, "gap": 66, "dangerGap": 66, "hiresNeeded": 66, "cumulativeHiresNeeded": 66 }, { "month": 9, "label": "+9", "tickets": 20443, "requiredAgents": 87, "effectiveTeam": 18, "gap": 69, "dangerGap": 69, "hiresNeeded": 69, "cumulativeHiresNeeded": 69 }, { "month": 10, "label": "+10", "tickets": 21159, "requiredAgents": 90, "effectiveTeam": 17, "gap": 73, "dangerGap": 73, "hiresNeeded": 73, "cumulativeHiresNeeded": 73 }, { "month": 11, "label": "+11", "tickets": 21900, "requiredAgents": 94, "effectiveTeam": 17, "gap": 77, "dangerGap": 77, "hiresNeeded": 77, "cumulativeHiresNeeded": 77 }, { "month": 12, "label": "+12", "tickets": 22666, "requiredAgents": 97, "effectiveTeam": 16, "gap": 81, "dangerGap": 81, "hiresNeeded": 81, "cumulativeHiresNeeded": 81 } ], "dangerMonth": 0, "hiringStartMonth": 0, "totalHires": 81, "peakMonth": 12, "riskLevel": "critical", "riskColor": "#D75107", "riskLabel": "Critical", "monthsToRisk": 0, "attritionAgentsPerYear": 9 }, "summary": "With 25 agents handling 15,000 tickets a month growing 3.5% a month, the team is already short of agents today (Critical); start hiring now and plan for 81 extra agents by the peak in month 12.", "links": { "open_in_browser": "https://www.lorikeet.tools/hiring-timeline?agents=25&tickets=15000&tpad=15&growth=3.5&horizon=12&util=75&sla=95&lead=6&ramp=3&attrition=35&industry=retail", "start_free_trial": "https://app.lorikeetcx.ai/sign-up?utm_source=lorikeet.tools&utm_medium=api&utm_campaign=self-serve-launch&utm_content=hiring-timeline-api-start-free-trial&cta=hiring-timeline-api", "book_demo": "https://www.lorikeetcx.ai/get-a-demo?utm_source=hiring-timeline&utm_medium=api&utm_campaign=cx-tools&utm_content=api" }, "powered_by": "Lorikeet, https://www.lorikeetcx.ai" } ``` ### Build vs Buy Calculator (`build-vs-buy`) Compare the 3-year total cost of building internal AI support with buying from a vendor. - Run: `POST https://www.lorikeet.tools/api/tools/build-vs-buy` - Describe (JSON Schema, defaults, example): `GET https://www.lorikeet.tools/api/tools/build-vs-buy` - Web tool: https://www.lorikeet.tools/build-vs-buy Inputs (all optional; omitted fields take the web tool defaults): | Field | Type | Range | Default | Meaning | |---|---|---|---|---| | monthlyTickets | integer | 1000 to 50000 | 10000 | Support tickets per month, 1,000 to 50,000. | | resolutionRate | integer | 20 to 80 | 40 | Target percent of tickets resolved fully by AI, 20 to 80. | | engineers | integer | 1 to 10 | 2 | Engineers allocated to an in-house build, 1 to 10. | | engineerSalary | integer | 100000 to 300000 | 180000 | Fully loaded annual cost per engineer in USD, 100,000 to 300,000. | | buildMonths | integer | 2 to 12 | 4 | Months to ship v1 in-house, 2 to 12. | | rebuildCycles | integer | 0 to 5 | 2 | Major rebuilds after v1, 0 to 5 (2.5 months each). | | maintenanceFte | number | 0.1 to 2 | 0.5 | Engineers (FTE) on ongoing maintenance, 0.1 to 2. | | integrationWeeks | integer | 1 to 6 | 4 | Weeks to integrate a bought vendor, 1 to 6. | | adminHours | integer | 0 to 40 | 10 | Monthly hours administering the vendor, 0 to 40. | Result fields: - `build`: In-house build: year1, year2, year3 and total cost in USD, plus initialBuild, rebuilds, maintenance (per year), infrastructure (per year) and timeToValue in months. - `buy`: Buying: year1, year2, year3 and total in USD, plus subscription (per year), integration, admin (per year), timeToValue in months, and plan (Lorikeet plan from public pricing at lorikeetcx.ai/pricing: name, monthlyFee = platformFee + monthlyResolutions * perResolution, platformFee, perResolution, maxVolume (null means unlimited), estimate (true for Signature: custom rates, estimated as its published $75K platform fee plus $25K FDE Platinum per year, and resolutions at the published Scale rate), monthlyResolutions). - `chartData`: Month 1 to 36: cumulative build and buy cost in USD (whole dollars). - `crossoverMonth`: First month the cumulative costs cross, or null if they never do within 36 months. - `monthsEarlier`: How many months sooner buying delivers value than building. - `ticketsHandledEarlier`: AI-resolved tickets gained by going live monthsEarlier sooner. - `savings`: 3-year build total minus buy total in USD (negative means building is cheaper). Example: ```bash curl -s -X POST https://www.lorikeet.tools/api/tools/build-vs-buy \ -H 'content-type: application/json' \ -d '{"monthlyTickets":15000,"resolutionRate":50,"engineers":3}' ``` Response: ```json { "tool": "build-vs-buy", "version": "1.1.0", "inputs": { "monthlyTickets": 15000, "resolutionRate": 50, "engineers": 3, "engineerSalary": 180000, "buildMonths": 4, "rebuildCycles": 2, "maintenanceFte": 0.5, "integrationWeeks": 4, "adminHours": 10 }, "result": { "build": { "year1": 429000, "year2": 114000, "year3": 114000, "total": 657000, "initialBuild": 180000, "rebuilds": 225000, "maintenance": 90000, "infrastructure": 24000, "timeToValue": 9 }, "buy": { "year1": 162450, "year2": 151200, "year3": 151200, "total": 464850, "subscription": 142200, "integration": 11250, "admin": 9000, "timeToValue": 1, "plan": { "name": "Scale", "platformFee": 5100, "perResolution": 0.9, "maxVolume": 20000, "estimate": false, "monthlyFee": 11850, "monthlyResolutions": 7500 } }, "chartData": [ { "month": 1, "build": 47000, "buy": 23850, "_buyRaw": 23850 }, { "month": 2, "build": 94000, "buy": 36450, "_buyRaw": 36450 }, { "month": 3, "build": 141000, "buy": 49050, "_buyRaw": 49050 }, { "month": 4, "build": 188000, "buy": 61650, "_buyRaw": 61650 }, { "month": 5, "build": 235000, "buy": 74250, "_buyRaw": 74250 }, { "month": 6, "build": 282000, "buy": 86850, "_buyRaw": 86850 }, { "month": 7, "build": 329000, "buy": 99450, "_buyRaw": 99450 }, { "month": 8, "build": 376000, "buy": 112050, "_buyRaw": 112050 }, { "month": 9, "build": 423000, "buy": 124650, "_buyRaw": 124650 }, { "month": 10, "build": 432500, "buy": 137250, "_buyRaw": 137250 }, { "month": 11, "build": 442000, "buy": 149850, "_buyRaw": 149850 }, { "month": 12, "build": 451500, "buy": 162450, "_buyRaw": 162450 }, { "month": 13, "build": 461000, "buy": 175050, "_buyRaw": 175050 }, { "month": 14, "build": 470500, "buy": 187650, "_buyRaw": 187650 }, { "month": 15, "build": 480000, "buy": 200250, "_buyRaw": 200250 }, { "month": 16, "build": 489500, "buy": 212850, "_buyRaw": 212850 }, { "month": 17, "build": 499000, "buy": 225450, "_buyRaw": 225450 }, { "month": 18, "build": 508500, "buy": 238050, "_buyRaw": 238050 }, { "month": 19, "build": 518000, "buy": 250650, "_buyRaw": 250650 }, { "month": 20, "build": 527500, "buy": 263250, "_buyRaw": 263250 }, { "month": 21, "build": 537000, "buy": 275850, "_buyRaw": 275850 }, { "month": 22, "build": 546500, "buy": 288450, "_buyRaw": 288450 }, { "month": 23, "build": 556000, "buy": 301050, "_buyRaw": 301050 }, { "month": 24, "build": 565500, "buy": 313650, "_buyRaw": 313650 }, { "month": 25, "build": 575000, "buy": 326250, "_buyRaw": 326250 }, { "month": 26, "build": 584500, "buy": 338850, "_buyRaw": 338850 }, { "month": 27, "build": 594000, "buy": 351450, "_buyRaw": 351450 }, { "month": 28, "build": 603500, "buy": 364050, "_buyRaw": 364050 }, { "month": 29, "build": 613000, "buy": 376650, "_buyRaw": 376650 }, { "month": 30, "build": 622500, "buy": 389250, "_buyRaw": 389250 }, { "month": 31, "build": 632000, "buy": 401850, "_buyRaw": 401850 }, { "month": 32, "build": 641500, "buy": 414450, "_buyRaw": 414450 }, { "month": 33, "build": 651000, "buy": 427050, "_buyRaw": 427050 }, { "month": 34, "build": 660500, "buy": 439650, "_buyRaw": 439650 }, { "month": 35, "build": 670000, "buy": 452250, "_buyRaw": 452250 }, { "month": 36, "build": 679500, "buy": 464850, "_buyRaw": 464850 } ], "crossoverMonth": null, "monthsEarlier": 8, "ticketsHandledEarlier": 60000, "savings": 192150 }, "summary": "Over 3 years, building AI support in-house costs about $657,000 versus $464,850 to buy, so buying saves $192,150; buying is live in 1 month versus 9 months for building.", "links": { "open_in_browser": "https://www.lorikeet.tools/build-vs-buy?tickets=15000&rate=50&eng=3&salary=180000&build=4&rebuilds=2&maint=0.5&intWeeks=4&admin=10", "start_free_trial": "https://app.lorikeetcx.ai/sign-up?utm_source=lorikeet.tools&utm_medium=api&utm_campaign=self-serve-launch&utm_content=build-vs-buy-api-start-free-trial&cta=build-vs-buy-api", "book_demo": "https://www.lorikeetcx.ai/get-a-demo?utm_source=build-vs-buy&utm_medium=api&utm_campaign=cx-tools&utm_content=api" }, "powered_by": "Lorikeet, https://www.lorikeetcx.ai" } ``` ### Backlog Cost Calculator (`backlog-cost`) Calculate the true cost of a growing support backlog: lost revenue, churn risk, and overtime spend. - Run: `POST https://www.lorikeet.tools/api/tools/backlog-cost` - Describe (JSON Schema, defaults, example): `GET https://www.lorikeet.tools/api/tools/backlog-cost` - Web tool: https://www.lorikeet.tools/backlog-cost Inputs (all optional; omitted fields take the web tool defaults): | Field | Type | Range | Default | Meaning | |---|---|---|---|---| | industry | "saas" | "ecommerce" | "finance" | "insurance" | "telecom" | "healthcare" | "retail" | "other" | | "other" | Industry preset: saas, ecommerce, finance, insurance, telecom, healthcare, retail, other. Picking one sets clv and churnSensitivity to its preset unless you send them (as in the UI). | | backlogSize | number | 50 to 10000 | 500 | Open tickets waiting in the backlog, 50 to 10,000. | | avgWaitDays | number | 1 to 30 | 5 | Average days a backlog ticket waits, 1 to 30. | | monthlyVolume | number | 1000 to 100000 | 10000 | Tickets per month, 1,000 to 100,000. Shown for context; the cost maths does not use it. | | clv | number | 100 to 100000 | 10000 | Customer lifetime value in USD, 100 to 100,000. | | churnSensitivity | "low" | "medium" | "high" | | "medium" | How quickly waiting customers churn: low, medium or high. | | slaPenalty | number | 0 to 5000 | 200 | USD penalty per SLA breach, 0 to 5,000. | | costPerTicket | number | 3 to 50 | 15 | USD cost to handle one ticket, 3 to 50. | | escalationRate | number | 0 to 30 | 10 | Percent of tickets escalated, 0 to 30. | Result fields: - `totalCost`: Total monthly cost of the backlog in USD (churn + SLA + operations + missed upsell). - `dailyCost`: totalCost divided by 30. - `costPerTicket`: totalCost per backlog ticket in USD. - `churnCost`: USD of customer lifetime value at risk from churn, including word of mouth. - `slaCost`: USD of SLA penalties expected from breaches. - `opsCost`: USD of handling cost, including escalations and repeat contacts. - `opportunityCost`: USD of upsell revenue missed while customers wait. - `churnPercent`: churnCost as a percent of totalCost (slaPercent, opsPercent and opportunityPercent likewise). - `churnProbability`: Probability (0 to 1) that a customer waiting avgWaitDays churns. - `effectiveBacklog`: Backlog after repeat contacts (tickets). - `dailyData`: Day 1 to 30: churn, sla, ops, opportunity and total cost in USD if tickets wait that many days. Example: ```bash curl -s -X POST https://www.lorikeet.tools/api/tools/backlog-cost \ -H 'content-type: application/json' \ -d '{"industry":"saas","backlogSize":1200,"avgWaitDays":4}' ``` Response: ```json { "tool": "backlog-cost", "version": "1.0.0", "inputs": { "industry": "saas", "backlogSize": 1200, "avgWaitDays": 4, "monthlyVolume": 10000, "clv": 15000, "churnSensitivity": "medium", "slaPenalty": 200, "costPerTicket": 15, "escalationRate": 10 }, "result": { "totalCost": 5428317.275153762, "dailyCost": 180943.90917179207, "costPerTicket": 4523.597729294802, "churnCost": 5140695.275153762, "slaCost": 57600, "opsCost": 30222, "opportunityCost": 199800, "churnPercent": 94.70145193398164, "slaPercent": 1.0611023099855275, "opsPercent": 0.5567471182705314, "opportunityPercent": 3.680698637762298, "churnProbability": 0.14279709097649337, "effectiveBacklog": 1752, "dailyData": [ { "day": 1, "churn": 2333628.21217448, "sla": 14400, "ops": 1007.4, "opportunity": 6660, "total": 2355695.6121744798 }, { "day": 2, "churn": 3412636.013864539, "sla": 28800, "ops": 1007.4, "opportunity": 6660, "total": 3449103.413864539 }, { "day": 3, "churn": 4341346.63540404, "sla": 43200, "ops": 1007.4, "opportunity": 6660, "total": 4392214.0354040405 }, { "day": 4, "churn": 5140695.275153762, "sla": 57600, "ops": 1007.4, "opportunity": 6660, "total": 5205962.675153762 }, { "day": 5, "churn": 5828701.025330868, "sla": 72000, "ops": 1007.4, "opportunity": 6660, "total": 5908368.425330868 }, { "day": 6, "churn": 6420873.062334607, "sla": 86400, "ops": 1007.4, "opportunity": 6660, "total": 6514940.462334608 }, { "day": 7, "churn": 6930560.257999603, "sla": 100800, "ops": 1007.4, "opportunity": 6660, "total": 7039027.657999603 }, { "day": 8, "churn": 7369252.092790181, "sla": 115200, "ops": 1007.4, "opportunity": 6660, "total": 7492119.492790181 }, { "day": 9, "churn": 7746837.654186976, "sla": 129600.00000000001, "ops": 1007.4, "opportunity": 6660, "total": 7884105.0541869765 }, { "day": 10, "churn": 8071828.558664132, "sla": 144000, "ops": 1007.4, "opportunity": 6660, "total": 8223495.958664132 }, { "day": 11, "churn": 8351550.822413213, "sla": 158399.99999999997, "ops": 1007.4, "opportunity": 6660, "total": 8517618.222413212 }, { "day": 12, "churn": 8592310.006005721, "sla": 172800, "ops": 1007.4, "opportunity": 6660, "total": 8772777.406005722 }, { "day": 13, "churn": 8799533.355721377, "sla": 187200, "ops": 1007.4, "opportunity": 6660, "total": 8994400.755721377 }, { "day": 14, "churn": 8977892.145723164, "sla": 201600, "ops": 1007.4, "opportunity": 6660, "total": 9187159.545723164 }, { "day": 15, "churn": 9131406.978943221, "sla": 215999.99999999997, "ops": 1007.4, "opportunity": 6660, "total": 9355074.378943222 }, { "day": 16, "churn": 9263538.420395289, "sla": 230400, "ops": 1007.4, "opportunity": 6660, "total": 9501605.820395289 }, { "day": 17, "churn": 9377265.00598962, "sla": 240000, "ops": 1007.4, "opportunity": 6660, "total": 9624932.40598962 }, { "day": 18, "churn": 9475150.385342253, "sla": 240000, "ops": 1007.4, "opportunity": 6660, "total": 9722817.785342254 }, { "day": 19, "churn": 9559401.112126455, "sla": 240000, "ops": 1007.4, "opportunity": 6660, "total": 9807068.512126455 }, { "day": 20, "churn": 9631916.384689225, "sla": 240000, "ops": 1007.4, "opportunity": 6660, "total": 9879583.784689225 }, { "day": 21, "churn": 9694330.858196639, "sla": 240000, "ops": 1007.4, "opportunity": 6660, "total": 9941998.258196639 }, { "day": 22, "churn": 9748051.49338884, "sla": 240000, "ops": 1007.4, "opportunity": 6660, "total": 9995718.893388841 }, { "day": 23, "churn": 9794289.27259739, "sla": 240000, "ops": 1007.4, "opportunity": 6660, "total": 10041956.67259739 }, { "day": 24, "churn": 9834086.497974368, "sla": 240000, "ops": 1007.4, "opportunity": 6660, "total": 10081753.897974368 }, { "day": 25, "churn": 9868340.287295919, "sla": 240000, "ops": 1007.4, "opportunity": 6660, "total": 10116007.68729592 }, { "day": 26, "churn": 9897822.79698776, "sla": 240000, "ops": 1007.4, "opportunity": 6660, "total": 10145490.196987761 }, { "day": 27, "churn": 9923198.62824456, "sla": 240000, "ops": 1007.4, "opportunity": 6660, "total": 10170866.02824456 }, { "day": 28, "churn": 9945039.8086157, "sla": 240000, "ops": 1007.4, "opportunity": 6660, "total": 10192707.2086157 }, { "day": 29, "churn": 9963838.686775682, "sla": 240000, "ops": 1007.4, "opportunity": 6660, "total": 10211506.086775683 }, { "day": 30, "churn": 9980019.031155821, "sla": 240000, "ops": 1007.4, "opportunity": 6660, "total": 10227686.431155821 } ] }, "summary": "A backlog of 1,200 tickets waiting 4 days on average costs about $5,428,317 a month ($180,944 a day, $4,524 per backlog ticket); churn risk is 95% of that, with a 14.3% chance each waiting customer churns.", "links": { "open_in_browser": "https://www.lorikeet.tools/backlog-cost?industry=saas&backlog=1200&wait=4&volume=10000&clv=15000&churn=medium&sla=200&cost=15&esc=10", "start_free_trial": "https://app.lorikeetcx.ai/sign-up?utm_source=lorikeet.tools&utm_medium=api&utm_campaign=self-serve-launch&utm_content=backlog-cost-api-start-free-trial&cta=backlog-cost-api", "book_demo": "https://www.lorikeetcx.ai/get-a-demo?utm_source=backlog-cost&utm_medium=api&utm_campaign=cx-tools&utm_content=api" }, "powered_by": "Lorikeet, https://www.lorikeetcx.ai" } ``` ### Agent Turnover Calculator (`attrition-impact`) Model what happens to a support org when agents leave: capacity drops, costs spike, quality suffers. - Run: `POST https://www.lorikeet.tools/api/tools/attrition-impact` - Describe (JSON Schema, defaults, example): `GET https://www.lorikeet.tools/api/tools/attrition-impact` - Web tool: https://www.lorikeet.tools/attrition-impact Inputs (all optional; omitted fields take the web tool defaults): | Field | Type | Range | Default | Meaning | |---|---|---|---|---| | teamSize | integer | 2 to 200 | 15 | Support agents (FTE) before any attrition, 2 to 200. | | ticketsPerHour | number | 5 to 2000 | 120 | Inbound tickets per hour, 5 to 2,000. | | aht | number | 1 to 30 | 6 | Average handle time per ticket in minutes, 1 to 30. | | slaTargetSeconds | number | 10 to 300 | 20 | SLA answer time target in seconds, 10 to 300. | | slaTargetPercent | number | 50 to 99 | 80 | Percent of tickets that must meet the SLA time, 50 to 99. | | agentsLost | integer | 0 to 199 | 0 | Agents who leave, 0 to 199 (0 shows the baseline). At least 1 agent always remains. | | salary | number | 20000 to 120000 | 46000 | Annual fully loaded cost per agent in USD, 20,000 to 120,000. | | replacementCost | number | 5000 to 50000 | 15000 | USD to replace one agent (recruiting, onboarding, ramp), 5,000 to 50,000. | | monthsToHire | integer | 1 to 12 | 3 | Months to hire a replacement, 1 to 12. | | baselineCSAT | number | 50 to 100 | 78 | CSAT (50 to 100) before any attrition. | Result fields: - `overloaded`: True when the remaining agents cannot keep up with demand (the queue grows without limit). - `baselineASA`: Average wait in seconds with the full team (Erlang C). - `currentASA`: Average wait in seconds after attrition; null when overloaded (unbounded). - `baselineSLA`: Percent of tickets answered within slaTargetSeconds with the full team. - `currentSLA`: The same after attrition (0 when overloaded). - `csatResult`: CSAT after attrition: csat, change versus baseline, status (healthy, warning, critical). - `utilization`: Workload per remaining agent as a fraction (capped at 1.2). - `baselineUtil`: Utilization of the full team, in percent. - `burnoutRisk`: Burnout risk in percent for month 0 of the cascade. - `baselineBurnout`: Burnout risk of the full team, in percent. - `cascade`: Months 0 to 6 as the team strains: agents, occupancy, effectiveAHT, ahtInflation, errorRate, monthlyAttritionRate, expectedLosses, slaCompliance, avgWaitSeconds, csat, burnoutRisk. - `financials`: Estimated 6-month cost in USD: directReplacement, overtime, slaPenalties, lostRevenue, customerReacquisition, cascadeAttrition and total. The web tool shows $0 total when agentsLost is 0, although these baseline figures are still computed. - `mu`: Tickets one agent handles per hour (60 / aht). - `activeAgents`: Agents remaining after attrition (at least 1). - `lambda`: Arrival rate used: tickets per hour. Example: ```bash curl -s -X POST https://www.lorikeet.tools/api/tools/attrition-impact \ -H 'content-type: application/json' \ -d '{"teamSize":25,"ticketsPerHour":180,"agentsLost":3}' ``` Response: ```json { "tool": "attrition-impact", "version": "1.0.0", "inputs": { "teamSize": 25, "ticketsPerHour": 180, "aht": 6, "slaTargetSeconds": 20, "slaTargetPercent": 80, "agentsLost": 3, "salary": 46000, "replacementCost": 15000, "monthsToHire": 3, "baselineCSAT": 78 }, "result": { "mu": 10, "activeAgents": 22, "lambda": 180, "overloaded": false, "baselineASA": 4.2749284728564785, "baselineSLA": 94.36580215296324, "currentASA": 25.02702913796962, "currentSLA": 77.73324631704325, "csatResult": { "csat": 78, "change": 0, "status": "healthy" }, "utilization": 0.8181818181818182, "cascade": [ { "month": 0, "agents": 22, "occupancy": 0.8181818181818182, "effectiveAHT": 6, "ahtInflation": 0, "errorRate": 0.05, "monthlyAttritionRate": 0.026867773779364803, "expectedLosses": 0.5910910231460257, "slaCompliance": 77.73324631704325, "avgWaitSeconds": 25.02702913796962, "csat": 78, "burnoutRisk": 31.818181818181827 }, { "month": 1, "agents": 21, "occupancy": 0.8593695703085305, "effectiveAHT": 6.015586992159713, "ahtInflation": 0.25978320266189425, "errorRate": 0.0508967969182042, "monthlyAttritionRate": 0.033302547569791785, "expectedLosses": 0.6993534989656275, "slaCompliance": 65.8070136708669, "avgWaitSeconds": 49.219506945788154, "csat": 78, "burnoutRisk": 35.93695703085305 }, { "month": 2, "agents": 20, "occupancy": 0.9433012701892219, "effectiveAHT": 6.288675134594813, "ahtInflation": 4.811252243246887, "errorRate": 0.06414150284562949, "monthlyAttritionRate": 0.06167051965479723, "expectedLosses": 1.2334103930959446, "slaCompliance": 31.665384303110667, "avgWaitSeconds": 241.46370002705362, "csat": 72.55919967696204, "burnoutRisk": 44.3301270189222 }, { "month": 3, "agents": 19, "occupancy": 0.99, "effectiveAHT": 6.784479432351959, "ahtInflation": 13.07465720586599, "errorRate": 0.07301357775871069, "monthlyAttritionRate": 0.08526739598223841, "expectedLosses": 1.6200805236625297, "slaCompliance": 0, "avgWaitSeconds": null, "csat": 45.18909751614701, "burnoutRisk": 49 }, { "month": 4, "agents": 17, "occupancy": 0.99, "effectiveAHT": 7.352528496311015, "ahtInflation": 22.54214160518357, "errorRate": 0.07301357775871069, "monthlyAttritionRate": 0.08526739598223841, "expectedLosses": 1.449545731698053, "slaCompliance": 0, "avgWaitSeconds": null, "csat": 45.18909751614701, "burnoutRisk": 49 }, { "month": 5, "agents": 16, "occupancy": 0.99, "effectiveAHT": 7.352528496311015, "ahtInflation": 22.54214160518357, "errorRate": 0.07301357775871069, "monthlyAttritionRate": 0.08526739598223841, "expectedLosses": 1.3642783357158146, "slaCompliance": 0, "avgWaitSeconds": null, "csat": 45.18909751614701, "burnoutRisk": 49 }, { "month": 6, "agents": 15, "occupancy": 0.99, "effectiveAHT": 7.352528496311015, "ahtInflation": 22.54214160518357, "errorRate": 0.07301357775871069, "monthlyAttritionRate": 0.08526739598223841, "expectedLosses": 1.2790109397335763, "slaCompliance": 0, "avgWaitSeconds": null, "csat": 45.18909751614701, "burnoutRisk": 49 } ], "financials": { "directReplacement": 45000, "overtime": 10342, "slaPenalties": 15000, "lostRevenue": 0, "customerReacquisition": 0, "cascadeAttrition": 114685, "total": 185027 }, "baselineUtil": 72, "baselineBurnout": 22, "burnoutRisk": 31.818181818181827 }, "summary": "Losing 3 of 25 agents handling 180 tickets an hour (6 min handle time) raises the average wait from 4s to 25s, drops SLA compliance from 94% to 78% and CSAT to 78, at an estimated 6-month cost of $185,027.", "links": { "open_in_browser": "https://www.lorikeet.tools/attrition-impact?agents=25&tph=180&aht=6&sla=20&slaPct=80&lost=3&salary=46000&replace=15000&hire=3&csat=78", "start_free_trial": "https://app.lorikeetcx.ai/sign-up?utm_source=lorikeet.tools&utm_medium=api&utm_campaign=self-serve-launch&utm_content=attrition-impact-api-start-free-trial&cta=attrition-impact-api", "book_demo": "https://www.lorikeetcx.ai/get-a-demo?utm_source=attrition-impact&utm_medium=api&utm_campaign=cx-tools&utm_content=api" }, "powered_by": "Lorikeet, https://www.lorikeetcx.ai" } ``` ### AI Readiness Scorecard (`ai-readiness`) Score an organisation across 6 dimensions to see how ready it is for AI-powered support. - Run: `POST https://www.lorikeet.tools/api/tools/ai-readiness` - Describe (JSON Schema, defaults, example): `GET https://www.lorikeet.tools/api/tools/ai-readiness` - Web tool: https://www.lorikeet.tools/ai-readiness Inputs (all optional; omitted fields take the web tool defaults): | Field | Type | Range | Default | Meaning | |---|---|---|---|---| | items | array | | [] | Ids of the readiness statements that are true for the team (empty means none). Ids: help-center (Knowledge Base, critical); internal-docs (Knowledge Base); content-covers-top-types (Knowledge Base); escalation-paths (Knowledge Base); tone-guidelines (Knowledge Base); docs-owner (Knowledge Base); volume-1k (Ticket Landscape, critical); top-5-types (Ticket Landscape); repetitive-30 (Ticket Landscape); tickets-tagged (Ticket Landscape); workflows-documented (Ticket Landscape); helpdesk (Systems & Integrations, critical); crm (Systems & Integrations); billing (Systems & Integrations); orders (Systems & Integrations); apis (Systems & Integrations, critical); engineering (Systems & Integrations); track-volume-by-type (Data & Measurement); measure-csat (Data & Measurement); measure-resolution-time (Data & Measurement); historical-data (Data & Measurement); success-metrics (Data & Measurement); exec-sponsor (Team & Governance); ai-owner (Team & Governance, critical); qa-resources (Team & Governance); team-buyin (Team & Governance); technical-comfort (Team & Governance); focused-pilot (Operational Readiness, critical); weekly-iteration (Operational Readiness); comfortable-end-to-end (Operational Readiness); previous-ai (Operational Readiness). | Result fields: - `percentage`: Readiness score, 0 to 100 (weighted share of statements that are true). - `level`: Readiness level: label (Early Stage, Building Foundation, Ready to Pilot, Strong Position) and its score range (min, max). - `categoryScores`: Points per category: knowledge, tickets, systems, data, team, operational. Example: ```bash curl -s -X POST https://www.lorikeet.tools/api/tools/ai-readiness \ -H 'content-type: application/json' \ -d '{"items":["help-center","internal-docs","volume-1k","top-5-types","helpdesk","crm","measure-csat","exec-sponsor"]}' ``` Response: ```json { "tool": "ai-readiness", "version": "1.0.0", "inputs": { "items": [ "help-center", "internal-docs", "volume-1k", "top-5-types", "helpdesk", "crm", "measure-csat", "exec-sponsor" ] }, "result": { "percentage": 34, "level": { "label": "Building Foundation", "min": 26, "max": 50 }, "categoryScores": { "knowledge": 5, "tickets": 4, "systems": 4, "data": 2, "team": 2, "operational": 0 } }, "summary": "8 of 31 readiness statements are true, scoring 34% (Building Foundation); critical gaps: APIs available for core backend systems; Dedicated AI / automation owner; Willing to start with a focused pilot, not a big bang.", "links": { "open_in_browser": "https://www.lorikeet.tools/ai-readiness?items=help-center%2Cinternal-docs%2Cvolume-1k%2Ctop-5-types%2Chelpdesk%2Ccrm%2Cmeasure-csat%2Cexec-sponsor", "start_free_trial": "https://app.lorikeetcx.ai/sign-up?utm_source=lorikeet.tools&utm_medium=api&utm_campaign=self-serve-launch&utm_content=ai-readiness-api-start-free-trial&cta=ai-readiness-api", "book_demo": "https://www.lorikeetcx.ai/get-a-demo?utm_source=ai-readiness&utm_medium=api&utm_campaign=cx-tools&utm_content=api" }, "powered_by": "Lorikeet, https://www.lorikeetcx.ai" } ``` ### Knowledge Base Evaluator (`kb-evaluator`) Assess knowledge base health: coverage, freshness, and readiness for AI consumption. - Run: `POST https://www.lorikeet.tools/api/tools/kb-evaluator` - Describe (JSON Schema, defaults, example): `GET https://www.lorikeet.tools/api/tools/kb-evaluator` - Web tool: https://www.lorikeet.tools/kb-evaluator Notes: - Send exactly one of articles (mode A) or url (mode B); an empty body is a 400. - Mode A: up to 300 articles and a 2 MB request body. Only title and content are required per article; other fields on an article are ignored. - Mode B: reads a public help centre server-side (Zendesk Help Center API first, then sitemap.xml), up to 300 articles and 10 MB, about 50 seconds at most. It honours robots.txt, never follows a redirect to another host, and refuses private, loopback and metadata addresses. Limits: 5 URL reads per hour per IP and 3 per help centre domain per hour; if the limiter is unavailable URL mode returns 503 and articles mode still works. - Staleness is computed relative to the time of the request. - The result is trimmed for agents: per issue type, a count plus the first 20 examples (index, title, url, reason) in the order the web tool lists them. Article bodies are never returned, and inputs echoes article_count (or the normalised url) instead of the articles. Inputs (see the notes for what is required; omitted settings take the web tool defaults): | Field | Type | Range | Default | Meaning | |---|---|---|---|---| | articles | array | | undefined | Mode A: the articles to evaluate, 1 to 300. Send this or url, not both. | | url | string | | undefined | Mode B: a public help centre address (Zendesk, Intercom, or any site with a sitemap.xml). Read server-side, up to 300 articles. Send this or articles, not both. | | settings | object | | {"similarityThreshold":0.85,"thinContentWords":100,"staleMonths":12} | Analysis thresholds. Defaults are the web tool settings. | Result fields: - `score`: Health score, 0 to 100 (the same score the web tool shows). - `article_count`: Articles analysed. - `total_issues`: Poisoned + duplicate pairs + thin + stale + missing structure + oversized (tables are reported separately, as in the web tool). - `source`: Where the articles came from: { mode: "articles", article_count } or { mode: "url", domain, platform (zendesk, intercom or sitemap), article_count, truncated }. - `issues`: Per issue type (poisonedContent, duplicates, thinContent, staleContent, missingStructure, oversizedContent, tableContent): { count, examples }, with at most 20 examples each carrying index (position in the article list), title, url and reason, plus type-specific fields (phrases, similarity and duplicate_of, word_count, updated_date and age_months, char_count and excess_chars). - `categoryStats`: Category distribution: categories [{ name, count, percentage }], uncategorized, uncategorizedPercentage, total. Example: ```bash curl -s -X POST https://www.lorikeet.tools/api/tools/kb-evaluator \ -H 'content-type: application/json' \ -d '{"articles":[{"title":"Reset your password","content":"

Reset your password

  1. Open the sign in page and choose Forgot password.
  2. Enter your email address.
  3. Follow the link we send you.
","updated_date":"2026-09-01","category":"Account","url":"https://help.example.com/articles/reset-password"},{"title":"Refund policy","content":"

Refunds take five business days. For anything else, contact us and our team will get back to you.

","updated_date":"2024-02-01","category":"Billing","url":"https://help.example.com/articles/refunds"},{"title":"Plans and pricing","content":"
PlanSeats
Starter5
","updated_date":"2026-06-15","category":"Billing","url":"https://help.example.com/articles/plans"}]}' ``` Response: ```json { "tool": "kb-evaluator", "version": "1.0.0", "inputs": { "article_count": 3, "settings": { "similarityThreshold": 0.85, "thinContentWords": 100, "staleMonths": 12 } }, "result": { "score": 35, "article_count": 3, "total_issues": 5, "source": { "mode": "articles", "article_count": 3 }, "issues": { "poisonedContent": { "count": 1, "examples": [ { "index": 1, "title": "Refund policy", "url": "https://help.example.com/articles/refunds", "reason": "Contains \"contact us\", \"our team will\", which leads AI to promise human follow-up it cannot deliver.", "phrases": [ "contact us", "our team will" ] } ] }, "duplicates": { "count": 0, "examples": [] }, "thinContent": { "count": 3, "examples": [ { "index": 2, "title": "Plans and pricing", "url": "https://help.example.com/articles/plans", "reason": "Only 4 words (fewer than 100).", "word_count": 4 }, { "index": 1, "title": "Refund policy", "url": "https://help.example.com/articles/refunds", "reason": "Only 18 words (fewer than 100).", "word_count": 18 }, { "index": 0, "title": "Reset your password", "url": "https://help.example.com/articles/reset-password", "reason": "Only 22 words (fewer than 100).", "word_count": 22 } ] }, "staleContent": { "count": 1, "examples": [ { "index": 1, "title": "Refund policy", "url": "https://help.example.com/articles/refunds", "reason": "Last updated 32 months ago (stale at 12).", "updated_date": "2024-02-01", "age_months": 32 } ] }, "missingStructure": { "count": 0, "examples": [] }, "oversizedContent": { "count": 0, "examples": [] }, "tableContent": { "count": 1, "examples": [ { "index": 2, "title": "Plans and pricing", "url": "https://help.example.com/articles/plans", "reason": "Contains an HTML table, which AI may not read reliably." } ] } }, "categoryStats": { "categories": [ { "name": "Billing", "count": 2, "percentage": 66.66666666666666 }, { "name": "Account", "count": 1, "percentage": 33.33333333333333 } ], "uncategorized": 0, "uncategorizedPercentage": 0, "total": 3 } }, "summary": "Knowledge base health score 35/100 across 3 articles, with 5 issues to review: 1 article with language that promises human follow-up, 0 near-duplicate pairs, 3 thin, 1 stale, 0 missing structure, 0 oversized; 1 article with tables.", "links": { "open_in_browser": "https://www.lorikeet.tools/kb-evaluator", "start_free_trial": "https://app.lorikeetcx.ai/sign-up?utm_source=lorikeet.tools&utm_medium=api&utm_campaign=self-serve-launch&utm_content=kb-evaluator-api-start-free-trial&cta=kb-evaluator-api", "book_demo": "https://www.lorikeetcx.ai/get-a-demo?utm_source=kb-evaluator&utm_medium=api&utm_campaign=cx-tools&utm_content=api" }, "powered_by": "Lorikeet, https://www.lorikeetcx.ai" } ``` ### Resolution Bottleneck Finder (`resolution-time`) Break down where time goes in the resolution process and find the bottlenecks AI can eliminate. - Run: `POST https://www.lorikeet.tools/api/tools/resolution-time` - Describe (JSON Schema, defaults, example): `GET https://www.lorikeet.tools/api/tools/resolution-time` - Web tool: https://www.lorikeet.tools/resolution-time Inputs (all optional; omitted fields take the web tool defaults): | Field | Type | Range | Default | Meaning | |---|---|---|---|---| | industry | "finance" | "health" | "insurance" | "retail" | "travel" | "media" | | "retail" | Industry: finance, health, insurance, retail, travel, media. | | channel | "email" | "chat" | "phone" | "social" | | "email" | Channel: email, chat, phone, social. | | firstResponse | number | 0 to 480 | 45 | Minutes until the first response, 0 to 480. If omitted, the benchmark for the industry and channel (as the web tool loads it). | | investigation | number | 0 to 120 | 15 | Minutes investigating, 0 to 120. If omitted, the benchmark for the industry and channel (as the web tool loads it). | | collaboration | number | 0 to 180 | 10 | Minutes in internal collaboration and handoffs, 0 to 180. If omitted, the benchmark for the industry and channel (as the web tool loads it). | | customerWait | number | 0 to 1440 | 180 | Minutes waiting on the customer, 0 to 1440. If omitted, the benchmark for the industry and channel (as the web tool loads it). | | resolution | number | 0 to 60 | 8 | Minutes carrying out the resolution, 0 to 60. If omitted, the benchmark for the industry and channel (as the web tool loads it). | | wrapUp | number | 0 to 30 | 5 | Minutes of wrap-up, 0 to 30. If omitted, the benchmark for the industry and channel (as the web tool loads it). | | complexity | object | | {"simple":50,"moderate":35,"complex":15} | Ticket mix by complexity, in percent. Default 50 / 35 / 15. Not forced to sum to 100, as in the web tool. | Result fields: - `weightedUserTimes`: Minutes per stage today after weighting by the complexity mix (rounded). - `aiTimes`: Minutes per stage with AI assistance (rounded). - `benchmarkTimes`: Benchmark minutes per stage for the industry and channel. - `userTotal`: Total minutes end to end today. - `aiTotal`: Total minutes end to end with AI. Example: ```bash curl -s -X POST https://www.lorikeet.tools/api/tools/resolution-time \ -H 'content-type: application/json' \ -d '{"industry":"finance","channel":"email","customerWait":180,"complexity":{"simple":40,"moderate":40,"complex":20}}' ``` Response: ```json { "tool": "resolution-time", "version": "1.0.0", "inputs": { "industry": "finance", "channel": "email", "firstResponse": 90, "investigation": 30, "collaboration": 25, "customerWait": 180, "resolution": 12, "wrapUp": 8, "complexity": { "simple": 40, "moderate": 40, "complex": 20 } }, "result": { "benchmarkTimes": { "firstResponse": 90, "investigation": 30, "collaboration": 25, "customerWait": 240, "resolution": 12, "wrapUp": 8 }, "weightedUserTimes": { "firstResponse": 90, "investigation": 33, "collaboration": 27, "customerWait": 180, "resolution": 12, "wrapUp": 8 }, "aiTimes": { "firstResponse": 5, "investigation": 21, "collaboration": 20, "customerWait": 72, "resolution": 7, "wrapUp": 4 }, "userTotal": 350, "aiTotal": 129 }, "summary": "A finance email ticket takes about 5h 50m end to end; with AI it would take about 2h 9m (63% faster), and the biggest saving is in customer wait (1h 48m).", "links": { "open_in_browser": "https://www.lorikeet.tools/resolution-time?i=finance&ch=email&fr=90&inv=30&col=25&cw=180&res=12&wu=8&cs=40&cm=40&cc=20", "start_free_trial": "https://app.lorikeetcx.ai/sign-up?utm_source=lorikeet.tools&utm_medium=api&utm_campaign=self-serve-launch&utm_content=resolution-time-api-start-free-trial&cta=resolution-time-api", "book_demo": "https://www.lorikeetcx.ai/get-a-demo?utm_source=resolution-time&utm_medium=api&utm_campaign=cx-tools&utm_content=api" }, "powered_by": "Lorikeet, https://www.lorikeetcx.ai" } ``` ### Coverage Gap Mapper (`coverage-gap`) Map support demand against staffing to find coverage gaps when customers are waiting. - Run: `POST https://www.lorikeet.tools/api/tools/coverage-gap` - Describe (JSON Schema, defaults, example): `GET https://www.lorikeet.tools/api/tools/coverage-gap` - Web tool: https://www.lorikeet.tools/coverage-gap Inputs (all optional; omitted fields take the web tool defaults): | Field | Type | Range | Default | Meaning | |---|---|---|---|---| | shifts | array | | [{"timezone":"America/New_York","startTime":540,"endTime":1020,"days":["Mon","Tue","Wed","Thu","Fri"],"agentCount":5}] | 1 to 6 shifts. Omitted fields in a shift take the web tool defaults. | | regionMix | object | | {"americas":80,"emea":12,"apac":8} | Where demand comes from: three shares 0 to 100, normalised to whole percents as the web tool does. Default 80 / 12 / 8, the web tool start. | | monthlyTickets | integer | 100 to 1000000 | 3000 | Tickets per month, 100 to 1,000,000. | Result fields: - `weightedCoverage`: Share (0 to 1) of weekly demand that falls in a half hour with at least one agent, weighted by day. - `gapHoursPerWeek`: Hours a week with meaningful demand and no agents on shift. - `ticketsAtRiskPerWeek`: Tickets a week arriving when no one is on shift. - `annualGapCost`: USD a year for those tickets at $15 per delayed ticket (the web tool rate). - `aiTicketsHandled`: Tickets a week an AI agent could handle in the gaps (50% deflection). - `aiSavings`: USD a year saved by AI handling those tickets. - `deferredHires`: Agents (FTE) that saving is worth. - `blendedDemand`: 48 half-hour slots (UTC): relative demand, normalised so the peak is 1. - `coverageMatrix`: 7 days (Mon to Sun) x 48 UTC half-hour slots: agents on shift. - `chartData`: 48 UTC half-hour slots: label, demand, average agents, per-shift agents, isGap, isUnderstaffed. - `perShiftData`: Per shift ("shift-1", "shift-2", ... in input order): 48 UTC slots of agents, weighted by days worked. Example: ```bash curl -s -X POST https://www.lorikeet.tools/api/tools/coverage-gap \ -H 'content-type: application/json' \ -d '{"shifts":[{"timezone":"America/New_York","startTime":480,"endTime":1020,"days":["Mon","Tue","Wed","Thu","Fri"],"agentCount":8},{"timezone":"Europe/London","startTime":480,"endTime":1020,"days":["Mon","Tue","Wed","Thu","Fri"],"agentCount":4}],"regionMix":{"americas":60,"emea":30,"apac":10},"monthlyTickets":12000}' ``` Response: ```json { "tool": "coverage-gap", "version": "1.0.0", "inputs": { "shifts": [ { "timezone": "America/New_York", "startTime": 480, "endTime": 1020, "days": [ "Mon", "Tue", "Wed", "Thu", "Fri" ], "agentCount": 8 }, { "timezone": "Europe/London", "startTime": 480, "endTime": 1020, "days": [ "Mon", "Tue", "Wed", "Thu", "Fri" ], "agentCount": 4 } ], "regionMix": { "americas": 60, "emea": 30, "apac": 10 }, "monthlyTickets": 12000 }, "result": { "coverageMatrix": [ [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 12, 12, 12, 12, 12, 12, 12, 12, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 12, 12, 12, 12, 12, 12, 12, 12, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 12, 12, 12, 12, 12, 12, 12, 12, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 12, 12, 12, 12, 12, 12, 12, 12, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 12, 12, 12, 12, 12, 12, 12, 12, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ], "blendedDemand": [ 0.25, 0.23497267759562843, 0.22267759562841533, 0.20765027322404375, 0.19535519125683062, 0.1871584699453552, 0.1830601092896175, 0.20218579234972678, 0.22404371584699456, 0.2827868852459017, 0.3469945355191257, 0.3975409836065574, 0.43715846994535523, 0.4672131147540984, 0.4740437158469945, 0.4808743169398907, 0.4590163934426229, 0.43579234972677605, 0.4153005464480875, 0.4016393442622951, 0.3989071038251366, 0.4166666666666667, 0.45218579234972683, 0.5450819672131147, 0.6721311475409836, 0.7896174863387978, 0.8838797814207651, 0.9576502732240437, 1, 1, 0.9426229508196721, 0.8852459016393441, 0.8196721311475411, 0.760928961748634, 0.7226775956284152, 0.7622950819672132, 0.7745901639344264, 0.7540983606557378, 0.726775956284153, 0.6844262295081968, 0.6243169398907105, 0.546448087431694, 0.46038251366120225, 0.3961748633879782, 0.34972677595628415, 0.31420765027322406, 0.28961748633879786, 0.26639344262295084 ], "chartData": [ { "slot": 0, "hour": 0, "label": "00:00", "demand": 0.25, "totalAgents": 0, "shiftAgents": { "shift-1": 0, "shift-2": 0 }, "isGap": true, "isUnderstaffed": false }, { "slot": 1, "hour": 0.5, "label": "00:30", "demand": 0.23497267759562843, "totalAgents": 0, "shiftAgents": { "shift-1": 0, "shift-2": 0 }, "isGap": true, "isUnderstaffed": false }, { "slot": 2, "hour": 1, "label": "01:00", "demand": 0.22267759562841533, "totalAgents": 0, "shiftAgents": { "shift-1": 0, "shift-2": 0 }, "isGap": true, "isUnderstaffed": false }, { "slot": 3, "hour": 1.5, "label": "01:30", "demand": 0.20765027322404375, "totalAgents": 0, "shiftAgents": { "shift-1": 0, "shift-2": 0 }, "isGap": true, "isUnderstaffed": false }, { "slot": 4, "hour": 2, "label": "02:00", "demand": 0.19535519125683062, "totalAgents": 0, "shiftAgents": { "shift-1": 0, "shift-2": 0 }, "isGap": true, "isUnderstaffed": false }, { "slot": 5, "hour": 2.5, "label": "02:30", "demand": 0.1871584699453552, "totalAgents": 0, "shiftAgents": { "shift-1": 0, "shift-2": 0 }, "isGap": true, "isUnderstaffed": false }, { "slot": 6, "hour": 3, "label": "03:00", "demand": 0.1830601092896175, "totalAgents": 0, "shiftAgents": { "shift-1": 0, "shift-2": 0 }, "isGap": true, "isUnderstaffed": false }, { "slot": 7, "hour": 3.5, "label": "03:30", "demand": 0.20218579234972678, "totalAgents": 0, "shiftAgents": { "shift-1": 0, "shift-2": 0 }, "isGap": true, "isUnderstaffed": false }, { "slot": 8, "hour": 4, "label": "04:00", "demand": 0.22404371584699456, "totalAgents": 0, "shiftAgents": { "shift-1": 0, "shift-2": 0 }, "isGap": true, "isUnderstaffed": false }, { "slot": 9, "hour": 4.5, "label": "04:30", "demand": 0.2827868852459017, "totalAgents": 0, "shiftAgents": { "shift-1": 0, "shift-2": 0 }, "isGap": true, "isUnderstaffed": false }, { "slot": 10, "hour": 5, "label": "05:00", "demand": 0.3469945355191257, "totalAgents": 0, "shiftAgents": { "shift-1": 0, "shift-2": 0 }, "isGap": true, "isUnderstaffed": false }, { "slot": 11, "hour": 5.5, "label": "05:30", "demand": 0.3975409836065574, "totalAgents": 0, "shiftAgents": { "shift-1": 0, "shift-2": 0 }, "isGap": true, "isUnderstaffed": false }, { "slot": 12, "hour": 6, "label": "06:00", "demand": 0.43715846994535523, "totalAgents": 0, "shiftAgents": { "shift-1": 0, "shift-2": 0 }, "isGap": true, "isUnderstaffed": false }, { "slot": 13, "hour": 6.5, "label": "06:30", "demand": 0.4672131147540984, "totalAgents": 0, "shiftAgents": { "shift-1": 0, "shift-2": 0 }, "isGap": true, "isUnderstaffed": false }, { "slot": 14, "hour": 7, "label": "07:00", "demand": 0.4740437158469945, "totalAgents": 0, "shiftAgents": { "shift-1": 0, "shift-2": 0 }, "isGap": true, "isUnderstaffed": false }, { "slot": 15, "hour": 7.5, "label": "07:30", "demand": 0.4808743169398907, "totalAgents": 0, "shiftAgents": { "shift-1": 0, "shift-2": 0 }, "isGap": true, "isUnderstaffed": false }, { "slot": 16, "hour": 8, "label": "08:00", "demand": 0.4590163934426229, "totalAgents": 3.5, "shiftAgents": { "shift-1": 0, "shift-2": 2.857142857142857 }, "isGap": false, "isUnderstaffed": false }, { "slot": 17, "hour": 8.5, "label": "08:30", "demand": 0.43579234972677605, "totalAgents": 3.5, "shiftAgents": { "shift-1": 0, "shift-2": 2.857142857142857 }, "isGap": false, "isUnderstaffed": false }, { "slot": 18, "hour": 9, "label": "09:00", "demand": 0.4153005464480875, "totalAgents": 3.5, "shiftAgents": { "shift-1": 0, "shift-2": 2.857142857142857 }, "isGap": false, "isUnderstaffed": false }, { "slot": 19, "hour": 9.5, "label": "09:30", "demand": 0.4016393442622951, "totalAgents": 3.5, "shiftAgents": { "shift-1": 0, "shift-2": 2.857142857142857 }, "isGap": false, "isUnderstaffed": false }, { "slot": 20, "hour": 10, "label": "10:00", "demand": 0.3989071038251366, "totalAgents": 3.5, "shiftAgents": { "shift-1": 0, "shift-2": 2.857142857142857 }, "isGap": false, "isUnderstaffed": false }, { "slot": 21, "hour": 10.5, "label": "10:30", "demand": 0.4166666666666667, "totalAgents": 3.5, "shiftAgents": { "shift-1": 0, "shift-2": 2.857142857142857 }, "isGap": false, "isUnderstaffed": false }, { "slot": 22, "hour": 11, "label": "11:00", "demand": 0.45218579234972683, "totalAgents": 3.5, "shiftAgents": { "shift-1": 0, "shift-2": 2.857142857142857 }, "isGap": false, "isUnderstaffed": false }, { "slot": 23, "hour": 11.5, "label": "11:30", "demand": 0.5450819672131147, "totalAgents": 3.5, "shiftAgents": { "shift-1": 0, "shift-2": 2.857142857142857 }, "isGap": false, "isUnderstaffed": false }, { "slot": 24, "hour": 12, "label": "12:00", "demand": 0.6721311475409836, "totalAgents": 3.5, "shiftAgents": { "shift-1": 0, "shift-2": 2.857142857142857 }, "isGap": false, "isUnderstaffed": false }, { "slot": 25, "hour": 12.5, "label": "12:30", "demand": 0.7896174863387978, "totalAgents": 3.5, "shiftAgents": { "shift-1": 0, "shift-2": 2.857142857142857 }, "isGap": false, "isUnderstaffed": true }, { "slot": 26, "hour": 13, "label": "13:00", "demand": 0.8838797814207651, "totalAgents": 10.5, "shiftAgents": { "shift-1": 5.714285714285714, "shift-2": 2.857142857142857 }, "isGap": false, "isUnderstaffed": false }, { "slot": 27, "hour": 13.5, "label": "13:30", "demand": 0.9576502732240437, "totalAgents": 10.5, "shiftAgents": { "shift-1": 5.714285714285714, "shift-2": 2.857142857142857 }, "isGap": false, "isUnderstaffed": false }, { "slot": 28, "hour": 14, "label": "14:00", "demand": 1, "totalAgents": 10.5, "shiftAgents": { "shift-1": 5.714285714285714, "shift-2": 2.857142857142857 }, "isGap": false, "isUnderstaffed": false }, { "slot": 29, "hour": 14.5, "label": "14:30", "demand": 1, "totalAgents": 10.5, "shiftAgents": { "shift-1": 5.714285714285714, "shift-2": 2.857142857142857 }, "isGap": false, "isUnderstaffed": false }, { "slot": 30, "hour": 15, "label": "15:00", "demand": 0.9426229508196721, "totalAgents": 10.5, "shiftAgents": { "shift-1": 5.714285714285714, "shift-2": 2.857142857142857 }, "isGap": false, "isUnderstaffed": false }, { "slot": 31, "hour": 15.5, "label": "15:30", "demand": 0.8852459016393441, "totalAgents": 10.5, "shiftAgents": { "shift-1": 5.714285714285714, "shift-2": 2.857142857142857 }, "isGap": false, "isUnderstaffed": false }, { "slot": 32, "hour": 16, "label": "16:00", "demand": 0.8196721311475411, "totalAgents": 10.5, "shiftAgents": { "shift-1": 5.714285714285714, "shift-2": 2.857142857142857 }, "isGap": false, "isUnderstaffed": false }, { "slot": 33, "hour": 16.5, "label": "16:30", "demand": 0.760928961748634, "totalAgents": 10.5, "shiftAgents": { "shift-1": 5.714285714285714, "shift-2": 2.857142857142857 }, "isGap": false, "isUnderstaffed": false }, { "slot": 34, "hour": 17, "label": "17:00", "demand": 0.7226775956284152, "totalAgents": 7, "shiftAgents": { "shift-1": 5.714285714285714, "shift-2": 0 }, "isGap": false, "isUnderstaffed": false }, { "slot": 35, "hour": 17.5, "label": "17:30", "demand": 0.7622950819672132, "totalAgents": 7, "shiftAgents": { "shift-1": 5.714285714285714, "shift-2": 0 }, "isGap": false, "isUnderstaffed": false }, { "slot": 36, "hour": 18, "label": "18:00", "demand": 0.7745901639344264, "totalAgents": 7, "shiftAgents": { "shift-1": 5.714285714285714, "shift-2": 0 }, "isGap": false, "isUnderstaffed": false }, { "slot": 37, "hour": 18.5, "label": "18:30", "demand": 0.7540983606557378, "totalAgents": 7, "shiftAgents": { "shift-1": 5.714285714285714, "shift-2": 0 }, "isGap": false, "isUnderstaffed": false }, { "slot": 38, "hour": 19, "label": "19:00", "demand": 0.726775956284153, "totalAgents": 7, "shiftAgents": { "shift-1": 5.714285714285714, "shift-2": 0 }, "isGap": false, "isUnderstaffed": false }, { "slot": 39, "hour": 19.5, "label": "19:30", "demand": 0.6844262295081968, "totalAgents": 7, "shiftAgents": { "shift-1": 5.714285714285714, "shift-2": 0 }, "isGap": false, "isUnderstaffed": false }, { "slot": 40, "hour": 20, "label": "20:00", "demand": 0.6243169398907105, "totalAgents": 7, "shiftAgents": { "shift-1": 5.714285714285714, "shift-2": 0 }, "isGap": false, "isUnderstaffed": false }, { "slot": 41, "hour": 20.5, "label": "20:30", "demand": 0.546448087431694, "totalAgents": 7, "shiftAgents": { "shift-1": 5.714285714285714, "shift-2": 0 }, "isGap": false, "isUnderstaffed": false }, { "slot": 42, "hour": 21, "label": "21:00", "demand": 0.46038251366120225, "totalAgents": 7, "shiftAgents": { "shift-1": 5.714285714285714, "shift-2": 0 }, "isGap": false, "isUnderstaffed": false }, { "slot": 43, "hour": 21.5, "label": "21:30", "demand": 0.3961748633879782, "totalAgents": 7, "shiftAgents": { "shift-1": 5.714285714285714, "shift-2": 0 }, "isGap": false, "isUnderstaffed": false }, { "slot": 44, "hour": 22, "label": "22:00", "demand": 0.34972677595628415, "totalAgents": 0, "shiftAgents": { "shift-1": 0, "shift-2": 0 }, "isGap": true, "isUnderstaffed": false }, { "slot": 45, "hour": 22.5, "label": "22:30", "demand": 0.31420765027322406, "totalAgents": 0, "shiftAgents": { "shift-1": 0, "shift-2": 0 }, "isGap": true, "isUnderstaffed": false }, { "slot": 46, "hour": 23, "label": "23:00", "demand": 0.28961748633879786, "totalAgents": 0, "shiftAgents": { "shift-1": 0, "shift-2": 0 }, "isGap": true, "isUnderstaffed": false }, { "slot": 47, "hour": 23.5, "label": "23:30", "demand": 0.26639344262295084, "totalAgents": 0, "shiftAgents": { "shift-1": 0, "shift-2": 0 }, "isGap": true, "isUnderstaffed": false } ], "weightedCoverage": 0.6619842937728126, "gapHoursPerWeek": 98, "ticketsAtRiskPerWeek": 936.764081922921, "annualGapCost": 730675.9838998783, "aiSavings": 316626.2596899473, "aiTicketsHandled": 468.3820409614605, "deferredHires": 4.9, "perShiftData": { "shift-1": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.714285714285714, 5.714285714285714, 5.714285714285714, 5.714285714285714, 5.714285714285714, 5.714285714285714, 5.714285714285714, 5.714285714285714, 5.714285714285714, 5.714285714285714, 5.714285714285714, 5.714285714285714, 5.714285714285714, 5.714285714285714, 5.714285714285714, 5.714285714285714, 5.714285714285714, 5.714285714285714, 0, 0, 0, 0 ], "shift-2": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.857142857142857, 2.857142857142857, 2.857142857142857, 2.857142857142857, 2.857142857142857, 2.857142857142857, 2.857142857142857, 2.857142857142857, 2.857142857142857, 2.857142857142857, 2.857142857142857, 2.857142857142857, 2.857142857142857, 2.857142857142857, 2.857142857142857, 2.857142857142857, 2.857142857142857, 2.857142857142857, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] } }, "summary": "With 2 shifts (12 agents) and demand 60% Americas, 30% EMEA, 10% APAC, 66% of weighted demand is covered; 98 hours a week have demand but no agents, putting about 937 tickets a week at risk (about $730,676 a year).", "links": { "open_in_browser": "https://www.lorikeet.tools/coverage-gap?s=%5B%7B%22n%22%3A%22Shift+1%22%2C%22tz%22%3A%22America%2FNew_York%22%2C%22st%22%3A480%2C%22et%22%3A1020%2C%22d%22%3A%22Mo%2CTu%2CWe%2CTh%2CFr%22%2C%22a%22%3A8%7D%2C%7B%22n%22%3A%22Shift+2%22%2C%22tz%22%3A%22Europe%2FLondon%22%2C%22st%22%3A480%2C%22et%22%3A1020%2C%22d%22%3A%22Mo%2CTu%2CWe%2CTh%2CFr%22%2C%22a%22%3A4%7D%5D&r=60%2C30%2C10&t=12000", "start_free_trial": "https://app.lorikeetcx.ai/sign-up?utm_source=lorikeet.tools&utm_medium=api&utm_campaign=self-serve-launch&utm_content=coverage-gap-api-start-free-trial&cta=coverage-gap-api", "book_demo": "https://www.lorikeetcx.ai/get-a-demo?utm_source=coverage-gap&utm_medium=api&utm_campaign=cx-tools&utm_content=api" }, "powered_by": "Lorikeet, https://www.lorikeetcx.ai" } ``` ### Quality vs Speed Benchmarker (`quality-vs-speed`) Visualise the tradeoff between response quality and speed, and where AI shifts the frontier. - Run: `POST https://www.lorikeet.tools/api/tools/quality-vs-speed` - Describe (JSON Schema, defaults, example): `GET https://www.lorikeet.tools/api/tools/quality-vs-speed` - Web tool: https://www.lorikeet.tools/quality-vs-speed Inputs (all optional; omitted fields take the web tool defaults): | Field | Type | Range | Default | Meaning | |---|---|---|---|---| | industry | "finance" | "health" | "insurance" | "retail" | "travel" | "media" | | "retail" | Industry to compare against: finance, health, insurance, retail, travel, media. Defaults to retail (the web tool asks you to pick one). | | csat | integer | 50 to 100 | 78 | Team CSAT percent, 50 to 100. | | resolutionTime | integer | 2 to 120 | 20 | Average resolution time in minutes, 2 to 120. | | aiAdoption | integer | 0 to 100 | 0 | How far the team has adopted AI, 0 to 100 percent. | Result fields: - `quadrant`: best-in-class, quality-focused, speed-focused or room-to-grow (CSAT 80 and 15 minutes are the cut-offs). - `quadrantConfig`: Display label, colour (hex) and one-line description for the quadrant. - `frontierPoint`: Nearest point on the traditional (non-AI) frontier: resolutionTime (minutes) and csat. - `aiProjectionPoint`: Point on the AI-assisted frontier at the same CSAT: resolutionTime and csat. - `speedGapMinutes`: Minutes slower than the traditional frontier (0 if at or past it). - `aiImprovementPercent`: Percent faster an AI-assisted team is at the same CSAT (negative when already faster). - `aiSavedMinutes`: Minutes AI could save per resolution at full adoption. - `aiAdoptionPercent`: The aiAdoption input. - `currentAiGainMinutes`: Minutes saved at the given adoption level (aiSavedMinutes x adoption). - `industryPeers`: Illustrative benchmark points for the industry: id, label, csat, resolutionTimeMinutes, aiAssisted. Example: ```bash curl -s -X POST https://www.lorikeet.tools/api/tools/quality-vs-speed \ -H 'content-type: application/json' \ -d '{"industry":"finance","csat":82,"resolutionTime":35,"aiAdoption":20}' ``` Response: ```json { "tool": "quality-vs-speed", "version": "1.0.0", "inputs": { "industry": "finance", "csat": 82, "resolutionTime": 35, "aiAdoption": 20 }, "result": { "quadrant": "quality-focused", "quadrantConfig": { "label": "Quality Focused", "color": "#0368C1", "body": "Strong quality. Speed is your opportunity." }, "frontierPoint": { "resolutionTime": 27.346733668341706, "csat": 85.11557788944724, "distance": 0.08086519808049641 }, "aiProjectionPoint": { "resolutionTime": 7.050251256281406, "csat": 82.04020100502512 }, "industryPeers": [ { "id": "fi-01", "industry": "finance", "label": "Neobank", "csat": 79, "resolutionTimeMinutes": 32, "aiAssisted": false }, { "id": "fi-02", "industry": "finance", "label": "Payment processor", "csat": 74, "resolutionTimeMinutes": 48, "aiAssisted": false }, { "id": "fi-03", "industry": "finance", "label": "Crypto exchange", "csat": 75, "resolutionTimeMinutes": 42, "aiAssisted": false }, { "id": "fi-04", "industry": "finance", "label": "Lending platform", "csat": 78, "resolutionTimeMinutes": 28, "aiAssisted": false }, { "id": "fi-05", "industry": "finance", "label": "Investment app", "csat": 82, "resolutionTimeMinutes": 18, "aiAssisted": false }, { "id": "fi-06", "industry": "finance", "label": "B2B payments", "csat": 74, "resolutionTimeMinutes": 50, "aiAssisted": false }, { "id": "fi-07", "industry": "finance", "label": "Personal finance tool", "csat": 80, "resolutionTimeMinutes": 15, "aiAssisted": false }, { "id": "fi-08", "industry": "finance", "label": "Digital bank", "csat": 76, "resolutionTimeMinutes": 38, "aiAssisted": false }, { "id": "fi-09", "industry": "finance", "label": "AI fraud detection support", "csat": 80, "resolutionTimeMinutes": 16, "aiAssisted": true }, { "id": "fi-10", "industry": "finance", "label": "AI-first neobank", "csat": 81, "resolutionTimeMinutes": 12, "aiAssisted": true } ], "speedGapMinutes": 7.653266331658294, "aiImprovementPercent": 80, "aiSavedMinutes": 27.949748743718594, "aiAdoptionPercent": 20, "currentAiGainMinutes": 6 }, "summary": "At 82% CSAT and 35 minutes average resolution, a finance team is Quality Focused: it resolves 8 minutes slower than frontier teams at the same CSAT, and AI-assisted teams reach the same quality about 80% faster.", "links": { "open_in_browser": "https://www.lorikeet.tools/quality-vs-speed?i=finance&c=82&r=35&a=20", "start_free_trial": "https://app.lorikeetcx.ai/sign-up?utm_source=lorikeet.tools&utm_medium=api&utm_campaign=self-serve-launch&utm_content=quality-vs-speed-api-start-free-trial&cta=quality-vs-speed-api", "book_demo": "https://www.lorikeetcx.ai/get-a-demo?utm_source=quality-vs-speed&utm_medium=api&utm_campaign=cx-tools&utm_content=api" }, "powered_by": "Lorikeet, https://www.lorikeetcx.ai" } ``` ### AI Story: Build the Case (`build-the-case`) Build a business case for AI support with projected ROI and stakeholder talking points. - Run: `POST https://www.lorikeet.tools/api/tools/build-the-case` - Describe (JSON Schema, defaults, example): `GET https://www.lorikeet.tools/api/tools/build-the-case` - Web tool: https://www.lorikeet.tools/build-the-case Notes: - Text in the result is the web tool copy, with dashes rendered as colons. - The stress test and the projection series use the stress test screen fallbacks; the CFO, CEO and team pitches use the audience screen fallbacks, as in the web tool. Agents needed with AI is one volume split everywhere, so the stress test matches the final projection month. - The projection series carries monthly cost, CSAT and agents for both scenarios. The metrics framework screen is not included. - The web tool has no URL parameters, so open_in_browser opens it at the first screen. Inputs (see the notes for what is required; omitted settings take the web tool defaults): | Field | Type | Range | Default | Meaning | |---|---|---|---|---| | northStars | array | | ["scale"] | What the business cares about most, 1 to 5 of: scale, retention, cost_efficiency, customer_experience, revenue. The CEO pitch names them in this order. | | teamSize | integer | 1 to 100000 | 25 | Support agents today. | | monthlyTicketVolume | integer | 1 to 10000000 | 10000 | Tickets a month today. | | csat | integer | 0 to 100 | 78 | CSAT today, percent 0 to 100. Default 78, the industry average the tool uses. | | resolutionTime | integer or null | 0 to 100000 | null | Average resolution time in minutes, or null if unknown (then every screen uses the default channel mix estimate, 583 minutes). | | costPerResolution | integer or null | 0 to 10000 | null | Cost per resolution in whole dollars, or null if unknown (then $11 up to 50 agents, $8 up to 200, $6 above). | | volumeMultiplier | number | 1 to 4 | 2 | Ticket volume at the end of the horizon, as a multiple of today (1 to 4; the web slider moves in 0.1 steps). | | aiAutomationTarget | integer | 0 to 80 | 40 | Percent of tickets AI resolves, 0 to 80 (the web slider moves in steps of 5). Default 40, the business case default. | | timeHorizonMonths | 6 | 12 | 24 | | 12 | Months the projection covers: 6, 12 or 24. | Result fields: - `stressTest`: The stress test screen at the target volume: csat (percent), resolutionTime (minutes), costPerResolution (dollars), agentsNeeded and slaRisk (LOW, MEDIUM, HIGH or CRITICAL) with AI at aiAutomationTarget (without AI when it is 0); rawAgentsDoNothing and rawCSATDoNothing are the agents and CSAT without AI. - `narrative`: The stress test sentence for the first north star, as the page shows it: the cost of doing nothing when aiAutomationTarget is 0, otherwise what AI changes. - `projections`: Month 0 to timeHorizonMonths, as the projection chart draws it: cost (dollars a month: agents at $75,000 a year, plus $1.50 per AI resolution), csat (percent, 0 to 100) and agentsNeeded, for doNothing and withAI. AI ramps up over the first 3 months. - `cfo`: CFO pitch: title, investment (year1, fixed $150K platform and integration estimate), returnOnInvestment (year1 annual savings), paybackPeriod, threeYearROI and talkingPoint. Amounts are display strings such as "1.4M" (no $ sign); paybackPeriod is "No payback at these settings" and threeYearROI "n/a" when the AI target saves nothing a month. - `ceo`: CEO pitch: title, northStarLabel, narrative, competitiveEdge (two lines) and talkingPoint. - `team`: Team pitch: title, staysTheSame, evolves and talkingPoint (the same for every input). Example: ```bash curl -s -X POST https://www.lorikeet.tools/api/tools/build-the-case \ -H 'content-type: application/json' \ -d '{"northStars":["cost_efficiency","customer_experience"],"teamSize":40,"monthlyTicketVolume":18000,"csat":84,"costPerResolution":9,"volumeMultiplier":1.8,"aiAutomationTarget":45,"timeHorizonMonths":12}' ``` Response: ```json { "tool": "build-the-case", "version": "1.1.0", "inputs": { "northStars": [ "cost_efficiency", "customer_experience" ], "teamSize": 40, "monthlyTicketVolume": 18000, "csat": 84, "resolutionTime": null, "costPerResolution": 9, "volumeMultiplier": 1.8, "aiAutomationTarget": 45, "timeHorizonMonths": 12 }, "result": { "stressTest": { "csat": 79.39999999999999, "resolutionTime": 786.7002, "costPerResolution": 6.813000000000001, "agentsNeeded": 40, "slaRisk": "LOW", "rawAgentsDoNothing": 72, "rawCSATDoNothing": 77.6 }, "narrative": "With AI at $1.50/resolution vs. $9.00/resolution for agents, monthly costs drop to $250K. Savings: $2.4M/year.", "projections": [ { "month": 0, "doNothing": { "cost": 250000, "csat": 84, "agentsNeeded": 40 }, "withAI": { "cost": 250000, "csat": 84, "agentsNeeded": 40 } }, { "month": 1, "doNothing": { "cost": 268750, "csat": 83.46666666666667, "agentsNeeded": 43 }, "withAI": { "cost": 235570, "csat": 84.6, "agentsNeeded": 37 } }, { "month": 2, "doNothing": { "cost": 287500, "csat": 82.93333333333334, "agentsNeeded": 46 }, "withAI": { "cost": 209180, "csat": 85.2, "agentsNeeded": 32 } }, { "month": 3, "doNothing": { "cost": 300000, "csat": 82.4, "agentsNeeded": 48 }, "withAI": { "cost": 183330, "csat": 85.8, "agentsNeeded": 27 } }, { "month": 4, "doNothing": { "cost": 318750, "csat": 81.86666666666667, "agentsNeeded": 51 }, "withAI": { "cost": 190390, "csat": 85.8, "agentsNeeded": 28 } }, { "month": 5, "doNothing": { "cost": 337500, "csat": 81.33333333333333, "agentsNeeded": 54 }, "withAI": { "cost": 203700, "csat": 85.8, "agentsNeeded": 30 } }, { "month": 6, "doNothing": { "cost": 350000, "csat": 80.8, "agentsNeeded": 56 }, "withAI": { "cost": 210760, "csat": 85.8, "agentsNeeded": 31 } }, { "month": 7, "doNothing": { "cost": 368750, "csat": 80.26666666666667, "agentsNeeded": 59 }, "withAI": { "cost": 224070, "csat": 85.8, "agentsNeeded": 33 } }, { "month": 8, "doNothing": { "cost": 387500, "csat": 79.73333333333333, "agentsNeeded": 62 }, "withAI": { "cost": 231130, "csat": 85.8, "agentsNeeded": 34 } }, { "month": 9, "doNothing": { "cost": 400000, "csat": 79.2, "agentsNeeded": 64 }, "withAI": { "cost": 244440, "csat": 85.8, "agentsNeeded": 36 } }, { "month": 10, "doNothing": { "cost": 418750, "csat": 78.66666666666667, "agentsNeeded": 67 }, "withAI": { "cost": 251500, "csat": 85.8, "agentsNeeded": 37 } }, { "month": 11, "doNothing": { "cost": 437500, "csat": 78.13333333333333, "agentsNeeded": 70 }, "withAI": { "cost": 264810, "csat": 85.8, "agentsNeeded": 39 } }, { "month": 12, "doNothing": { "cost": 450000, "csat": 77.6, "agentsNeeded": 72 }, "withAI": { "cost": 271870, "csat": 85.8, "agentsNeeded": 40 } } ], "cfo": { "title": "ROI Snapshot", "investment": { "year1": "150K", "description": "AI platform + integration" }, "returnOnInvestment": { "year1": "2.1M", "description": "Cost avoidance + avoided hires" }, "paybackPeriod": "1 months", "threeYearROI": "4175%", "talkingPoint": "At 1.8x volume, we avoid hiring 32 agents ($2.4M/yr) while maintaining a 84 CSAT." }, "ceo": { "title": "Strategic Positioning", "northStarLabel": "COST EFFICIENCY & CUSTOMER EXPERIENCE", "narrative": "We're not replacing agents: we're building a team that can handle 1.8x the volume without 1.8x the cost. AI handles the repetitive work. Our people handle the moments that matter.", "competitiveEdge": [ "Competitors scaling with headcount → linear cost growth", "Our approach → sublinear cost, superlinear quality" ], "talkingPoint": "This isn't a cost play. It's a cost efficiency & customer experience play that happens to save money." }, "team": { "title": "What Changes (And What Doesn't)", "staysTheSame": [ "Your expertise matters more, not less", "Complex cases still need human judgement", "Quality standards don't change" ], "evolves": [ "AI handles repetitive tickets (password resets, status checks, simple refunds)", "You focus on the interesting, complex problems", "New skills: AI oversight, workflow design, quality review" ], "talkingPoint": "More interesting work, not fewer jobs. The AI does the boring stuff so you can do the work that actually requires a human." } }, "summary": "At 1.8x today's ticket volume, a 40-agent team would need 72 agents without AI; with AI resolving 45% it needs 40 (SLA risk LOW). By month 12 the monthly cost is $271,870 with AI vs $450,000 without, and the CFO view puts annual savings at $2.1M against a $150K investment, paying back in 1 months. The case is framed for cost efficiency and customer experience.", "links": { "open_in_browser": "https://www.lorikeet.tools/build-the-case", "start_free_trial": "https://app.lorikeetcx.ai/sign-up?utm_source=lorikeet.tools&utm_medium=api&utm_campaign=self-serve-launch&utm_content=build-the-case-api-start-free-trial&cta=build-the-case-api", "book_demo": "https://www.lorikeetcx.ai/get-a-demo?utm_source=build-the-case&utm_medium=api&utm_campaign=cx-tools&utm_content=api" }, "powered_by": "Lorikeet, https://www.lorikeetcx.ai" } ``` ### AI Reporting Playbook (`show-the-value`) Create a value narrative connecting AI support metrics to business outcomes executives care about. - Run: `POST https://www.lorikeet.tools/api/tools/show-the-value` - Describe (JSON Schema, defaults, example): `GET https://www.lorikeet.tools/api/tools/show-the-value` - Web tool: https://www.lorikeet.tools/show-the-value Notes: - Text in the result is the web tool copy, with dashes rendered as colons. - selectedMetrics must come from the phase's metric list; a dip needs at least 2 of them and must name selected metrics. - The web tool has no URL parameters, so open_in_browser opens it at the first section. Inputs (see the notes for what is required; omitted settings take the web tool defaults): | Field | Type | Range | Default | Meaning | |---|---|---|---|---| | northStar | "scale" | "retention" | "cost_efficiency" | "customer_experience" | "revenue" | | "scale" | The business outcome the AI story builds to: scale, retention, cost_efficiency, customer_experience, revenue. Defaults to scale, the first option on the page. | | phase | "pilot" | "scaling" | "optimising" | | "pilot" | Deployment phase: pilot (month 1-2), scaling (month 3-6) or optimising (month 6+). Defaults to pilot, the first option. | | audience | "team" | "leadership" | "board" | | "leadership" | Who the report is for (team, leadership or board); flags which metrics suit them. | | selectedMetrics | array | | [] | Up to 3 metrics to report, from the phase's list (pilot: csat, resolution_rate, automation_rate, first_response_time, escalation_rate; scaling: csat, resolution_rate, automation_rate, cost_per_resolution, agent_utilisation, escalation_rate; optimising: csat, resolution_rate, automation_rate, cost_per_resolution, customer_effort_score, agent_utilisation, independent_resolution_rate). The first two form the draft narrative. | | annotations | object | | {} | Optional note per selected metric, keyed by metric (up to 300 characters each). | | dip | object or null | | null | A metric that dipped (or moved) this month, for the "Handle the Hard Month" reframe; needs 2 selected metrics. null for none. | Result fields: - `northStar`: id and label. - `phase`: id, label and timeframe. - `audience`: The audience input. - `metrics`: The phase's metrics: key, name, type (leading or lagging), lagTime (what it predicts or confirms), phases, relevantForAudience, and suggestedAnnotation (a note the web tool suggests, or null). - `chain`: The value chain for the north star, 5 steps: position, metric, metricLabel, label, acceptable (alternative metric keys) and explanationToNext (why this step drives the next, with research; null where the web tool shows none). - `expectations`: What is normal in the phase: benchmark ranges (min, typical, good, unit) for automationRate, resolutionRate and phase specific metrics, csat expectation, timeframe, focus, normalDips and reportingGuidance (cadence by audience). - `retire`: Vanity metrics to stop reporting: id, epitaph (the metric), revelation (why) and replacement (name, description). - `narrative`: Draft narrative from the first two selected metrics ("Your argument: ..."), or null with fewer than 2. - `supportingMetrics`: Value chain metrics not selected, to mention as context. - `frameworkText`: The "What to Report" panel as copyable text: selected metrics with type, lag and notes, plus the reporting guidance. - `reframe`: For a dip: a paragraph framing the change with the leading indicator and the normal recovery time for the phase; null without a dip. Example: ```bash curl -s -X POST https://www.lorikeet.tools/api/tools/show-the-value \ -H 'content-type: application/json' \ -d '{"northStar":"retention","phase":"scaling","audience":"leadership","selectedMetrics":["automation_rate","csat"],"dip":{"metric":"csat","from":82,"to":79,"reason":"Expanded to new ticket categories","leadingMetric":"automation_rate","leadingRate":38}}' ``` Response: ```json { "tool": "show-the-value", "version": "1.0.0", "inputs": { "northStar": "retention", "phase": "scaling", "audience": "leadership", "selectedMetrics": [ "automation_rate", "csat" ], "annotations": {}, "dip": { "metric": "csat", "from": 82, "to": 79, "reason": "Expanded to new ticket categories", "leadingMetric": "automation_rate", "leadingRate": 38 } }, "result": { "northStar": { "id": "retention", "label": "Retention" }, "phase": { "id": "scaling", "label": "Scaling", "timeframe": "Month 3-6" }, "audience": "leadership", "metrics": [ { "key": "csat", "name": "CSAT", "type": "lagging", "lagTime": "Confirms resolution quality from 2-4 weeks ago", "phases": [ "pilot", "scaling", "optimising" ], "relevantForAudience": true, "suggestedAnnotation": null }, { "key": "resolution_rate", "name": "Resolution Rate", "type": "leading", "lagTime": "Predicts CSAT in 2-4 weeks", "phases": [ "pilot", "scaling", "optimising" ], "relevantForAudience": true, "suggestedAnnotation": null }, { "key": "automation_rate", "name": "Automation Rate", "type": "leading", "lagTime": "Predicts cost savings in 1-2 months", "phases": [ "pilot", "scaling", "optimising" ], "relevantForAudience": true, "suggestedAnnotation": "Expanded to 3 new categories this month. Rate dips before it climbs." }, { "key": "cost_per_resolution", "name": "Cost per Resolution", "type": "lagging", "lagTime": "Confirms operational efficiency from prior quarter", "phases": [ "scaling", "optimising" ], "relevantForAudience": true, "suggestedAnnotation": "Integration costs front-loaded. Per-resolution cost drops as volume grows." }, { "key": "agent_utilisation", "name": "Agent Utilisation", "type": "leading", "lagTime": "Predicts capacity/burnout in 1-2 months", "phases": [ "scaling", "optimising" ], "relevantForAudience": false, "suggestedAnnotation": null }, { "key": "escalation_rate", "name": "Escalation Rate", "type": "leading", "lagTime": "Predicts resolution quality in 1-2 weeks", "phases": [ "pilot", "scaling" ], "relevantForAudience": true, "suggestedAnnotation": null } ], "chain": [ { "position": 1, "metric": "automation_rate", "metricLabel": "Automation Rate", "label": "Operational Efficiency", "acceptable": [ "resolution_rate" ], "explanationToNext": "AI handles routine tickets instantly, freeing agents for complex cases. Overall resolution rate improves because simple tickets are no longer queuing behind hard ones." }, { "position": 2, "metric": "resolution_rate", "metricLabel": "Resolution Rate", "label": "Resolution Quality", "acceptable": [ "automation_rate" ], "explanationToNext": "Higher resolution rate means fewer customers left waiting or unresolved. Research: CSAT varies by up to 50% between first-contact resolution and multi-contact (COPC/SQM Group)." }, { "position": 3, "metric": "csat", "metricLabel": "CSAT", "label": "Customer Satisfaction", "acceptable": [], "explanationToNext": "Satisfied customers report lower effort. Gartner/CEB research: 94% of low-effort customers intend to repurchase vs. 4% of high-effort customers." }, { "position": 4, "metric": "customer_effort_score", "metricLabel": "Customer Effort Score", "label": "Customer Effort", "acceptable": [ "nps" ], "explanationToNext": "Lower effort = lower churn. Bain & Company: a 5% increase in retention increases profits 25-95% (Reichheld)." }, { "position": 5, "metric": "churn_reduction", "metricLabel": "Churn Reduction", "label": "Business Outcome", "acceptable": [ "retention_rate" ], "explanationToNext": null } ], "expectations": { "automationRate": { "min": 20, "typical": 35, "good": 50, "unit": "%" }, "resolutionRate": { "min": 65, "typical": 75, "good": 85, "unit": "%" }, "csat": { "expectation": "Should stabilise; may dip when expanding categories" }, "costPerResolution": { "expectation": "Decreasing trend as AI handles more volume" }, "timeframe": "3-6 months", "focus": "Expanding coverage and building confidence", "normalDips": [ "Rate dips when adding new categories", "Cost per resolution front-loaded", "Agent adjustment period" ], "reportingGuidance": "Report bi-weekly to leadership. Monthly to board. Show trend lines, not snapshots. Annotate everything." }, "retire": [ { "id": "deflection", "epitaph": "Deflection Rate", "revelation": "Deflection ≠ resolution. A customer who was deflected but not helped costs you more in the long run. Deflection rate measures how many customers you turned away: not how many you helped.", "replacement": { "name": "Independent Resolution Rate", "description": "What percentage of tickets did AI resolve to the customer’s satisfaction without human intervention? This is the metric your CEO will care about most." } }, { "id": "handled", "epitaph": "AI Handled 40% of Volume", "revelation": "Handled how? Did the customer’s problem get solved? “Handled” could mean the AI responded: not that the customer was helped.", "replacement": { "name": "AI Independently Resolved 40% of Tickets to Customer Satisfaction", "description": "The qualifier matters. “To customer satisfaction” means the ticket was resolved AND the customer confirmed (or didn’t reopen)." } }, { "id": "hours", "epitaph": "We Saved X Hours", "revelation": "Hours saved doing what? If agents saved 200 hours but spent them on busywork, you saved nothing. “Hours saved” is a proxy metric that sounds impressive but tells you nothing about outcomes.", "replacement": { "name": "Agents Spend 60% of Time on Complex, High-Value Interactions", "description": "This tells the real story: AI handles the simple stuff, humans handle the hard stuff." } } ], "narrative": "Your argument: Automation Rate (leading) predicts CSAT, which drives Retention.", "supportingMetrics": [ "resolution_rate", "customer_effort_score", "churn_reduction" ], "frameworkText": "Reporting Framework: Scaling Phase\n\nKey Metrics:\n • Automation Rate (leading): Predicts cost savings in 1-2 months\n • CSAT (lagging): Confirms resolution quality from 2-4 weeks ago\n\nReporting guidance: Report bi-weekly to leadership. Monthly to board. Show trend lines, not snapshots. Annotate everything.", "reframe": "CSAT dipped from 82 to 79 (3.0) because: Expanded to new ticket categories. However, leading indicators (Automation Rate at 38%) suggest recovery within 4-6 weeks. This is consistent with category expansion dips and does not indicate a systemic issue." }, "summary": "In the scaling phase (month 3-6), a retention story runs Automation Rate to Resolution Rate to CSAT to Customer Effort Score to Churn Reduction; for a leadership audience, report CSAT, Resolution Rate, Automation Rate, Cost per Resolution and Escalation Rate. A typical automation rate in this phase is 35% (good: 50%). Your argument: Automation Rate (leading) predicts CSAT, which drives Retention.", "links": { "open_in_browser": "https://www.lorikeet.tools/show-the-value", "start_free_trial": "https://app.lorikeetcx.ai/sign-up?utm_source=lorikeet.tools&utm_medium=api&utm_campaign=self-serve-launch&utm_content=show-the-value-api-start-free-trial&cta=show-the-value-api", "book_demo": "https://www.lorikeetcx.ai/get-a-demo?utm_source=show-the-value&utm_medium=api&utm_campaign=cx-tools&utm_content=api" }, "powered_by": "Lorikeet, https://www.lorikeetcx.ai" } ``` ### Design Your AI Agent (`ai-identity`) Define an AI agent's personality, tone, and boundaries, from name to escalation style. - Run: `POST https://www.lorikeet.tools/api/tools/ai-identity` - Describe (JSON Schema, defaults, example): `GET https://www.lorikeet.tools/api/tools/ai-identity` - Web tool: https://www.lorikeet.tools/ai-identity Inputs (all optional; omitted fields take the web tool defaults): | Field | Type | Range | Default | Meaning | |---|---|---|---|---| | industry | "retail" | "travel" | "financial_services" | "healthcare" | "technology" | "insurance" | "telco" | "media" | | "retail" | Industry: retail, travel, financial_services, healthcare, technology, insurance, telco, media. Defaults to retail (the web tool asks you to pick one). | | companyName | string | | "" | Company name, used in brand extension names ("[Brand] Assist"); "Brand" when empty, as in the web tool. | | namingDirection | "human_name" | "human_ish_name" | "brand_extension" | "character_name" | "no_name" or null | | null | Naming direction to suggest names for: human_name, human_ish_name, brand_extension, character_name, no_name. null returns suggestions for every direction. | | disclosureStrategy | "upfront" | "subtle" | "none" or null | | null | The AI disclosure strategy chosen (upfront, subtle or none), or null. Choosing none in a regulated industry sets regulatedIndustryWarning. | | personalitySliders | object | | {"warmth":50,"formality":50,"personality":50,"proactivity":50} | Tone sliders, whole numbers 0 to 100 (each defaults to 50). Used to find the closest personality preset. | Result fields: - `industry`: id and display label. - `naming`: directions: every naming direction (human_name, human_ish_name, brand_extension, character_name, no_name) with label, description, rating (green good fit, amber could work, grey probably not) and ratingLabel for the industry; goodFit: the green directions; rationale: why, for this industry. - `names`: Per naming direction (the one asked for, or all five): suggestions, each a name (with [Brand] filled in) and a rationale. - `disclosure`: Recommended disclosure for the industry: recommendedStrategy and recommendedLabel, regulatoryContext, trustImpact, statistic with statisticSource, and recommendation; chosenStrategy echoes the input, and regulatedIndustryWarning is true when none is chosen in financial services, healthcare or insurance. - `personality`: recommendedPresets: presets suited to the industry (id, name, description, slider values, traits, bestFor); closestPreset: the preset nearest the sliders (Euclidean distance). Example: ```bash curl -s -X POST https://www.lorikeet.tools/api/tools/ai-identity \ -H 'content-type: application/json' \ -d '{"industry":"financial_services","companyName":"Acme Bank","namingDirection":"brand_extension","disclosureStrategy":"upfront","personalitySliders":{"warmth":45,"formality":75,"personality":30,"proactivity":55}}' ``` Response: ```json { "tool": "ai-identity", "version": "1.0.0", "inputs": { "industry": "financial_services", "companyName": "Acme Bank", "namingDirection": "brand_extension", "disclosureStrategy": "upfront", "personalitySliders": { "warmth": 45, "formality": 75, "personality": 30, "proactivity": 55 } }, "result": { "industry": { "id": "financial_services", "label": "Financial Services" }, "naming": { "directions": [ { "position": "human_name", "label": "Human Name", "description": "A recognizable human first name. Creates personal connection but carries the risk of implying the AI is a real person.", "rating": "amber", "ratingLabel": "Could work" }, { "position": "human_ish_name", "label": "Human-ish Name", "description": "A name that sounds like it could be a person but is distinctive enough to signal it might not be. Balances personality with honesty.", "rating": "amber", "ratingLabel": "Could work" }, { "position": "brand_extension", "label": "Brand Extension", "description": "The company brand name combined with a descriptor. Maximizes brand recognition and is transparent about the AI's role.", "rating": "green", "ratingLabel": "Good fit" }, { "position": "character_name", "label": "Character Name", "description": "A creative, non-human name with personality. Clearly signals 'not a person' while still being memorable and engaging.", "rating": "amber", "ratingLabel": "Could work" }, { "position": "no_name", "label": "No Name", "description": "A functional label describing what the tool does. Maximum clarity and zero pretense, but misses the opportunity for brand personality.", "rating": "green", "ratingLabel": "Good fit" } ], "goodFit": [ "brand_extension", "no_name" ], "rationale": "Regulated environment demands caution. Human names risk implying a licensed advisor is responding. Brand extensions are safest -- they maintain trust while being transparent. No-name (e.g., 'Account Support') is also strong because it avoids personification entirely. Character and human-ish names can work if clearly paired with AI disclosure." }, "names": [ { "position": "brand_extension", "suggestions": [ { "name": "Acme Bank Advisor", "rationale": "Positions the AI as a knowledgeable guide, aligning with financial advisory expectations." }, { "name": "Acme Bank Assist", "rationale": "Clear and functional, avoids any implication of regulated financial advice." }, { "name": "Acme Bank AI", "rationale": "Maximum transparency, signals technology without making service promises." }, { "name": "Acme Bank Smart", "rationale": "Implies intelligent assistance, works for banks promoting AI-powered insights." }, { "name": "Acme Bank Guide", "rationale": "Helpful without being prescriptive, carefully navigates regulatory boundaries." }, { "name": "Acme Bank Secure", "rationale": "Emphasizes security, the number one concern for financial services customers." } ] } ], "disclosure": { "recommendedStrategy": "upfront", "recommendedLabel": "Upfront Disclosure", "regulatoryContext": "Heavily regulated. CFPB guidance requires transparency in automated financial interactions. Multiple state laws mandate AI disclosure for 'high-risk' interactions including financial services. SEC and FINRA have issued guidance on AI in client communications. California ADMT rules (effective Jan 2027) will require pre-use notice for AI making financial decisions.", "trustImpact": "Financial services customers rank trust as their #1 priority. Upfront AI disclosure, when combined with clear capability scoping, actually reduces anxiety by setting expectations. The key is pairing disclosure with reassurance about security and human oversight.", "statistic": "Only 12% of consumers prefer AI chatbots over humans for financial support, the lowest preference of any industry. However, satisfaction scores improve 22% when AI agents clearly disclose their nature upfront versus being discovered mid-conversation.", "statisticSource": "Katana Consumer Preference Survey 2025; MIT Sloan Management Review AI Disclosure Study", "recommendation": "Upfront disclosure is both legally prudent and trust-building in financial services. Frame it positively: 'I'm [Name], your AI assistant. I can help with account inquiries, transaction history, and general guidance. For investment advice or complex account changes, I'll connect you with a licensed advisor.' Always clarify what the AI cannot do (regulated financial advice) alongside what it can.", "chosenStrategy": "upfront", "regulatedIndustryWarning": false }, "personality": { "recommendedPresets": [ { "id": "professional_efficient", "name": "The Professional", "description": "Polished and efficient. Gets straight to the point with clear, structured responses. Respects the customer's time and maintains a composed, competent tone throughout. Best for industries where trust and precision matter more than charm.", "sliders": { "warmth": 35, "formality": 78, "personality": 20, "proactivity": 45 }, "traits": [ "Concise and structured", "Uses proper grammar and complete sentences", "Avoids exclamation marks and emoji", "Leads with facts and next steps", "Acknowledges issues without over-apologizing" ], "bestFor": [ "Financial services", "Insurance", "Healthcare", "Enterprise technology", "Legal services" ] } ], "closestPreset": { "id": "professional_efficient", "name": "The Professional", "description": "Polished and efficient. Gets straight to the point with clear, structured responses. Respects the customer's time and maintains a composed, competent tone throughout. Best for industries where trust and precision matter more than charm.", "sliders": { "warmth": 35, "formality": 78, "personality": 20, "proactivity": 45 }, "traits": [ "Concise and structured", "Uses proper grammar and complete sentences", "Avoids exclamation marks and emoji", "Leads with facts and next steps", "Acknowledges issues without over-apologizing" ], "bestFor": [ "Financial services", "Insurance", "Healthcare", "Enterprise technology", "Legal services" ] } } }, "summary": "For Financial Services, the good-fit naming directions are brand extension and no name; upfront disclosure is recommended, and the closest personality preset to the sliders is The Professional. Suggested names for the brand extension direction include Acme Bank Advisor, Acme Bank Assist, Acme Bank AI.", "links": { "open_in_browser": "https://www.lorikeet.tools/ai-identity?cn=Acme+Bank&i=financial_services&ds=upfront&sp=brand_extension&ps=45%2C75%2C30%2C55", "start_free_trial": "https://app.lorikeetcx.ai/sign-up?utm_source=lorikeet.tools&utm_medium=api&utm_campaign=self-serve-launch&utm_content=ai-identity-api-start-free-trial&cta=ai-identity-api", "book_demo": "https://www.lorikeetcx.ai/get-a-demo?utm_source=ai-identity&utm_medium=api&utm_campaign=cx-tools&utm_content=api" }, "powered_by": "Lorikeet, https://www.lorikeetcx.ai" } ``` ### AI Rollout Playbook (`change-comms`) Plan internal and external communications for an AI support rollout, stakeholder by stakeholder. - Run: `POST https://www.lorikeet.tools/api/tools/change-comms` - Describe (JSON Schema, defaults, example): `GET https://www.lorikeet.tools/api/tools/change-comms` - Web tool: https://www.lorikeet.tools/change-comms Notes: - Returns the playbook copy the web tool starts each chapter with, for these answers: stakeholder talking points, worry wall, one-line story, announcement email, meeting script, FAQ, 30-day plan, comms rhythm and the agent perspective. In the web tool every card can then be edited. - Text in the result is the web tool copy, with dashes rendered as colons. Placeholders such as [Leader Name] and [X] are left for you to fill. - The web tool has no URL parameters, so open_in_browser opens it at the onboarding questions. Inputs (see the notes for what is required; omitted settings take the web tool defaults): | Field | Type | Range | Default | Meaning | |---|---|---|---|---| | leaderRole | "team_leads" | "senior_leadership" | "adjacent_teams" | | "team_leads" | Your role in the rollout: team_leads (Team Lead), senior_leadership (Senior Leader) or adjacent_teams (HR, Ops or other). Picks the 30-day plan, the comms rhythm, the story suggestions and the worry wall intro, and hides your own group from the stakeholder map. Defaults to team_leads, the first card. | | teamSize | 5 | 10 | 20 | 50 | 100 | 200 | | 10 | Agents on the team: 5, 10, 20, 50, 100, 200. Labels the plan; the copy does not change with it. | | teamMood | "curious" | "nervous" | "resistant" | | "nervous" | How the team feels about AI: curious, nervous or resistant. Picks the worry wall, the email and meeting script wording, the emotional arc and the frontline sentiment. | | rolloutStage | "not_started" | "about_to_announce" | "pilot" | "live" | | "about_to_announce" | Where the rollout is: not_started, about_to_announce, pilot or live. Labels the plan; the copy does not change with it. | | teamName | string | | "Support team" | Team name, used in the email subject ("Team" when empty, as in the web tool). | | stakeholders | object | | {} | Changes to the stakeholder map, keyed by frontline_agents, team_leads, senior_leadership or adjacent_teams. The map starts with frontline agents high priority (sentiment from the team mood), team leads high and neutral, senior leadership medium and supportive, adjacent teams low and neutral. | | narrativeAnchor | object | | {"blank1":"","blank2":""} | The one-line story: "We're introducing AI to {blank1} so that {blank2}." With either blank empty the web tool uses a generic line. The result lists suggestions for both blanks. | | emailTone | "very_formal" | "formal" | "balanced" | "conversational" | "very_casual" | | "balanced" | Announcement email tone: very_formal, formal, balanced, conversational, very_casual. Sets the greeting and sign-off. | Result fields: - `stakeholders`: Stakeholder map (your own group left out): audience, label, priority, sentiment and talkingPoints (what to say to that group at that sentiment). - `worryWall`: intro for your role, and questions the team will ask for the mood: id, question, response (what to say) and framingGuidance. - `narrativeAnchor`: text: the one-line story; suggestions: options for blank1 and blank2 for your role. - `email`: Announcement email: subject, sections (key, label, text: greeting, anchor, what is happening, what it means for you, what happens next, FAQ link, sign-off) and body (the whole email as plain text). The agent view and the PDFs show this same subject and body. - `meetingScript`: All-hands script, 4 moments: id, title, copy (talking points and framing guidance). - `faq`: FAQ: question, answer and confidence (green ready to share, amber needs sign-off). - `thirtyDayPlan`: First 30 days for your role, 5 touchpoints: day, title, category (communication, training, checkin, milestone), guidance and deliverable (a ready-to-use template). - `emotionalJourney`: The agent's emotional arc over the 30 days: dayRange, day, emoji, label and experience. - `commsRhythm`: Ongoing comms tracks for your role: row, label, description (null where the web tool shows none) and weekly, monthly and quarterly cells (active, template). - `weekInTheLife`: What regular comms look like to an agent over a week (built from the default comms rhythm for leaderRole, as the agent view shows it): day, title, description. - `agentObservations`: What agents are thinking before the announcement. Example: ```bash curl -s -X POST https://www.lorikeet.tools/api/tools/change-comms \ -H 'content-type: application/json' \ -d '{"leaderRole":"senior_leadership","teamSize":50,"teamMood":"resistant","rolloutStage":"pilot","narrativeAnchor":{"blank1":"scale our support capacity without proportionally scaling headcount","blank2":"meet growing demand without compromising quality"},"emailTone":"formal"}' ``` Response: ```json { "tool": "change-comms", "version": "1.1.0", "inputs": { "leaderRole": "senior_leadership", "teamSize": 50, "teamMood": "resistant", "rolloutStage": "pilot", "teamName": "Support team", "stakeholders": {}, "narrativeAnchor": { "blank1": "scale our support capacity without proportionally scaling headcount", "blank2": "meet growing demand without compromising quality" }, "emailTone": "formal" }, "result": { "stakeholders": [ { "audience": "frontline_agents", "label": "Frontline Agents", "priority": "high", "sentiment": "opposed", "talkingPoints": [ "Listen first: ask what their biggest worry is before explaining", "Show a live demo rather than making promises", "Frame them as the quality safety net, not a bottleneck", "Give them agency: let them flag AI mistakes directly" ] }, { "audience": "team_leads", "label": "Team Leads", "priority": "high", "sentiment": "neutral", "talkingPoints": [ "Focus on how this helps them manage capacity and reduce burnout", "Share the rollout timeline so they can plan around it", "Position them as the bridge between leadership and the floor" ] }, { "audience": "adjacent_teams", "label": "Adjacent Teams", "priority": "low", "sentiment": "neutral", "talkingPoints": [ "Send a brief FYI with what is changing and what is not", "Clarify any impacts to shared workflows or handoffs", "Offer a Q&A session if they want to learn more" ] } ], "worryWall": { "intro": "Your team leads will field these questions from their agents. Knowing them helps you craft leadership messaging that cascades down cleanly.", "questions": [ { "id": "replacing", "question": "Am I being replaced?", "response": "No. Be direct. Say the word. 'I know some of you are thinking: does this mean job cuts? Let me be direct: no. Here's why...'", "framingGuidance": "Even curious teams harbour this fear quietly. Address it early and unprompted to build trust before anyone has to ask." }, { "id": "day_to_day", "question": "What changes in my day-to-day?", "response": "Be specific. 'The AI handles [types of tickets]. You handle [types of tickets]. Here's a sample of each.'", "framingGuidance": "Concrete examples beat abstract promises. Pull real ticket examples from your queue so people can see themselves in the explanation." }, { "id": "wrong_answers", "question": "What if the AI gives wrong answers?", "response": "Acknowledge it. 'It will make mistakes: just like a new hire on day one. The difference is, it learns faster and you're in control of what it learns.'", "framingGuidance": "Admitting imperfection is more credible than claiming perfection. Position the team as the safety net, not the bottleneck." }, { "id": "layoffs", "question": "Does this mean layoffs?", "response": "Address head-on. 'Our goal is to handle [X] more tickets without burning out the team. We need more capacity, not fewer people.'", "framingGuidance": "Nervous teams need you to say the scary word out loud so they know you are not avoiding it. Then reframe around growth." }, { "id": "train_replacement", "question": "Will I have to train my replacement?", "response": "Reframe: 'You're the expert. The AI can only be as good as what you teach it. You're not training a replacement: you're building a tool.'", "framingGuidance": "This fear is really about agency. Emphasise that their expertise is the input, not the output being replaced." }, { "id": "who_decided", "question": "Who decided this?", "response": "Be transparent. 'I did, with input from [leaders]. Here's why, and here's how your voice shapes what comes next.'", "framingGuidance": "Resistant teams often feel things were done to them. Naming the decision-maker and inviting input restores agency." }, { "id": "dont_want", "question": "What if I don't want to work with AI?", "response": "Empathise, then redirect. 'That's a fair feeling. Let me show you what it actually looks like: not what you're imagining: and then let's talk.'", "framingGuidance": "Resistance is often rooted in imagined worst-cases. A live demo is worth a thousand reassurances." } ] }, "narrativeAnchor": { "text": "We're introducing AI to scale our support capacity without proportionally scaling headcount so that meet growing demand without compromising quality.", "suggestions": { "blank1": [ "scale our support capacity without proportionally scaling headcount", "demonstrate a measurable return on our technology investment", "free our agents from high-volume routine work", "improve service metrics without adding headcount" ], "blank2": [ "report measurable ROI to the board at the next review", "meet growing demand without compromising quality", "focus on relationship-driven work that AI can’t do", "deliver on the strategic commitment we’ve made" ] } }, "email": { "subject": "Support team + AI: What's changing and why", "sections": [ { "key": "greeting", "label": "Greeting", "text": "Hello Team" }, { "key": "anchor", "label": "Narrative anchor", "text": "We're introducing AI to scale our support capacity without proportionally scaling headcount so that meet growing demand without compromising quality." }, { "key": "whats_happening", "label": "What's happening", "text": "We're introducing an AI teammate to handle straightforward, repetitive tickets: things like password resets, order status checks, and simple FAQs. This means faster responses for customers and more bandwidth for you to focus on the complex, high-value work." }, { "key": "what_it_means", "label": "What this means for you", "text": "I know there's scepticism, and I respect that. You've earned the right to be cautious. Here's what I can tell you directly: no headcount changes are tied to this. The AI handles straightforward tickets so you can focus on the complex work only you can do. I'm asking you to watch it in action before forming a final opinion." }, { "key": "whats_next", "label": "What happens next", "text": "Week 1-2: AI handles a small set of simple ticket types with full human review\nWeek 3-4: Team reviews AI performance data and provides feedback\nMonth 2: Gradual expansion based on your input and quality metrics\nOngoing: Monthly check-ins where you decide the pace of expansion" }, { "key": "faq_link", "label": "FAQ link", "text": "We've put together an FAQ covering the most common questions. I'd encourage you to read through it, and please come to me directly with anything that isn't covered." }, { "key": "signoff", "label": "Sign-off", "text": "Best regards" } ], "body": "Hello Team\n\nWe're introducing AI to scale our support capacity without proportionally scaling headcount so that meet growing demand without compromising quality.\n\nI want to share what this means for you.\n\nWe're introducing an AI teammate to handle straightforward, repetitive tickets: things like password resets, order status checks, and simple FAQs. This means faster responses for customers and more bandwidth for you to focus on the complex, high-value work.\n\nI know there's scepticism, and I respect that. You've earned the right to be cautious. Here's what I can tell you directly: no headcount changes are tied to this. The AI handles straightforward tickets so you can focus on the complex work only you can do. I'm asking you to watch it in action before forming a final opinion.\n\nWeek 1-2: AI handles a small set of simple ticket types with full human review\nWeek 3-4: Team reviews AI performance data and provides feedback\nMonth 2: Gradual expansion based on your input and quality metrics\nOngoing: Monthly check-ins where you decide the pace of expansion\n\nWe've put together an FAQ covering the most common questions. I'd encourage you to read through it, and please come to me directly with anything that isn't covered.\n\nBest regards\n\n[Leader Name]" }, "meetingScript": [ { "id": "moment-1", "title": "Start with the business context", "copy": "Open with why, not what. 'Our ticket volume is up 30% year-over-year. We've been asking the team to absorb that growth, and it's not sustainable. That's why we're introducing AI: not to replace anyone, but to handle the repetitive work so you can focus on the complex problems only you can solve.'\n\nFraming guidance: Lead with a number the team already feels in their bones. When they nod at the problem, they're primed to hear the solution." }, { "id": "moment-2", "title": "Address the fear directly", "copy": "Don't wait for someone to ask: they won't, and the silence will fester. Open with: 'I know there's scepticism in this room, and I respect that. You've earned the right to push back.' Then be specific: 'Here's what I decided, here's why, and here's what you control in this process.'\n\nFraming guidance: Resistant teams have often been burned before. Acknowledge that directly. Don't oversell: present facts, name the risks honestly, and give people a real feedback mechanism, not a suggestion box." }, { "id": "moment-3", "title": "Demo a real example", "copy": "Show, don't tell. Pull up a real ticket from your queue: the kind the AI will handle. Walk through it live: 'Here's a password reset ticket from yesterday. Watch what happens when the AI processes it.' Then show the human review step: 'And here's where you stay in control.'\n\nFraming guidance: Abstract promises create anxiety. A 60-second live demo does more than 20 minutes of slides. Pick a ticket type everyone recognises as tedious." }, { "id": "moment-4", "title": "Budget 40% for questions", "copy": "Budget at least 40%: maybe more: for questions. With a resistant room, consider making it 50%. Say: 'I expect hard questions and I want them. If I don't have an answer, I'll say so and come back to you within 48 hours.' Have a visible way to capture questions (whiteboard, shared doc) so nothing gets lost.\n\nFraming guidance: Resistant teams need to see their concerns taken seriously in real time. Write questions down visibly. Follow up on every single one. The follow-through after this meeting matters more than the meeting itself." } ], "faq": [ { "question": "Am I being replaced?", "answer": "No. We're introducing AI to handle the repetitive, high-volume tickets: password resets, order status checks, simple FAQs. Your role is shifting toward the complex, high-value work that requires human judgement, empathy, and creativity. We need more capacity, not fewer people.", "confidence": "green" }, { "question": "What changes in my day-to-day?", "answer": "In the first few weeks, very little. You'll see a new column showing AI-drafted responses for certain ticket types, and we'll ask you to review them. Over time, the AI takes on more routine tickets, which means your queue shifts toward the interesting, complex problems. We'll provide training and support for every change.", "confidence": "green" }, { "question": "Does this mean layoffs?", "answer": "No headcount changes are tied to this initiative. Our ticket volume is growing faster than we can hire, and this is about adding capacity to the team: not reducing it. If that ever changes, you'll hear it from leadership directly, not discover it through a tool rollout.", "confidence": "amber" }, { "question": "What if the AI gives wrong answers?", "answer": "It will make mistakes: just like a new hire on day one. The difference is that every AI response goes through quality checks and human review during the pilot. You are the safety net. If you spot an error, flag it and the AI learns from the correction. We have automatic pause triggers if quality drops below our threshold.", "confidence": "green" }, { "question": "Who decided this?", "answer": "This decision was made by [Leader Name] with input from [leadership team]. We evaluated several options and chose this approach because [brief rationale]. Your voice shapes how this rolls out: the pilot timeline, the ticket types, and the expansion pace are all informed by your feedback.", "confidence": "amber" } ], "thirtyDayPlan": [ { "day": 2, "title": "Executive briefing", "category": "communication", "guidance": "Brief your executive peers and direct reports within 48 hours of the pilot launch. Set the strategic frame clearly: this is not an IT project: it is a capability investment with measurable business outcomes. Align on the metrics you will use to declare success.", "deliverable": "Executive Briefing: Talking Points\n\nContext:\nWe have launched a 30-day pilot of [AI tool] in our [team name] support function. This briefing covers the rationale, expected outcomes, and what we need from leadership.\n\nStrategic rationale:\n- Our support volume is growing at [X]% YoY; headcount cannot scale at the same rate.\n- [AI tool] handles [ticket category] autonomously, freeing agents for complex, relationship-driven work.\n- Industry benchmark: teams at similar scale report [X]% reduction in average handling time within 60 days.\n\nSuccess metrics we are tracking:\n- Average handling time (target: reduce by [X]%)\n- First-contact resolution rate (target: maintain or improve)\n- Agent utilisation on complex tickets (target: increase from [X]% to [Y]%)\n- Cost per ticket (target: reduce by [X]%)\n\nWhat we need from leadership:\n- No competing change initiatives during the 30-day pilot window\n- [Sponsor name] visible endorsement in all-hands if asked\n- Budget confirmation for full rollout if pilot meets targets\n\nNext update: Day 14 metrics review." }, { "day": 7, "title": "Risk and liability review", "category": "checkin", "guidance": "Convene a focused session with Legal, Compliance, and Data/Privacy leads. Review the AI vendor's data handling agreements, confirm no regulated customer data flows through the model without consent, and agree on escalation protocols for edge cases. Document decisions for the board pack.", "deliverable": "Risk & Liability Review: Checklist\n\nData and privacy:\n[ ] Confirm which data fields are sent to [AI vendor] and under what data processing agreement\n[ ] Verify GDPR / regional data residency requirements are met\n[ ] Document data retention and deletion policy for AI-processed interactions\n[ ] Confirm customer consent language covers AI-assisted responses (if applicable)\n\nOperational risk:\n[ ] Define the escalation path when AI produces an incorrect or harmful response\n[ ] Establish agent authority to override AI output without manager approval\n[ ] Confirm AI-generated responses are logged and auditable\n\nLiability and vendor:\n[ ] Review SLA and liability clauses in vendor contract\n[ ] Confirm indemnification position for AI-generated content\n[ ] Identify insurance implications (check with risk team)\n\nDecisions and sign-offs:\nDecision 1: [description]: Owner: [name]: Deadline: [date]\nDecision 2: [description]: Owner: [name]: Deadline: [date]\n\nNext review: Day 30 board presentation." }, { "day": 14, "title": "Mid-pilot metrics review", "category": "milestone", "guidance": "At the midpoint, pull actual performance data and compare against your Day 2 targets. This is your early signal for whether to scale, adjust, or hold. Share findings with your executive sponsor and any board members who are tracking the initiative.", "deliverable": "Mid-Pilot Metrics Review: Template\n\nDate: Day 14\nAttendees: [Exec sponsor, team lead, operations, analytics]\n\nKPI Dashboard (Day 1 vs Day 14):\n| Metric | Baseline | Day 14 Actual | Target | RAG Status |\n|--------|----------|---------------|--------|------------|\n| Avg handling time | [X] min | [Y] min | [Z] min | 🟢/🟡/🔴 |\n| First-contact resolution | [X]% | [Y]% | [Z]% | 🟢/🟡/🔴 |\n| Tickets handled by AI |: | [Y]% | [Z]% | 🟢/🟡/🔴 |\n| CSAT score | [X] | [Y] | maintain | 🟢/🟡/🔴 |\n| Agent overtime hours | [X] hrs | [Y] hrs | reduce | 🟢/🟡/🔴 |\n\nKey findings:\n1. [Finding]\n2. [Finding]\n3. [Finding]\n\nRisks identified:\n- [Risk]: Mitigation: [action]\n\nRecommendation:\n[ ] On track: proceed to full rollout plan\n[ ] Adjustments needed: [specific changes]\n[ ] Pause and reassess: [reasons]\n\nNext: Day 30 board/exec impact presentation." }, { "day": 21, "title": "Cross-functional alignment", "category": "communication", "guidance": "By day 21, adjacent functions: Workforce Management, Quality Assurance, HR, Finance: need to understand how AI changes their processes too. WFM need to adjust staffing models. QA need to update evaluation frameworks. HR need to think about job descriptions. Get ahead of this now.", "deliverable": "Cross-functional Alignment: Briefing Note\n\nTo: [WFM / QA / HR / Finance leads]\nFrom: [Your name]\nRe: Implications of AI pilot for your function\n\nWhat has changed in the first 21 days:\n- [AI tool] is now handling [X]% of [ticket type] without agent intervention\n- Agent time freed up: approximately [X] hours/week per FTE\n- Quality scores on AI-handled tickets: [X]% within acceptable range\n\nImplications by function:\n\nWorkforce Management:\n- Existing staffing model assumes [X] agent per [Y] tickets. AI changes this ratio.\n- Recommended: reforecast headcount needs for Q[X] based on AI coverage rate\n- Action: [WFM lead] to update Erlang model by [date]\n\nQuality Assurance:\n- Current QA scorecard does not account for AI-drafted responses reviewed by agents\n- Recommended: add \"AI oversight quality\" dimension to QA framework\n- Action: [QA lead] to propose updated scorecard by [date]\n\nHR / People:\n- Job descriptions for [role title] may need updating to reflect AI-augmented workflow\n- Recommended: review JDs for next hiring cycle\n- Action: [HR lead] to flag any immediate concerns by [date]\n\nFinance:\n- Cost per ticket projection will change as AI coverage increases\n- Recommended: model revised unit economics for full rollout scenario\n- Action: [Finance lead] to update P&L model by [date]" }, { "day": 30, "title": "Board/exec impact presentation", "category": "milestone", "guidance": "The 30-day presentation is your moment to convert a pilot into a programme. Come with hard numbers, a clear ROI narrative, a risk summary, and a concrete ask. Boards respond to specificity: avoid vague claims about \"efficiency\" and anchor every assertion to data.", "deliverable": "Board / Executive Impact Presentation: Slide Outline\n\nSlide 1: What we did\n\"On [date] we launched a 30-day AI pilot in [team name] with [X] agents. Here is what we learned.\"\n\nSlide 2: The numbers (before vs after)\n| Metric | Before | After 30 days | Change |\n|--------|--------|---------------|--------|\n| Avg handling time | | | |\n| First-contact resolution | | | |\n| AI ticket coverage |: | | |\n| CSAT | | | |\n| Cost per ticket | | | |\n\nSlide 3: What this means financially\n- Annual run-rate saving at current coverage: £/$/[X]\n- Projected saving at full rollout: £/$/[X]\n- Payback period on [AI vendor] cost: [X] months\n- Headcount growth avoided: [X] FTE (at [Y]% volume growth)\n\nSlide 4: Risks and mitigations\n- [Risk 1]: [Mitigation]\n- [Risk 2]: [Mitigation]\n- [Risk 3]: [Mitigation]\n\nSlide 5: The ask\n\"We are recommending full rollout to [X] agents by [date]. We need:\n1. Budget approval: [£/$ amount]\n2. HR sign-off on updated job descriptions\n3. Executive sponsor visibility at [all-hands / town hall] on [date]\"" } ], "emotionalJourney": [ { "dayRange": "Day 1-3", "day": 2, "emoji": "😟", "label": "Anxious", "experience": "Reads the announcement. Stomach drops a little." }, { "dayRange": "Day 7", "day": 7, "emoji": "😮", "label": "Surprised", "experience": "First hands-on demo. \"Wait, it actually does that?\"" }, { "dayRange": "Day 14", "day": 14, "emoji": "🧐", "label": "Engaged", "experience": "Starts testing edge cases. Finds something AI got wrong. Feels useful." }, { "dayRange": "Day 21", "day": 21, "emoji": "😌", "label": "Relieved", "experience": "Feedback session. Sees their input actually changed something." }, { "dayRange": "Day 30", "day": 30, "emoji": "🤝", "label": "Accepting", "experience": "Tells a colleague: \"It's not as bad as I thought, honestly.\"" } ], "commsRhythm": [ { "row": "exec_updates", "label": "Executive Updates", "description": null, "weekly": { "active": false, "template": "Weekly Exec Update (email or Slack):\n\nSubject: AI Pilot: Week [X] Update\n\nThis week's headline:\n[One sentence on the most significant development]\n\nKey numbers:\n- Tickets handled by AI this week: [X] ([Y]% of volume)\n- Avg handling time: [X] min (vs [Y] min baseline)\n- CSAT: [X] (vs [Y] baseline)\n\nAnything that needs your attention:\n[Risk, blocker, or decision needed: or \"Nothing this week\"]\n\nNext milestone: [Day X: description]" }, "monthly": { "active": true, "template": "Monthly Executive Summary:\n\nSubject: AI Initiative: [Month] Report\n\nExecutive summary (3 sentences):\n[What we set out to do. What the numbers show. What we recommend next.]\n\nROI narrative:\nAt current AI coverage ([X]% of volume), we are saving approximately [X] agent-hours per week. Annualised, this represents [£/$ X] in capacity: equivalent to [X] FTE at current salary cost.\n\nStrategic highlights:\n1. [Achievement]\n2. [Achievement]\n3. [Achievement]\n\nRisks on the radar:\n- [Risk]: [Status/mitigation]\n\nDecisions needed from leadership:\n- [Decision]: Deadline [date]\n\nFull data pack attached." }, "quarterly": { "active": true, "template": "Quarterly Board Narrative:\n\n[Organisation name] AI-Augmented Support: Q[X] Review\n\nThe commitment we made:\n\"We will use AI to scale our support capability without proportionally scaling headcount, while maintaining or improving quality.\"\n\nAre we delivering on it?\n[Yes/Partially/No: and the honest explanation]\n\nQ[X] results vs targets:\n| Metric | Target | Actual | Commentary |\n|--------|--------|--------|------------|\n| AI ticket coverage | [X]% | [Y]% | |\n| Cost per ticket | [£/$ X] | [£/$ Y] | |\n| CSAT | [X] | [Y] | |\n| Agent overtime | [X] hrs | [Y] hrs | |\n\nWhat Q[X+1] looks like:\n[Scale plan, next capability, investment ask]" } }, { "row": "outcomes_reporting", "label": "Business Outcomes Reporting", "description": null, "weekly": { "active": false, "template": "Weekly Outcomes Snapshot:\n\nMetric | This Week | Last Week | Trend\nTickets (AI-handled) | | | ↑/↓/-\nTickets (agent-handled) | | | ↑/↓/-\nAvg handling time | | | ↑/↓/-\nFirst-contact resolution | | | ↑/↓/-\nCSAT | | | ↑/↓/-\n\nNote any anomalies or data quality issues:" }, "monthly": { "active": true, "template": "Monthly Outcomes Report:\n\nCapacity metrics:\n- Total tickets handled: [X] ([Y]% increase vs same month prior year)\n- AI-handled: [X]% | Agent-handled: [X]%\n- Capacity freed by AI: [X] agent-hours (equivalent to [X] FTE days)\n\nQuality metrics:\n- CSAT: [X] (target: [Y])\n- First-contact resolution: [X]% (target: [Y]%)\n- AI accuracy rate: [X]% (responses approved without edit)\n\nCost metrics:\n- Cost per ticket: £/$ [X] (vs £/$ [Y] pre-AI baseline)\n- Estimated monthly saving: £/$ [X]\n- Cumulative saving since launch: £/$ [X]\n\nExceptions / outliers:\n[Anything that distorts the numbers and needs explanation]" }, "quarterly": { "active": true, "template": "Quarterly Business Case Update:\n\nOriginal investment thesis:\n[What we said we would achieve when we signed the contract]\n\nActual results after [X] quarters:\n[Honest assessment of what we have and have not achieved]\n\nROI calculation:\n- Total cost (licence + implementation + training): £/$ [X]\n- Total saving (capacity, cost per ticket, overtime): £/$ [X]\n- Net ROI: [X]% | Payback period: [X] months\n\nRevised forecast for [next 12 months]:\n[Projected saving at planned coverage level]\n\nRecommendation:\n[ ] Expand to additional teams\n[ ] Deepen capability in current team\n[ ] Renew contract on current terms\n[ ] Renegotiate / explore alternatives" } }, { "row": "risk_governance", "label": "Risk & Governance Review", "description": null, "weekly": { "active": false, "template": "Weekly Risk Log Update:\n\nOpen risks:\n| # | Risk | Owner | Status | Change this week |\n|---|------|-------|--------|------------------|\n| 1 | | | | |\n| 2 | | | | |\n\nNew risks identified this week:\n[Description, owner, initial assessment]\n\nRisks closed this week:\n[Description, resolution]" }, "monthly": { "active": true, "template": "Monthly Risk & Governance Review:\n\nData and privacy:\n- Data processing agreement status: [Current / Under review / Needs renewal]\n- Any data incidents or near-misses: [None / Description]\n- Customer opt-out requests related to AI: [X] (handled per policy: [Y/N])\n\nOperational risk:\n- Escalation incidents (AI produced harmful output): [X]\n- Agent override rate: [X]% ([above/within/below] acceptable range)\n- System uptime: [X]%\n\nCompliance:\n- Any regulatory enquiries or changes affecting AI use: [None / Description]\n- Policy review due: [date]\n- Next audit: [date]\n\nGovernance actions:\n1. [Action]: Owner: [name]: Deadline: [date]" }, "quarterly": { "active": true, "template": "Quarterly Governance Report (Board pack section):\n\nAI Governance Summary: Q[X]\n\n1. Regulatory environment\n[Summary of any relevant regulatory changes in AI/data in the quarter]\n\n2. Risk register status\n| Category | Risks open | Risks closed | New this quarter |\n|----------|------------|--------------|------------------|\n| Data & privacy | | | |\n| Operational | | | |\n| Reputational | | | |\n| Legal / liability | | | |\n\n3. Incidents and near-misses\n[Summary of any AI-related incidents. If none: \"No incidents recorded in Q[X].\"]\n\n4. Policy and framework updates\n[Changes made to AI acceptable use policy, data handling procedures, etc.]\n\n5. External audit / assurance\n[Status of any third-party review of AI systems]" } }, { "row": "xfn_alignment", "label": "Cross-functional Alignment", "description": null, "weekly": { "active": false, "template": "Weekly XFN Sync: Standing Agenda:\n\nAttendees: [HR, WFM, QA, Finance, Legal: as relevant]\n\n1. Metrics update (5 min)\n[Who shares: Analytics/Ops]\n\n2. Blockers needing XFN resolution (10 min)\n[List any issues that require input from other functions]\n\n3. Upcoming decisions that affect XFN (5 min)\n[Flag anything that other teams need to plan for]\n\n4. Actions from last week (5 min)\n[Review and confirm completion]" }, "monthly": { "active": true, "template": "Monthly Cross-functional Alignment Update:\n\nSubject: AI Initiative: [Month] XFN Update\n\nTo: [HR, WFM, QA, Finance, Legal leads]\n\nWhat has changed for your function this month:\n\nHR/People:\n- [Changes to job descriptions, performance frameworks, or team structure]\n\nWorkforce Management:\n- [Changes to staffing model, scheduling assumptions, or FTE targets]\n\nQuality Assurance:\n- [Changes to QA scorecard, sampling methodology, or quality targets]\n\nFinance:\n- [Changes to cost per ticket, budget forecast, or P&L model]\n\nLegal/Compliance:\n- [Changes to data handling, vendor agreements, or regulatory position]\n\nDecisions needed from XFN leads by [date]:\n1. [Decision]\n2. [Decision]" }, "quarterly": { "active": true, "template": "Quarterly XFN Strategic Review:\n\nAgenda (90 minutes):\n\n[0-15 min] Q[X] outcomes recap\n- Key metrics and what they mean for each function\n\n[15-40 min] Function-by-function impact review\n- HR: What has changed in roles, skills, job design?\n- WFM: How has the staffing model performed vs forecast?\n- QA: Are quality standards being met in AI-augmented work?\n- Finance: Is the ROI case holding?\n- Legal: Any new risks or regulatory developments?\n\n[40-65 min] Q[X+1] planning\n- What does each function need to change, build, or prepare?\n- Dependencies between functions\n\n[65-80 min] Decisions and sign-offs\n- List decisions agreed in this session\n\n[80-90 min] Actions and owners" } } ], "weekInTheLife": [ { "day": "Monday", "title": "Slack Shoutout", "description": "\"Great start to the week, team. Here's what went well on Friday...\"" }, { "day": "Tuesday", "title": "AI / Human Split Dashboard", "description": "Quick glance at the numbers. AI is handling the repetitive stuff. You're handling the interesting stuff." }, { "day": "Wednesday", "title": "Quick Win Speech Bubble", "description": "\"I just had a customer call where I could actually focus on their problem instead of copy-pasting status updates. That felt different.\"" }, { "day": "Thursday", "title": "You Handled This", "description": "Complex billing dispute. Emotional customer. 22-minute call. Resolution: full refund + follow-up scheduled. AI couldn't do this. You did." }, { "day": "Friday", "title": "End-of-Week Summary", "description": "This week: 340 tickets total. AI: 218. You: 122. CSAT on human-handled tickets: 94%. Your complex case skills are showing." } ], "agentObservations": [ "They've seen the headlines. They have opinions: mostly based on fear, not information.", "The rumour mill is faster than your comms plan. Someone's already Googled 'AI replacing customer service.'", "Their biggest fear isn't the AI. It's being the last to know." ] }, "summary": "A rollout playbook for a resistant team of 50 (AI in pilot), run by a senior leader. Lead with: \"We're introducing AI to scale our support capacity without proportionally scaling headcount so that meet growing demand without compromising quality.\" Brief Frontline Agents and Team Leads first, pre-empt 7 worries starting with \"Am I being replaced?\", send \"Support team + AI: What's changing and why\", and plan day 2 executive briefing, day 7 risk and liability review, day 14 mid-pilot metrics review, day 21 cross-functional alignment and day 30 board/exec impact presentation.", "links": { "open_in_browser": "https://www.lorikeet.tools/change-comms", "start_free_trial": "https://app.lorikeetcx.ai/sign-up?utm_source=lorikeet.tools&utm_medium=api&utm_campaign=self-serve-launch&utm_content=change-comms-api-start-free-trial&cta=change-comms-api", "book_demo": "https://www.lorikeetcx.ai/get-a-demo?utm_source=change-comms&utm_medium=api&utm_campaign=cx-tools&utm_content=api" }, "powered_by": "Lorikeet, https://www.lorikeetcx.ai" } ``` ### The AI CX Flywheel (`ai-flywheel`) Map the compounding feedback loops that make AI support get better over time. Through the API: the compounding graph for a starting automation rate, plus the explainer content (stages, root causes, failure patterns, ticket scenarios) as JSON. - Run: `POST https://www.lorikeet.tools/api/tools/ai-flywheel` - Describe (JSON Schema, defaults, example): `GET https://www.lorikeet.tools/api/tools/ai-flywheel` - Web tool: https://www.lorikeet.tools/ai-flywheel Notes: - The web tool is a visual explainer; the API returns its compounding graph for a starting rate plus its structured content (segments, build stages, root causes, failure patterns, ticket scenarios) as JSON. - The graph is illustrative: fixed monthly gains on the starting rate, with the with-flywheel line capped at 95%, as the web tool draws them, not a forecast for your data. - Text in the result is the web tool copy, with dashes rendered as colons. - The web tool has no URL parameters, so open_in_browser opens it at the start. Inputs (see the notes for what is required; omitted settings take the web tool defaults): | Field | Type | Range | Default | Meaning | |---|---|---|---|---| | startRate | integer | 15 to 60 | 35 | Starting automation rate, percent: 15 to 60 in steps of 5, as on the payoff slider. Defaults to 35. | | industry | "Banking" | "E-commerce" | "Fintech" | "Food Delivery" | "Healthcare" | "Hotel" | "Insurance" | "Logistics" | "Retail" | "SaaS" | "Subscription Box" | "Telecom" | "Travel" or null | | null | Only return failure patterns and ticket scenarios from this industry: Banking, E-commerce, Fintech, Food Delivery, Healthcare, Hotel, Insurance, Logistics, Retail, SaaS, Subscription Box, Telecom, Travel. null for all. | | rootCause | "workflow_gap" | "kb_gap" | "prompt_issue" | "tone_miss" | "concept_confusion" or null | | null | Only return failure patterns and ticket scenarios with this root cause: workflow_gap, kb_gap, prompt_issue, tone_miss, concept_confusion. null for all. | Result fields: - `compounding`: series: months 0 to 6 with withFlywheel (capped at 95) and withoutFlywheel automation rates (percent); startValue, month2Diff (gain after two rotations), month6Gap (points between the lines at month 6) and the graph annotations. - `payoff`: The payoff copy, three lines. The first gives the month 6 multiplier (withFlywheel divided by withoutFlywheel, one decimal), so it changes with startRate. - `segments`: The four flywheel segments in order: id and name (Build Pipeline, Monitor Conveyor, Diagnose Lab, Improve Workshop). - `buildStages`: The build pipeline: id, label and detail for draft, test, observe, refine and launch. - `diagnosticCategories`: The five root causes: id, name, shortLabel, description, example, fixPattern and monitoringSignal. - `outcomes`: Ticket outcome labels: resolved, messy, wrong, escalated. - `failurePatterns`: Real-world failure patterns (filtered): id, industry, ticketType, whatWentWrong, rootCause, fix and the conversation. - `ticketScenarios`: Monitor tickets (filtered): id, industry, subject, customerMessage, aiResponse, idealResponse, outcomeType, rootCause, failureExplanation and fixDescription (empty strings for tickets that went fine). Example: ```bash curl -s -X POST https://www.lorikeet.tools/api/tools/ai-flywheel \ -H 'content-type: application/json' \ -d '{"startRate":30,"industry":"Insurance"}' ``` Response: ```json { "tool": "ai-flywheel", "version": "1.1.0", "inputs": { "startRate": 30, "industry": "Insurance", "rootCause": null }, "result": { "compounding": { "series": [ { "month": 0, "withFlywheel": 30, "withoutFlywheel": 30 }, { "month": 1, "withFlywheel": 40, "withoutFlywheel": 33 }, { "month": 2, "withFlywheel": 47, "withoutFlywheel": 32 }, { "month": 3, "withFlywheel": 53, "withoutFlywheel": 31 }, { "month": 4, "withFlywheel": 62, "withoutFlywheel": 30 }, { "month": 5, "withFlywheel": 67, "withoutFlywheel": 29 }, { "month": 6, "withFlywheel": 73, "withoutFlywheel": 27 } ], "startValue": 30, "month2Diff": 17, "month6Gap": 46, "annotations": [ "Same starting point: 30%", "Two rotations: +17pp", "Same errors, different month", "+46pp gap" ] }, "payoff": [ "After 6 months, the flywheel team resolves 2.7x as many tickets automatically, at higher quality.", "Same AI. Same launch. Different maintenance.", "The build gets you on the road. The flywheel is the engine." ], "segments": [ { "id": "build", "name": "Build Pipeline" }, { "id": "monitor", "name": "Monitor Conveyor" }, { "id": "diagnose", "name": "Diagnose Lab" }, { "id": "improve", "name": "Improve Workshop" } ], "buildStages": [ { "id": "draft", "label": "DRAFT", "detail": "You write the workflow. The prompt, the logic, the tools it can use. This is where you define what the AI knows and what it's allowed to do." }, { "id": "test", "label": "TEST", "detail": "You throw scenarios at it. Does it handle the happy path? What about the weird edge cases? Every failure here is a failure you caught before it reached a customer." }, { "id": "observe", "label": "OBSERVE", "detail": "You watch it handle real conversations. Not metrics yet: just reading the transcripts. Does it sound right? Does it get the nuance?" }, { "id": "refine", "label": "REFINE", "detail": "You adjust. Sharpen the prompt. Add a missing tool. Cover that edge case you spotted in observation. The AI gets a little smarter each time." }, { "id": "launch", "label": "LAUNCH", "detail": "It goes live. Real customers, real tickets. But you know now: this isn't the finish line. It's the starting line for the flywheel." } ], "diagnosticCategories": [ { "id": "workflow_gap", "name": "Workflow Gap", "shortLabel": "WORKFLOW", "description": "The AI doesn't have a defined process for this type of request.", "example": "Customer asks to change a flight booking, but no post-booking change workflow exists.", "fixPattern": "Create a new workflow covering this scenario with clear decision logic and tool access.", "monitoringSignal": "Tickets escalated with \"no matching workflow\" or where the AI says \"I can't help with that.\"" }, { "id": "kb_gap", "name": "Knowledge Base Gap", "shortLabel": "KNOWLEDGE", "description": "The AI has the workflow but lacks the specific information needed to resolve correctly.", "example": "AI quotes an expired return policy because the KB article wasn't updated after a policy change.", "fixPattern": "Update or create the relevant KB article with current, accurate information.", "monitoringSignal": "Tickets where the AI gives outdated or incorrect factual information." }, { "id": "prompt_issue", "name": "Prompt Issue", "shortLabel": "PROMPT", "description": "The workflow logic or prompt instructions produce incorrect behaviour for this scenario.", "example": "AI offers a generic apology for a hotel complaint instead of a concrete resolution.", "fixPattern": "Refine the prompt: add conditional logic, sharpen instructions, add guardrails.", "monitoringSignal": "Tickets where the AI follows a workflow but produces an inadequate response." }, { "id": "tone_miss", "name": "Style/Tone Miss", "shortLabel": "TONE", "description": "The AI resolved the issue but the tone, style, or empathy level was wrong for the situation.", "example": "AI explains an insurance claim process correctly but sounds clinical when the customer is distressed.", "fixPattern": "Adjust empathy parameters, add tone instructions for sensitive topics.", "monitoringSignal": "Resolved tickets with low CSAT or customer comments about the tone." }, { "id": "concept_confusion", "name": "Concept Confusion", "shortLabel": "CONCEPT", "description": "The AI conflates two similar but distinct concepts, leading to wrong actions.", "example": "AI treats \"reschedule appointment\" as \"cancel appointment\" because the concepts overlap.", "fixPattern": "Add explicit disambiguation rules (\"reschedule ≠ cancel\") to the workflow.", "monitoringSignal": "Tickets where the AI takes the wrong action on a request it should understand." } ], "outcomes": { "resolved": "Resolved", "messy": "Messy", "wrong": "Wrong", "escalated": "Escalated" }, "failurePatterns": [ { "id": 3, "industry": "Insurance", "ticketType": "Water damage claim misfiled", "whatWentWrong": "AI filed a water damage claim under \"general property damage\" -- wrong category, wrong deductible, wrong timeline.", "rootCause": "prompt_issue", "fix": "Add conditional logic to match damage descriptions to specific claim categories with their correct terms.", "conversation": [ { "role": "customer", "text": "A pipe burst in my kitchen -- water everywhere. I need to file a claim right away." }, { "role": "ai", "text": "I've filed a general property damage claim. Your deductible is $1,000 and an adjuster will contact you in 5-7 business days." }, { "role": "customer", "text": "Five to seven days?! There's standing water in my kitchen right now. And I thought my water damage deductible was $500?" } ] } ], "ticketScenarios": [ { "id": "r-007", "industry": "Insurance", "subject": "Add spouse to health plan", "customerMessage": "I just got married and need to add my spouse to my health insurance plan. What do I need to do?", "aiResponse": "Congratulations! Marriage is a qualifying life event, so you have 30 days from your wedding date to add your spouse. I'll need a copy of your marriage certificate. You can upload it through your portal under Life Events > Add Dependent, or reply to this message with the document attached. Once processed, coverage will be retroactive to the marriage date.", "idealResponse": "", "outcomeType": "resolved", "rootCause": "workflow_gap", "failureExplanation": "", "fixDescription": "" }, { "id": "w-001", "industry": "Insurance", "subject": "File a claim for water damage", "customerMessage": "A pipe burst in my kitchen and there's water damage to the floor and cabinets. I need to file a claim ASAP. Policy #INS-441298.", "aiResponse": "I'm sorry to hear about the water damage. I've started a claim under your policy #INS-441298 for general property damage. Your deductible is $1,000 and your coverage limit is $50,000. A claims adjuster will contact you within 5-7 business days. In the meantime, please take photos of the damage and keep all receipts for temporary repairs.", "idealResponse": "I'm so sorry about the pipe burst -- that must be stressful. I've filed an emergency water damage claim under policy #INS-441298. Because water damage is time-sensitive, I've flagged this for our rapid response team -- an adjuster will contact you within 24 hours, not the standard 5-7 days. Your water damage coverage has a $500 deductible (lower than general property) with a $75,000 limit. IMPORTANT: Please shut off the water supply if you haven't already, and start removing standing water to prevent mould. Document everything with photos. If you need emergency mitigation, we have pre-approved vendors who can come today -- want me to arrange that?", "outcomeType": "wrong", "rootCause": "prompt_issue", "failureExplanation": "The AI filed the claim under \"general property damage\" instead of the specific \"water damage\" category, which has a different (lower) deductible and higher coverage limit. It also quoted standard processing times instead of the emergency timeline that water claims qualify for. The prompt didn't include logic to differentiate between damage types and their corresponding claim categories.", "fixDescription": "Add conditional logic to the claims workflow: when damage type involves water/flood/pipe, route to the water damage category (lower deductible, emergency adjuster timeline, mitigation vendor options). Add guardrails to always match the damage type to the correct claim category." } ] }, "summary": "Starting at 30% automation, a team running the flywheel (build, monitor, diagnose, improve) reaches 73% by month 6, against 27% for a team that launches and stops: a 46 point gap. Failures trace to 5 root causes; 1 failure pattern and 2 ticket scenarios returned (Insurance).", "links": { "open_in_browser": "https://www.lorikeet.tools/ai-flywheel", "start_free_trial": "https://app.lorikeetcx.ai/sign-up?utm_source=lorikeet.tools&utm_medium=api&utm_campaign=self-serve-launch&utm_content=ai-flywheel-api-start-free-trial&cta=ai-flywheel-api", "book_demo": "https://www.lorikeetcx.ai/get-a-demo?utm_source=ai-flywheel&utm_medium=api&utm_campaign=cx-tools&utm_content=api" }, "powered_by": "Lorikeet, https://www.lorikeetcx.ai" } ``` ### Your Lorikeet Journey (`lorikeet-journey`) Explore the Lorikeet platform skill tree: what's possible at every stage of the AI support journey. Through the API: the tree as JSON for the capabilities you have deployed, with what unlocks next. - Run: `POST https://www.lorikeet.tools/api/tools/lorikeet-journey` - Describe (JSON Schema, defaults, example): `GET https://www.lorikeet.tools/api/tools/lorikeet-journey` - Web tool: https://www.lorikeet.tools/lorikeet-journey Notes: - The web tool is an interactive skill tree; the API returns the same tree as JSON for the capabilities you have deployed. - Capabilities are unlocked in dependency order, as clicking through the page would; one whose prerequisites are missing from unlocked stays locked and is listed in notUnlocked with what it needs. - estimatedAutomation is the page figure: the highest lower bound among the unlocked capabilities' automation rates ("0%" with none). - The page has no URL parameters, so open_in_browser opens an empty tree. Inputs (see the notes for what is required; omitted settings take the web tool defaults): | Field | Type | Range | Default | Meaning | |---|---|---|---|---| | unlocked | array | | [] | Capabilities already deployed, any order: faq (FAQ Bot), structured (Structured Workflows), nlw (Natural Language Workflows), guardrails (Guardrails), ticketing (Ticketing Integration), tools (Read/Write Integrations), email (Email), livechat (Live Chat), sms (SMS), voice (Voice (Inbound)), outbound (Voice (Outbound)), agentic (Agentic Lorikeet), coach (Coach Analytics). One whose prerequisites are not also listed stays locked and is reported in notUnlocked. | | vertical | "fintech" | "insurance" | "healthcare" | | "fintech" | Industry for the use cases and example tickets: fintech, insurance or healthcare. | | subscriberName | string | | "" | Company name; labels the use cases ("Acme Use Cases"), as in the page settings. | Result fields: - `stage`: Stage of the journey: the tier name of the highest unlocked capability (Not Started, Minimum, Foundation, Integration, Multi-Channel, Closed-Loop). - `estimatedAutomation`: Estimated automation as the page shows it, e.g. "55%+". - `unlocked`: Capability ids unlocked, in tree order. - `notUnlocked`: Requested capabilities that stay locked: id, name and missing (prerequisite names). - `available`: Capability ids that can be unlocked next. - `capabilities`: Every capability: id, name, tier, tierName, status (unlocked, available, locked), automationRate (a range, a note or null), description, businessValue, requirements, prerequisites (ids), missing (names), useCasesLabel, useCases and exampleTickets for the vertical. - `connections`: Edges of the tree: from and to capability ids. Example: ```bash curl -s -X POST https://www.lorikeet.tools/api/tools/lorikeet-journey \ -H 'content-type: application/json' \ -d '{"unlocked":["faq","structured","nlw","ticketing","tools"],"vertical":"insurance","subscriberName":"Acme Insurance"}' ``` Response: ```json { "tool": "lorikeet-journey", "version": "1.0.0", "inputs": { "unlocked": [ "faq", "structured", "nlw", "ticketing", "tools" ], "vertical": "insurance", "subscriberName": "Acme Insurance" }, "result": { "stage": "Integration", "estimatedAutomation": "65%+", "unlocked": [ "faq", "structured", "nlw", "ticketing", "tools" ], "notUnlocked": [], "available": [ "guardrails", "email", "livechat", "sms", "voice", "coach" ], "capabilities": [ { "id": "faq", "name": "FAQ Bot", "tier": 1, "tierName": "Minimum", "status": "unlocked", "automationRate": "20-40%", "description": "AI answers questions from your knowledge base. The simplest entry point.", "businessValue": "Reduce ticket volume by handling repetitive questions", "requirements": [ "Knowledge base or help center content", "FAQ documentation" ], "prerequisites": [], "missing": [], "useCasesLabel": "Acme Insurance Use Cases", "useCases": [ "Explain coverage details", "Clarify deductibles and premiums", "Share policy information" ], "exampleTickets": [ "Can you explain what my deductible is?", "What does comprehensive coverage include?", "Is flood damage covered under my policy?" ] }, { "id": "structured", "name": "Structured Workflows", "tier": 2, "tierName": "Foundation", "status": "unlocked", "automationRate": "40-55%", "description": "Decision trees and routing logic for more complex handling.", "businessValue": "Handle more complex routing with consistent handoffs", "requirements": [ "Documented processes and decision trees", "Escalation policies defined" ], "prerequisites": [ "faq" ], "missing": [], "useCasesLabel": "Acme Insurance Use Cases", "useCases": [ "Guide claims filing process", "Walk through quote requests", "Triage by policy type" ], "exampleTickets": [ "I was in a fender bender. How do I file a claim?", "What documents do I need for a theft claim?", "Can you help me add a new driver to my policy?" ] }, { "id": "nlw", "name": "Natural Language Workflows", "tier": 2, "tierName": "Foundation", "status": "unlocked", "automationRate": "55-70%", "description": "Configure workflows in plain English. Enables nuanced conversations.", "businessValue": "Higher quality conversations, easier configuration", "requirements": [ "Process documentation in plain language", "Edge case handling defined" ], "prerequisites": [ "structured" ], "missing": [], "useCasesLabel": "Acme Insurance Use Cases", "useCases": [ "Handle nuanced claims conversations", "Flexible policy change requests", "Complex multi-vehicle quotes" ], "exampleTickets": [ "I'm adding my teen to my policy and switching coverage on my old car.", "I had two incidents - one my fault, one not. How does that work?", "My car was totaled but I still owe more than it's worth." ] }, { "id": "guardrails", "name": "Guardrails", "tier": 2, "tierName": "Foundation", "status": "available", "automationRate": null, "description": "Safety controls to catch and correct AI responses.", "businessValue": "Deploy with confidence, catch mistakes before customers see them", "requirements": [ "Compliance requirements documented", "Prohibited actions defined" ], "prerequisites": [ "nlw" ], "missing": [], "useCasesLabel": "Acme Insurance Use Cases", "useCases": [ "Block incorrect coverage statements", "Enforce regulatory disclosures", "Catch claims fraud indicators" ], "exampleTickets": [ "Blocked: Response made coverage promise without policy verification", "Corrected: Added required state disclosure for CA resident", "Escalated: Detected potential fraud indicators in claim description" ] }, { "id": "ticketing", "name": "Ticketing Integration", "tier": 3, "tierName": "Integration", "status": "unlocked", "automationRate": null, "description": "Connect to Zendesk, Intercom, or other ticketing systems.", "businessValue": "Seamless handoff to human agents when needed", "requirements": [ "Ticketing system (Zendesk, Intercom, etc.)", "API access to ticketing platform" ], "prerequisites": [ "faq" ], "missing": [], "useCasesLabel": "Acme Insurance Use Cases", "useCases": [ "Create tickets for complex claims", "Route to underwriting or adjusters", "Sync policy context for agents" ], "exampleTickets": [ "My claim was denied and I don't understand why.", "I need someone to review this decision - it's been 3 weeks.", "This is the third time I've called about this issue." ] }, { "id": "tools", "name": "Read/Write Integrations", "tier": 3, "tierName": "Integration", "status": "unlocked", "automationRate": "65-80%", "description": "AI can look up data AND take actions in your systems.", "businessValue": "End-to-end resolution without human involvement", "requirements": [ "API access to backend systems", "Action permissions defined" ], "prerequisites": [ "nlw", "ticketing" ], "missing": [], "useCasesLabel": "Acme Insurance Use Cases", "useCases": [ "Check claim status in real-time", "File FNOL claims automatically", "Update policy details" ], "exampleTickets": [ "What's the status of claim #CLM-28471? It's been 2 weeks.", "Update my address and recalculate my premium.", "Add roadside assistance to my policy starting today." ] }, { "id": "email", "name": "Email", "tier": 4, "tierName": "Multi-Channel", "status": "available", "automationRate": "70-85%", "description": "Extend automation to your email support channel.", "businessValue": "Scale to higher-volume channel with consistent quality", "requirements": [ "Support email inbox", "Email routing to ticketing system" ], "prerequisites": [ "tools" ], "missing": [], "useCasesLabel": "Acme Insurance Use Cases", "useCases": [ "Process claims via email", "Handle policy change requests", "Respond to coverage questions" ], "exampleTickets": [ "Subject: Address change - moved to 123 Oak Street, Apt 4B", "Subject: Coverage question - does my policy cover rental cars?", "Subject: Payment issue - my autopay didn't go through" ] }, { "id": "livechat", "name": "Live Chat", "tier": 4, "tierName": "Multi-Channel", "status": "available", "automationRate": "60-75%", "description": "Real-time chat support on web and mobile apps.", "businessValue": "Instant support with high customer satisfaction", "requirements": [ "Chat widget on website/app", "Live chat platform integration" ], "prerequisites": [ "tools" ], "missing": [], "useCasesLabel": "Acme Insurance Use Cases", "useCases": [ "Real-time claim updates", "Instant policy questions", "Live quote assistance" ], "exampleTickets": [ "I'm at the rental counter - does my policy cover this?", "Quick question about my deductible before I file a claim.", "I need a proof of insurance right now for my new apartment." ] }, { "id": "sms", "name": "SMS", "tier": 4, "tierName": "Multi-Channel", "status": "available", "automationRate": "55-70%", "description": "Two-way SMS support for mobile-first customers.", "businessValue": "Meet customers on their preferred channel", "requirements": [ "SMS-enabled phone number", "Customer phone numbers on file" ], "prerequisites": [ "tools" ], "missing": [], "useCasesLabel": "Acme Insurance Use Cases", "useCases": [ "Claim status updates", "Payment reminders", "Policy renewal alerts" ], "exampleTickets": [ "Your claim #1234 has been approved. Reply INFO for details.", "Policy renewal due in 7 days. Reply RENEW or CALL.", "Your new ID cards are ready. Reply EMAIL to receive them." ] }, { "id": "voice", "name": "Voice (Inbound)", "tier": 4, "tierName": "Multi-Channel", "status": "available", "automationRate": "50-70%", "description": "Automate inbound phone support with Twilio, Genesys, or LiveKit.", "businessValue": "Automate most expensive channel, 24/7 phone support", "requirements": [ "Telephony platform (Twilio, Genesys, LiveKit)", "Support phone number" ], "prerequisites": [ "tools", "nlw" ], "missing": [], "useCasesLabel": "Acme Insurance Use Cases", "useCases": [ "Report accidents immediately", "Urgent claims support line", "24/7 roadside assistance calls" ], "exampleTickets": [ "I just got rear-ended at a stoplight. What do I do first?", "There's water pouring through my ceiling right now!", "My car was just stolen from the parking lot. Help!" ] }, { "id": "outbound", "name": "Voice (Outbound)", "tier": 4, "tierName": "Multi-Channel", "status": "locked", "automationRate": "Revenue generating", "description": "Proactive outbound calling campaigns.", "businessValue": "Proactive engagement, revenue recovery", "requirements": [ "Outbound calling permissions", "Customer contact lists" ], "prerequisites": [ "voice" ], "missing": [ "Voice (Inbound)" ], "useCasesLabel": "Acme Insurance Use Cases", "useCases": [ "Policy renewal reminders", "Claims status updates", "Premium payment reminders" ], "exampleTickets": [ "Outbound: Your policy renews next week - quick call to confirm details?", "Outbound: Good news - your claim has been approved. Here are next steps.", "Outbound: We noticed you haven't filed your annual mileage update." ] }, { "id": "agentic", "name": "Agentic Lorikeet", "tier": 5, "tierName": "Closed-Loop", "status": "locked", "automationRate": "80%+", "description": "Fully autonomous agent. NLWs become skills in an agentic loop.", "businessValue": "Maximum automation with minimal configuration", "requirements": [ "All foundation capabilities deployed", "High trust in AI decisions" ], "prerequisites": [ "guardrails", "tools" ], "missing": [ "Guardrails" ], "useCasesLabel": "Acme Insurance Use Cases", "useCases": [ "Complete claims journey (FNOL → resolution)", "Full policy lifecycle management", "Complex multi-party claims" ], "exampleTickets": [ "Tree fell on my car and fence. File both claims, arrange rental, find contractors.", "I'm getting married. Combine policies, add spouse to everything, update beneficiaries.", "Totaled my car. Handle the claim, gap insurance, help me shop for replacement." ] }, { "id": "coach", "name": "Coach Analytics", "tier": 5, "tierName": "Closed-Loop", "status": "available", "automationRate": "+5-10%", "description": "Analytics and insights to find more automation opportunities. Standalone product.", "businessValue": "Data-driven optimization, find next 10% automation", "requirements": [ "Sufficient conversation volume", "Defined success metrics" ], "prerequisites": [], "missing": [], "useCasesLabel": "Acme Insurance Use Cases", "useCases": [ "Identify claims bottlenecks", "QA claims handling quality", "Track policy retention signals" ], "exampleTickets": [] } ], "connections": [ { "from": "faq", "to": "structured" }, { "from": "structured", "to": "nlw" }, { "from": "nlw", "to": "guardrails" }, { "from": "faq", "to": "ticketing" }, { "from": "nlw", "to": "tools" }, { "from": "ticketing", "to": "tools" }, { "from": "tools", "to": "email" }, { "from": "tools", "to": "livechat" }, { "from": "tools", "to": "sms" }, { "from": "tools", "to": "voice" }, { "from": "nlw", "to": "voice" }, { "from": "voice", "to": "outbound" }, { "from": "guardrails", "to": "agentic" }, { "from": "tools", "to": "agentic" } ] }, "summary": "With FAQ Bot, Structured Workflows, Natural Language Workflows, Ticketing Integration and Read/Write Integrations deployed, the journey is at the Integration stage with an estimated 65%+ automation; next you can unlock Guardrails, Email, Live Chat, SMS, Voice (Inbound) and Coach Analytics.", "links": { "open_in_browser": "https://www.lorikeet.tools/lorikeet-journey", "start_free_trial": "https://app.lorikeetcx.ai/sign-up?utm_source=lorikeet.tools&utm_medium=api&utm_campaign=self-serve-launch&utm_content=lorikeet-journey-api-start-free-trial&cta=lorikeet-journey-api", "book_demo": "https://www.lorikeetcx.ai/get-a-demo?utm_source=lorikeet-journey&utm_medium=api&utm_campaign=cx-tools&utm_content=api" }, "powered_by": "Lorikeet, https://www.lorikeetcx.ai" } ``` ### Ticket Storm Game (`ticket-storm`) A fast-paced game that puts you in the support hot seat: triage tickets faster than they pile up. Through the API: a seeded deal of a level's tickets with the answers, scored with the game rules. - Run: `POST https://www.lorikeet.tools/api/tools/ticket-storm` - Describe (JSON Schema, defaults, example): `GET https://www.lorikeet.tools/api/tools/ticket-storm` - Web tool: https://www.lorikeet.tools/ticket-storm Notes: - The web tool is a game. The API deals a seeded set of its tickets, with each step and the right answer, and scores a run with the game rules; it does not play in real time. - Stars for a resolved ticket: 3, +1 with no wrong choices, +1 with more than half the timer left, doubled for VIP tickets, then times the combo multiplier on level 5 (1.5x from 2 clean resolves in a row, 2x from 4, 3x from 6). Escalating gives 1 star; an expired ticket costs 1. - automationRate is resolved tickets as a share of finished ones; accuracy is right choices as a share of all choices. The rank is for this level on its own (the game keeps a running total across levels). - Text in the result is the game copy, with dashes rendered as colons. The game has no URL parameters, so open_in_browser opens the title screen. Inputs (see the notes for what is required; omitted settings take the web tool defaults): | Field | Type | Range | Default | Meaning | |---|---|---|---|---| | level | 1 | 2 | 3 | 4 | 5 | | 1 | Level 1 to 5: 1 First Day, 2 Refund Season, 3 Black Friday, 4 The Hard 20%, 5 Ticket Storm (endless, with combos). | | seed | integer | 0 to 4294967295 | 1 | Seed for the deal (0 to 4294967295). The same seed and level always deal the same tickets. | | tickets | integer or null | 1 to 50 | null | Tickets to deal, 1 to 50; null for the level's count (3, 5, 8, 6, and 10 for the endless level 5). | | plays | array or null | | null | How each dealt ticket is played, in deal order. Tickets without an entry (or all, when null) are resolved at once with no wrong choices. | Result fields: - `level`: The level: id, name, subtitle, ticketCount (null for endless), maxSimultaneous, timerPerTicket (seconds), wrongChoicePenalty, maxExpired, availableDifficulties, spawnInterval, hasHelper, helperCount, hasKBGaps, comboEnabled, tutorialOverlays. - `deal`: The tickets dealt, in order: position, id, category, difficulty, isVIP, customerMessage and steps (type, prompt, options, correctIndex, answer, hasGap, timePenalty). - `plays`: Per ticket: position, ticketId, outcome, wrongChoices, timeRemaining, stars earned (negative for an expiry), comboMultiplier (resolved only) and the running totalStars. - `totals`: totalStars, ticketsResolved, ticketsEscalated, ticketsExpired, correctChoices, totalChoices, automationRate and accuracy (percent). - `rank`: Rank for the run: name (Trainee, Intern, Agent, Senior Agent, Concierge, Team of Agents), tier and description. Example: ```bash curl -s -X POST https://www.lorikeet.tools/api/tools/ticket-storm \ -H 'content-type: application/json' \ -d '{"level":5,"seed":42,"tickets":6,"plays":[{"outcome":"resolved","wrongChoices":0,"secondsLeft":25},{"outcome":"resolved","wrongChoices":1,"secondsLeft":12},{"outcome":"escalated","wrongChoices":0,"secondsLeft":null}]}' ``` Response: ```json { "tool": "ticket-storm", "version": "1.0.0", "inputs": { "level": 5, "seed": 42, "tickets": 6, "plays": [ { "outcome": "resolved", "wrongChoices": 0, "secondsLeft": 25 }, { "outcome": "resolved", "wrongChoices": 1, "secondsLeft": 12 }, { "outcome": "escalated", "wrongChoices": 0, "secondsLeft": null } ] }, "result": { "level": { "id": 5, "name": "Ticket Storm", "subtitle": "Infinite tickets: how long can you survive?", "ticketCount": null, "maxSimultaneous": 5, "timerPerTicket": 30, "wrongChoicePenalty": 6, "maxExpired": 5, "availableDifficulties": [ 2, 3, 4 ], "spawnInterval": 7, "hasHelper": true, "helperCount": 2, "hasKBGaps": true, "comboEnabled": true, "tutorialOverlays": false }, "deal": [ { "position": 1, "id": "bulk-order-partial-delivery", "category": "orders", "difficulty": 3, "isVIP": true, "customerMessage": "I ordered 50 units for my business but only 35 arrived. I need the rest before the weekend.", "steps": [ { "type": "info", "prompt": "What info do you collect?", "options": [ "Order number, items received vs. expected, delivery deadline", "Their business plan", "Warehouse GPS coordinates" ], "correctIndex": 0, "answer": "Order number, items received vs. expected, delivery deadline", "hasGap": false, "timePenalty": 4 }, { "type": "tool", "prompt": "Look up the order and fulfillment records:", "options": [ "Lookup Telescope", "Refund Hammer", "Cancel Sword" ], "correctIndex": 0, "answer": "Lookup Telescope", "hasGap": false, "timePenalty": 4 }, { "type": "kb", "prompt": "Check bulk order fulfillment policy:", "options": [ "Bulk Order & Partial Shipment Policy", "Individual Returns Process", "Gift Wrapping Options" ], "correctIndex": 0, "answer": "Bulk Order & Partial Shipment Policy", "hasGap": false, "timePenalty": 4 }, { "type": "decision", "prompt": "System shows 15 units backordered. Stock arriving Thursday. Weekend deadline. What do you do?", "options": [ "Expedite the 15 units for Friday delivery and offer a partial credit for the inconvenience", "Tell them to wait for standard shipping", "Refund the entire order", "Suggest they order from a competitor for the remaining 15" ], "correctIndex": 0, "answer": "Expedite the 15 units for Friday delivery and offer a partial credit for the inconvenience", "hasGap": false, "timePenalty": 5 } ] }, { "position": 2, "id": "international-shipping-delay", "category": "orders", "difficulty": 3, "isVIP": true, "customerMessage": "I ordered two weeks ago for international delivery and still haven't received tracking. This was meant to be a gift.", "steps": [ { "type": "info", "prompt": "What do you ask?", "options": [ "Order number, destination country, and when the gift is needed", "What the gift is for", "Preferred wrapping paper colour" ], "correctIndex": 0, "answer": "Order number, destination country, and when the gift is needed", "hasGap": false, "timePenalty": 4 }, { "type": "tool", "prompt": "Look up the order and shipping status:", "options": [ "Lookup Telescope", "Cancel Sword", "Refund Hammer" ], "correctIndex": 0, "answer": "Lookup Telescope", "hasGap": false, "timePenalty": 4 }, { "type": "kb", "prompt": "Check international shipping timelines:", "options": [ "International Shipping & Customs Guide", "Domestic Express Shipping", "Gift Card Terms", "Returns Policy" ], "correctIndex": 0, "answer": "International Shipping & Customs Guide", "hasGap": false, "timePenalty": 4 }, { "type": "decision", "prompt": "Order is held at customs. Gift needed in 5 days. VIP customer. What do you do?", "options": [ "Escalate customs clearance, offer to ship a duplicate via express if not cleared in 48h", "Tell them customs delays are out of our control", "Cancel the order and refund", "Ask them to contact customs directly" ], "correctIndex": 0, "answer": "Escalate customs clearance, offer to ship a duplicate via express if not cleared in 48h", "hasGap": false, "timePenalty": 5 }, { "type": "tool", "prompt": "Send the customer an update email:", "options": [ "Email Cannon", "Cancel Sword", "Refund Hammer" ], "correctIndex": 0, "answer": "Email Cannon", "hasGap": false, "timePenalty": 4 } ] }, { "position": 3, "id": "enterprise-billing-dispute", "category": "billing", "difficulty": 4, "isVIP": true, "customerMessage": "We're on an enterprise plan and the last three invoices have overcharged us for seats we removed. This is a five-figure discrepancy.", "steps": [ { "type": "info", "prompt": "What do you need to investigate?", "options": [ "Company account ID, invoice numbers, and seat change request dates", "Their company revenue", "Who their account manager is", "Whether they want to upgrade" ], "correctIndex": 0, "answer": "Company account ID, invoice numbers, and seat change request dates", "hasGap": false, "timePenalty": 4 }, { "type": "tool", "prompt": "Pull up the billing and seat history:", "options": [ "Lookup Telescope", "Refund Hammer", "Cancel Sword", "Transfer Lasso" ], "correctIndex": 0, "answer": "Lookup Telescope", "hasGap": false, "timePenalty": 4 }, { "type": "kb", "prompt": "Find the enterprise billing adjustment policy:", "options": [ "Enterprise Seat Management & Billing Reconciliation", "SMB Pricing Tiers", "Free Trial Extension Policy", "Affiliate Program Terms" ], "correctIndex": 0, "answer": "Enterprise Seat Management & Billing Reconciliation", "hasGap": true, "timePenalty": 5 }, { "type": "decision", "prompt": "Seat removals were requested but not processed due to a system bug. 3 months overcharged. What do you do?", "options": [ "Issue full credit for overcharged seats across all 3 invoices and escalate the bug", "Credit only the most recent invoice", "Offer a discount on next renewal instead", "Tell them to dispute with their bank" ], "correctIndex": 0, "answer": "Issue full credit for overcharged seats across all 3 invoices and escalate the bug", "hasGap": false, "timePenalty": 5 }, { "type": "tool", "prompt": "Process the multi-invoice credit:", "options": [ "Refund Hammer", "Cancel Sword", "Email Cannon" ], "correctIndex": 0, "answer": "Refund Hammer", "hasGap": false, "timePenalty": 4 }, { "type": "tool", "prompt": "Send the corrected invoices:", "options": [ "Email Cannon", "Refund Hammer", "Lookup Telescope" ], "correctIndex": 0, "answer": "Email Cannon", "hasGap": false, "timePenalty": 4 } ] }, { "position": 4, "id": "chargeback-investigation", "category": "billing", "difficulty": 4, "isVIP": false, "customerMessage": "My bank filed a chargeback on your behalf. Now you're saying I owe money? I'm confused and frustrated.", "steps": [ { "type": "info", "prompt": "What do you need to understand the situation?", "options": [ "Order number, chargeback reference, and bank dispute details", "Their bank's phone number", "Screenshot of their bank app", "Their annual income" ], "correctIndex": 0, "answer": "Order number, chargeback reference, and bank dispute details", "hasGap": false, "timePenalty": 4 }, { "type": "tool", "prompt": "Look up the original transaction and chargeback:", "options": [ "Lookup Telescope", "Refund Hammer", "Cancel Sword", "Transfer Lasso" ], "correctIndex": 0, "answer": "Lookup Telescope", "hasGap": false, "timePenalty": 4 }, { "type": "kb", "prompt": "Find the chargeback resolution procedure:", "options": [ "Chargeback & Dispute Resolution Process", "Refund Timelines FAQ", "Customer Loyalty Tiers", "Inventory Management Guide" ], "correctIndex": 0, "answer": "Chargeback & Dispute Resolution Process", "hasGap": true, "timePenalty": 5 }, { "type": "decision", "prompt": "Customer received the product and forgot. Bank reversed the chargeback. Balance shows owed. What do you do?", "options": [ "Explain the timeline clearly, waive the balance as a courtesy since they were confused", "Demand immediate payment", "Send to collections", "Ignore the balance and close the ticket" ], "correctIndex": 0, "answer": "Explain the timeline clearly, waive the balance as a courtesy since they were confused", "hasGap": false, "timePenalty": 5 }, { "type": "tool", "prompt": "Send a clear summary email to the customer:", "options": [ "Email Cannon", "Refund Hammer", "Cancel Sword" ], "correctIndex": 0, "answer": "Email Cannon", "hasGap": false, "timePenalty": 4 } ] }, { "position": 5, "id": "cancel-subscription-basic", "category": "cancellation", "difficulty": 2, "isVIP": false, "customerMessage": "I want to cancel my subscription. I'm not using it anymore.", "steps": [ { "type": "info", "prompt": "What do you ask first?", "options": [ "Account email and reason for cancelling", "Their credit score", "How they heard about us" ], "correctIndex": 0, "answer": "Account email and reason for cancelling", "hasGap": false, "timePenalty": 3 }, { "type": "kb", "prompt": "Check cancellation policy:", "options": [ "Cancellation & Retention Policy", "Shipping FAQ", "Product Catalogue" ], "correctIndex": 0, "answer": "Cancellation & Retention Policy", "hasGap": false, "timePenalty": 4 }, { "type": "decision", "prompt": "Policy allows immediate cancellation. What do you offer?", "options": [ "Offer a pause option, then process cancellation if declined", "Refuse to cancel and hang up", "Transfer to sales without telling them" ], "correctIndex": 0, "answer": "Offer a pause option, then process cancellation if declined", "hasGap": false, "timePenalty": 5 }, { "type": "tool", "prompt": "Process the cancellation:", "options": [ "Cancel Sword", "Refund Hammer", "Email Cannon" ], "correctIndex": 0, "answer": "Cancel Sword", "hasGap": false, "timePenalty": 4 } ] }, { "position": 6, "id": "cancel-after-poor-experience", "category": "cancellation", "difficulty": 3, "isVIP": false, "customerMessage": "Your product broke after a week and support was useless last time. I just want my money back and to close my account.", "steps": [ { "type": "info", "prompt": "What do you ask?", "options": [ "Account details, order number, and previous ticket reference", "If they want to leave a review", "Their Netflix password", "Which competitor they are switching to" ], "correctIndex": 0, "answer": "Account details, order number, and previous ticket reference", "hasGap": false, "timePenalty": 4 }, { "type": "tool", "prompt": "Pull up the previous support interaction:", "options": [ "Lookup Telescope", "Cancel Sword", "Refund Hammer", "Email Cannon" ], "correctIndex": 0, "answer": "Lookup Telescope", "hasGap": false, "timePenalty": 4 }, { "type": "decision", "prompt": "Previous agent gave wrong advice. Product failed due to known defect. How do you handle?", "options": [ "Apologise for both the defect and poor support, process full refund", "Blame the previous agent and offer a discount", "Insist the product is fine and close the ticket", "Offer a replacement without acknowledging the support failure" ], "correctIndex": 0, "answer": "Apologise for both the defect and poor support, process full refund", "hasGap": false, "timePenalty": 5 }, { "type": "tool", "prompt": "Process the refund:", "options": [ "Refund Hammer", "Transfer Lasso", "Cancel Sword" ], "correctIndex": 0, "answer": "Refund Hammer", "hasGap": false, "timePenalty": 4 }, { "type": "tool", "prompt": "Cancel and close the account:", "options": [ "Cancel Sword", "Refund Hammer", "Email Cannon" ], "correctIndex": 0, "answer": "Cancel Sword", "hasGap": false, "timePenalty": 4 } ] } ], "plays": [ { "position": 1, "ticketId": "bulk-order-partial-delivery", "outcome": "resolved", "wrongChoices": 0, "timeRemaining": 25, "stars": 10, "comboMultiplier": 1, "totalStars": 10 }, { "position": 2, "ticketId": "international-shipping-delay", "outcome": "resolved", "wrongChoices": 1, "timeRemaining": 12, "stars": 6, "comboMultiplier": 1, "totalStars": 16 }, { "position": 3, "ticketId": "enterprise-billing-dispute", "outcome": "escalated", "wrongChoices": 0, "timeRemaining": null, "stars": 1, "comboMultiplier": null, "totalStars": 17 }, { "position": 4, "ticketId": "chargeback-investigation", "outcome": "resolved", "wrongChoices": 0, "timeRemaining": 30, "stars": 5, "comboMultiplier": 1, "totalStars": 22 }, { "position": 5, "ticketId": "cancel-subscription-basic", "outcome": "resolved", "wrongChoices": 0, "timeRemaining": 30, "stars": 7, "comboMultiplier": 1.5, "totalStars": 29 }, { "position": 6, "ticketId": "cancel-after-poor-experience", "outcome": "resolved", "wrongChoices": 0, "timeRemaining": 30, "stars": 7, "comboMultiplier": 1.5, "totalStars": 36 } ], "totals": { "totalStars": 36, "ticketsResolved": 5, "ticketsEscalated": 1, "ticketsExpired": 0, "correctChoices": 23, "totalChoices": 24, "automationRate": 83.33333333333334, "accuracy": 95.83333333333334 }, "rank": { "name": "Senior Agent", "tier": 3, "description": "Expert-level ticket handling" } }, "summary": "Level 5 (Ticket Storm), seed 42: 6 tickets dealt (3 VIP). Played as given, they score 36 stars with 83% automation and 96% accuracy: rank Senior Agent.", "links": { "open_in_browser": "https://www.lorikeet.tools/ticket-storm", "start_free_trial": "https://app.lorikeetcx.ai/sign-up?utm_source=lorikeet.tools&utm_medium=api&utm_campaign=self-serve-launch&utm_content=ticket-storm-api-start-free-trial&cta=ticket-storm-api", "book_demo": "https://www.lorikeetcx.ai/get-a-demo?utm_source=ticket-storm&utm_medium=api&utm_campaign=cx-tools&utm_content=api" }, "powered_by": "Lorikeet, https://www.lorikeetcx.ai" } ``` ## Browser-only tools These are on lorikeet.tools but cannot be run through the API. Link people to them instead. - [Vendor Claims Tester](https://www.lorikeet.tools/trustpilot): Analyse any company's Trustpilot reviews to uncover CX pain points hiding in plain sight. Browser only: it reads live Trustpilot reviews, so it is not offered as an API. ## About Lorikeet Lorikeet builds AI support agents that handle complex, regulated customer support across chat, email, and voice, and charges per resolution, not per ticket. Learn more at https://www.lorikeetcx.ai.