SecurityAI agentsIntegrations

Chatbot Permissions: What a Support Bot Should Never Be Allowed to Do

A four-tier permission model for AI support agents: which actions to allow, which need a verified visitor or a person, and why refunds never belong to the bot.

PepoChat TeamPublished Last verified 17 min read
A metal control panel with labelled close-off-open rotary switches for motors and a vent beside a red emergency stop button

Short answer

Give a support chatbot permissions in four tiers. Reading public information needs no checks. Reading personal data needs a verified visitor and a trimmed field list. Reversible writes, such as filing a ticket or cancelling at period end, need an explicit request and a confirmation. Refunds, payments and other irreversible actions stay with a person, because automated actions can run twice. OWASP's 2025 list, current in October 2026, calls over-powered agents excessive agency.

Connecting an AI support agent to Stripe, Shopify or a helpdesk moves the worst case from a wrong answer to a wrong change: a plan cancelled for the wrong person, a ticket filed three times, a refund nobody approved. Which of those can happen is decided by the permissions you set, not by how clever the model is.

The guide below is for founders, support leads and developers deciding which actions to switch on. It sets out a four-tier permission model, maps common support actions to it, and ends with a ten-question checklist. For what action-taking agents can do in general, see agentic AI in customer service; this post is about what to allow.

Every source was read on 19 October 2026: OWASP's entry on excessive agency, NIST's AI Risk Management Framework and Stripe's documentation. The examples use PepoChat, the AI support agent we build, as its documentation and source code stood in October 2026, including where a control is only an instruction to the model.

Why do permissions matter more than the model?

Permissions set the worst case; the model only sets how often you reach it. A model that gets almost every request right still acts on the one it gets wrong, and a manipulated conversation can produce that one on purpose.

A permission, for an AI agent, is three settings you control: which tools it may call, what the credential behind each tool may do, and which checks must pass before a call goes out. None of them depends on the model behaving well.

The OWASP Top 10 for LLM Applications calls the failure excessive agency. OWASP's LLM06 entry, from the 2025 edition still current in October 2026, defines it as the weakness that lets damaging actions happen in response to unexpected, ambiguous or manipulated model output. Its three causes each have a support-desk version: excessive functionality is a cancel action you never needed, excessive permissions is a full secret key where a read-only key would do, and excessive autonomy is a write nobody confirms.

Permissions also cover words. A chatbot that promises a refund can commit money without touching a payment system: in Moffatt v. Air Canada (February 2024), a Canadian tribunal ordered the airline to pay damages after its chatbot misdescribed how to claim a bereavement refund, as covered in AI chatbot security risks. The money tier therefore covers promises as well as payments.

What are the four permission tiers for an AI support agent?

The four tiers sort every action by what it touches and whether it can be undone: reading public information, reading personal data, reversible writes, and irreversible writes and money. Each step up adds a check, and the top tier takes the bot out of the decision.

TierExamplesVerificationHuman checkpointLoggingWorst case
1. Read public informationReturn window, prices, opening hours, setup stepsNoneNone; spot-check answersThe conversation transcriptA wrong answer you may be held to
2. Read personal dataOrder status, plan and renewal date, ticket status, contact recordA verified visitor, or an identifier a stranger cannot guess, plus minimal fieldsNone per request; weekly transcript reviewTranscript plus the provider's request logOne customer's data shown to someone else
3. Reversible writesCreate a ticket, cancel at period end, subscribe on request, alert the teamVerified visitor for account changes; explicit request; restated confirmationNone per action; a person reads the created record anywayTranscript plus the record created in the other toolA duplicate or unwanted record, cheap to undo
4. Irreversible writes and moneyRefunds, payments, credits, immediate cancellation, account deletion, address change after dispatchNever enough on its ownA named person decides, outside the chatTicket, approver's name and the payment tool's own recordMoney or data lost, possibly twice

Tier 1 is what your website already publishes. The control is grounding: the agent answers from your knowledge base and hands off when it finds nothing.

Tier 2 begins when an action returns something about one customer. Its failure is quiet: one customer's order or plan read out to someone else, with nothing in the logs that looks wrong.

Tier 3 covers changes a person can undo in a minute: a merged ticket, a removed subscriber, a period-end cancellation reversed before the period ends. Duplicates are its common failure, covered in the retries section below.

Tier 4 is where the bot stops acting and starts preparing. Refunds, payments, credits, immediate cancellations and deletions move money or cannot be reversed, so a named person decides, using the details the agent collected.

A human checkpoint is a point where a person, not the model, decides whether an action happens. NIST's AI Risk Management Framework asks organisations to define, assess and document their processes for human oversight (subcategory MAP 3.5), and the NIST AI RMF Playbook suggests starting by identifying the system features and capabilities that require it. For a support bot, the tier table is that document.

Which actions should a support chatbot be allowed to take?

Allow tier 1 freely, tier 2 only behind verification and trimmed fields, most of tier 3 with a confirmation, and nothing in tier 4. The table maps common support actions to the tiers; the safeguard column is the minimum, not the whole design.

ActionTierAllowed for a bot?Safeguard
Answer policy, pricing and how-to questions1YesAnswers come from your knowledge base; hand off when nothing is found
Check order status by order number2Yes, with minimal fieldsStatus and dates only, since many stores number orders sequentially
Find a customer's orders by email2Only for a verified visitorVerification code first; order numbers and statuses, never addresses
Read a plan, price and renewal date2Only for a verified visitorRead-only key; no card or payment method fields
Check a ticket's status2YesStatus and subject only, because ticket numbers can be guessed
Look up a CRM contact2Only to file a follow-upUse the record to attach a ticket; never read it back to the visitor
Create a ticket or case3YesExplicit request; a summary rather than the transcript; duplicates get merged
File a bug report3YesSummary and steps; the product team triages
Post an alert to a team channel3YesInternal channel only; mentions switched off where the tool allows
Subscribe someone to a newsletter3Yes, on explicit requestConfirm the address; use double opt-in
Book a meeting3YesThe calendar re-checks the slot; the host can cancel
Cancel a subscription at period end3Yes, for a verified visitorRestate the plan and end date; explicit yes; reversible until the period ends
Trigger a Zapier automationSame as the ZapOnly if the Zap stays in tier 3 or belowRead what the Zap does before enabling the action
Change plan or seat count mid-cycle4NoProrations create charges or credits; link to your billing portal
Change a delivery address after dispatch4NoRedirecting goods is a common fraud move; a person checks
Cancel immediately4NoStripe cannot restart a cancelled subscription; offer period end instead
Refund, credit or discount4NoDraft for approval: the agent files the request, a person decides
Take a payment or change a card4NoLink to your billing portal; the bot never sees card details
Delete an account or personal data4NoIdentity proven outside the chat; legal deadlines apply

A Zapier action has no tier of its own: it inherits the tier of whatever the Zap does. PepoChat's Zapier template even offers "refund request" as an example event label, which is safe while the Zap only records the request and unsafe the day someone extends it to pay the refund.

Newsletter sign-ups are reversible but not harmless, because anyone can type someone else's address. PepoChat's Mailchimp action subscribes people straight away, and the Mailchimp documentation shows how to switch it to pending, so Mailchimp emails a confirmation first and only the inbox's owner can complete the sign-up.

Plan changes look like tier 3 but create prorated charges or credits, which makes them money, and address changes become a fraud route once an order ships. The full subscription flow is in cancelling Stripe subscriptions safely.

Does a chatbot need to verify identity before it reads customer data?

Yes, for anything personal, unless the lookup needs an identifier a stranger cannot guess and returns only harmless fields. Verification decides who may ask; the field list decides what a wrong person could learn if verification is skipped or fooled.

A verified visitor is someone who proved control of an email address during the current session, usually by typing a six-digit code sent to it. PepoChat's visitor verification codes expire after 10 minutes and allow 5 attempts, and the methods and their trade-offs are compared in chatbot identity verification.

In PepoChat, verification is checked in code before the agent recalls someone's meeting history or a transcript is emailed, but integration lookups are not gated: a Stripe or WooCommerce lookup by email runs for any address typed into the chat, as the Stripe integration documentation says plainly. A "verify first" line in an action's "when to use" text makes the agent ask for the code, but PepoChat does not pass the verification result to actions, so nothing in the request checks that it was entered.

Three settings close most of that gap. Trim the response fields until an unverified answer is harmless: PepoChat's Shopify action reads only the order name, date, payment status and fulfilment status, as the Shopify order status walkthrough shows, and a custom action passes only the fields you list (an empty list passes the whole response). Prefer identifiers that are hard to guess. And when the lookup hits your own API, make it require two facts that must match, such as the order number and the order's email, and return nothing when they do not.

OWASP calls that third habit complete mediation: authorization enforced in the downstream system instead of left to the model. A manipulated conversation can change what the model asks for, but not what your API agrees to return.

Why can a chatbot action run twice, and which writes are safe?

An action can run twice because systems that cannot tell whether a call landed try it again. A write is safe under those conditions when repeating it changes nothing that matters.

At-least-once execution is a delivery rule that prefers repeating a step to losing it: when the system cannot tell whether a step finished, it runs the step again, so a write can occasionally happen twice. PepoChat's integrations documentation says its actions work this way and warns against wiring refunds or payments as actions. The usual cause of a repeat is a step that fails after the provider call already succeeded and is then retried. A model can also repeat a call when a visitor asks whether something went through.

An operation is idempotent when running it twice leaves the same result as running it once. Reads are idempotent, and so is setting a flag: PepoChat's Stripe cancel action sends cancel_at_period_end=true, and a second identical request changes nothing. Creating something is not, because a retried "create ticket" files a second ticket.

Payment APIs handle this with an idempotency key, a unique value sent with a write so the server can recognise a retry. Stripe's idempotent requests documentation says the API returns the saved result of the first request to any retry with the same key, errors if the parameters differ, may prune keys once they are at least 24 hours old, and accepts keys on every POST, while GET and DELETE are idempotent by definition.

If your own API accepts such keys, a PepoChat custom action can send one, because its headers take the same {{input}} placeholders as the URL and body. Build the key from an order number, since Stripe advises against personal identifiers such as email addresses. Without keys, design the endpoint so a repeated request finds and returns the first result.

A confirmation step handles the other failure, a misunderstood request: the agent restates the exact change, waits for a plain yes, and reports the result from the provider's response rather than from its own expectation. PepoChat writes this into the instructions of its account-changing actions: the Stripe cancel action may run only when the customer explicitly asks and confirms, and the Mailchimp action only after the visitor asks and confirms the address.

Of PepoChat's 22 prebuilt actions across 13 tools, 11 only read, 11 write, and none moves money.

ToolRead actionsWrite actionsIf a write runs twice
StripeFind Stripe customer; Check subscription statusCancel subscription at period endNothing changes, because the flag is already set
ShopifyCheck order statusNoneNot applicable
WooCommerceCheck WooCommerce order; Find WooCommerce orders by emailNoneNot applicable
ZendeskCheck Zendesk ticket statusCreate Zendesk ticketA second ticket to merge
FreshdeskCheck Freshdesk ticket statusCreate Freshdesk ticketA second ticket to merge
Zoho DeskCheck Zoho Desk ticket statusCreate Zoho Desk ticketA second ticket to merge
HubSpotFind HubSpot contactCreate HubSpot ticketA second ticket to merge
SalesforceFind Salesforce contact; Check Salesforce case statusCreate Salesforce caseA second case to merge
JiraNoneCreate Jira issueA second issue to close
MailchimpNoneSubscribe to the newsletterMailchimp answers "Member Exists"
SlackNoneNotify the team on SlackA second alert
DiscordNoneNotify the team on DiscordA second alert
ZapierNoneSend to ZapierThe Zap runs twice

Checked against PepoChat's action templates on 19 October 2026. Every write listed is tier 3, unless the Zap behind the Zapier action does more.

Should a chatbot be allowed to process refunds?

No. A support chatbot should take a refund request, not grant one: money is hard to take back, retries can repeat it, and refund decisions need judgement about policy and fairness that customers expect a person to make.

Stripe's documentation on refunds and cancellations shows how little room there is to recover. You can issue more than one refund against a charge, up to the original amount, so a doubled full refund fails, but a doubled partial refund goes through whenever the two together stay within the charge. Stripe's processing fees on the original payment are not returned, and only some card refunds can be cancelled, for a short period and only from the Dashboard.

Draft for approval replaces the refund action: the agent prepares everything a person needs to decide, and the person carries out the decision in the payment system, in four steps:

  1. The agent collects the facts. Order number, amount, reason and the customer's email, without promising an outcome.
  2. The agent files the request. A ticket through a Zendesk, Freshdesk or Zoho Desk action, or a human handoff to the team inbox, which emails your team the reason and the last three messages.
  3. A person decides. They check the order against your policy and issue the refund in the payment tool; Stripe's Dashboard asks for a reason and requires a note when the reason is Other.
  4. The customer hears back. The person replies by email, so the answer comes from someone accountable for it.
Close-up of a hand signing off a printed form with a ballpoint pen, the other hand holding the page flat
In the draft-for-approval pattern the agent prepares the request and a person signs it off in the payment tool, where Stripe keeps the reason with the refund.

PepoChat ships no action that moves money, and its documentation says not to connect refunds or payments. Nothing in the product blocks a custom action from calling a refund endpoint, so make the rule hold in the credential: a Stripe restricted key without write access to refunds or charges gets an error back from Stripe whatever the bot is told, and Stripe recommends restricted keys for any key given to an AI agent.

Add a refusal to the agent's instructions too, such as "Never promise a refund, credit or discount", because a promise in chat commits you as well. The agent instructions documentation explains how PepoChat's "Never do this" field makes the agent decline.

The full decision table, with Stripe, Shopify and WooCommerce specifics, is in can an AI chatbot process refunds?.

Which guardrails are enforced in code, and which are only instructions?

A guardrail enforced in code holds whatever the model is told; a guardrail written as an instruction holds only while the model follows it. Put every limit that protects money or personal data in the first group, and treat the second group as helpful defaults.

GuardrailHow PepoChat applies itEnforced by
Which actions existEach action has an on/off switch; actions added with a pasted key start switched offCode
Where a request goesFixed URL, method and body template; visitor inputs fill placeholders but never the hostCode
Input format on prebuilt actionsDigits-only order and ticket numbers; Stripe ids must start with cus_ or sub_Code
What the model reads backOnly the listed fields of a successful response, at most 4,000 characters; an empty list passes everythingCode
NetworkHTTPS only, private hosts blocked, no redirects, 10-second timeout, responses over 2 MB rejectedCode
Stored credentialsKeys and secrets encrypted with AES-256-GCM and never shown again; webhook URLs stay visibleCode
Meeting memory needs a verified emailChecked on every callCode
Verify before an integration lookupA line in the action's "when to use" textInstruction
Explicit request and confirmation before a writeThe action's "when to use" textInstruction
No refunds or paymentsYour choice of actions and your key's permissionsYour configuration

Checked against PepoChat's documentation and source code on 19 October 2026.

Read the table from the bottom. The last three rows depend on the model following instructions or on your own setup, so the rows above them should carry the weight: fewer actions, shorter field lists and the narrowest key each provider offers. The custom actions documentation lists the limits on every field.

Who can change these settings is part of the permission model too. In PepoChat any workspace member can connect, edit and test integrations, and the Test button runs the real request, so testing the cancel action schedules a real cancellation. Keep seats to people you would trust with the keys, and test on test records.

A grey control panel with a dial gauge, coloured indicator lights and a row of toggle switches, one per function
Each action has its own switch, and actions added with a pasted key start switched off. The switch is enforced in code; a sentence in the when-to-use text is not.

How do you log and audit what an AI agent did?

Keep three records for every action: the conversation, the connected tool's own log of the call, and, for anything in tier 4, the name of the person who approved it.

OWASP lists logging, monitoring and rate limiting as controls that do not prevent excessive agency but limit the damage: logs show where unwanted actions happen, and rate limits cap how many can happen before someone notices. A useful record of an action answers five questions: who asked, whether they were verified, what the agent restated, what it sent and what came back.

PepoChat's team inbox and its CSV export hold the conversation, including the agent's confirmation and its plain-language report of the result, but not the raw request and response. The record of the call lives in the tool you connected: Stripe keeps request logs for each restricted key, and a helpdesk keeps the ticket's history. Name each key after the bot so its calls are easy to find.

An audit also needs an off switch. NIST's AI RMF core asks for mechanisms to supersede, disengage or deactivate an AI system whose outcomes are inconsistent with its intended use (subcategory MANAGE 2.4). In PepoChat that means each action's switch, plus escalation: actions run only while the agent is answering, so moving a conversation to escalated stops them.

Review on a rhythm that matches the tier: every week, read a sample of conversations about orders, billing and tickets, where tier 2 and tier 3 actions run; every month, remove actions nobody used; and check how each tier 4 ticket ended. PepoChat allows up to 20 actions per workspace; fewer is safer.

Ten questions to answer before you switch on a new action

Answer these in writing before a new action goes live; if one has no answer yet, the action is not ready.

  1. Which tier is it? If it moves money or cannot be undone, build the draft-for-approval route instead.
  2. Could a stranger supply the inputs? Anyone can type an email address or a sequential number, so have your own API require a second fact that must match, and keep the returned fields harmless.
  3. Which response fields does the answer need? List them and nothing else; the rest should never reach the model.
  4. What else can the credential do? Restrict it to this action's resources, read-only wherever the action only reads.
  5. What happens if it runs twice? "Nothing" and "a duplicate someone merges" are acceptable; anything else needs an idempotency key or a person.
  6. Is the trigger explicit? The "when to use" text names the request that triggers the action and requires a restated confirmation for any write.
  7. Who can undo it, and how fast? Name the person and the steps before the first mistake.
  8. Who hears about it? Decide whether a run, a failure or both create a ticket, an alert or a handoff.
  9. Where is the record? Point to the transcript and the provider log that will answer "who did this?" six months from now.
  10. When will you review it? Put a date in the calendar, and remove the action if nobody has used it by then.

What to do next

Frequently asked questions

Should a chatbot be allowed to issue refunds?
No. A support chatbot should collect the order, amount and reason and hand the request to a person, who issues the refund in the payment tool. Automated actions can be retried, and with Stripe a repeated partial refund goes through while card refunds can be cancelled only briefly. As of October 2026, PepoChat ships no action that moves money and its documentation says not to connect one.
What does idempotent mean for chatbot actions?
An action is idempotent when running it twice leaves the same result as running it once. Setting a subscription to cancel at period end is idempotent; creating a ticket is not, because a retry files a second ticket. PepoChat runs actions at least once, so a rare retry can repeat a write. Connect only writes whose repeat is harmless or cheap to clean up.
How should a chatbot verify identity before showing order data?
Ask for proof that the visitor controls the email on the order, usually a six-digit code sent to that inbox, before showing anything personal. A lookup by an order number alone is acceptable only when the reply is limited to status and dates, because many stores number orders sequentially. If your own API serves the lookup, make it require the order number and the matching email.
What is excessive agency in AI security?
Excessive agency is OWASP's name for an AI system that can take damaging actions when its output is wrong, ambiguous or manipulated. It is LLM06 in the 2025 Top 10 for LLM Applications, still the current edition in October 2026, and OWASP traces it to three causes: excessive functionality, excessive permissions and excessive autonomy. The fixes are fewer tools, narrower credentials and human approval for high-impact actions.
How do I log what an AI agent did?
Keep three records: the conversation, including what the agent restated before acting; the connected tool's own log of each call, such as Stripe's request logs for a restricted key; and the name of the person who approved anything involving money. In PepoChat the team inbox and CSV export hold the conversation but not raw request and response data, so the provider's log is your record of the call.
Can a chatbot cancel a subscription safely?
Yes, if it schedules the cancellation for the end of the paid period, only for a verified customer, after restating the plan and end date and getting an explicit yes. A period-end cancel can be reversed until the period ends and is harmless if repeated. Immediate cancellation, prorated refunds and plan changes involve money or cannot be undone, so they go to a person.

Try this on your own site in ten minutes

PepoChat includes every feature on the free plan — 200 AI replies and 5 knowledge sources a month, no credit card.