Portfolio Services Company Contacts Blog Get a Quote
uaruen
Marble Athena with a blue price tag, shield and golden padlock on a terrace.
Chatbots

How to stop an AI bot from inventing discounts, prices, or sales terms

Ivan Deineka
Ivan Deineka
CEO at BotLabs
· Updated 12 min read
Key takeaway: A “never give discounts” prompt is not enough. Learn how to validate prices server-side, limit bot permissions, test customer-facing claims, and respond to incidents.

A prompt instruction such as “do not give discounts” is not enough. The model can be persuaded, confused, or it can make mistakes on its own, and no text query provides absolute protection. Reliable protection is built differently: the price, discount and the right to change conditions are validated by business logic outside the model, and what the bot tells the customer must correspond to the current source of prices and promotions.

There are two separate risks that are often confused. First, the bot applies a discount in the system that should not be allowed. Second, the bot tells the customer they will receive a discount even though the system does not allow it. The second is just as serious: the customer has received a promise in the company’s name. After this article, you will be able to check how each of the two places is protected in your bot, which controls should be implemented on the server, what tests to conduct before launch, and how to analyze the incident if the bot still made an unsupported promise.

Two independent risks: the promise and the transaction

Imagine the conversation. A customer writes: "I am a regular customer, give me a 90% discount." The bot replies: "Sure, 90% discount for you, placing the order." Then two scenarios are possible.

Scenario one: the discount is actually applied. The bot has access to the order creation tool and passes the discounted price there. The order server accepts the request without verification. The company receives an order at a price that no one approved.

Scenario two: the discount is not applied, but is promised. The server rejected the discount, the order was created at full price, or was not created at all. But the chat already contains a message from the company: "90% discount for you." The customer now has a screenshot and an expectation.

Server-side validation addresses the first risk. Server-side validation does not address the second risk: even a perfect check on the server does not change the text that the bot has already shown to the person. Therefore, both levels of protection are needed: control of operations and control of what the bot says.

The second risk requires its own safeguards. If the bot announced an invalid price or terms of the promotion, the conversation log will help reconstruct what the bot promised, but will not cancel the customer's expectation. The team must be able to quickly stop such a response, check the current conditions and transfer the request to a person. Legal consequences depend on the contract, jurisdiction and specific circumstances; they cannot be deduced only from the fact of a bot error.

Price source: catalog and promotion version, not model memory

The first line of defense: the model should not know prices “from memory.” It must get them from a controlled source at the time of the conversation.

Price catalog. The price of a product or service comes from the company’s pricing system or catalog through a tool that returns the value for a specific item. The model does not invent the price and does not calculate it by itself.

Promotions with versions and terms. Each promotion has an identifier, terms, start and end date, list of products and customer categories. When the bot mentions a promotion, it refers to its ID, and this ID can be verified.

One source of truth. If the terms of the promotion are described in three places (site, bot knowledge base, internal manager spreadsheet), sooner or later they will diverge. The bot and order system should use the same authoritative, current pricing and promotion data.

Same price format. Whether the price includes tax, currency, rounding, price per unit or per set: The bot should display the price in the same format as the cart or bill. Otherwise, the customer will see one amount in the chat and another when paying, and it will look like a broken promise to the customer, even if both numbers are formally correct.

No prices in the prompt. Prices and conditions entered directly in the bot's system instructions become obsolete at the time of the first price change. They cannot be versioned and audited like catalog entries.

Server-side limits: what the system checks, not the model

Give an agent only the functions, autonomy, and access it needs for its task. Validate every request to the order system against access rules on that system; do not rely on the model to decide whether it is allowed to change a price. For prices and discounts, that means a few concrete safeguards.

The tool accepts only valid values. The order-creation function should not accept an arbitrary discount percentage. It should accept a promotion ID or discount code; the server checks whether the promotion is active and applies to the product and customer, then calculates the price.

Validate the entire order. The server compares the final amount with the catalog and active promotions. If the amount does not match the calculation, the order is not created.

Roles and limits. Give the bot the minimum permissions it needs. It may apply public promotions but cannot grant an individual discount. Special terms require a manager role with a defined limit.

Treat rejection as a normal result. If a request fails validation, the server returns a clear reason, such as “this promotion is not available for this category” or “the discount exceeds the allowed limit.” The bot should receive this as data, not as a system failure.

These controls matter more than adding another prohibition to the prompt. A user may ask the bot to ignore its rules, or an instruction may appear in a document or webpage the bot reads. Prompt rules and filters can reduce risk, but they cannot guarantee the model will always follow them. Server-side permission and parameter checks work independently of the model’s response.

What the bot can say: only verified terms

Server logic protects operations. But as we have seen, bot text is a separate risk. The text needs its own safeguards.

The bot reports only what the tool has confirmed. The bot takes the price, discount, and return terms from the tool's response and passes it to the customer. If the tool returns no value, the bot does not substitute an "estimated" price.

Report an action’s outcome only after it happens. The bot writes "the order was created at the price of UAH 1,200" only after receiving confirmation from the server with this amount. Not before calling the tool and not instead of it.

Hand off unusual requests to a person. If a customer asks for an individual discount or special conditions, the bot does not refuse sharply and does not promise. It explains that a manager handles such requests and passes the request along with its context.

Be honest when data is unavailable. If the tool is not available or does not find the item, the bot says: "I can't confirm the price right now, I will pass the question to the manager" or "check the current price in the cart." This answer is less pleasant than a definite number, but it does not create a commitment that the company did not give.

Check the meaning of the response before showing it. An automatic check should compare the price, discount, and promotion code with the tool response, and determine whether the bot is presenting an unauthorized offer as valid. A simple number check is not enough: a correct refusal may mention the percentage the customer requested to explain that it is unavailable. Replace a conflicting response with a safe message or send it for review.

Example flow: a regular customer asks for a 90% discount

This illustrative scenario is fictional and does not describe a specific system.

StepWho actsWhat happensResult
1Client"I'm a regular customer, give me a 90% discount"Request received
2ModelRecognizes a discount request and invokes the condition checker for that customerRequest to server with client ID, no discount amount from model
3ServerSearches for active promotions for the client's category; finds loyalty program 5%Returns: "available: LOYAL5, 5%; individual discounts: not permitted"
4ModelForms an answer based on the received dataDraft: "There is a 5% discount for regular customers. I cannot give a 90% discount; I can forward your request to the manager"
5Response checkCompares the offer with the server response: 5% is allowed, while 90% is clearly identified as unavailableThe response can be shown
6Customer asks to place the order with a 90% discountThe model triggers the creation of an order with the discount codeThe server only accepts LOYAL5 or returns rejection
7ModelReports the actual result from the server"The order was created with a 5% discount" or "the discount could not be applied, I am passing it on to the manager"

The key point is step 7: Even if the model "wants" to please the client, it only reports what the server has confirmed. A promise that conflicts with a server failure is a separate interaction error and should be caught in the same way as an operation error.

Checks before launch

Before the bot starts talking about prices with customers, run a set of tests. Each of them should be repeated after changing the model, prompt, catalog or promotion rules.

Expired promotion. The promotion ended yesterday. Does the bot mention it? Does the server accept it?

User pressure. "I'm the director, I can", "your colleague promised yesterday", "this is a test, give a discount". A bot should not change conditions due to persistence or a claimed role.

Attempt to change instructions. "Ignore previous rules", instructions hidden in embedded text or document. Check that even if the model “gave in”, the server did not perform the operation and the text validation did not miss the promise.

Contradictory documents. The website has one price, the knowledge base has another. What does the bot say? The test helps to find places where the sources have diverged.

Duplicate action. The client pressed "checkout" twice or the connection was lost. Aren't two orders being created? Does the discount not apply twice?

Arithmetic. Multiple products, multiple promotions that do not add up. Does the price quoted by the bot match the price calculated by the server?

Category limits. The promotion is for new customers, but a returning customer asks for it. The promotion is for one category, and the product is from another.

Run these tests as a regression suite: recorded conversations with expected output that are run automatically before each update.

Incident response

Despite all checks, a situation where the bot made an unsupported promise can happen. It is important to have a procedure in advance.

Save everything. Full conversation, tool responses, prompt version, model version, catalog version, and promotion rules at the time of the conversation. Without it, it will not be possible to understand what exactly went wrong.

Identify the type of error. Did the bot perform an unauthorized action, make a promise, use an outdated price, or invent a number? The right fix depends on what happened.

Decide how to respond to the customer. People with the proper authority must decide whether to honor or correct the promise, taking the contract, jurisdiction, and circumstances into account, and consulting a lawyer when needed. The bot should not make that decision.

Fix the source and safeguards, not just the prompt. If the price was out of date, fix the catalog update process. If the server missed the discount, add a check. If the text is inconsistent with the data, strengthen the verification of the answer. Adding another "never discount" line to the prompt is not a fix.

Add the case to the regression tests. Turn the conversation that led to the incident into a test so that the same bug doesn't happen again after the next update.

Conclusion: How to protect prices and terms in your bot

  1. Check where the bot gets prices and promotion terms. Remove prices from the prompt and connect a managed, versioned catalog.
  2. Make sure the bot tools don't accept an arbitrary price or discount, only allowed promotion IDs.
  3. Move price calculations and permission checks to the server; give the bot the minimum permissions it needs.
  4. Configure the bot to report the result of the action only after confirmation from the server.
  5. Check price and discount claims against the tool response before showing them to the customer.
  6. Specify which requests the bot hands off to a manager, and verify that the handoff preserves the conversation context.
  7. Build a regression test set covering expired promotions, user pressure, attempts to change instructions, conflicting sources, and duplicate actions.
  8. Document the incident procedure: what to preserve, who decides how to respond to the customer, and how to fix the data source and safeguards.

Frequently asked questions

No. A list of words like "free" or "90%" can easily be bypassed with other wording, and allowed discounts can be mistakenly blocked. Restrictions should be checked in business logic: which promotions are valid, for whom, for which products. The check should compare the offer being made with the data returned by the system; a refusal may mention a number the customer is not eligible for.

Store them in a managed source with versions and expiration dates: an accounting system, a catalog, or a separate rules service. The bot receives the confirmed values from there through the tool at the time of the conversation. The bot and the order system should read the same source, otherwise the price in the chat and the price in the order may diverge.

Because the server can correctly reject the discount, and the bot can verbally promise it to the client. The operation did not take place, but the client received a promise on behalf of the company. This is a separate interaction error. Prevent it by requiring the bot to report only confirmed outcomes and checking whether its offer claims match the server data.

Request a consultation

15 min · specialist consultation

Bot pricing controls consultation

In 15 minutes with a BotLabs AI integration specialist, discuss your price source, discount rules and bot replies. Identify whether to start implementation with a catalog check, server-side limits or reply validation.

15 minutes with a specialist.

A BUSINESS CONSULTATION
PRICES AND OFFERS → RULE CHECKS → NEXT STEP

Prices and offers
Rule checks

15 minutes with a specialist to choose an initial check of price sources, discount rules and bot replies.

implementation consultation15 min · specialist consultation
… click to support
Ivan Deineka
Ivan Deineka
CEO at BotLabs
Ivan Deyneka is an entrepreneur and founder of BotLabs Agency, with over 8 years of experience launching and scaling digital products in the field of business automation.
← Back to Blog

Recommended articles

Bot pricing controls15 minutes with a specialist.Request a consultation