Third-party service integration reference — Stripe, Mailgun, PandaDoc, Algolia, HubSpot, Salesforce, OpenAI, Intercom, Sentry, Google Maps, and Vimeo patterns in A3
From a3-pluginnpx claudepluginhub trusted-american/marketplace --plugin a3-pluginThis skill uses the workspace's default tool permissions.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Searches prompts.chat for AI prompt templates by keyword or category, retrieves by ID with variable handling, and improves prompts via AI. Use for discovering or enhancing prompts.
Implements structured self-debugging workflow for AI agent failures: capture errors, diagnose patterns like loops or context overflow, apply contained recoveries, and generate introspection reports.
Most third-party integrations in A3 follow this pattern:
Frontend Component → REST Adapter (adapter/firebase.ts) → Cloud Function HTTPS Endpoint → Third-Party API
The Cloud Function acts as a proxy/orchestrator, keeping API keys secure on the server side.
Frontend: app/adapters/stripe/ — REST adapters for Stripe resources
Backend: functions/src/https/stripe/ — Checkout sessions, webhooks, customer management
Package: stripe (backend), @stripe/stripe-js (frontend)
// app/adapters/stripe/customer.ts
import FirebaseAdapter from '../firebase';
export default class StripeCustomerAdapter extends FirebaseAdapter {
namespace = 'api/stripe';
}
// functions/src/https/stripe/checkout.ts
const session = await stripe.checkout.sessions.create({
customer: customerId,
line_items: [{ price: priceId, quantity: 1 }],
mode: 'subscription',
success_url: `${appUrl}/success`,
cancel_url: `${appUrl}/cancel`,
});
Backend: functions/src/https/mailgun/ — Email sending
Package: mailgun.js
await mg.messages.create(domain, {
from: 'A3 <noreply@trustedamerican.com>',
to: [recipient],
subject: 'Your enrollment has been approved',
html: emailTemplate(data),
});
Frontend: app/adapters/pandadoc/ — Document management
Backend: functions/src/https/pandadoc/ — Document creation, sending
Package: pandadoc-node-client
Frontend: app/services/search.ts — Search client
Backend: functions/src/https/algolia/ — Index management
Package: algoliasearch (both), @algolia/client-search (frontend)
// app/services/search.ts
import { algoliasearch } from 'algoliasearch';
const client = algoliasearch(appId, searchKey);
const results = await client.search({
requests: [{ indexName: 'clients', query: searchTerm }],
});
// When a client is created/updated, sync to Algolia
await client.saveObject({
indexName: 'clients',
body: { objectID: clientId, firstName, lastName, email },
});
Backend: functions/src/https/hubspot/ — CRM sync
Package: @hubspot/api-client
Backend: functions/src/https/salesforce/ — CRM sync
Backend: functions/src/https/openai/ — AI-powered features
Package: openai
Frontend: @intercom/messenger-js-sdk — Chat widget
// Initialize Intercom with user data
import Intercom from '@intercom/messenger-js-sdk';
Intercom({ app_id: 'xxx', user_id: userId, email: userEmail });
Frontend: @sentry/ember — Error monitoring
Backend: @sentry/node — Server-side error tracking
// Auto-configured via @sentry/ember
// Catches: uncaught exceptions, unhandled rejections, Ember errors
import * as Sentry from '@sentry/node';
Sentry.init({ dsn: process.env.SENTRY_DSN });
Sentry.captureException(error);
Frontend: @googlemaps/js-api-loader — Map integration
import { Loader } from '@googlemaps/js-api-loader';
const loader = new Loader({ apiKey: config.googleMapsApiKey });
const google = await loader.load();
const map = new google.maps.Map(element, { center, zoom: 10 });
Frontend: highcharts + ember-highcharts — Data visualization
<HighCharts @content={{this.chartData}} @chartOptions={{hash chart=(hash type="line")}} />
Frontend: @vimeo/player — Video player
import Player from '@vimeo/player';
const player = new Player(element, { id: videoId });