Skip to main content
RapidDev - Software Development Agency
bolt-ai-integrationsBolt Chat + API Route

How to Integrate Bolt.new with Sendible

Integrate Sendible with Bolt.new by using Sendible's API with your API key to schedule posts, fetch engagement analytics, and build white-label social media dashboards for agency clients. Sendible's API requires an active subscription. All API calls are outbound HTTP requests that work in Bolt's WebContainer preview. Incoming webhooks require deploying to Netlify or Bolt Cloud first.

What you'll learn

  • How to obtain a Sendible API key and configure authentication for your Bolt.new project
  • How to schedule social media posts to multiple client profiles via the Sendible REST API
  • How to fetch per-client and per-service engagement analytics for white-label reporting
  • How to build a multi-client social media management dashboard in Bolt.new
  • How to handle Sendible's service-based data model for managing multiple client accounts
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate15 min read25 minutesMarketingApril 2026RapidDev Engineering Team
TL;DR

Integrate Sendible with Bolt.new by using Sendible's API with your API key to schedule posts, fetch engagement analytics, and build white-label social media dashboards for agency clients. Sendible's API requires an active subscription. All API calls are outbound HTTP requests that work in Bolt's WebContainer preview. Incoming webhooks require deploying to Netlify or Bolt Cloud first.

Build a White-Label Social Media Dashboard with Sendible and Bolt.new

Sendible's core differentiator is its agency-first design — the platform is built around managing multiple clients with white-label branding, client-specific reports, and team role assignments. While Sendible's web dashboard is comprehensive, agencies often need custom integrations that connect Sendible data to their own client portals, CRM systems, or automated reporting workflows. Bolt.new lets you build these custom layers on top of Sendible's API without building a social media tool from scratch.

The Sendible API uses a service-based model where each connected social media account is called a 'service.' Clients are grouped into profiles, and services (Twitter accounts, Facebook pages, Instagram profiles) are nested under those profiles. Understanding this hierarchy is essential before building any integration — your API routes need to navigate from client profiles to their services to fetch the right data. For agencies building a custom client portal in Bolt, the typical pattern is: fetch all client profiles → display a client selector → fetch services for the selected client → show scheduling and analytics for those services.

Sendible's API is available to paying subscribers and provides access to core scheduling, publishing, and analytics features. The API documentation covers the endpoints for creating posts, fetching profile lists, and retrieving engagement metrics. For agencies that need to deliver custom-branded analytics reports to clients — showing exactly what the client cares about, styled to match the agency's brand — a Bolt app built on the Sendible API can replace manually assembled PowerPoint reports with a self-serve portal.

Integration method

Bolt Chat + API Route

Bolt.new connects to Sendible through server-side API routes that proxy authenticated requests to Sendible's REST API. The integration supports scheduling social media posts, fetching per-client engagement analytics, and building white-label reporting dashboards. Sendible's API key is stored in server-side environment variables and never exposed to the client. Outbound API calls work in Bolt's WebContainer preview during development.

Prerequisites

  • A Sendible account with an active subscription (API access requires a paid plan — check sendible.com/pricing)
  • Your Sendible API key from Account Settings → API (or Developer section)
  • At least one client profile configured in Sendible with connected social media services
  • A Bolt.new project (Next.js or Vite)
  • Optional: A Supabase project if building features that require data persistence (like the approval workflow use case)

Step-by-step guide

1

Get Your Sendible API Key and Understand the Service Model

Start by accessing your Sendible API credentials. Log in to Sendible and navigate to your account settings — look for a Developer or API section. Sendible provides an API key that you include in every request header. If you can't find the API key in settings, contact Sendible support, as API access details may be provided differently depending on your plan tier. Store the key in your Bolt project's .env file as SENDIBLE_API_KEY. Before writing any API routes, spend a few minutes understanding Sendible's data hierarchy — this will save significant debugging time. Sendible organizes data in a specific way: your account contains multiple Client Profiles (representing each of your agency clients), each Profile contains Services (individual social media accounts — a Twitter handle, a Facebook page, an Instagram profile are each separate services), and Posts are created and assigned to one or more services. When you call the API to schedule a post, you specify the service IDs (not profile IDs) that the post should go to. This means your integration usually needs two API calls to start: first fetch all profiles to show a client list, then fetch services for a selected profile to show which social accounts are available. Sendible's API base URL is typically https://api.sendible.com/api/v1 — always confirm the current base URL in Sendible's developer documentation as it may be versioned. All requests use an API key passed in the Authorization header or as a query parameter, depending on the endpoint.

Bolt.new Prompt

Set up a Sendible API integration for my Bolt app. Create lib/sendible.ts with a sendibleRequest(endpoint, method?, body?) function that calls https://api.sendible.com/api/v1/${endpoint} with Authorization: Bearer ${process.env.SENDIBLE_API_KEY} header. Export helper functions: getProfiles() calling /profiles, getServices(profileId?) calling /services, and schedulePost(serviceIds, content, scheduledAt, mediaUrl?) calling POST /messages. Add SENDIBLE_API_KEY to .env as a placeholder. Create GET /api/sendible/profiles and GET /api/sendible/services?profile_id= routes using these helpers.

Paste this in Bolt.new chat

lib/sendible.ts
1// lib/sendible.ts
2const SENDIBLE_BASE = 'https://api.sendible.com/api/v1';
3
4async function sendibleRequest<T>(
5 endpoint: string,
6 method: string = 'GET',
7 body?: Record<string, unknown>
8): Promise<T> {
9 const response = await fetch(`${SENDIBLE_BASE}/${endpoint}`, {
10 method,
11 headers: {
12 Authorization: `Bearer ${process.env.SENDIBLE_API_KEY}`,
13 'Content-Type': 'application/json',
14 Accept: 'application/json',
15 },
16 ...(body ? { body: JSON.stringify(body) } : {}),
17 });
18
19 if (!response.ok) {
20 const errorText = await response.text();
21 throw new Error(`Sendible API ${response.status}: ${errorText}`);
22 }
23
24 return response.json();
25}
26
27export const getProfiles = () => sendibleRequest('profiles');
28
29export const getServices = (profileId?: string) => {
30 const query = profileId ? `?profile_id=${profileId}` : '';
31 return sendibleRequest(`services${query}`);
32};
33
34export const getAnalytics = (serviceId: string, startDate: string, endDate: string) =>
35 sendibleRequest(`analytics?service_id=${serviceId}&start_date=${startDate}&end_date=${endDate}`);
36
37export const schedulePost = (
38 serviceIds: string[],
39 content: string,
40 scheduledAt: string,
41 mediaUrl?: string
42) =>
43 sendibleRequest('messages', 'POST', {
44 message: content,
45 service_ids: serviceIds,
46 scheduled_at: scheduledAt,
47 ...(mediaUrl ? { media_url: mediaUrl } : {}),
48 });

Pro tip: Sendible's service IDs are what you actually use when scheduling posts — not profile IDs. Always fetch services for the selected client profile before building any post scheduling UI.

Expected result: The Sendible utility is set up. The /api/sendible/profiles route returns your client profiles list as JSON, and /api/sendible/services returns the social accounts for a given client.

2

Build the Multi-Client Management Dashboard

The multi-client dashboard is the core of a Sendible-based agency tool. It shows all clients in a sidebar or dropdown, and when a client is selected, loads their connected social services and key metrics. Build this as a two-panel layout: the left panel lists all client profiles fetched from Sendible, the right panel shows the selected client's services with their posting stats and recent activity. Fetch client profiles on component mount and store them in React state. When a user clicks a client, fetch that client's services and their recent posts. Display services as cards with the social network icon, account name, follower count, and last post date. Add a quick-schedule button on each service card that opens a compose modal. For the analytics section, show the last 30 days' post count, average engagement rate, and a sparkline chart of daily engagement. Cache the profile list in React state to avoid re-fetching when switching between clients — profile data rarely changes during a session. The service data (follower counts, recent posts) should refresh each time a client is selected since it's the live current data. Implementing a loading skeleton while data fetches improves the perceived performance for agencies managing large client lists. Important: all of these Sendible API calls are outbound requests, so they work in Bolt's WebContainer preview during development without needing to deploy first.

Bolt.new Prompt

Build a multi-client social media dashboard for Sendible. Left sidebar: list all clients from /api/sendible/profiles with their profile name and avatar. Right main panel: when a client is selected, fetch their services from /api/sendible/services?profile_id={id} and display each as a card showing: service name, platform icon (Twitter/Facebook/Instagram/LinkedIn), follower count, posts last 30 days, avg engagement. Add a blue Schedule Post button that opens a modal with a textarea, optional media URL, datetime picker, and a checkbox list of the client's services. On submit, POST to /api/sendible/schedule. Show loading skeletons while fetching.

Paste this in Bolt.new chat

app/api/sendible/schedule/route.ts
1// app/api/sendible/schedule/route.ts
2import { NextRequest, NextResponse } from 'next/server';
3import { schedulePost } from '@/lib/sendible';
4
5export async function POST(request: NextRequest) {
6 const { service_ids, content, scheduled_at, media_url } = await request.json();
7
8 if (!service_ids?.length || !content || !scheduled_at) {
9 return NextResponse.json(
10 { error: 'service_ids, content, and scheduled_at are required' },
11 { status: 400 }
12 );
13 }
14
15 const scheduledDate = new Date(scheduled_at);
16 if (scheduledDate <= new Date()) {
17 return NextResponse.json(
18 { error: 'Scheduled time must be in the future' },
19 { status: 400 }
20 );
21 }
22
23 try {
24 const result = await schedulePost(
25 service_ids,
26 content,
27 scheduledDate.toISOString(),
28 media_url || undefined
29 );
30 return NextResponse.json(result);
31 } catch (error) {
32 console.error('Sendible schedule post failed:', error);
33 return NextResponse.json(
34 { error: 'Failed to schedule post in Sendible' },
35 { status: 500 }
36 );
37 }
38}

Pro tip: When scheduling to multiple services, Sendible creates one post object but distributes it to all specified service IDs. The response includes a message ID per service for tracking individual post status.

Expected result: The dashboard displays all client profiles in the sidebar. Selecting a client shows their social accounts with stats. The schedule modal creates posts in Sendible successfully.

3

Build the Analytics and Reporting Layer

Analytics reporting is where a custom Bolt-based Sendible dashboard provides the most value over Sendible's built-in interface — you can present exactly the metrics clients care about, in the visual format your agency prefers, with your branding. Sendible's analytics API provides engagement data by service for configurable date ranges. Build an analytics section that fetches data for each of the client's services and aggregates it into a unified report view. The key metrics for social media reporting are: total post count, total reach (people who saw posts), total engagements (likes + comments + shares), engagement rate (engagements / reach), top performing posts (highest individual engagement), follower count over time (growth trajectory), and best day/time to post (based on historical performance patterns). Fetch analytics in parallel for all services using Promise.all() to minimize loading time. Present the data using Recharts components: a line chart for follower growth, a bar chart comparing engagement across platforms, and a table of top performing posts. For white-label purposes, remove any references to Sendible from the visible UI — use your agency's branding, colors, and terminology. Add an export-to-PDF button using the browser's print API (window.print() with print-specific CSS) so clients can download their monthly report. The PDF export approach requires no additional libraries and works with Bolt's generated React components. Cache analytics responses for at least 15 minutes since the data doesn't change in real-time and analytics fetches are typically slower API calls.

Bolt.new Prompt

Add an analytics reporting section to my Sendible dashboard. Create an API route GET /api/sendible/analytics?service_id={id}&start={date}&end={date} that fetches engagement data from Sendible. On the dashboard, when a client is selected, fetch analytics for all their services in parallel (Promise.all). Build a report layout with: 1) Summary stats row (total posts, total reach, avg engagement rate as large number cards), 2) Recharts line chart showing daily engagement over the last 30 days, 3) Recharts bar chart comparing follower growth per platform, 4) Table of top 5 posts by engagement with caption preview and engagement count. Add a Print Report button that triggers window.print() for PDF export.

Paste this in Bolt.new chat

app/api/sendible/analytics/route.ts
1// app/api/sendible/analytics/route.ts
2import { NextRequest, NextResponse } from 'next/server';
3import { getAnalytics } from '@/lib/sendible';
4
5export async function GET(request: NextRequest) {
6 const { searchParams } = new URL(request.url);
7 const serviceId = searchParams.get('service_id');
8 const startDate = searchParams.get('start');
9 const endDate = searchParams.get('end');
10
11 if (!serviceId || !startDate || !endDate) {
12 return NextResponse.json(
13 { error: 'service_id, start, and end are required' },
14 { status: 400 }
15 );
16 }
17
18 try {
19 const data = await getAnalytics(serviceId, startDate, endDate);
20 return NextResponse.json(data);
21 } catch (error) {
22 console.error('Sendible analytics fetch failed:', error);
23 return NextResponse.json({ error: 'Failed to fetch analytics' }, { status: 500 });
24 }
25}
26
27// In your React component — fetch analytics for all services in parallel
28// const analyticsResults = await Promise.all(
29// services.map(service =>
30// fetch(`/api/sendible/analytics?service_id=${service.id}&start=${startDate}&end=${endDate}`)
31// .then(r => r.json())
32// )
33// );

Pro tip: Use Promise.all() to fetch analytics for all client services simultaneously rather than sequentially — for a client with 5 connected social accounts, parallel fetching is 5x faster than waiting for each one.

Expected result: The analytics section shows a full engagement report for the selected client with charts for follower growth and engagement trends. The Print Report button opens the browser print dialog for PDF export.

4

Deploy and Set Up Environment Variables for Production

Deploying your Sendible dashboard to Netlify or Bolt Cloud makes it accessible to your agency team and clients. The deployment process also enables Sendible webhooks for real-time post status updates. Start by deploying: in Bolt, click the Publish button to deploy to Bolt Cloud, or connect your GitHub repository to Netlify for automated CI/CD. Once deployed, set the SENDIBLE_API_KEY environment variable in your hosting platform — in Netlify, go to Site Configuration → Environment Variables and add the key. In Bolt Cloud, use the Secrets panel in your project settings. Never commit your API key to a git repository. After deployment, your app runs server-side API routes on real infrastructure instead of the WebContainer. If your dashboard requires user authentication (to restrict which clients or team members can see data), add auth using Supabase Auth or Clerk — both integrate well with Bolt apps. For agencies wanting to give clients their own login to view their reports, Supabase Auth with row-level security on a client profiles table is a clean approach. Custom domain setup (e.g., reports.youragency.com) makes the portal feel native to your brand rather than a generic app URL. Both Netlify and Bolt Cloud support custom domains with automatic SSL. The WebContainer limitation for incoming requests also applies here: if Sendible offers webhooks for post status notifications, these webhooks can only be tested and used on your deployed URL, not the Bolt preview.

Bolt.new Prompt

Prepare my Sendible dashboard for deployment. Add proper error boundaries to the main dashboard component so API errors show a friendly error message instead of a crash. Create a simple login page using Supabase Auth (email + password) that gates access to the dashboard. Add a .env.example file listing SENDIBLE_API_KEY, NEXT_PUBLIC_SUPABASE_URL, and NEXT_PUBLIC_SUPABASE_ANON_KEY with placeholder values and comments explaining each. Add a README-style comment at the top of lib/sendible.ts explaining the setup steps. Make sure no API keys are hardcoded anywhere in the codebase.

Paste this in Bolt.new chat

.env.example
1// .env.example — copy to .env and fill in your values
2// SENDIBLE_API_KEY=your_sendible_api_key_here
3// Get this from: Sendible Dashboard → Settings → API
4// Required plan: Pro or Agency
5//
6// NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
7// Get this from: Supabase Dashboard → Settings → API
8//
9// NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key
10// Get this from: Supabase Dashboard → Settings → API
11// Safe to use in client-side code (protected by Row Level Security)
12
13// IMPORTANT: Never commit your .env file to git
14// Add .env to your .gitignore file

Pro tip: Add .env to your .gitignore file before the first git commit — accidentally committing API keys to a public repository is a common security incident. Bolt's git integration respects .gitignore entries.

Expected result: The dashboard is deployed with proper environment variables. Team members and clients can log in using Supabase Auth. The app works identically to the local preview but on a public URL.

Common use cases

Multi-Client Social Media Report Portal

Build a white-label reporting portal where clients can log in and view their social media analytics — follower growth, engagement rates, top posts, and best posting times — without accessing Sendible directly. The portal fetches data from Sendible's API and presents it in the agency's branded style.

Bolt.new Prompt

Build a client analytics portal using the Sendible API. Create a client selector dropdown populated from GET /api/sendible/profiles. When a client is selected, fetch their connected services (social accounts) from /api/sendible/services?profile_id={id}. Display an analytics dashboard showing for each service: follower count, posts this month, average engagement rate, and top 3 posts by engagement. Use Recharts for a follower growth line chart over the last 30 days. Store SENDIBLE_API_KEY in .env and proxy all requests through server-side routes.

Copy this prompt to try it in Bolt.new

Bulk Post Scheduler for Multiple Clients

Create a scheduling interface where agency team members can write one post and publish it to multiple client profiles and social networks simultaneously. The tool selects the appropriate services per client and schedules the post through Sendible's API, optionally at different times per client.

Bolt.new Prompt

Build a bulk post scheduler for Sendible. Create a form with: a textarea for post content, an image URL field, a datetime picker for scheduled time, and a multi-select checklist of client profiles fetched from the Sendible API. On submit, for each selected client, call POST /api/sendible/schedule with the content, image, scheduled time, and the client's service IDs. Show a results list indicating success or failure per client. Handle rate limiting with a small delay between API calls if scheduling to more than 5 clients at once.

Copy this prompt to try it in Bolt.new

Agency Content Approval Workflow

Build a content approval tool where clients can review and approve posts before they're published. Posts are drafted in Bolt, stored in a Supabase database with 'pending_approval' status, and only submitted to Sendible for scheduling once the client approves them via the portal.

Bolt.new Prompt

Create a content approval workflow using Sendible and Supabase. Build a 'Draft Post' page where agency staff write posts, add images, select target Sendible profiles, and save them to a Supabase 'pending_posts' table with status 'draft'. Build a client-facing 'Approve Posts' page that shows all pending posts. When a client clicks Approve, call POST /api/sendible/schedule to create the post in Sendible, then update the Supabase record status to 'scheduled'. Add a Reject button that allows the client to leave feedback and set the status back to 'needs_revision'.

Copy this prompt to try it in Bolt.new

Troubleshooting

Sendible API returns 401 Unauthorized with a valid API key

Cause: The API key format is incorrect, has extra whitespace, or has been revoked. Some Sendible plans require a different authentication method (OAuth instead of API key).

Solution: Copy the API key directly from Sendible's settings page, avoiding any trailing spaces. Verify the Authorization header format matches Sendible's documentation — some versions use 'Bearer KEY' while others use 'Basic' or direct key in a query parameter. Contact Sendible support to confirm the authentication method for your plan.

Post scheduling succeeds (200 OK) but the post doesn't appear in Sendible

Cause: The service_ids in the request are invalid or don't match any services connected to your Sendible account, or the scheduled_at time is in the past.

Solution: Fetch and log the service list from /api/sendible/services to confirm the IDs you're using are valid. Ensure the scheduled_at timestamp is in the future and in ISO 8601 format (e.g., '2026-05-01T14:00:00Z'). Check Sendible's message queue directly in the dashboard to see if the post appears with any error status.

Analytics API returns empty data or zeros for all metrics

Cause: The date range requested may have no published posts, or the service has been connected but has no historical data in Sendible yet.

Solution: Confirm in Sendible's dashboard that the service has published posts within the requested date range. Try a broader date range (last 90 days instead of 30). Check that the service has been connected to Sendible for longer than the requested start date — analytics are only available for posts published through Sendible.

Best practices

  • Never expose your Sendible API key in client-side code — always proxy Sendible API calls through server-side routes
  • Fetch client profiles once on app load and cache them in React state — profiles rarely change and re-fetching on every interaction wastes API calls
  • Fetch analytics for multiple services in parallel using Promise.all() rather than sequentially — significantly faster for clients with many connected social accounts
  • Cache analytics API responses for 15-30 minutes — social media analytics data updates infrequently and caching reduces load time and API quota consumption
  • Remove Sendible branding from client-facing views to maintain white-label appearance — use your agency's name, colors, and logo throughout the portal
  • Validate scheduled post times on the client side before submitting to the API — checking that the time is in the future and the content length is within platform limits prevents unnecessary API errors
  • Test all scheduling and analytics features using Bolt's WebContainer preview before deploying — outbound Sendible API calls work fine in development

Alternatives

Frequently asked questions

Can I use the Sendible API during development in Bolt's WebContainer preview?

Yes — all outbound Sendible API calls work fine in Bolt's WebContainer preview. You can fetch client profiles, services, and analytics, and schedule posts during development without deploying. The limitation is incoming connections: Sendible webhooks (for post status notifications) cannot reach the preview's dynamic URL. Set up webhooks after deploying to Netlify or Bolt Cloud.

What Sendible plan is required for API access?

Sendible's API access is available on paid plans. The specific plan requirement depends on Sendible's current pricing tier — check sendible.com/pricing or contact Sendible support to confirm. Developer and agency plans typically include API access, while entry-level plans may not.

Can I build a multi-tenant app where different agency staff log in and manage their assigned clients?

Yes — combine Sendible's API with Supabase Auth for user management. Store a mapping of user IDs to allowed Sendible client profile IDs in Supabase. When a staff member logs in, fetch only the Sendible profiles they're authorized to see. Sendible's own API doesn't enforce per-user permissions at the API level, so you implement this access control in your Bolt app's authentication layer.

How do I give clients read-only access to view their own analytics?

Create client-specific user accounts in Supabase Auth and map each account to their Sendible profile ID. Build a client-facing view that fetches analytics only for the logged-in client's profile. Use Supabase Row Level Security on any database tables that store client data. The Sendible API itself doesn't have a read-only key — all access control happens in your Bolt app's authentication and authorization layer.

Does Sendible support white-label domains through the API?

Sendible's own white-label features (custom branding within Sendible's interface) are configured in Sendible's settings, not the API. When you build a Bolt app on top of the Sendible API, the white-label presentation is entirely your own design — your agency's branding, domain, and UI. The Sendible API just provides the data; how you present it to clients is fully under your control.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Need help with your project?

Our experts have built 600+ apps and can accelerate your development. Book a free consultation — no strings attached.

Book a free consultation

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.