Skip to content

Connect Peach to AI Agents: Automate Contacts and Payment Flows

Learn how to connect Peach to AI agents using Truto's /tools endpoint. A complete guide to automating donor management, payment processing, and campaigns.

Yuvraj Muley Yuvraj Muley · · 10 min read
Connect Peach to AI Agents: Automate Contacts and Payment Flows

You want to connect Peach to an AI agent so your system can independently manage donor records, process payments, analyze campaign statistics, and automate fundraising workflows based on historical context. Here is exactly how to do it using Truto's /tools endpoint and SDK, bypassing the need to hand-code complex payment integrations manually.

Giving a Large Language Model (LLM) read and write access to a specialized fundraising and payment platform like Peach is an engineering challenge. You either spend weeks building, hosting, and maintaining a custom connector that correctly handles payment idempotency, or you use a managed infrastructure layer that handles the boilerplate for you. If your team uses ChatGPT, check out our guide on connecting Peach to ChatGPT, or if you are building on Anthropic's models, read our guide on connecting Peach to Claude. For developers building custom autonomous workflows, you need a programmatic way to fetch these tools and bind them to your agent framework.

This guide breaks down exactly how to fetch AI-ready tools for Peach, bind them natively to an LLM using LangChain (or any framework like LangGraph, CrewAI, or Vercel AI SDK), and execute complex payment and contact operations. For a deeper look at the architecture behind this approach, refer to our research on architecting AI agents and the SaaS integration bottleneck.

The Engineering Reality of Custom Peach Connectors

Building AI agents is easy. Connecting them to external SaaS and payment APIs is hard. Giving an LLM access to external financial data sounds simple in a prototype. You write a Node.js function that makes a fetch request and wrap it in an @tool decorator. In production, this approach collapses entirely, especially with an ecosystem handling monetary transactions like Peach.

If you decide to integrate Peach yourself, you own the entire API lifecycle. Peach's API introduces several highly specific integration challenges that break standard LLM assumptions.

The Subscription and Payment Payload Trap

Payment APIs are unforgiving. In Peach, creating a payment requires strict adherence to schema rules based on the type of payment. For example, if you set isSubscription to true, the billingCycles field becomes absolutely required. Furthermore, the currency defaults to ILS (Israeli New Shekel) if omitted.

If you hand-code this integration, you have to write complex, brittle prompts to teach the LLM these conditional rules. When the LLM inevitably hallucinates and attempts to create a subscription without specifying billingCycles, or assumes the currency is USD, the API throws an error. The agent then gets stuck in an unresolvable loop of retries because it does not understand the nuance of the payment provider's business logic.

Identity Resolution Complexity

Before an agent can process a payment or update a donor, it must resolve the entity's identity. Peach allows fetching a single contact by multiple identifiers: contactId, email, phoneNumber, or tz (national ID). At least one must be provided.

When writing custom tool descriptions for an LLM, teaching it to strategically fallback across these four identifiers requires extensive prompt engineering. If the agent receives a request to "update John's payment method" but only has John's phone number, a poorly designed tool will fail because it expects a rigid contactId.

Strict Rate Limiting Realities

AI agents are inherently aggressive. A multi-step reasoning agent (like ReAct or a LangGraph loop) might execute twenty API calls in three seconds to cross-reference donor history, campaign stats, and transaction logs. This will immediately trigger an HTTP 429 Too Many Requests response from the upstream API.

It is critical to understand how this is handled in a production architecture. Truto does not retry, throttle, or apply backoff on rate limit errors. When the upstream Peach API returns an HTTP 429, Truto passes that error directly back to the caller.

What Truto does do is normalize the chaotic upstream rate limit information into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) strictly adhering to the IETF specification. The caller - your agent framework or application logic - is fully responsible for reading these headers and executing the appropriate retry or backoff strategy. Do not expect the integration layer to magically absorb rate limit errors; your agent must be engineered to pause when told to.

Why a Unified Tool Layer Matters for Agent Safety

Before writing a line of integration code, decide what layer your agent talks to. This choice determines how safe your production system will be.

Direct API tools (one tool per raw Peach endpoint) look convenient but they push provider quirks into the LLM's context. The model has to remember currency defaults, complex pagination cursors, and conditional field requirements. Every one of those quirks is a hallucination waiting to happen.

A unified tool layer collapses these complexities behind a standardized proxy. Your agent sees create_a_peach_payment with a strict JSON schema dictating exactly what is required. That gives you concrete safety wins:

  1. Smaller attack surface for hallucination. The LLM only ever chooses from a stable list of function names. It never invents endpoint paths or query parameters.
  2. Deterministic input validation. Every tool has a strict JSON schema. Invalid arguments (like missing billingCycles on a subscription) are rejected before they hit the Peach API, so a broken tool call fails fast instead of confusing the model with an upstream HTML error page.
  3. Decoupled authentication. The LLM never sees or handles Peach API keys. Authentication is managed entirely by the proxy layer.
  4. Standardized error handling. When a 429 occurs, your agent framework receives a clean, standardized HTTP header set to calculate its sleep duration, rather than parsing custom string errors from the provider.

Hero Tools for Peach Automation

Truto exposes Peach's capabilities as LLM-ready tools. Rather than dumping raw REST endpoints into your prompt context, you provide the LLM with specific, high-leverage operations. Here are the core hero tools that enable autonomous fundraising workflows.

Create a Peach Contact

Before accepting a donation or logging an interaction, the agent must ensure the donor exists in the system. This tool handles the creation of a new contact record, returning the contactId needed for subsequent operations.

Contextual Usage Notes: Require your agent to check if a contact exists using the get tool before defaulting to creation to avoid duplicate records.

"The donor Sarah Jenkins (sarah.j@example.com) just signed up at the gala. Create a new contact record for her in Peach so we can process her pledge."

Get Single Peach Contact by ID

This is the foundational identity resolution tool. It allows the agent to lookup a contact using either contactId, email, phoneNumber, or tz.

Contextual Usage Notes: This tool is crucial for workflows triggered by external webhooks (like an incoming email) where the internal contactId is unknown, but the email address is available.

"We received a support ticket from 555-0199 asking to cancel their monthly donation. Find their Peach contact record using this phone number."

Create a Peach Payment

The core transactional tool. It creates a payment in Peach, handling both one-off donations and recurring subscriptions.

Contextual Usage Notes: The schema strictly enforces that billingCycles must be provided if isSubscription is true. The agent will automatically default to ILS unless instructed otherwise in the prompt.

"Process a one-off donation of 500 for contact ID 88492 towards the 'Summer Youth' campaign. Ensure the currency is set to USD."

Update a Peach Payment by ID

Managing the lifecycle of a payment. This tool allows the agent to perform actions such as canceling a subscription, changing the charge day, or freezing an account.

Contextual Usage Notes: Essential for autonomous customer support agents handling donor requests without human intervention.

"The donor associated with payment ID PAY-9928 requested a pause on their account. Freeze this payment subscription immediately."

Peach Interactions Create Note

Fundraising is heavily relationship-driven. This tool allows the agent to append interaction notes to a donor's profile, providing audit trails for other team members.

Contextual Usage Notes: Always prompt your agent to log a note after it completes a state-changing action (like updating a payment or resolving a support query).

"Log an interaction note for contact ID 88492 stating that they called in to update their billing address, and the support agent successfully processed the request."

List All Peach Search Transactions

An analytical tool that allows the agent to search and filter transactions within a date range, optionally filtering by specific campaigns.

Contextual Usage Notes: The date range defaults to the last 30 days. The agent must handle pagination if more than 1000 results are returned.

"Pull all transactions for the 'Winter Drive' campaign over the last 14 days so I can summarize the total amount raised this week."

To view the complete schema definitions, required parameters, and the full inventory of available tools, visit the Peach integration page.

Workflows in Action

Individual tools are useful, but the real power of an AI agent comes from chaining them together to solve complex problems autonomously. Here is how specific personas use these tools in production.

Scenario 1: Autonomous Subscription Rescue

Persona: Donor Success Agent

When a recurring donation fails, organizations often lose that revenue because manual follow-up is too slow. An AI agent can detect the failure, reach out, and update the record automatically.

"A webhook alert just came in that a payment failed for donor email alex@example.com. Find their record, freeze their current subscription, and log a note that we are awaiting a new payment method."

Step-by-Step Execution:

  1. The agent calls get_single_peach_contact_by_id passing email: "alex@example.com" to retrieve the contactId.
  2. The agent queries recent transactions to find the active subscription ID associated with that contact.
  3. The agent calls update_a_peach_payment_by_id, passing the payment ID and the action freeze.
  4. Finally, the agent calls peach_interactions_create_note with the contactId, logging that the subscription was frozen due to a payment failure.

Outcome: The system safely pauses the billing cycle, preventing further failed transaction fees, and leaves a clear audit trail for the human fundraising team - all within seconds.

Scenario 2: Campaign Donation Orchestration

Persona: Campaign Operations Agent

During a live telethon or fundraising gala, offline donations need to be rapidly entered into the system and attributed to the correct campaign.

"We just got a 1000 USD check from Marcus Thorne (marcus.t@enterprise.com) for the 'Clean Water' campaign (ID: C-772). Enter him into the system, process the offline payment record, and update the interaction log."

Step-by-Step Execution:

  1. The agent calls get_single_peach_contact_by_id to see if Marcus is already in the system.
  2. Finding no record, it calls create_a_peach_contact with the provided name and email, receiving a new contactId.
  3. It calls create_a_peach_payment, setting the sum to 1000, currency to USD, campaignId to C-772, and isSubscription to false.
  4. It calls peach_interactions_create_note detailing the offline check reception.

Outcome: The campaign statistics are updated in real-time, the donor record is created accurately, and the finance team has a structured record of the offline payment.

Building Multi-Step Workflows

To build these autonomous loops, you need to bind Truto's dynamically generated tools to your LLM framework. Truto provides a /tools endpoint that outputs a schema natively understood by standard AI frameworks.

Whether you are using LangChain, Vercel AI SDK, or CrewAI, the architecture remains the same. Below is a concrete example using TypeScript, LangChain, and the truto-langchainjs-toolset to fetch Peach tools and handle the execution loop.

The Architecture

flowchart TD
    A["Agent Application<br>(LangChain/Vercel)"] -->|"Initialize via SDK"| B["TrutoToolManager<br>(Fetches schemas)"]
    B -->|"GET /integrated-account/:id/tools"| C["Truto API Proxy"]
    C -->|"Returns JSON Schemas"| B
    B -->|"bindTools()"| D["LLM<br>(GPT-4/Claude)"]
    D -->|"Function Call"| E["Tool Execution Layer"]
    E -->|"Execute Tool"| C
    C -->|"Standardized Headers<br>& Auth Injection"| F["Peach API"]
    F -->|"429 Too Many Requests"| C
    C -->|"ratelimit-* headers"| E
    E -.->|"Retry logic based<br>on reset header"| E

Implementation with LangChain

First, install the required packages:

bun add @langchain/openai @trutohq/truto-langchainjs-toolset

Next, initialize the agent, fetch the tools, and implement a robust execution loop that explicitly handles rate limiting.

import { ChatOpenAI } from "@langchain/openai";
import { TrutoToolManager } from "@trutohq/truto-langchainjs-toolset";
import { HumanMessage } from "@langchain/core/messages";
 
async function runPeachAgent() {
  // 1. Initialize the LLM
  const llm = new ChatOpenAI({
    modelName: "gpt-4o",
    temperature: 0,
  });
 
  // 2. Initialize the Truto Tool Manager with your Peach Integrated Account ID
  const toolManager = new TrutoToolManager({
    trutoToken: process.env.TRUTO_API_KEY!,
    integratedAccountId: "peach-account-id-123",
  });
 
  // 3. Fetch all tools dynamically. 
  // The LLM will now understand the exact schema for Peach payments and contacts.
  const tools = await toolManager.getTools();
  const llmWithTools = llm.bindTools(tools);
 
  console.log(`Loaded ${tools.length} Peach tools.`);
 
  // 4. Create the initial prompt
  const messages = [
    new HumanMessage("Find the contact for david@example.com and log a note that we left a voicemail about their failing subscription.")
  ];
 
  // 5. Agent Execution Loop
  while (true) {
    const response = await llmWithTools.invoke(messages);
    messages.push(response);
 
    if (!response.tool_calls || response.tool_calls.length === 0) {
      console.log("Agent completed the task:", response.content);
      break;
    }
 
    for (const toolCall of response.tool_calls) {
      const tool = tools.find((t) => t.name === toolCall.name);
      if (tool) {
        try {
          console.log(`Executing: ${tool.name}`);
          const result = await tool.invoke(toolCall.args);
          
          messages.push({
            role: "tool",
            tool_call_id: toolCall.id,
            name: tool.name,
            content: JSON.stringify(result),
          });
 
        } catch (error: any) {
          // 6. Explicit Rate Limit Handling
          // Truto passes the 429 directly to you. You MUST handle it.
          if (error.response && error.response.status === 429) {
            const headers = error.response.headers;
            const resetTime = headers.get('ratelimit-reset');
            
            console.warn(`Rate limit hit. Standardized reset header: ${resetTime}`);
            
            // Implement your backoff/sleep logic here based on the reset header
            // await sleep(calculateSleepTime(resetTime));
            
            messages.push({
              role: "tool",
              tool_call_id: toolCall.id,
              name: tool.name,
              content: "Error: Rate limit exceeded. The system is backing off. Please try this step again.",
            });
          } else {
            // Handle other API errors (e.g., validation failures)
            messages.push({
              role: "tool",
              tool_call_id: toolCall.id,
              name: tool.name,
              content: `Error executing tool: ${error.message}`,
            });
          }
        }
      }
    }
  }
}
 
runPeachAgent();

This architecture guarantees that your agent is not guessing how the Peach API works. By relying on the dynamic schemas provided by Truto, the LLM is constrained to valid operations, reducing hallucinations. By explicitly reading the ratelimit-reset header, your system remains resilient under heavy, multi-step agentic workloads without expecting the integration provider to invisibly queue or drop requests.

Moving Beyond Point-to-Point Connectors

Building an AI agent that can reliably automate Peach payment flows requires moving past rudimentary API wrappers. If your LLM is guessing endpoint structures, parsing raw HTML error pages, or fighting undocumented schema quirks, your agent will never reach production reliability.

By leveraging Truto's proxy architecture and dynamic /tools endpoint, you collapse the complexity of the Peach API into a safe, standardized schema that any agent framework can consume natively. You maintain total control over your application's retry logic and execution loops, while offloading the integration boilerplate entirely.

FAQ

How do I connect Peach to an AI agent framework like LangChain?
You can connect Peach to LangChain by fetching dynamic tool schemas from Truto's `/tools` endpoint using the `TrutoToolManager` SDK. This allows you to use the `.bindTools()` method to give the LLM native access to Peach operations.
How does Truto handle Peach API rate limits?
Truto does not retry, throttle, or apply backoff on rate limit errors. When Peach returns an HTTP 429, Truto passes the error to the caller and normalizes the rate limit info into standardized IETF headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset). The caller must handle the retry logic.
Can an AI agent create Peach subscriptions autonomously?
Yes. By using the `create_a_peach_payment` tool, the agent can create subscriptions. Truto's schema ensures the agent knows that setting `isSubscription` to true strictly requires providing the `billingCycles` parameter, reducing LLM hallucinations.
Does Truto store the payment data passing between the agent and Peach?
No. Truto operates as a proxy layer. It authenticates and routes the request to Peach, returning the response directly to your agent without retaining the payload.

More from our Blog