Skip to main content
RapidDev - Software Development Agency
retool-integrationsREST API Resource

How to Integrate Retool with Planoly

Connect Retool to Planoly by creating a REST API Resource with Planoly's API authentication. Pull Instagram scheduling and analytics data into Retool to build visual content planning dashboards that show scheduled posts, grid previews, engagement metrics, and publishing performance — giving social media managers an operational view beyond Planoly's native interface.

What you'll learn

  • How to configure a Planoly REST API Resource in Retool with proper API authentication
  • How to query scheduled posts, media uploads, and analytics data from Planoly's API
  • How to build an Instagram content calendar dashboard showing upcoming scheduled posts with visual previews
  • How to use JavaScript transformers to reshape Planoly's response data for Retool Table and Calendar components
  • How to combine Planoly scheduling data with engagement analytics for a complete content performance view
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Beginner16 min read20 minutesMarketingLast updated April 2026RapidDev Engineering Team
TL;DR

Connect Retool to Planoly by creating a REST API Resource with Planoly's API authentication. Pull Instagram scheduling and analytics data into Retool to build visual content planning dashboards that show scheduled posts, grid previews, engagement metrics, and publishing performance — giving social media managers an operational view beyond Planoly's native interface.

Quick facts about this guide
FactValue
ToolPlanoly
CategoryMarketing
MethodREST API Resource
DifficultyBeginner
Time required20 minutes
Last updatedApril 2026

Build a Planoly Instagram Content Operations Dashboard in Retool

Social media managers using Planoly for Instagram planning often need reporting and operational views that Planoly's native interface doesn't provide: bulk content status reports across multiple accounts, date-range performance comparisons, automated content approval workflows, or custom views for clients and stakeholders who shouldn't have direct Planoly access. Exporting data from Planoly to spreadsheets creates maintenance overhead that grows with every reporting cycle.

Retool provides a configurable alternative by giving your team direct access to Planoly's API. You can build a content calendar dashboard that shows all scheduled posts with thumbnail previews and posting times, displays engagement metrics for recently published content, tracks grid composition across content types, and generates performance summaries for client reporting — all without logging into Planoly's interface.

Planoly's API provides access to your scheduled media library, post metadata, and analytics data. When combined with Instagram Graph API data in the same Retool app, you can correlate Planoly's planning data with real Instagram performance metrics for a complete content operations view.

Integration method

REST API Resource

Planoly connects to Retool through a REST API Resource using Planoly's API token authentication passed as a Bearer token or header on each request. Configure the base URL and API credentials once in the Retool resource settings, then build individual queries for scheduled posts, analytics, and media management. All requests are proxied server-side through Retool, keeping your credentials secure.

Prerequisites

  • A Planoly account (Pro or Business plan for API access — free plan may have limited API availability)
  • Planoly API credentials — access the API documentation at planoly.com/developer or contact Planoly support to request API access
  • A Retool account with permission to create Resources
  • Familiarity with Retool's query editor, Table component with Image column type
  • Optional: Instagram Graph API access for combining Planoly planning data with Instagram insights

Step-by-step guide

1

Obtain Planoly API credentials and configure the Resource

Planoly's API access availability depends on your subscription plan and their current developer program status. Log in to your Planoly account and navigate to Account Settings → Integrations or API section (if available) to find your API credentials. If API access is not visible in your account settings, contact Planoly support at support@planoly.com to request API access for your account — include your use case (internal analytics dashboard) in the request. Once you have your API credentials (typically an API key or token), store them securely in Retool. Navigate to your Retool instance's Settings → Configuration Variables, click Create Variable, name it PLANOLY_API_KEY, paste your API key value, and mark it as Secret. Navigate to the Resources tab in your Retool instance and click Add Resource. Select REST API from the resource type list. Name the resource 'Planoly API'. In the Base URL field, enter https://api.planoly.com (verify the exact base URL with Planoly's API documentation, as it may differ). In the Authentication section, select Bearer Token and enter {{ retoolContext.configVars.PLANOLY_API_KEY }} in the Token field. Alternatively, if Planoly uses a header-based API key, add it in the Default Headers section with the key name specified in Planoly's documentation. Add a default header: Key = Content-Type, Value = application/json. Click Save Changes.

Pro tip: Planoly's API availability and endpoints may vary by subscription tier. If API access is not available on your current plan, Planoly's Instagram scheduling data can also be accessed through a combination of Instagram Graph API (for published post analytics) and a local tracking database in Retool where you manually log scheduled content. This hybrid approach works well for reporting dashboards while Planoly API access is being arranged.

Expected result: A Planoly API REST resource is saved in your Resources list with Bearer token authentication configured. The resource is ready to make authenticated API calls once you have confirmed the correct base URL and authentication method with Planoly's documentation.

2

Query scheduled media and posts

Create the primary query to retrieve your scheduled Planoly posts. In your Retool app, open the Code panel and click the + icon to add a query. Name it getScheduledPosts, select the Planoly API resource, set Method to GET. Planoly's API endpoints for scheduled content typically follow the pattern /v1/media or /v1/posts for your connected Instagram profiles. Check Planoly's current API documentation for the exact endpoint path for your account. Add URL parameters for filtering: Key = status, Value = {{ select_status.value || 'scheduled' }}, and Key = profile_id, Value = {{ dropdown_profile.value }}. For fetching connected Instagram profiles, create a separate query named getProfiles with Method GET and the profile list endpoint. Use the response to populate a Dropdown component named dropdown_profile so users can switch between connected Instagram accounts. Create a JavaScript transformer to extract and format the scheduled posts data. The key fields to extract are: the post ID, scheduled time, caption text, image thumbnail URL, content type (image, video, carousel, story), status, and any hashtags. Bind a Retool Table component to the transformer output. Set the thumbnail column type to Image with URL source set to {{ currentRow.thumbnail_url }} to display post previews inline.

transformer.js
1// JavaScript transformer — format Planoly scheduled posts
2const posts = data?.posts || data?.media || data?.items || [];
3
4return posts.map(post => {
5 const scheduledTime = post.scheduled_at || post.scheduled_time || post.publish_time;
6 const scheduledDate = scheduledTime ? new Date(scheduledTime) : null;
7
8 return {
9 id: post.id,
10 thumbnail_url: post.thumbnail_url || post.image_url || post.media_url || '',
11 caption: post.caption
12 ? (post.caption.length > 100
13 ? post.caption.substring(0, 100) + '...'
14 : post.caption)
15 : 'No caption',
16 full_caption: post.caption || '',
17 content_type: post.media_type || post.content_type || 'image',
18 status: post.status || 'scheduled',
19 scheduled_date: scheduledDate
20 ? scheduledDate.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' })
21 : 'Not scheduled',
22 scheduled_time_str: scheduledDate
23 ? scheduledDate.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' })
24 : 'N/A',
25 scheduled_timestamp: scheduledDate ? scheduledDate.toISOString() : null,
26 hashtags: post.caption
27 ? (post.caption.match(/#[\w]+/g) || []).join(' ')
28 : 'None',
29 profile_id: post.profile_id || 'N/A'
30 };
31}).sort((a, b) => {
32 if (!a.scheduled_timestamp) return 1;
33 if (!b.scheduled_timestamp) return -1;
34 return new Date(a.scheduled_timestamp) - new Date(b.scheduled_timestamp);
35});

Pro tip: Sort scheduled posts by scheduled_timestamp in ascending order in your transformer (upcoming posts first) so the table naturally displays the content publishing queue from soonest to latest. This mirrors how a content calendar should read.

Expected result: The scheduled posts table shows upcoming Planoly content with thumbnail image previews, truncated captions, content type, and scheduled date and time. Posts are sorted from nearest to furthest scheduled time.

3

Build analytics and engagement performance queries

Create queries to retrieve performance analytics for published posts. Create getPublishedPosts with Method GET and the Planoly published/analytics endpoint — this typically returns posts that have been published with their engagement data (likes, comments, impressions, reach) if Planoly has synced Instagram Insights for your account. Add URL parameters for date filtering: Key = start_date, Value = {{ dateRange.start.toISOString().split('T')[0] }}, Key = end_date, Value = {{ dateRange.end.toISOString().split('T')[0] }}. Create a JavaScript transformer that calculates derived metrics for each post: engagement rate (likes + comments + saves / reach * 100), and identifies top performing content by engagement rate. Add a DateRange component to filter the analytics period. Bind the Table's data to the transformer output, sorted by engagement_rate descending so best-performing posts appear first. Add a Chart component showing engagement rate trends over time. Configure it as a Line chart with scheduled/publish date on the X-axis and engagement_rate on the Y-axis. Add a second data series showing post reach to visualize the reach vs. engagement relationship. Add Stat components showing average engagement rate, total posts in period, and best-performing post for quick executive summary display at the top of the dashboard.

transformer.js
1// JavaScript transformer — calculate engagement metrics for published posts
2const posts = data?.posts || data?.analytics || data?.media || [];
3
4return posts
5 .filter(post => post.status === 'published' || post.published_at)
6 .map(post => {
7 const likes = parseInt(post.likes || post.like_count || 0);
8 const comments = parseInt(post.comments || post.comment_count || 0);
9 const saves = parseInt(post.saves || post.saved_count || 0);
10 const reach = parseInt(post.reach || post.impressions || 0);
11
12 const engagements = likes + comments + saves;
13 const engagementRate = reach > 0
14 ? parseFloat(((engagements / reach) * 100).toFixed(2))
15 : 0;
16
17 const publishedDate = post.published_at || post.created_at;
18
19 return {
20 id: post.id,
21 thumbnail_url: post.thumbnail_url || post.image_url || '',
22 caption_preview: (post.caption || '').substring(0, 80) + (post.caption?.length > 80 ? '...' : ''),
23 published_date: publishedDate
24 ? new Date(publishedDate).toLocaleDateString()
25 : 'N/A',
26 content_type: post.media_type || 'image',
27 likes: likes.toLocaleString(),
28 comments: comments.toLocaleString(),
29 saves: saves.toLocaleString(),
30 reach: reach.toLocaleString(),
31 engagement_rate: `${engagementRate}%`,
32 engagement_rate_num: engagementRate,
33 performance: engagementRate >= 5 ? 'High'
34 : engagementRate >= 2 ? 'Average'
35 : 'Low'
36 };
37 })
38 .sort((a, b) => b.engagement_rate_num - a.engagement_rate_num);

Pro tip: Instagram engagement rate benchmarks vary by account size: accounts with under 10K followers often see 3-6% engagement rate, while larger accounts (100K+) typically see 1-3%. Add a performance label in your transformer (High/Average/Low) using these benchmarks to give context to raw engagement rate numbers in the dashboard.

Expected result: The analytics table shows published posts sorted by engagement rate with likes, comments, saves, reach, and calculated engagement rate. The trend chart visualizes performance over the selected date period.

4

Build a content grid preview and gap analysis panel

Build a visual panel that shows how your Instagram grid will look with upcoming scheduled posts. Planoly's core value proposition is visual grid planning — replicate this view in Retool using a grid-style layout. Create a query named getGridPosts that fetches the most recent published posts plus all upcoming scheduled posts, sorted by date, to simulate the Instagram grid. Instagram displays posts in a 3-column grid, newest first. In Retool, use a List View component with 3 columns to create a grid-like display. Configure the List View's data to {{ gridPostsTransformer.data }} and set each list item to show an Image component (thumbnail_url) with a small status indicator (published/scheduled) overlaid. Add a gap analysis section: create a JavaScript query that analyzes your posting schedule for gaps longer than 3 days in the next 30 days. Display these gaps in a warning-styled Text or Banner component: 'No posts scheduled for [date range] — consider adding content.' Add a content type distribution Chart (Pie chart) showing the percentage breakdown of your scheduled content by type (photos, videos, carousels, Reels) to ensure content variety aligns with your strategy. For teams managing multiple Instagram accounts through Planoly, add an account selector dropdown and build all queries to accept the profile_id parameter, making the entire dashboard switchable between accounts with a single control.

gap_analysis.js
1// JavaScript query — find scheduling gaps in the next 30 days
2const posts = getScheduledPosts.data || [];
3const today = new Date();
4const thirtyDaysLater = new Date(today.getTime() + 30 * 24 * 60 * 60 * 1000);
5
6// Get all scheduled dates
7const scheduledDates = posts
8 .filter(p => p.scheduled_timestamp)
9 .map(p => new Date(p.scheduled_timestamp))
10 .sort((a, b) => a - b);
11
12const gaps = [];
13let checkDate = new Date(today);
14checkDate.setHours(0, 0, 0, 0);
15
16while (checkDate < thirtyDaysLater) {
17 const dayEnd = new Date(checkDate);
18 dayEnd.setHours(23, 59, 59);
19
20 const hasPost = scheduledDates.some(
21 d => d >= checkDate && d <= dayEnd
22 );
23
24 if (!hasPost) {
25 gaps.push(checkDate.toLocaleDateString('en-US', {
26 weekday: 'short', month: 'short', day: 'numeric'
27 }));
28 }
29
30 checkDate.setDate(checkDate.getDate() + 1);
31}
32
33return {
34 gap_days: gaps,
35 gap_count: gaps.length,
36 coverage_rate: `${Math.round(((30 - gaps.length) / 30) * 100)}%`,
37 consecutive_gaps: gaps.length > 3
38 ? gaps.slice(0, 3).join(', ') + ' and more...'
39 : gaps.join(', ')
40};

Pro tip: Display the gap analysis results using a Banner component with a warning style when gap_count > 3. Set the Banner's message to 'Schedule gap detected: {{ gapAnalysis.data.consecutive_gaps }}' and mark it visible only when {{ gapAnalysis.data.gap_count > 0 }}. This proactively surfaces posting gaps before they affect your Instagram consistency.

Expected result: The grid preview shows upcoming scheduled posts in a 3-column layout that approximates the Instagram grid appearance. The gap analysis panel identifies days without scheduled content, and the content type distribution chart shows the current content mix breakdown.

Common use cases

Build a content calendar and scheduled post overview

Create a Retool app that shows all Planoly scheduled posts for the next 30 days in a Table with thumbnail image previews, scheduled times, captions, and current status (draft, scheduled, published). Add a calendar view using Retool's Calendar component to visualize post distribution and identify gaps in the publishing schedule.

Retool Prompt

Build a content calendar dashboard that fetches all scheduled media from Planoly's API, displays posts in a Table with an Image column showing thumbnails, caption text, scheduled_time, and status columns, plus a Calendar component showing posting dates for quick schedule visualization with a filter to show only 'scheduled' or 'draft' status items.

Copy this prompt to try it in Retool

Multi-account content approval workflow

Build a Retool content review panel where a social media manager or client can see all draft posts awaiting approval, preview the image and caption, leave an approval note, and mark the post as approved or rejected. This creates a structured approval workflow that doesn't require sharing Planoly account credentials with approvers.

Retool Prompt

Create a content approval panel that queries draft posts from Planoly, shows each post as a card with the full-size image preview, complete caption, and hashtags, with Approve and Reject buttons that update an external tracking database, and a comment field for feedback notes linked to each post's Planoly ID.

Copy this prompt to try it in Retool

Instagram content performance and analytics reporting

Build a performance dashboard that combines Planoly's scheduled post data with published post analytics to show which content types, posting times, and caption styles drive the most engagement. Add a Chart component showing daily follower growth, reach, and engagement rate trends for the past 90 days.

Retool Prompt

Build a content analytics dashboard that queries Planoly's analytics endpoint for published posts, calculates engagement rate per post (likes + comments + saves / reach), groups performance by content type (photo, video, carousel), and shows a bar chart comparing average engagement rate by day of week and time of day to identify optimal posting windows.

Copy this prompt to try it in Retool

Troubleshooting

401 Unauthorized error on all Planoly API requests

Cause: The API token in the resource configuration is incorrect, or the authentication method (Bearer token vs. API key header) doesn't match Planoly's requirements for your account type.

Solution: Verify your API credentials with Planoly support or your Planoly account settings. Try both authentication methods: Bearer Token (Authorization: Bearer {token}) and a custom header (e.g., X-API-Key or api-key). Check Planoly's current API documentation for the exact authentication header name — this can change between API versions. If authentication succeeds in an API testing tool but fails in Retool, confirm the configuration variable value doesn't have extra whitespace.

Post thumbnails display as broken images in the Retool Table

Cause: Planoly's media URLs may require authentication headers to access, or the thumbnail URLs may have expired short-lived signed URLs that were valid when the API was called but expired before the browser renders the images.

Solution: Check whether Planoly's thumbnail URLs are publicly accessible (try opening one in an incognito browser window). If they require authentication, Retool's Table Image column cannot display them directly since it fetches images from the browser without the resource authentication headers. In this case, use the page_url or public CDN URL field if available, or display the URL as a clickable link that opens the image in a new tab instead.

Analytics data is empty or only shows basic post metadata without engagement metrics

Cause: Planoly's analytics data depends on Instagram Insights being connected and synced. Basic API calls may return scheduled post metadata without engagement data if Planoly hasn't synced recent Instagram Insights or if your account plan doesn't include analytics API access.

Solution: Verify in Planoly's web app that your Instagram Business or Creator account is connected with Facebook Business Manager and that Instagram Insights are showing in Planoly's native analytics view. If insights appear in Planoly but not through the API, contact Planoly support to confirm analytics API availability on your plan. As an alternative, query Instagram Graph API's /media endpoint directly using a separate Retool resource for more reliable engagement data.

API returns data for wrong Instagram account or no profile data found

Cause: Planoly manages multiple Instagram profiles per account. Without specifying a profile_id parameter, the API may return data from the first connected profile or no data if a profile selector is required.

Solution: First fetch all connected profiles using the profiles endpoint (typically /v1/profiles or /v1/accounts) to get the list of profile IDs. Add a Dropdown component to your dashboard that lets users select which Instagram account to view, and include the selected profile_id as a URL parameter in all subsequent queries.

typescript
1// URL parameter for profile-specific queries
2// Key: profile_id
3// Value:
4{{ dropdown_profile.value }}

Best practices

  • Store Planoly API credentials as Secret configuration variables in Retool — this prevents other team members from seeing the token values while still allowing them to use the dashboard.
  • Always include a profile_id filter in your queries if you manage multiple Instagram accounts through Planoly — without it, results may be incomplete or mixed across accounts.
  • Cache the profiles list query (getProfiles) with a long TTL (1+ hour) since Instagram account connections rarely change, reducing unnecessary API calls every time the dashboard loads.
  • Sort scheduled posts by scheduled_timestamp ascending in your transformers to display the content queue from nearest to furthest publication date — this is the most useful order for content managers reviewing what's coming up next.
  • Calculate engagement rate as (likes + comments + saves) / reach * 100 rather than followers — reach-based engagement rate is more accurate for content performance comparison than follower-count-based rate.
  • Add a posting gap analysis to surface days with no content scheduled in the next 14-30 days — consistent posting cadence is critical for Instagram algorithm performance and a common oversight for busy content teams.
  • Build the dashboard to be read-only for most team members, with write operations (updating captions, rescheduling posts) restricted to Retool permission groups for social media managers only.
  • Combine Planoly scheduling data with Instagram Graph API data in the same Retool app for a complete picture — Planoly shows what's planned, Instagram API shows actual post performance data.

Alternatives

Frequently asked questions

Does Planoly have a publicly documented API for Retool integration?

Planoly's API availability for third-party integrations varies by subscription plan and may require contacting their support team to enable API access. As of 2026, Planoly does not have a widely published public API documentation portal — API access is typically provided to enterprise customers and integration partners on request. For teams needing reliable Instagram scheduling data, combining Planoly's available API with the Instagram Graph API (which has comprehensive public documentation) provides a more robust integration.

What Instagram data can I access through a Planoly integration in Retool?

Through Planoly's API (if enabled for your account), you can typically access scheduled post queues, draft content, published post metadata, and analytics data synced from Instagram Insights. The exact data available depends on your Planoly plan and what Instagram data Planoly has synced to its own servers. For comprehensive Instagram analytics (impressions, reach, story views, follower demographics), the Instagram Graph API via a separate Retool resource provides more reliable access.

Can I build a content approval workflow using Retool with Planoly?

Yes — the most practical approach is a hybrid workflow where Planoly handles Instagram scheduling and you use Retool as a review interface. Build a Retool app that fetches draft posts from Planoly, displays them for stakeholder review with the full image and caption, and records approval decisions in a separate database table. The approval status from your database can drive notifications or workflow steps outside of Planoly, since writing approval status back to Planoly's API depends on what write endpoints they expose for your account.

How do I display Planoly scheduled posts in a calendar view in Retool?

Retool has a built-in Calendar component that can display events on a monthly or weekly calendar view. Fetch your scheduled posts using the Planoly API query, transform the data to include a start field with the scheduled_timestamp value, then bind the Calendar component's events property to {{ scheduledPostsTransformer.data }}. Set the event title to the post's content type or a truncated caption. Set the event color based on status (blue for scheduled, green for published) using Retool's Calendar event color options.

What should I do if Planoly API access is not available for my account?

If Planoly API access isn't available for your plan, build your Instagram content operations dashboard using the Instagram Graph API directly as your Retool resource. The Instagram Graph API provides access to media, insights, stories, and scheduling capabilities for Instagram Business and Creator accounts. You can track your planned content using a Retool Database table (or connected PostgreSQL) as the scheduling source of truth, and pull actual performance data from Instagram's own API.

RapidDev

Talk to an Expert

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

Book a free consultation

Integrations are where projects stall

We wire Retool integrations like this one every week — auth, webhooks, edge cases included. Fixed-price builds from $13K, delivered in 6–10 weeks.

Talk to an integration engineer

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.