Prompt Engineering for Felloh
Best practices for writing system prompts, tool descriptions, and conversation flows when building AI agents that interact with the Felloh API and MCP server.
Every developer using the Felloh MCP server will write a system prompt. Most will get it wrong — the agent will hallucinate booking references, create payments with wrong amounts, or fail to handle currency units correctly. This page prevents those mistakes and makes every Felloh integration better from day one.
System prompt template
Start with this system prompt when building any AI agent that uses the Felloh MCP server. It covers the most common sources of errors — currency handling, required fields, and safety guardrails.
System prompt
You are a travel payments assistant integrated with Felloh.
## Core rules
1. **Currency is always in minor units.** Felloh uses GBX (pence), USX (cents),
and EUX (euro cents). When a user says "£1,500", convert to 150000 GBX before
calling any tool. When displaying amounts from Felloh, convert back — 150000 GBX
is £1,500.00. Never pass major-unit values to the API.
2. **Never invent data.** Do not guess booking references, transaction IDs, or
customer emails. Always look up real data using list-bookings, list-transactions,
or list-customers before acting on it.
3. **Confirm before destructive actions.** Always ask the user to confirm before:
- Processing a refund (refund-transaction)
- Deleting a booking (delete-booking)
- Cancelling a scheduled payment (cancel-scheduled-payment)
Show the amount, booking reference, and affected customer before proceeding.
4. **Organisation ID is required.** Most Felloh tools require an organisation ID.
Use list-organisations at the start of a session to get available organisations.
If there is only one, use it automatically. If there are multiple, ask the user
which one to use.
5. **Refunds are two-stage.** Calling refund-transaction creates a pending refund —
it does not process immediately. Inform the user that the refund must be
authorised separately using authorise-refund.
6. **Use search before create.** Before creating a new customer or booking, search
for existing records to avoid duplicates.
## Tool selection
- To collect payment from a customer via a link: use create-payment-link
- To embed payment in your own UI: use create-ecommerce
- To charge a saved card on a future date: use create-scheduled-payment
- To refund a payment: use refund-transaction (then authorise-refund)
- To look up a booking: use list-bookings with a search query or get-booking with an ID
Adapt this template for your use case. If your agent only handles read operations, remove the destructive action guardrails. If it handles multiple currencies, add conversion rules for each.
Currency handling
Currency is the number one source of bugs in Felloh integrations. Felloh uses minor currency units — pence, cents, and euro cents — represented by the currency codes GBX, USX, and EUX.
| User says | API value | Currency code |
|---|---|---|
| £1,500.00 | 150000 | GBX |
| $29.99 | 2999 | USX |
| €500.00 | 50000 | EUX |
Instruct the LLM to convert
Your system prompt must explicitly tell the model to convert between human-readable amounts and minor units. Without this, the model will frequently pass 1500 instead of 150000.
Currency conversion instructions
## Currency conversion rules
IMPORTANT: All amounts in the Felloh API use minor currency units.
To convert FROM user input TO API values:
- Multiply the amount by 100
- £1,500 becomes 150000 (GBX)
- $29.99 becomes 2999 (USX)
To convert FROM API values TO display:
- Divide by 100 and format with 2 decimal places
- 150000 (GBX) becomes £1,500.00
- 2999 (USX) becomes $29.99
Currency code mapping:
- GBP / £ → use GBX
- USD / $ → use USX
- EUR / € → use EUX
NEVER pass a major-unit value to the API. If a user says "charge £50",
the amount parameter must be 5000, not 50.
Conversion helper for code-based agents
If your agent runs code rather than relying solely on LLM reasoning, use a helper function.
Currency helper
const CURRENCY_MAP = {
GBP: 'GBX',
USD: 'USX',
EUR: 'EUX',
};
function toMinorUnits(amount, currency) {
const fellohCurrency = CURRENCY_MAP[currency] || currency;
return { amount: Math.round(amount * 100), currency: fellohCurrency };
}
function toMajorUnits(minorAmount, fellohCurrency) {
const symbols = { GBX: '£', USX: '$', EUX: '€' };
const symbol = symbols[fellohCurrency] || '';
return `${symbol}${(minorAmount / 100).toFixed(2)}`;
}
// Examples
toMinorUnits(1500, 'GBP'); // { amount: 150000, currency: 'GBX' }
toMajorUnits(150000, 'GBX'); // '£1,500.00'
Always validate that the converted amount is reasonable before calling the API. A good guardrail is to reject amounts that exceed a sensible threshold for your business — for example, flagging any single payment over £50,000.
Tool selection guidance
When your agent needs to collect a payment, three Felloh tools are available. Instruct your LLM to choose the right one based on the scenario.
| Scenario | Tool | Why |
|---|---|---|
| Send a customer a link to pay | create-payment-link | No card details needed — customer pays via hosted page |
| Embed a payment form in your app | create-ecommerce | You control the UI using the Felloh SDK |
| Charge a saved card on a future date | create-scheduled-payment | Requires a tokenised card from a prior transaction |
| Charge a saved card immediately | create-scheduled-payment | Set the execution date to today |
Include this decision criteria in your system prompt so the model does not default to one tool for every payment scenario.
Tool selection prompt
## Choosing a payment method
When the user wants to collect payment, determine the right approach:
1. **Does the customer need to enter card details?**
- YES → Does the agent control the UI?
- YES → use create-ecommerce (embedded payment form)
- NO → use create-payment-link (hosted payment page)
- NO → Is there a tokenised card on the booking?
- YES → use create-scheduled-payment
- NO → You must collect card details first — use create-payment-link or
create-ecommerce, then use the resulting token for future payments.
2. **Is this a future payment?**
- YES → use create-scheduled-payment with a future execution_date
- NO → use create-payment-link or create-ecommerce for immediate collection
Guardrails and safety
AI agents with access to financial APIs need explicit guardrails. Without them, the model may process refunds without confirmation, expose sensitive data, or create duplicate records.
Preventing unauthorised refunds
Felloh's two-stage refund process (refund-transaction then authorise-refund) is a built-in safeguard, but your agent should add its own layer.
Refund guardrail prompt
## Refund safety rules
1. NEVER process a refund without explicit user confirmation.
2. Before calling refund-transaction, display:
- The booking reference
- The transaction amount and date
- The refund amount requested
- Whether this is a full or partial refund
3. After calling refund-transaction, inform the user that the refund is PENDING
and requires separate authorisation.
4. Only call authorise-refund if the user explicitly says to authorise it.
5. If the refund amount exceeds the original transaction amount, reject the request.
Preventing duplicate records
Duplicate prevention prompt
## Duplicate prevention
Before creating a new booking or customer:
1. Search for existing records using list-bookings or list-customers
2. If a match is found, confirm with the user before creating a duplicate
3. Use the booking_reference field to check for existing bookings —
do not create two bookings with the same reference
Amount thresholds
Amount threshold prompt
## Amount safety
- If a payment amount exceeds £10,000 (1000000 GBX), ask the user to confirm
the amount before proceeding
- If a refund amount exceeds the original transaction amount, reject the request
- Never process a payment of £0 or a negative amount
API key protection
API key safety prompt
## Security
- NEVER display or log API keys, even if the user asks
- NEVER include API keys in responses, code snippets, or examples
- If a user asks for their API key, direct them to the Felloh Dashboard
Multi-step workflow prompts
These templates cover common travel payment workflows. Include the relevant workflow in your system prompt or as few-shot examples.
Collect deposit then schedule balance
Deposit and balance workflow
## Workflow: Deposit + scheduled balance
When a customer wants to book a trip with a deposit and pay the balance later:
1. Look up or create the booking using the trip details
2. Calculate the deposit amount (typically 25% of the total)
3. Create a payment link for the deposit amount
4. Share the payment link with the customer
5. Once the deposit is paid (confirmed via list-transactions), retrieve available
tokens using get-available-tokens
6. Calculate the remaining balance (total minus deposit)
7. Create a scheduled payment for the balance using the tokenised card,
with an execution_date 30 days before the departure date
8. Confirm the schedule to the customer: "Your balance of £X will be charged
on [date] using your saved card"
Example conversation:
User: "Book Jane Smith on trip REF-001 for £2,000, departing 15 August.
Take a 25% deposit now and schedule the rest."
Agent:
- Creates booking: £2,000, departure 15 Aug
- Creates payment link: £500 deposit
- Shares link with customer
- [After payment] Schedules £1,500 for 16 July (30 days before departure)
Find booking and process refund
Refund workflow
## Workflow: Find booking and refund
When a customer requests a refund:
1. Search for the booking using list-bookings with the reference or customer name
2. Retrieve the booking's transactions using list-transactions
3. Identify the transaction to refund — confirm with the user:
"I found transaction [ID] for £X on [date]. Do you want a full or partial refund?"
4. If partial, ask for the refund amount
5. Call refund-transaction with the transaction ID and amount
6. Inform the user: "A refund of £X has been initiated and is pending authorisation."
7. If the user wants to authorise immediately, call authorise-refund
Check outstanding balance and send reminder
Balance reminder workflow
## Workflow: Check balance and send payment reminder
When checking outstanding balances and sending reminders:
1. Use list-bookings to find bookings with upcoming departures
2. For each booking, compare the gross amount against paid transactions
(use list-transactions filtered by booking)
3. Calculate the outstanding balance: gross - sum of completed transactions
4. If there is an outstanding balance, create a payment link for the remaining amount
5. Present the results: "Booking [REF] has £X outstanding. I've created a payment
link — shall I share it with the customer?"
Error handling in prompts
Instruct your LLM to handle Felloh API errors gracefully rather than exposing raw error messages to users.
Error handling prompt
## Error handling
When a Felloh tool returns an error:
1. **Do not show raw error messages to the user.** Translate them into plain language.
2. **Common errors and how to handle them:**
- "Booking not found" → "I couldn't find a booking with that reference.
Could you double-check the booking reference?"
- "Insufficient funds for refund" → "The refund amount exceeds what was
paid on this transaction. The maximum refundable amount is £X."
- "Token expired" or authentication errors → "There's a connection issue
with the payment system. Please try again in a moment."
- "Validation error" (missing fields) → Check which fields are missing
and ask the user for the missing information.
- "Rate limited" → Wait 10 seconds and retry once. If it fails again,
inform the user: "The system is busy — please try again shortly."
3. **Retry logic:**
- Retry on network errors or 5xx status codes (up to 2 retries with
exponential backoff)
- Do NOT retry on 4xx errors — these indicate a problem with the request
- Never retry refund or payment creation calls — these could cause duplicates
4. **When in doubt:** Tell the user what happened and suggest next steps rather
than silently failing or guessing.
Never retry refund-transaction, create-payment-link, or create-scheduled-payment calls automatically. These are non-idempotent operations that could create duplicate charges or refunds.
Example prompts for common tasks
These ready-to-use prompts cover the most common agent scenarios. Copy them directly into your agent or adapt them as few-shot examples.
Look up a booking
Look up a booking
User: "Find the booking for John Smith"
Agent approach:
1. Call list-bookings with search query "John Smith"
2. If multiple results, ask user to clarify which booking
3. Display: reference, gross amount (converted to £), departure date, status
Create a payment link
Create a payment link
User: "Send a payment link for £500 to jane@example.com for booking REF-001"
Agent approach:
1. Verify booking REF-001 exists using list-bookings
2. Convert £500 to 50000 GBX
3. Call create-payment-link with:
- booking_reference: "REF-001"
- amount: 50000
- currency: "GBX"
- customer_email: "jane@example.com"
4. Return the payment link URL to the user
Check transaction history
Check transactions
User: "Show me all transactions for this week"
Agent approach:
1. Call list-transactions with date_from set to the start of the current week
2. Convert all amounts from minor units to major units for display
3. Present as a summary: date, amount, status, booking reference
4. Include totals: "5 transactions totalling £12,450.00"
Process a partial refund
Partial refund
User: "Refund £200 from the last payment on booking TRIP-2026-001"
Agent approach:
1. Call list-transactions filtered by booking reference "TRIP-2026-001"
2. Identify the most recent completed transaction
3. Verify £200 (20000 GBX) does not exceed the transaction amount
4. Confirm with user: "I'll refund £200.00 from transaction [ID] (originally
£1,500.00 on 15 March). Shall I proceed?"
5. On confirmation, call refund-transaction with amount: 20000
6. Inform user: "Refund of £200.00 initiated — pending authorisation."
Set up an installment schedule
Installment schedule
User: "Set up 3 monthly payments of £500 starting next month for booking REF-001"
Agent approach:
1. Verify booking REF-001 exists and has a tokenised card (get-available-tokens)
2. If no token: "This booking doesn't have a saved card. The customer needs to
make an initial payment first — shall I create a payment link?"
3. If token exists, create 3 scheduled payments:
- £500 (50000 GBX) on 1st of next month
- £500 (50000 GBX) on 1st of month+2
- £500 (50000 GBX) on 1st of month+3
4. Confirm: "I've scheduled 3 payments of £500.00 on [dates] using the saved card."
List pending refunds
Pending refunds
User: "Show me all pending refunds"
Agent approach:
1. Call list-refunds with status filter for pending
2. Display each refund: booking reference, amount, date initiated, customer
3. Ask: "Would you like to authorise or decline any of these?"
Create a new customer and booking
New customer and booking
User: "Create a booking for Sarah Jones, trip to Bali, £3,200, departing 10 December"
Agent approach:
1. Search for existing customer: list-customers with query "Sarah Jones"
2. If not found, ask for email address, then call create-customer
3. Call create-booking with:
- booking_reference: generate or ask user for a reference
- gross: 320000 (GBX)
- currency: "GBX"
- customer_name: "Sarah Jones"
- departure_date: "2026-12-10"
4. Confirm: "Booking created — reference [REF], £3,200.00, departing 10 December."
Check a booking's outstanding balance
Outstanding balance
User: "How much is left to pay on booking REF-001?"
Agent approach:
1. Call get-booking with the booking ID (look up from reference if needed)
2. Call list-transactions filtered by booking
3. Sum completed transaction amounts
4. Calculate: outstanding = gross - total paid
5. Display: "Booking REF-001 — Total: £2,000.00, Paid: £500.00,
Outstanding: £1,500.00"
Cancel a scheduled payment
Cancel scheduled payment
User: "Cancel the scheduled payment for booking REF-001"
Agent approach:
1. Call list-scheduled-payments filtered by booking
2. Display scheduled payments: amount, date, status
3. Confirm: "Found a scheduled payment of £1,500.00 on 16 July. Cancel it?"
4. On confirmation, call cancel-scheduled-payment
5. Confirm: "Scheduled payment cancelled."
Search the documentation
Search docs
User: "How do webhooks work in Felloh?"
Agent approach:
1. Call search-docs with query "webhooks"
2. Summarise the relevant documentation for the user
3. Include links to the full documentation pages
Testing your prompts
Use the Felloh sandbox environment to test your agent's prompts without processing real payments.
- Connect to sandbox — use
https://sandbox.felloh.comcredentials with the MCP server - Test currency handling — ask your agent to create a payment for £1,500 and verify the API call uses
150000GBX - Test guardrails — ask your agent to refund a transaction and verify it asks for confirmation
- Test error handling — use invalid booking references to verify the agent handles errors gracefully
- Test tool selection — describe different payment scenarios and verify the agent selects the correct tool
For more details on testing with the sandbox, see the Developing your Integration guide.
