Automate Social Media with Make: From Content Data to Scheduled Posts
Make.com social media automation with two HTTP modules: import an image, schedule Instagram and LinkedIn posts via bundle.social and log results in Sheets.
Make.com social media automation for publishing comes down to two HTTP modules: one imports the image into bundle.social with POST /api/v1/upload/from-url, and one schedules the post with POST /api/v1/post/. A Google Sheets row supplies the caption, image URL and publish time, and a second scenario writes the published result back to the same row.
bundle.social's native Make app is in progress with no release date, so this tutorial uses Make's HTTP module, which reaches every endpoint of the public API and keeps working after the app ships. The example publishes one JPEG to Instagram and LinkedIn. For a text-only LinkedIn version with fewer modules, start from the Google Sheets to LinkedIn recipe; for an importable blueprint, the public examples repository has one that posts a two-image TikTok carousel.
Build the Make.com social media automation scenario
The publishing scenario has five modules and one filter:
| Module | Job |
|---|---|
| Google Sheets: Search Rows | Find rows with Status set to Ready. |
| Filter | Continue only if PostID is empty. |
| Google Sheets: Update a Row | Set the row to Submitting. |
| HTTP: Make a request | Import the image URL into bundle.social. |
| HTTP: Make a request | Create the scheduled post with the upload ID. |
| Google Sheets: Update a Row | Save the post ID and set the row to Queued. |
Schedule it so one run finishes before the next starts. The Submitting status keeps later runs away from the row, and the reference key in the post body stops two overlapping runs from creating a second post.
Before you start
- A bundle.social API key from Organization > API Keys. The Free plan includes API access and 20 posts a month, and drafts do not count toward that quota.
- A team with an Instagram business or creator account and a LinkedIn profile or page connected. A team holds one account per platform.
- The team ID: run one HTTP module with
GET https://api.bundle.social/api/v1/team/and thex-api-keyheader, then copy your team'sid. - A Make account on any plan.
Prepare the content queue
Create the columns RowID, TeamID, Title, Caption, MediaURL, PublishAt, Status, PostID and LastError. Give every row a unique RowID that never changes, because it becomes part of the post's reference key.
Use Draft while writing and Ready once the post is approved. Write PublishAt as an ISO 8601 timestamp with an offset, such as 2026-12-01T10:00:00+01:00. MediaURL must be a direct file link that bundle.social can download without signing in, not an editor or preview page. If the picture still needs cropping to an Instagram or LinkedIn size, the social media image resizer does it in the browser before you host the file.
Import the image
Add HTTP > Make a request with these settings:
- Method
POSTand URLhttps://api.bundle.social/api/v1/upload/from-url. - A header named
x-api-keywith your API key. - Body content type
application/JSONand body input method Data structure. - Parse response set to Yes, so later modules can map the output.
Map the row into the body:
{ "teamId": "YOUR_TEAM_ID", "url": "https://example.com/replace-with-your-image.jpg" }
The response is the upload object; map its id into the next module. According to Make's HTTP app documentation, the Data structure input escapes JSON reserved characters in mapped values automatically, which keeps captions with quotation marks or line breaks valid.
Create the scheduled post
Add a second HTTP > Make a request with method POST, URL https://api.bundle.social/api/v1/post/, the same header and the same body settings. Map the row and the upload ID into this structure:
{ "teamId": "YOUR_TEAM_ID", "title": "Product update", "referenceKey": "make:YOUR_ROW_ID", "postDate": "2026-12-01T09:00:00Z", "status": "SCHEDULED", "socialAccountTypes": ["INSTAGRAM", "LINKEDIN"], "data": { "INSTAGRAM": { "type": "POST", "text": "Our latest product update.", "uploadIds": ["YOUR_UPLOAD_ID"] }, "LINKEDIN": { "text": "Our latest product update.", "uploadIds": ["YOUR_UPLOAD_ID"] } } }
Each platform in socialAccountTypes needs its own entry under data, so Instagram and LinkedIn can carry different captions. uploadIds is an array even for one image. Instagram's type: "POST" makes a feed post (REEL and STORY are the other values), and its captions can be up to 2,200 characters.
For the first test, set status to DRAFT and check the draft in the bundle.social dashboard. Then use a fresh row with SCHEDULED, because the draft already holds its make:{RowID} key. The response returns the post with its id and status; the last module writes id to PostID and sets Status to Queued.
The Free plan's 20 posts a month are enough to test both scenarios end to end.
bundle.social
Schedule posts from a Make scenario with two HTTP modules and one API key.
Call the bundle.social API from the HTTP module today; a native Make app is on the way.
Confirm the result in a second scenario

A 200 response only means bundle.social accepted the post. To find out whether Instagram and LinkedIn published it, run a second scenario every few hours:
- Google Sheets > Search Rows for rows with
Statusset toQueued. - HTTP > Make a request with
GET https://api.bundle.social/api/v1/post/{PostID}. - A router that sends each result to Google Sheets > Update a Row.
| Status | What to write to the row |
|---|---|
SCHEDULED, PROCESSING, RETRYING | Leave Queued; the next run checks again. |
POSTED | Posted, plus externalData.INSTAGRAM.permalink and externalData.LINKEDIN.permalink. |
ERROR | Failed, plus the per-platform message from errorsVerbose in LastError. |
With your own backend, the post.published webhook replaces this polling: bundle.social sends it when a post reaches POSTED or ERROR, signed in the x-signature header. The webhooks API page covers the setup.
Recover errors without duplicating a campaign
referenceKey is unique within your organization. A second create with a key that already exists returns HTTP 409 with the message "A post with this referenceKey already exists in this organization", and no second post is created. So a rerun after Make loses a response is safe: either the first request never landed and the rerun creates the post, or it did and the rerun gets a 409.
To handle the 409 in the scenario, open Advanced settings on the create module, set Return error if HTTP request fails to No, and add a router:
- Status 200: save
idas before. - Status 409: call
GET https://api.bundle.social/api/v1/post/reference-key/make:{RowID}and save theidit returns. - Any other status: write the message to
LastError. A 400 response names each invalid field, for exampledata.LINKEDIN.text: Required.
For a post that reached ERROR, fix the cause shown in errorsVerbose, such as an expired connection or rejected media, and call POST https://api.bundle.social/api/v1/post/{id}/retry instead of creating a new post.

What it costs in Make operations
Make bills in credits. For standard apps such as Google Sheets and HTTP, one operation (a single module run) costs one credit (as of November 2026). A search module uses one operation per run even when it finds nothing, and every module after it runs once per row it receives.
| Module runs | Credits |
|---|---|
| Publisher: Search Rows | 1 per run |
| Publisher: Update a Row, two HTTP requests, Update a Row | 4 per post |
| Checker: Search Rows | 1 per run |
| Checker: HTTP request and Update a Row | 2 per post, per check |
| 409 recovery, only when it happens | 1 extra |
A post that is already published at its first check costs 6 credits. The scheduled searches often cost more than the posts: two scenarios running every hour spend 1,440 credits a month on Search Rows alone. With 100 posts a month and both scenarios running every 4 hours, the total is about 960 credits (360 for searches, 600 for posts), just inside the 1,000 monthly credits of Make's Free plan. On the bundle.social side, a post counts once against the monthly quota whether it goes to one platform or both.
Make, Zapier or n8n for this workflow
The three tools connect to bundle.social in different ways and bill in different units (as of November 2026). The integrations overview shows how each one connects today.
| Make | Zapier | n8n | |
|---|---|---|---|
| bundle.social connection | HTTP module; native app in progress | bundle.social app (beta): upload and post actions, published and failed triggers | Community node on self-hosted n8n; HTTP Request node on n8n Cloud |
| Billing unit | 1 credit per module run | 1 task per successful action; triggers do not count | n8n Cloud: 1 execution per workflow run, whatever the step count |
The Zapier tutorial builds this queue with the bundle.social app, and the n8n guide does it with HTTP Request nodes, which work on n8n Cloud too. On self-hosted n8n you can import the Google Sheets to Instagram, Facebook and LinkedIn template, which uses the community node to schedule each new row for the date written in it. When approvals start in a CMS or CRM, the marketing automation API guide moves the pattern into your own service.
The Make integration page has the module settings, and the media upload API and scheduling API pages list the fields for the other platforms.
Frequently asked questions
Is there a bundle.social app for Make?
Not yet. The native Make app is in progress and has no release date. Until it ships, the HTTP module covers the whole bundle.social API with an API key in the x-api-key header. Scenarios built on HTTP modules keep working after the app is released, because the app will call the same API.
How many Make credits does one scheduled post use?
Six in this tutorial: four module runs in the publishing scenario (update the row, import the image, create the post, save the ID) and two in the checker (read the post, update the row). Each scheduled run also costs one credit for its Search Rows module, even when no row is ready.
What happens if the scenario sends the same row twice?
The second create request returns HTTP 409, because make:{RowID} is already used as a reference key in your organization, so no duplicate post is created. Route the 409 to GET /api/v1/post/reference-key/make:{RowID}, which returns the existing post, and save its id to the row as usual.
Can I post videos or Reels from Make?
Yes. The same upload/from-url call accepts a public video URL and returns an upload ID. Set Instagram's type to REEL instead of POST and map the upload into uploadIds. Videos take longer to process, so expect PROCESSING on the first checks and keep the checker running until the post reaches POSTED or ERROR.
Which bundle.social plan do I need for Make automation?
The Free plan covers this tutorial: API access, 20 posts a month and 3 teams, and drafts do not count toward the quota. Pro costs $100 a month, or $90 billed yearly, and raises the limit to 10,000 posts a month with unlimited teams and analytics. Your Make plan is billed separately.