How to Integrate LlamaIndex for payments with Supabase for AI agents
Why this integration matters
If you’re building AI agents that handle payments, you need two things: a reliable payment layer and a durable system of record. LlamaIndex for payments gives your agent the ability to reason over payment-related workflows, while Supabase gives you Postgres-backed storage, auth, and realtime state for every transaction and agent action.
The combination is useful when your agent needs to create invoices, track payment status, reconcile events, or keep an audit trail of every decision it made.
Prerequisites
- •Python 3.10+
- •A Supabase project with:
- •
SUPABASE_URL - •
SUPABASE_SERVICE_ROLE_KEY
- •
- •A LlamaIndex payments setup with:
- •API key or provider credentials
- •access to the payment tools or workflow package you’re using
- •Installed packages:
- •
supabase - •
llama-index - •your LlamaIndex payments integration package
- •
- •A Postgres table for storing payment events
- •Basic familiarity with async Python if your payment flow is asynchronous
Install the core dependencies:
pip install supabase llama-index python-dotenv
If your payments integration is packaged separately, install that too:
pip install llama-index-tools-payments
Integration Steps
1. Configure environment variables
Keep credentials out of code. Load both Supabase and payment credentials from the environment.
import os
from dotenv import load_dotenv
load_dotenv()
SUPABASE_URL = os.getenv("SUPABASE_URL")
SUPABASE_SERVICE_ROLE_KEY = os.getenv("SUPABASE_SERVICE_ROLE_KEY")
PAYMENTS_API_KEY = os.getenv("PAYMENTS_API_KEY")
if not all([SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, PAYMENTS_API_KEY]):
raise ValueError("Missing required environment variables")
A clean .env file should look like this:
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
PAYMENTS_API_KEY=your-payments-key
2. Create a Supabase client for event storage
Use the service role key on the backend only. Your agent will write payment events into a table like payment_events.
from supabase import create_client, Client
supabase: Client = create_client(SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY)
def insert_payment_event(event: dict):
response = supabase.table("payment_events").insert(event).execute()
return response.data
A minimal table schema in Postgres might look like this:
create table if not exists payment_events (
id uuid primary key default gen_random_uuid(),
user_id text not null,
payment_id text not null,
status text not null,
amount numeric not null,
currency text not null,
metadata jsonb,
created_at timestamptz default now()
);
3. Initialize the LlamaIndex payments tool
The exact package name depends on how you’ve installed the payments integration in LlamaIndex. The pattern is the same: initialize the tool/client with your API key, then call its payment methods from your agent workflow.
from llama_index.core.tools import FunctionTool
# Replace this import with your actual payments integration package.
# Example pattern only:
# from llama_index_tools_payments import PaymentsClient
class PaymentsClient:
def __init__(self, api_key: str):
self.api_key = api_key
def create_payment_intent(self, amount: int, currency: str, customer_id: str):
# Replace with actual SDK call in your payments provider wrapper.
return {
"id": "pi_123",
"status": "requires_confirmation",
"amount": amount,
"currency": currency,
"customer_id": customer_id,
}
payments_client = PaymentsClient(api_key=PAYMENTS_API_KEY)
Wrap it as a tool so your agent can use it inside an LLM-driven workflow:
def create_payment(amount: int, currency: str, customer_id: str):
return payments_client.create_payment_intent(
amount=amount,
currency=currency,
customer_id=customer_id,
)
payment_tool = FunctionTool.from_defaults(fn=create_payment)
4. Build an agent flow that writes to Supabase after each payment action
This is the part that matters in production. The agent performs a payment action, then persists the result to Supabase so you can audit it later.
from datetime import datetime, timezone
def process_payment(user_id: str, amount: int, currency: str):
payment = create_payment(
amount=amount,
currency=currency,
customer_id=user_id,
)
event = {
"user_id": user_id,
"payment_id": payment["id"],
"status": payment["status"],
"amount": amount,
"currency": currency,
"metadata": {"source": "llamaindex_agent"},
"created_at": datetime.now(timezone.utc).isoformat(),
}
inserted = insert_payment_event(event)
return {
"payment": payment,
"stored_event": inserted,
}
If you’re using an actual LlamaIndex agent runner, plug payment_tool into the tool list and keep insert_payment_event() as your post-action persistence layer.
5. Query Supabase for reconciliation and agent memory
Once events are stored, use Supabase as your source of truth for reconciliation checks and operational memory.
def get_recent_payments(user_id: str):
response = (
supabase.table("payment_events")
.select("*")
.eq("user_id", user_id)
.order("created_at", desc=True)
.limit(10)
.execute()
)
return response.data
recent = get_recent_payments("user_001")
print(recent)
That gives your agent historical context without forcing it to re-run payment operations or depend on ephemeral in-memory state.
Testing the Integration
Run a simple end-to-end test that creates a mock payment intent and stores it in Supabase.
if __name__ == "__main__":
result = process_payment(
user_id="user_001",
amount=5000,
currency="usd",
)
print("Payment:", result["payment"])
print("Stored:", result["stored_event"])
Expected output:
Payment: {'id': 'pi_123', 'status': 'requires_confirmation', 'amount': 5000, 'currency': 'usd', 'customer_id': 'user_001'}
Stored: [{'id': '...', 'user_id': 'user_001', 'payment_id': 'pi_123', 'status': 'requires_confirmation', 'amount': 5000, 'currency': 'usd', ...}]
If Stored comes back empty or throws an error:
- •check your Supabase table name
- •verify RLS is disabled for service-role inserts or policies allow backend writes
- •confirm your payment client returns a stable
payment_id
Real-World Use Cases
- •
Invoice collection agents
An AI agent generates an invoice summary with LlamaIndex-backed reasoning, triggers a payment intent, then stores invoice/payment state in Supabase for finance ops. - •
Subscription recovery flows
The agent detects failed renewals from stored events in Supabase and uses the payments tool to retry charges or prompt customers for updated billing details. - •
Payment support copilots
Support agents query Supabase for transaction history while using LlamaIndex tools to explain statuses, refunds, and next steps to customers.
Keep learning
- •The complete AI Agents Roadmap — my full 8-step breakdown
- •Free: The AI Agent Starter Kit — PDF checklist + starter code
- •Work with me — I build AI for banks and insurance companies
By Cyprian Aarons, AI Consultant at Topiax.
Want the complete 8-step roadmap?
Grab the free AI Agent Starter Kit — architecture templates, compliance checklists, and a 7-email deep-dive course.
Get the Starter Kit