How Canva built an Agentic Support Experience using Langfuse Observability

Canva's Scale Challenge: Support at 260 Million Users

Speaker H introduces Canva's observability talk, explaining the company's growth challenge of scaling support to 1 billion users without increasing headcount. He breaks down the support funnel: of 10-15 million monthly help requests, 97% are self-served while the remaining 3% (100,000+ tickets) require human involvement and AI-assisted resolution.

Two AI Systems: Helper Chatbot vs Ticket Resolution

Speaker H describes Canva's two AI systems with different trade-offs: the Helper system optimized for latency and cost handling 10 million interactions monthly, and the Ticket Resolution system optimized for reasoning quality handling 100k+ tickets monthly. He poses key diagnostic questions the team asks about agent performance, escalation accuracy, and scaling with growing user requests.

From Logging to Tracing: Debugging AI System Failures

Speaker H explains the complex architecture underlying their AI systems—retrieval, workflows, sub-agents, LLMs, tools, routing, and prompts—and why failures are hard to debug. He describes the shift from traditional logging to AI tracing, since logging suits deterministic code while tracing better handles nondeterministic AI systems by capturing causality, latency, cost, and token usage.

Prompt Management: Empowering Non-Engineers

Speaker H discusses why Langfuse's prompt management was chosen over GitHub, emphasizing the need to let non-engineers like localization specialists tune prompts for different languages. He highlights three key benefits: linking traces to prompts for root-cause analysis, providing a single source of truth, and enabling LLM-as-a-judge evaluation for compliance and tone by non-engineers.

Building Custom Extensions on Langfuse

Speaker H details three custom systems built on top of Langfuse: asynchronous PII redaction (combining deterministic and LLM-driven components), trace sampling to manage costs at scale by focusing on automations and escalations, and trace enrichment to attach delayed events like user feedback back into traces for better diagnostics.

The Five-Layer Evaluation Approach

Speaker H introduces Canva's layered evaluation framework: offline evaluation for building confidence, shadow runs to test components on real traffic without user impact, LLM-as-a-judge for scaled failure detection, human QA for cases judges can't handle, and live metrics for real user satisfaction signals. He notes these five layers repeat for every feature change and hands off to Sahil for a detailed example.

Offline Evaluation for Escalation Decisions

Speaker I (Sahil) begins walking through the layered approach using Canva's escalation decision system as an example, explaining how ground truth datasets enable prompt and model experiments to measure escalation accuracy. He emphasizes that this offline eval loop empowers non-engineers, such as PMs, to iteratively improve prompts without engineering support.

Shadow Runs: Testing Safely on Live Traffic

Sahil explains how shadow runs validate changes on real production traffic without impacting users, solving the cold-start problem by capturing real data at scale (about 10k traces daily at Canva). He describes how this technique applies across multiple subsystems and details how escalation decisions evolved from escalating everything to whitelisting AI-approved responses.

LLM-as-a-Judge: Scaling Evaluation with Narrow Judges

Sahil explains how LLM-as-a-judge enables scaled evaluation using a separate model to grade outputs against a rubric, reducing self-bias. He stresses using narrow, specialized judges for aspects like compliance, response quality, and tone, calibrating them against human review, and monitoring trends over time to catch regressions early.

Human Review: The Critical Layer for Domain Expertise

Sahil describes human review as foundational for identifying issues requiring subject matter expertise beyond LLM judge capabilities, such as evaluating whether an AI agent truly resolved a customer issue. He explains human review serves two purposes: calibrating LLM judges and providing SME judgment on policy and rule application.

Live Metrics and A/B Testing for Impact Verification

Sahil discusses live metrics as the ultimate verdict on whether changes have real impact, describing how Canva uses A/B tests to roll out changes and monitor metrics like CSAT weekly. He walks through the process of detecting anomalies, diving into traces to diagnose problems, and shipping improvements based on findings.

Future Directions: Auto-Eval Loops and Cross-System Quality

Sahil previews upcoming work including an auto-eval loop using Claude Code as an agent harness connected to Langfuse to automatically refine prompts, emphasizing that dataset and scorer design are critical to success. He also discusses plans for consistent cross-system evaluation of voice, tone, and compliance, plus data anonymization to enable safer use of production traces in offline evals.

Closing Takeaways: Traces, Layers, and Democratized Quality

Sahil concludes with three key takeaways: traces become the common language for discussing AI system behavior, layered evaluations provide breadth (LLM judges), depth (human QA), and impact (live metrics), and quality evaluation should be democratized across PMs, QA, support teams, and engineers rather than bottlenecked by AI engineers.

We're

going to talk about observability today. And there were four different talks, and this one is about observability as well. And we're going to talk about how we do observability at Canva and how we solve support. Today, Canva has around two sixty million active users, and it keeps growing. One of the goals that Canva has is to grow up to 1,000,000,000 users. And this poses a very significant challenge for the support because we need to take that into account somehow.

We need to scale without increasing the headcount. So out of those two sixty million monthly active users, about two to 5% usually need help. That means around 10,000,000 to 15,000,000 requests that hit our systems. Out of those, 97% are quite simple.

They can be solved by self serving. Usually, a user would go into our chatbot, into our automation flows and find a solution themselves. And that's very efficient. The remaining 3% are usually very hard problems. They would need human involvement. And even if it's just 3%, it results in about 100,000 tickets or even more, like support tickets where a human has to go through it. And we also try to scale that with AI.

We have two large systems with different trade offs today. One of them is called helper system. That's essentially a chatbot with different automation functionality. And we optimize for latency and cost. That's where the reasoning is not as important. We try to solve everything in a real time chat fashion. Whereas with ticket resolution system, where we try to solve tickets at scale, We actually don't care about latency and cost as much, but we care about reasoning.

We care about the quality of the solution a lot more. We try to use the latest models there even though it can cost us a lot. You can see the scale. Helper system operates at about 10,000,000 interactions per month and ticket resolution system, about 100 ks plus tickets a month. And here are the questions we ask ourselves quite often.

Did the agent actually help to the user? Or sometimes it's very it's very important to escalate the issue rather than solve it. So did we escalate when we should have? Is this actually doing the right thing? Is it using the correct content? Is it using the correct tools? And finally, how do we scale with more users' requests?

So to answer those questions, we actually need to look under the hood of our system. And as you saw, each system has content, meaning that there will always be a retrieval system under the hood. If you want to give guarantees, there will probably be some form of workflows. There will be sub agents to address things like working with images for broken print orders.

There will be LLMs, as we've discussed. We want to scale that with AI in the end. There will be tools. There will be routing to be able to tell which system needs to execute which part right now for the particular request. There will be prompts and content, as I mentioned. The main issue here is that user requests go through every system.

Journey usually like, any failure in that journey is very hard to debug. The system fails quite silently. For that reason, we went from logging to tracing, first of all. Logging is being designed for deterministic code. And it's usually time ordered. It's very hard to analyze when you have the the whole AI system to to debug. You often need to run that system multiple times because it's nondeterministic.

With AI tracing, it's just a lot easier for us to look at structured by causality events. And also, has some of the other nice features, like latency, costs, tokens, models, as first class citizens. One interesting feature of LINE FUSE that we've been using is prompt management. Interestingly enough, in our domain, we want to enable non engineers to be able to tune our system to work with our systems.

And it seems like GitHub could be a good answer for prompt management, but that was not quite the case for us. While it provides rigor, the problem is we need to be able to tune our prompts by non engineers. A good example could be people who look after how we reply in different laicals. Some of the answers need to be in a good French language, for example.

And I, as an engineer, I don't speak French. I can't tune those prompts. So quick and simple rollout was another feature. We want to be able to roll out the prompts really quickly. And we want to teach those people how to experiment on data sets. So it's easier to enable others to do these simple machine learning tasks than to do all the tasks by ourselves, ML engineers.

So we picked prompt management solution. And here are the top three things that we found working out of the box right away. We talked about tracing, how it enables finding issue root causes. We talked about prompt management and the good things about it, how it enables other people to contribute. What's interesting, it links traces to prompts, so now we know which prompt is exactly responsible for which failure in the trace, if that was a prompt fault.

And it gives us a single source of truth. And one more feature that we found extremely useful was LLM as a judge. So spinning up LLM as a judge might look dangerous, but it actually helps us to enable, again, non engineers to evaluate systems, to evaluate things like compliance or voice and tone for different lapels. Here are three things that we actually had to build on top of LendFuse. While it was a good platform, we quickly started building on top of it.

We needed PII reduction almost immediately, and we needed asynchronous PII reduction. We don't want a reduction to affect the runtime of our systems, so we had to build that pipeline ourselves. We also had to make sure that our reduction is robust, so we had to evaluate it properly. It's now semi deterministic.

There's a deterministic component, and there is LLM driven component. Then there is a trace sampling. At a large scale, you want to understand what's the most important part of your system. Otherwise, you pay for all the traces that you capture. We want to look into automations. We want to look into escalations and issues. And don't look at all the traces because 90% of them are not going to be that useful.

So we had to offload traces to separate DB and sample from here. And the last one is trace enrichment. This one is interesting. Once we start tracing our system, there are some events that are happening outside of that trace, but still very, very useful for diagnostics. For example, user has left a feedback for us and did it one day after the trace has been captured.

We want to add those events back into the trace and enrich traces with that useful information. So we attach that useful information to traces via an independent job that runs async. That helps us to narrow down the issues even better. After adopting the observability platform, we came up with this approach to evaluation. Essentially, it's layer by layer.

We have a flying evaluation that gives us confidence during building. It helps us formulate requirements. Usually, would pick a data set, we would run our system, we would see what the performance is like. Then it's a shadow run. This is something interesting that we've been practicing. We would often run a component independently of the system without serving the result of that component to the user so we can see how it performs on the real traffic.

Yes, it makes it a bit more expensive, but it's very valuable information, especially if you try to cold start the component. Then it's our elements of judges. They help us to identify what's failing at scale and where human QAs need to focus on. So elements of judge allows us to focus human attention essentially. Sometimes there can be areas where elements of judge simply cannot be helpful. So then human takes over and looks at those cases every week. And in the end, it's life metrics.

How did we go? What's the user satisfaction? How many tickets were solved? Those are all important signals. And they they also, they're independent. They give us a lot of useful information. So we gain those. What's important, these five layers, they are repeated for many chances that we make to the features. Next, I'll invite Sahil to talk about the example of the layered evolution approach. Thank you, Sergei.

Sorry. Can you hear me? Yeah. Awesome. Thank you, Sergei. Yesterday, I googled of how to be the last speaker at a conference, and the answer top result was Don't be. But anyways, I assume that I'm, they left the best for the last and let's get going because yeah, we wanna wrap this up before the bar opens.

Okay, so I'll go through this layered approach with this example of how we tuned our escalation decision system. So think of it as a, it's pretty much a subsystem that decides whether an AI generated response should be sent to the customer or should we escalate this to a human specialist. So the first thing is we start off with offline evaluations.

So we basically create a ground truth data set of tickets, the responses. And ideally the ground truth is whether this response is good enough to send to the user or should this be escalated and to a human specialist. The next thing that we do is we basically can then run prompt and model experiments.

So you basically run new versions against this existing data set and calculate this score. So you basically calculate the accuracy of our escalation. So how well we are doing when it comes to escalating the right prompts, sorry, the right tickets. And then finally, decide on whether the accuracy of the escalation system itself is good enough based on a threshold from a business perspective.

One thing I want to highlight here is once we have this loop set up in place, making these improvements is something that non engineers can do. So within our team, the PM was actually able to make all those iterative improvements on these prompts because we have the data set and the entire offline eval loop set up.

And that is quite empowering. Next, we talk about shadow runs. So shadow runs basically help us validate changes on real traffic safely. You basically are running new version of the prompt alongside live traffic with zero user impact. What Shadow Run pretty much also helps solve is the problem of the cold start problem where, yeah, we are basically able to capture real production data and seed this through to offline evals.

At canvas scale, you're basically talking at about 10 ks traces a day that we run as Shadow. And essentially, that's a good enough data set for us to be able to feed in the valuable items into our offline data sets. Shadow runs is not just for escalation systems. Basically, the idea can work across multiple subsystems.

So you could have multiple shadow runs for response generation to compare responses between different models, escalation prompts, compliance prompts, all can be shadowed within a single run. With the escalation decision, we actually started with, in production, we started with, okay, we'll just escalate everything to capture data in real time in production without the AI system sending any response back to the user. And then we built on top of the escalation prompt to allow for white listing pretty much the cases that we find are good enough for the AI to actually respond.

We talk about LLM as a judge. So what LLM as a judge really helps us enable is evaluating at scale. Conceptually, it's basically just another separate model that's grading your output against a rubric. Because you're using a separate model, what it really helps to add is diversity and reduce the overall self bias. One thing I wanted to highlight with LLM as a judge is it's always valuable to have narrow judges.

So basically have multiple judges evaluating individual aspects of the quality. So an example here is we have LMS judges that are evaluating compliance, evaluating response quality, voice and tone. And each of these individually provide us valuable insights on where we need to make improvements.

Another key call out with LLM as a judges is you need to make sure that we are able to align the LLM as a judge and calibrate this against human review. So we wanna make sure that human are looking at the LLM as a judge's responses and we are making sure that they're aligning with the human judgment.

Another call out is with LLM as a judge, it's important to look at the trend rather than individual snapshots. So if you're monitoring trend, it can actually be quite valuable because any sort of down trend or change in the trend will essentially help us, will be an early sign of any sort of regressions that we want to review.

Next is human review. So human review is foundationally quite a critical piece for basically being able to find improvements and essentially identifying issues that simply LLMS judges cannot evaluate just because they require subject matter expertise. So as we're looking at solving customer queries, customer issues, A lot of these aspects, for example, whether the AI agent was able to resolve a customer issue or is something that requires domain judgment, requires understand the product, requires you to understand the different nuances and aspects attached. And that's where human review is critical.

And human review is solely used here for two purposes. One is for fine tuning and improving the simple LLM as a judges, for example, the escalation decision, and the other aspect of where SMEs are actually required. So things such as, are we looking at the right policies, are we applying the right rules, and so on. Last step is in the whole layered approach is the live metrics.

So live metrics pretty much are the ultimate verdict in terms of whether the changes that we're making are actually having an impact. AB tests, we found AB tests to be, yeah, we basically actively use AB tests to roll out any new changes. And this helps with comparing live metrics. We can then look into diving deeper for any sort of anomalies in scores like CSAT over time.

And then what the process pretty much looks like is because we are tracking this on a week by week level, if there's a drop in CSAT, would detected an anomaly. You go into the trace, deep dive into the ticket, understand where the system went wrong, and then identify any sort of improvements and shift those improvements going forward.

Before wrapping up, wanted to quickly also go through what's next. So I know there's a few sessions that talked about this entire auto eval loop. But basically, this is something that we're experimenting with is how can we make the LLM as a judge collaboration more efficient. And with auto eval, the idea is that you start off with defining a data set and and then you're running this loop.

So you run and score. The AI agent is then finding failures and planning a refinement. And then the agent itself is committing a new prompt version and essentially you repeat the loop. And because we are doing Langfuse, we can pretty much use Claude code as the agent harness to essentially connect to Langfuse YMCP and run this loop to basically be able to improve and create improved versions of the prompt.

One thing I want to highlight is this approach is, the critical piece to get this right is how we define our data sets and the scorer. So yeah, that really helps with identifying and getting this to work with good quality. Next is evaluation across systems.

So evaluation across systems, we have multiple systems that we're running individually evals on, but we want to make sure that we have a consistent view of quality across all the different systems and things such as voice and tone compliance and handover. And then lastly is data anonymization. So we've talked about PII, but we want to go the next step where we can anonymize the data so that we can then use these traces safely in our production for our offline evals.

I'll close off by three key takeaways. The first thing is traces become the language we speak. So with traces, pretty much teams are going to look at traces as the first class citizen and the conversation pretty much starts with the traces. Second is layered evaluations.

So we need to have breadth, depth and impact when it comes to layered evaluations. LLMS judges provide the breadth, human QA offline evals help with the depth, and live metrics are the ones that actually show impact. And then lastly is democratizing quality. Evals should be everyone's job.

It's not something, and that's something that we have been able to achieve with PMs, QA, support teams, engineers, all helping and shipping evals and improving our systems. And the AI engineers are no longer the bottleneck here. Thank you so much and hope you had a great day and feel free to reach out for any questions.

Scalable support for 1B+ MAU

A bar chart illustrating rapid, exponential growth in Monthly Active Users (MAU) from 2015 to 2025. The chart's peak is labeled as 260M+ MAU, showing a steep upward trend.

260M+ MAU

From the total monthly active users, 2-5% need help.

Of those needing help:

  • 97% have Simple problems

    Resolution: Self-serve (chatbot, flows, ...)

  • 3% have Hard problems

    Resolution: AI driven resolution + Human

A flowchart diagram illustrating customer support scaling. It starts with an icon representing a large group of people, labeled "260M+ MAU". An arrow points from this group to another icon of a group of people, indicating that "2-5% need help". Blue question marks float above this second group.

From the group needing help, two dashed lines branch out: one labeled "97%" and another labeled "3%".

The 97% branch leads to a rectangular box labeled "Simple problems", which contains an icon of a person with a thumbs-up and a thumbs-down gesture. Below the label, text reads "Self-serve (chatbot, flows, ...)".

The 3% branch leads to a rectangular box labeled "Hard problems", which contains an icon of a person wearing a headset, with a question mark and a speech bubble. Below the label, text reads "AI driven resolution + Human".

Customer Support System Overview

  • A group of users with questions directs 97% of queries to the Help Assistant and 3% to the Ticket Resolution System.

Help Assistant

  • Performance Metrics:
    • Latency: High
    • Cost: Medium
    • Reasoning: Low
  • Usage Statistics:
    • 10M+ interactions / month
    • 10+ agentic flows
    • 500+ articles

Ticket resolution system

  • Performance Metrics:
    • Latency: Low
    • Cost: Low
    • Reasoning: High
  • Usage Statistics:
    • 100k+ tickets / month
    • 100+ LLM tools
    • 1000+ articles
A diagram illustrates a customer support workflow. An icon representing a group of users with question marks above their heads connects to two distinct systems. 97% of queries go to a "Help Assistant" and 3% go to a "Ticket resolution system". Each system is accompanied by bar graphs showing its relative performance in latency, cost, and reasoning, and lists of operational statistics. The Help Assistant shows high latency, medium cost, and low reasoning. The Ticket resolution system shows low latency, low cost, and high reasoning.

SUPPORT AUTOMATION · QUALITY

Balance Volume and Quality

  • Did the agent actually help?
  • How do we scale with more users/requests?
  • Did we escalate when we should have?
  • Correct context, correct tools?

SUPPORT ARCHITECTURE

Under the hood

  • Retrieval
  • Prompts
  • LLM calls
  • Routing
  • Content
  • Workflows
  • Sub-agents
  • Tools
  • Policies & guardrails
A diagram illustrates the "SUPPORT ARCHITECTURE Under the hood", presenting nine key components within a rounded rectangle. Each component has an icon and a label: Retrieval (database with gear), Prompts (speech bubble with code brackets and sparkles), LLM calls (brain with neural connections), Routing (node with arrows indicating different paths with checks and an X), Content (document with a pencil), Workflows (gear with circular arrows and checkmarks), Sub-agents (person icon with interconnected nodes), Tools (crossed wrench and screwdriver), and Policies & guardrails (checklist document with a shielded checkmark).

OBSERVABILITY • TRACING

LOGGING

For deterministic code. Time-ordered, flat, grep-friendly.

AI TRACING

For non-deterministic systems. Structured by causality, with prompts, tools, and costs as first-class citizens.

A screenshot labeled 'Before' displays a console or terminal window filled with many lines of log messages, including 'INFO', 'DEBUG', and 'ERROR' entries, indicating system activity. A screenshot labeled 'After' shows an 'AI Tracing' user interface. This interface details a structured workflow, including steps such as 'Preprocess query', 'Build content', 'Execute tool', 'Generate step', each with associated durations. A larger panel on the right labeled 'Preview' displays a text response from an AI system, starting with "Thanks for getting in touch...".

OBSERVABILITY • PROMPT MANAGEMENT

Github? not quite...

  • Rigour
  • Tuning by non-engineers
  • Quick and simple rollouts
  • Experiments on datasets

Example: SMEs tune prompts for non-En locales

Prompt Example (from screenshot):

ROLE: You are an automation eligibility screener for customer support tickets.

TASK: Analyze the ticket and context to determine if it should be automated or escalated to a human.

Key sections within the prompt:

  • system_response (highlighted by Sahil)
  • ## Purely Informational (highlighted by Michelle)
  • ### Self-Serve Guidance (highlighted by Sergey)

A screenshot of a prompt management application interface. The left panel shows a chronological list of prompt versions and modifications. The right panel displays the configuration details for a selected prompt (labeled #43), including its 'Text Prompt' field. Within the prompt text, green, blue, and purple annotations labeled "Sahil," "Michelle," and "Sergey" respectively, point to different structural sections like 'system_response', '## Purely Informational', and '### Self-Serve Guidance'. The "Rigor" bullet point has a black cat emoji, and the bullet points "Tuning by non-engineers", "Quick and simple rollouts", and "Experiments on datasets" each have a cricket bat emoji.

OBSERVABILITY • THE EASY PARTS

Making system observable, iterable, measurable

Tracing, cost, errors

Tracking important information. Finding issue root causes

3m 27s | $0.393672
• Preprocess query
  1.04s
• Build context
  17.72s | $0.005747
• Retrieve content
  42.95s | $0.009641
• Agent loop
  2m 0s | $0.162340
• Shadow tasks
  27.09s | $0.000558
  • (shadow) - Escalation flag
    3.41s | $0.000558
  • (shadow) - Replay structured generation
    3.91s | 4,666 × 347 (5,013) | $0.000558
Generate draft reply

Prompt management

Connect traces with prompts, safe iterations, better collaboration

  • Experimenting
  • Versioning
  • Accessibility
  • Link traces & prompts
  • Single source of truth

LLM-as-judges

Measuring quality at scale, catching regressions, enable SMEs to run evals

  • Code / No code
  • Accessibility
  • Versioning

The slide is divided into three vertical columns, each with a different colored header section: purple, blue, and green. The first column, labeled "Tracing, cost, errors," features a magnifying glass icon and displays a screenshot of a detailed system trace output showing various stages, durations, and costs. The second column, "Prompt management," includes a speech bubble icon and lists five smaller icons with corresponding labels: a beaker for experimenting, a circuit board for versioning, a group of people for accessibility, a chain link for linking traces & prompts, and a database globe for single source of truth. The third column, "LLM-as-judges," has a balance scale icon and lists three smaller icons with labels: a faucet for code / no code, a group of people for accessibility, and a leaf with gears for versioning.

Making traces safe, discoverable, and valuable.

  • Async PII Redaction

    Problem: redaction shouldn't affect runtime behaviour

    Solution: async redaction pipeline

    Value
    'Hi [REDACTED],'
    Thanks for getting in touch. We understand how important
    this is, especially when the final print doesn't match
    what you expected.
    We've reviewed your report and received the photos you
    attached. It looks like the green accents printed
    yellowed/washed out, the text appears slightly blurry,
    and there's pink/magenta fringing around some of the
    
  • Trace Sampling

    Problem: high volume → need to focus on important traces

    Solution: offload traces to separate DB and sample from there

    • Automations
    • Escalations
    • Issues
  • Trace Enrichment

    Problem: traces lack useful info available later (e.g. CSAT scores)

    Solution: attach useful information to traces via independent job async

    • CSAT
    • Resolution
    • Human QA

A shield icon is next to "Async PII Redaction". A funnel icon is next to "Trace Sampling". A price tag icon is next to "Trace Enrichment".

Under "Trace Sampling", there are icons for: a process flowchart (Automations), an exclamation mark inside a magnifying glass (Escalations), and a warning triangle (Issues).

Under "Trace Enrichment", there are icons for: a thumbs-up (CSAT), a checkmark (Resolution), and a person with a fedora and trench coat representing a detective (Human QA).

A code snippet is displayed in a dark theme, showing redacted text.

EVALUATING AI SYSTEMS

Layered evaluation

  • Measure real impact
  • Gain human insight, look into issues outside LLMaj context
  • Identify what's failing at scale
  • Validating feature with real traffic
  • Confidence during building - prompt and model changes
  • Live metrics
  • Human QA
  • LLM-as-a-judge
  • Shadow runs
  • Offline evaluations

Loop repeated for all changes

A diagram illustrating a "Layered evaluation" approach for AI systems. On the left, a vertical list with icons describes five evaluation goals: "Measure real impact" (clock icon), "Gain human insight, look into issues outside LLMaj context" (person icon), "Identify what's failing at scale" (scales icon), "Validating feature with real traffic" (loop icon), and "Confidence during building - prompt and model changes" (clipboard icon). On the right, a pyramid-like stack of five horizontal colored blocks represents different evaluation methods, ordered from the base upwards: "Offline evaluations", "Shadow runs", "LLM-as-a-judge", "Human QA", and "Live metrics". Horizontal lines connect each evaluation goal on the left to a corresponding evaluation method on the right. An arrow above the stack indicates "Loop repeated for all changes".

How we tuned the escalation decision.

A subsystem that decides whether an AI-generated reply is sent to the customer or escalated to a specialist.

  • Generated reply
  • from the agent
  • Guardrail check
  • send or escalate?
  • Send to user
  • Escalate to human

A flowchart diagram illustrates a decision process. It begins with a box labeled "Generated reply" (from the agent), which leads to a central process box labeled "Guardrail check" with the question "send or escalate?". From this check, there are two potential outcomes: a box labeled "Send to user" with a green checkmark, and a box labeled "Escalate to human" with a red warning sign.

ESCALATION DECISION

Make model/prompt changes with confidence

OFFLINE EVALUATION

  • Ground Truth Dataset

    150 labelled tickets — escalate or autosend

  • Prompt / Model Experiments

    New versions run against the same dataset

  • Score vs Ground Truth

    Measure accuracy of escalation.

  • Ship if Accuracy ≥ Threshold

    Otherwise iterate before production

Accuracy Score by Prompt Version — escalation_v1 dataset

10 experiment runs - each dot = one prompt/model config tested in Langfuse

  • Target ≥ x%
  • Improvements made by non-eng PM
  • hits target x% - ship!

Accuracy scores over 10 experiment runs shown: 82%, 86%, 84%, 89%, 91%, 93%, 93%, 94%, 98%.

A four-step process diagram illustrating an offline evaluation workflow. Step 1: Ground Truth Dataset, represented by a clipboard icon. Step 2: Prompt / Model Experiments, represented by a beaker icon. Step 3: Score vs Ground Truth, represented by a target icon. Step 4: Ship if Accuracy ≥ Threshold, represented by a rocket icon.

A line graph titled "Accuracy Score by Prompt Version" plots accuracy percentages over 10 experiment runs. The purple line shows the accuracy generally increasing from 82% at run 1.0 to 98% at run 10.0, with a dip at run 3.0 before resuming an upward trend. A horizontal green line indicates a target accuracy threshold. An annotation highlights "Improvements made by non-eng PM" below the graph, and another note "hits target x% - ship!" appears when the purple line crosses the green target line.

ESCALATION DECISION

Validate changes on real traffic, safely.

SHADOW RUNS

Run in parallel with production

New prompts run alongside live traffic, zero user impact

Solves the cold-start problem

Captures real production data to seed offline evals. 10k+ traces/day

Works across multiple subsystems

Response generation, escalation, compliance: all shadowed in one run.

Shadow run example – same ticket, two decisions

47 disagreements this week queued for manual review

CURRENT (PRODUCTION)

escalate: true

← missed a valid autosend response

SHADOW RUN (new prompt)

escalate: false

← correctly flagged safe for autosend

VERDICT

38 / 47

favoured new prompt

→ PROMOTE ✓

  • 01 Offline Evaluations
  • 02 Shadow runs
  • 03 LLM-as-a-judge
  • 04 Human QA
  • 05 Live metrics
Three circular icons represent: a connected loop for parallel execution, a database cylinder for data capture, and a grid of squares for multiple subsystems. An example shows a comparison between a 'CURRENT (PRODUCTION)' decision and a 'SHADOW RUN (new prompt)' decision, with a 'VS' icon in between, and a 'VERDICT' box showing a promotion decision. A horizontal process flow diagram at the bottom indicates five steps, with "02 Shadow runs" highlighted.

Always-on evaluation at scale.

LLM-as-a-judge

Another LLM scores traces

A separate model grades output against a rubric
— adds diversity, reduces self-bias.

One judge per evaluation criteria

Many narrow judges, each evaluating a single
aspect of quality.

Needs human alignment to work

Calibrated against human reviews, will only be as
good as its alignment.

Active LLM-as-a-Judge Evaluators

30-day pass-rate trend

Current

  • Compliance Risk: 82.2%
  • Escalation Judge: drifting 79.8%
  • Response Quality: 79.7%
  • Voice and Tone: 81.1%

Trends > snapshots. Escalation Judge still passes (>75%) — but the downtrend is something worth investigating

  • 01 Offline Evaluations
  • 02 Shadow runs
  • 03 LLM-as-a-judge
  • 04 Human QA
  • 05 Live metrics
An icon with scales representing justice. An icon with stacked papers or documents. An icon with a person and a cogwheel. A line chart showing the 30-day pass-rate trends for four evaluators: Compliance Risk, Escalation Judge, Response Quality, and Voice and Tone. Each evaluator has a corresponding line on the graph and a current pass percentage. The Escalation Judge line is labeled as "drifting" and shows a downward trend.

Dig deeper with human review.

Human QA Review

  • Weekly trace sample reviewed

    Review sample of traces across intents and criteria.

  • SMEs evaluate what judges can't

    Subject-matter expertise for nuanced, context-dependent calls.

  • Surfaces root causes and fixes

    Failures feed the next round of agent improvements.

QA Annotation Scorecard

Dimension Why human? Solely requires SME? Annotation
Escalation correct? Calibrate the Escalation LLMaj True / False
Article retrieved? No ground-truth article per scenario • SME True / False
Compliance risk? nuanced policy interpretation • SME Low / Medium / High
Issue Resolution met? domain judgement on real outcome • SME True / False
Free-form content opportunity? open-ended — needs human insight • SME Free Text
  • 01 Offline Evaluations
  • 02 Shadow runs
  • 03 LLM-as-a-judge
  • 04 Human QA
  • 05 Live metrics
The slide features three main sections at the top, each with an icon: a calendar with a checkmark for "Weekly trace sample reviewed", two overlapping person icons with a checkmark for "SMEs evaluate what judges can't", and a magnifying glass for "Surfaces root causes and fixes". Below these is a table titled "QA Annotation Scorecard" with four columns (Dimension, Why human?, Solely requires SME?, Annotation) and five rows of data. At the bottom, there is a horizontal navigation bar with five steps, where "04 Human QA" is highlighted.

ESCALATION DECISION

Close the loop with real outcomes.

Live metrics

CSAT, escalation rate metrics

The ultimate verdict on every change.

A/B tests for rollouts

Compare new vs. baseline on real tickets.

Dips trigger deeper analysis

Anomaly → trace-level investigation in Langfuse.

CSAT Score per Week

Trend: steady → dip → recovery

WHAT HAPPENED IN Week 5

76%

CSAT dropped 12pts from baseline

  • Anomaly detected (Week 5)
  • Trace deep dive (Langfuse)
  • Fix shipped (Week 6)
  1. Offline Evaluations
  2. Shadow runs
  3. LLM-as-a-judge
  4. Human QA
  5. Live metrics
Three distinct sections at the top each feature a circular icon: a speedometer for CSAT, a code bracket for A/B tests, and a warning triangle for deeper analysis. A line graph titled "CSAT Score per Week" plots scores (Y-axis 0-100) against weeks (X-axis 1.0-8.0), showing a steady score, a dip around week 5, and then a recovery. A yellow box highlights "WHAT HAPPENED IN Week 5," stating "76% CSAT dropped 12pts from baseline," followed by a flow diagram illustrating three steps: "Anomaly detected (Week 5)" with a warning icon, leading to "Trace deep dive (Langfuse)" with a magnifying glass icon, leading to "Fix shipped (Week 6)" with a checkmark icon.

What's next on the eval roadmap.

AutoEvals

Agent harness + Langfuse MCP run an autocalibration loop on prompts.

SETUP - ONE TIME
  1. Define dataset + scorers
  2. Run and Score

    Experiment against dataset via Langfuse MCP

  3. Diagnose

    Agent finds failures, plans a refinement.

  4. Refine

    Agent commits a new prompt version.

Claude Code runs the loop unattended

Evaluation across systems

Consistent quality across the full Canva support journey.

Evaluation Aspects:

  • Voice & Tone
  • Compliance
  • Handover

User Support Journey Steps:

  1. Help Assistant
  2. AI Ticket Resolution System
  3. AI Ticket Response Copilot
  4. Email Followup

+ user support journey

Data Anonymization

Turn production traces into safe, reusable eval datasets.

  1. Production trace

    raw

  2. Redact

    [REDACTED]

  3. Anonymise

    John -> Bob

  4. Eval dataset

    safe to use

A diagram illustrating three key areas of an evaluation roadmap: AutoEvals, Evaluation across systems, and Data Anonymization.

The "AutoEvals" section features a circular flowchart depicting a four-step iterative process: 1. Define dataset + scorers, 2. Run and Score, 3. Diagnose, and 4. Refine.

The "Evaluation across systems" section shows three distinct evaluation aspects (Voice & Tone, Compliance, Handover) positioned above a horizontal flowchart representing a user support journey through four stages: Help Assistant, AI Ticket Resolution System, AI Ticket Response Copilot, and Email Followup.

The "Data Anonymization" section presents a linear flowchart illustrating the transformation of data: Production trace (raw) leads to Redact ([REDACTED]), then to Anonymise (John -> Bob), ultimately resulting in an Eval dataset (safe to use).

Three things to take away.

  • 01 TRACES

    Traces became the language we speak.

    Cross-team debugging collapsed to "send me the trace ID."

  • 02 LAYERED EVALS

    Breadth + Depth + Impact

    LLM-judge for breadth. Human QA + Offline Evals for depth. Live metrics for impact.

  • 03 DEMOCRATISE QUALITY

    Evals are everyone's job now.

    PMs, QAs, support and engineers all ship evals. AI Engineers are no longer the bottleneck.

An icon depicting a winding path with a location pin marks the "Traces" section. An icon of three stacked layers represents "Layered Evals". An icon showing a group of three people symbolizes "Democratise Quality".

Technologies & Tools

  • Claude Code
  • Langfuse
  • Langfuse MCP

Concepts & Methods

  • AB Testing
  • Auto Eval Loop
  • Cold Start Problem
  • CSAT
  • Data Anonymization
  • Human Review
  • LLM as a Judge
  • Offline Evaluation
  • PII Redaction
  • Prompt Management
  • Shadow Run
  • Trace Enrichment
  • Trace Sampling
  • Tracing

Organisations & Products

  • Canva
  • Escalation Decision System
  • GitHub
  • Helper System
  • Ticket Resolution System