Use case · Support agent

A returning customer is not a stranger

Past tickets, resolution outcomes, preferred channel. Saved at ticket close, read at ticket open. The agent picks up where the last conversation ended.

The shape of it

Want to build a support agent that already knows who is writing? Here is how

Think about your favourite local coffee place. You walk in and the barista says "the usual, oat flat white, extra hot?" before you open your mouth. You never told them again. They just remembered.

Now picture the opposite, a call centre where every single agent makes you spell your name, read your order number, and re-explain the whole problem you already explained twice yesterday. A good support agent should feel like the barista. Most of them feel like the call centre, because the moment a chat session ends the agent forgets you exist.

Korely is the part that lets your agent be the barista. The customer writes "hey it is still broken" and the agent already knows who they are, what broke, which channel they like, and that this is the third time they have asked.

How you build it

Six steps, and the last one is the part you skip

  1. 1
    Wire up the agent itself. You already have Claude Code or Cursor, so spin up the bot in whatever you use for helpdesk and chat: a Zendesk or Intercom integration, a custom widget, a Slack or WhatsApp bridge. This part is the easy part and you can do it today.
  2. 2
    Identify the customer before the first reply. When a message comes in, take the email or customer ID and look up everything you already know about that person: open tickets, past issues, the channel they wrote from last time, their plan, their mood on the last contact. This is one read call, and it has to be fast or the chat feels laggy.
  3. 3
    Feed that context into the prompt. Open the conversation already informed. Instead of "Hi, how can I help you today," the agent can say "Hi Marco, is this still about the failed export from Tuesday?" That single line is the whole difference between a bot people tolerate and one they trust.
  4. 4
    Let the agent write down what it learns. The customer mentions they are on the new billing plan, that they prefer email over phone, that the bug only happens on Safari. The agent saves those as facts the moment they come up, so the next agent or the next session starts from there.
  5. 5
    Handle the truth changing over time. Yesterday the ticket was open, today it is resolved. Yesterday they were a trial user, today they pay. Memory cannot just pile up old notes, it has to know what is true right now and resolve the contradiction when "use my work email" becomes "actually use my personal one," keeping a trail of when it changed in case billing asks later.
  6. 6
    Skip the hard part. A bi-temporal, graph-backed agentic memory that recognises a returning customer, tracks issue history, knows the preferred channel, handles facts that change, and resolves contradictions, all answered in under fifty milliseconds. With Korely you skip building that infrastructure yourself. You call add to save what the agent learns and search to recall it. It starts at nineteen euro a month and it saves you weeks of building plus the ongoing cost of running it.

The shape of the fix

Recognise the customer, save what they tell you, read it back next time

Friday chat

CSV export failing

  • Agent resolves the issue
  • Prefers email over chat

Korely memory

Bi-temporal store

  • Indexed by customer email
  • Old open ticket superseded on resolve

Monday chat

Recognised, fast-path

  • No intake repeat
  • Opens from what is true now

The developer makes two calls. Korely runs the heavy memory machinery underneath: bi-temporal facts, contradiction resolution, the entity graph, and hybrid retrieval.

How Korely fits

The memory layer that makes a support agent feel like it remembers people

That layer is genuinely hard. Korely saves you from building it. Bi-temporal typed facts so the agent knows what is true now versus what was true last week. Two-stage contradiction resolution so a changed preference does not leave two conflicting answers floating around. An entity graph that links a customer to their tickets, their devices, and their plan. Hybrid retrieval, full text plus vector plus reranking, so the right history surfaces even when the customer phrases it differently than they did last time.

We measured it. At an equal token budget, a reader answers 76 percent of long memory questions correctly from Korely selected memory versus 42 percent from a same-size recency window. A 34 point gap, reproducible. The retrieval runs over Postgres only, with the vector index, the full-text index, RRF fusion, and the reranker in the same store, no extra database to operate.

Reads come back in under fifty milliseconds with no LLM on the read path, which matters enormously in support where a laggy reply kills the illusion of a human. It is EU-hosted, so customer data, which is sensitive in support, stays in Europe. For a helpdesk team, all of this is the difference between an agent that re-asks what the customer already told you and one that opens with the answer. You write the agent. Korely is the memory.

Show me the code

Save on close, read on open

support_agent.py python
# ── On ticket close ────────────────────────────────────────────
from korely_memory import Korely

korely = Korely(api_key="kor_live_...")

korely.add(
    f"Ticket #{ticket.id}: customer reported CSV export failing on "
    f"order {ticket.order_id}. Resolution: fixed, marked resolved "
    f"2026-03-04. Prefers email over chat.",
    agent_id=f"brand-{brand_id}",
    metadata={"customer_id": hash(customer.email)},
)

# ── On ticket open: search before the agent greets ─────────────
history = korely.search(
    f"history customer {customer.email}",
    agent_id=f"brand-{brand_id}",
)

if history:
    greeting = build_warm_greeting(history)   # "Hi again, the Friday export is sorted..."
else:
    greeting = build_first_time_greeting()

The same memory is reachable from any agent, Zendesk, Intercom, Slack, WhatsApp, or a plain HTTP client. Scope memories with different agent_id values to keep each brand customer history separate and auditable.

When the truth changes

The agent answers from what is true now, not from a pile of stale notes

A customer opens a chat Friday afternoon: "my CSV export is failing." The agent helps, the customer says "ok that fixed it, thanks," and the chat ends. The ticket is now resolved. On Monday the same customer writes back: "hey, quick one."

A memory that just stacks everything would surface the Friday ticket and have the agent say "I see you are having trouble with your CSV export, let me help with that," which is wrong and makes the customer feel unheard, because that is done. With time-aware memory the agent reads what is true now: the export issue is closed, marked resolved Friday, so it opens with "Hi again, the export issue from Friday is sorted on our side, is this something new?"

Same data, completely different experience. The agent never re-opens a problem the customer already told you was fixed, and never re-asks for the order number, the email, or the channel they already gave you. That is the whole point of bi-temporal facts.

timeline.py python
korely.add(
    "Ticket open: CSV export failing on order 8842.",
    agent_id="brand-acme",
    metadata={"effective_from": "2026-03-06"},
)

# Same chat, the fix lands and the ticket closes
korely.add(
    "Ticket resolved: CSV export fixed on order 8842.",
    agent_id="brand-acme",
    metadata={"effective_from": "2026-03-06"},
)

korely.search("export status", agent_id="brand-acme")
# → "resolved" (current). Open-ticket memory marked superseded in the graph.

# Retrieve full history via the REST API:
# GET /v1/memories/{id}/history  -> full timeline with effective_from metadata

Frequently asked

Support memory, common questions

How does the agent recognise a returning customer before they say anything? +

You look them up by something you already have at the start of a session, usually their email or a customer ID from your helpdesk. With that, the agent calls Korely search scoped to that customer and gets back their history, their open and resolved tickets, the channel they wrote from last time, and anything still unresolved. The agent puts that into its prompt before it writes the first line, so it can open with the answer instead of asking who you are. The read comes back in under fifty milliseconds, so the chat never feels like it is thinking.

What stops the agent from re-asking things the customer already told me? +

The whole point of the memory layer. Every detail the customer gave you in past chats is saved as a fact tied to that customer: their email, their plan, the bug only happening on Safari, that they prefer email over phone. When they come back, the agent reads those facts first. So it never re-asks for the order number, never makes them re-explain the issue, and never starts from zero. That is the difference between a bot people tolerate and one they trust.

My customer situation changes constantly. A ticket gets resolved, a plan gets upgraded. How does memory keep up? +

This is where time-aware memory matters. Korely stores facts with time, so it knows what is true right now versus what was true last week. When a ticket is marked resolved, the old open status is superseded, so on the next chat the agent does not re-open a problem the customer already told you was fixed. If a preference changes, the agent answers from the current one, not from a stack of conflicting old notes. The trail of what changed and when is still there if billing or compliance ever needs it.

Do I have to build the memory infrastructure myself? +

No, and that is the point. You already have Claude Code or Cursor to build the agent and your helpdesk integration. The hard part is the memory: bi-temporal facts, contradiction handling, an entity graph linking customers to tickets and devices, and fast hybrid retrieval. Korely is that part, ready to use. You call add to save what the agent learns and search to recall it. We measured the quality: at an equal token budget a reader answers 76 percent of long memory questions correctly from Korely selected memory versus 42 percent from a same-size recency window. It starts at nineteen euro a month.

Where is the customer data stored? Support data is sensitive. +

In a managed store in the EU, Postgres with a vector and graph index, nothing for you to host. Support conversations carry personal and sometimes sensitive information, so keeping it in Europe matters. You can export everything or erase a customer memory with one call when they ask, which keeps you on the right side of data requests.

Does this work with Zendesk, Intercom, Slack, or my custom widget? +

Yes. Korely sits behind whatever front end you use. Any agent that can make an HTTP call, through the Python or Node SDK or the REST API, can read and write memory. So the same customer memory is shared whether they reach you through chat, email, Slack, or WhatsApp, and the agent recognises them no matter which door they came through.

Let the agent open the next ticket already informed

The SDKs are live and the Hobby tier is free, so you can wire up customer memory and see your agent recognise a returning customer today. When you are ready for real volume, see what fits.

Looking for a different shape? See the other nine use cases →