The discount_negotiator skill
What the skill does
Discount negotiation is the riskiest mutating action a chatbot can take. Mis-applied discounts hurt margins immediately and can cascade if the bot starts giving everyone the maximum allowed code. discount_negotiator handles this carefully across all 13 channels with rate limits of 50,000 queries per month on Business.
When a visitor asks for a discount or shows price hesitation, the skill:
- Checks per-visitor, per-workspace, and per-code caps.
- Picks a discount code that falls within all three caps.
- Offers the code to the visitor.
- Logs the action with full audit trail.
Three hard limits the bot can't override:
- Per-visitor cap. Maximum discount any one visitor can receive. Default 15%.
- Per-workspace cap. Aggregate discount value applied across all visitors per month. Default $5,000 USD equivalent.
- Per-code cap. Maximum number of times a specific code can be applied. Once a code hits this, the bot stops offering it.
The skill is on Business and above. Business+
Setup
Configure under AI Agents > Skills > discount_negotiator:
- Enable the skill.
- Configure cap bounds. Per-visitor maximum percentage, per-workspace monthly dollar cap, per-code usage limit.
- Add available codes. Pull from your Stripe Coupons, Shopify Discount Codes, or paste manually. Each code carries its percentage or absolute value.
- Set trigger thresholds. When the bot detects hesitation (cart abandonment, "do you have any discounts?", "this is too expensive"), it considers offering a code.
- Customize messaging. What the bot says when offering a discount, and what it says when refusing (caps exhausted).
Test in sandbox mode under Skills > discount_negotiator > Test Mode before going live.
When the bot offers a code
Three trigger patterns:
- Explicit ask. "Do you have any discount codes?", "Is there a coupon I can use?", "Can you do better on price?"
- Hesitation signal. Long pause on the pricing page, cart abandonment for 5+ minutes, repeated visits without purchase. Configurable.
- Sales-intent decay. Visitor showed clear buying signals earlier in the conversation but is now drifting away. The bot offers a code to re-engage.
For all three, the bot first checks caps. If all three caps allow it, the bot offers. If any cap is exhausted, the bot says: "Unfortunately I can't apply additional discounts right now, but let me connect you with our sales team."
Code selection logic
When the bot decides to offer, it picks from your code pool:
- Match the customer's plan tier. Visitor on Starter pricing gets a Starter-applicable code.
- Match the visitor's cart contents. Visitor with $200 cart gets a code that applies above $100 threshold; visitor with $50 cart gets a code without minimum.
- Cheapest viable code first. The bot offers the smallest discount that should close the deal. Doesn't blow your full 15% cap if a 5% code suffices.
Tune the selection logic under Skills > discount_negotiator > Selection Strategy.
Audit logging
Every discount application is logged with:
- Conversation ID and visitor email.
- The code offered and the discount value.
- Cap status at time of offer (remaining per-visitor, per-workspace, per-code).
- Whether the visitor used the code (verified via webhook from Stripe or Shopify).
- Timestamp.
Visible under Dashboard > Skills > discount_negotiator > Audit Log. Filter by date, code, value range.
Sandbox mode for testing
Before going live, test in sandbox mode. Sandbox:
- Bot offers codes but doesn't actually apply them.
- Caps don't deplete.
- Audit log marks every entry as
sandbox: true.
Verify your trigger thresholds, code pool, and customer messaging are right before flipping to production.
Limits
- Plan availability. Business and above.
- Code pool size. Up to 200 active codes per workspace.
- Per-cap-evaluation latency. Adds about 100 to 200 ms to bot response time.
- Webhook dependency. Per-code usage tracking depends on Stripe or Shopify webhooks firing. Without webhooks the cap is approximate, not exact.
Common pitfalls
Bot offers codes to everyone. Trigger thresholds are too loose. Tighten to require explicit ask or strong hesitation signal.
Per-workspace cap exhausts mid-month. Either your monthly cap is too low or the bot is offering codes too liberally. Audit recent activations and tighten the per-visitor max.
Code applied but not honored at checkout. Code expired in Stripe/Shopify after AskVault offered it. Sync code state via webhook to keep AskVault's view fresh.
Discount-shoppers abuse the system. Bot offers 15% off, customer buys, then comes back next month for another 15%. Configure per-customer lifetime cap under Skills > discount_negotiator > Per-customer Lifetime Cap.
FAQ
Can the bot create new discount codes?
No. The skill only applies codes you've created in advance. Creating codes on the fly would require write scope to your payment processor, which we don't grant by default.
Can I set different caps per customer segment?
Yes. Configure segment-based caps under Skills > discount_negotiator > Segment Caps. Useful when you want VIP customers to be eligible for larger discounts.
Does this work with subscription discounts?
Yes if your Stripe coupon applies to subscriptions. The bot can offer a recurring discount that applies to the next billing cycle.
How do I prevent the bot from offering discounts to non-paying-intent visitors?
Add the not_buying_intent filter under Skills > discount_negotiator > Filters. The skill considers the conversation's intent score and only offers when intent is "buying" or "evaluating".
What's the typical lift from this skill?
Most teams see 5 to 15% increase in conversion among visitors who hesitate and receive a code. Tradeoff: lower margin per converted sale. Net revenue impact varies; measure your own.
Related guides
- Cart recovery skill
- Subscription manager skill
- Stripe integration setup
- Shopify integration setup
- Custom webhook skill