Free forever, no credit card.Get Started for Free →
← All posts
September 29, 2026 · 5 min read

How to Give a Copilot Studio Agent Persistent Memory Between Runs

How to Give a Copilot Studio Agent Persistent Memory Between Runs Every Monday at 8 AM, a Power Automate flow wakes up your Copilot Studio agent. It reads the support queue, drafts replies, flags the escalations. And every single Monday, it does all of that with no idea what happened the Monday before. It does not know the billing workaround was tried twice and failed. It does not know the customer it promised a follow-up to is still waiting. It re-reads the same queue with fresh eyes and makes

How to Give a Copilot Studio Agent Persistent Memory Between Runs

Every Monday at 8 AM, a Power Automate flow wakes up your Copilot Studio agent. It reads the support queue, drafts replies, flags the escalations. And every single Monday, it does all of that with no idea what happened the Monday before. It does not know the billing workaround was tried twice and failed. It does not know the customer it promised a follow-up to is still waiting. It re-reads the same queue with fresh eyes and makes fresh versions of last week's mistakes.

If you run scheduled automations with Copilot Studio agents, this is the problem that quietly eats your ROI. The agent is not dumb. It is just amnesiac, because Copilot Studio keeps conversation state scoped to the session, and a scheduled run is a new session every time.

Why the memory disappears

It helps to be precise about what survives and what does not. Within a conversation, Copilot Studio remembers plenty: topic variables track working state, global variables carry user-level state across topics, and system variables identify the user and the conversation. That is session memory, and it works fine.

The wall is the session boundary. When the conversation ends, or when a scheduled flow starts a fresh run, the agent starts blank. Microsoft's own agent samples say it plainly: persistent memory across sessions requires external storage, typically Dataverse, SharePoint, or Azure Cosmos DB. Nobody is hiding this. It is just not the default, and most builders discover it weeks into a project, usually the morning an agent repeats itself in front of a customer.

So giving your agent persistent memory means choosing where that memory lives outside the agent, and wiring two habits into every run: save what happened, read it back next time.

Option one: a Dataverse memory table

This is the heavy-duty Microsoft answer. You define a table, maybe AgentMemory, with fields for the memory key, the value, a scope (per user, per process, global), and an expiration date. The agent writes a row every time something worth keeping happens and queries the table at the start of every run.

The Dataverse route is the right pick when governance matters more than speed. Table-level auditing gives you a paper trail. Entra identity gives you real user scoping: use System.User.Id as the key for anything that must survive across sessions, but only when the user is authenticated. Dataverse memory is also the answer Microsoft's own consultants reach for first, and there are documented patterns for the full read-write loop.

The honest cost: you are now a database team for one agent. Schema changes, index tuning, cleanup jobs, expired-fact hygiene. Stale facts degrade agent quality, so you need expiration from the start, not as a later patch. And the table is only as good as the discipline around it. A Dataverse memory nobody queries at the start of each run is an archive, not a memory.

Option two: a SharePoint list

Lighter and faster to stand up. One list, one item per memory, columns for scope and expiry. Microsoft's copilot-agent samples literally prescribe this: structured memory (facts, preferences, tasks) in SharePoint lists, narrative memory in markdown files. For a single scheduled agent, say a weekly reporting agent that needs to remember last week's baseline numbers, this can run for months with almost no maintenance.

The limitation is retrieval. SharePoint gives you filters, not search. As the list grows, the agent either reads too much (burning tokens every run on the whole memory) or too little (missing the one fact that mattered). Scoped keys help: report:last-baseline, escalation:policy, user:summary-length. Think of it as a filing cabinet. Great when you know exactly where you filed things.

Option three: an MCP memory layer

There is a third option, and it is the one most Copilot Studio builders never consider. Published Copilot Studio agents support MCP tools. That means the agent can talk to a cloud-hosted memory layer over MCP exactly like it calls any connector: save context when something matters, load relevant context at the start of the run.

This is what Vilix AI is built for. Zero infrastructure: the agent connects to one Vilix AI account over MCP, and every run can recall what past runs saved. The same memory also follows your other tools, so the n8n workflow and the Claude session your team uses all read and write the same shared memory instead of each building its own Dataverse table.

A few grounded facts about how it behaves. Retrieval is semantic, so the agent finds memories by meaning, with keyword search running alongside so exact strings like ticket IDs and policy names match literally. It keeps full conversation history, not just distilled facts, which matters when the agent needs to answer "did we try this already?" Conflict resolution is last write wins: correct something once and the newest version is what every tool sees. Plans start with a free plan, there is a 7-day Pro trial with no credit card required, and you can export everything or wipe it instantly at any time.

The tradeoff is real and you should weigh it: memory lives outside your Microsoft tenant. If your compliance picture requires everything in Dataverse, options one and two are the honest choice.

Wiring the read-write habit

Whichever storage you pick, the pattern that makes memory work is the same, and it has three parts.

First, decide what gets remembered. Three things cover most scheduled agents: what was decided, what is pending, and what changed since last run. Everything else can be re-derived. An agent that saves everything learns nothing, because retrieval drowns.

Second, read memory at the start of every run. This is the step teams skip. Put the recall at the top of the flow, before any reasoning, and make it unconditional. Memory the agent does not read is memory you do not have.

Third, expire aggressively. Facts about your process go stale. Policies change, preferences change, workarounds get fixed for real. Build an expiration date into every memory and a weekly glance at what is about to age out. An agent acting on a memory from four months ago that nobody reviewed is doing harm with confidence.

Do this and your Monday agent stops being a stranger. It opens the queue, sees last week's pending follow-up, skips the workaround that failed twice, and picks up exactly where it left off. Stateless models are fine. An agent that wakes up blind every run is a bug you now know how to fix.

Get Started for Free

Persistent memory across ChatGPT, Claude, and the AI tools you already use in Vilix AI.

Get Started for Free

Free forever, no credit card.

Keep reading
ChatGPT's Agent Has No Memory on Purpose. Your Recurring Workflows Still Need One.

ChatGPT's Agent Has No Memory on Purpose. Your Recurring Workflows Still Need One. In July 2025, OpenAI launched ChatGPT Agent: a full virtual computer inside ChatGPT that browses the web, runs code in a terminal, edits spreadsheets, and chains multi-step tasks with minimal input. It is the closest thing to a digital employee that a chat product has shipped. It also remembers nothing between tasks. Run a competitor-research task on Monday and the same task again on Friday, and Friday's run has

Does Trigger.dev Remember Between Runs?

If you run scheduled AI work, you have probably looked at Trigger.dev. It is the background-jobs platform a lot of AI teams reach for: cron triggers, long-running tasks, durable execution, and now a whole AI chat stack with chat.agent. One question comes up constantly from automation operators: does Trigger.dev remember between runs? The short answer is layered: yes within a run, yes within a chat session, and no everywhere else. That last part is where scheduled agents quietly lose everything

Why Your AI Receptionist Keeps Double-Booking (and How Memory Fixes It)

Why Your AI Receptionist Keeps Double-Booking (and How Memory Fixes It) Picture a dental clinic running an AI receptionist on its phones. Monday morning, two patients call within five minutes of each other. Both need a cleaning, both want Wednesday at 4 PM, and both hear the same warm confirmation: "You're all set for Wednesday at 4." Wednesday arrives, two patients are in the waiting room, and there is one hygienist. The receptionist sounded flawless on both calls. It had no idea the other cal