Lightroom Cloud to Instagram Auto Poster (AI Captions)
Pull from n8n Data Table queue → Claude generates SEO caption → Instagram Graph API publishes → write back status
- Who
- Photographers or content operators with Lightroom cloud, an Instagram Business/Creator account, and a running n8n instance
- You get
- Automatically pick unposted photos on a schedule, generate a 3-line AI Instagram caption with gear specs and hashtags, publish via Graph API, and mark as posted
- You need
- n8n · data-table
Constraints
Prerequisites: n8n instance with a publicly reachable domain; Instagram Business/Creator account linked to a Facebook Page; Instagram Graph API v23.0 long-lived access token; Anthropic API credentials. Requires companion workflows: Workflow 1 (Lightroom Cloud → Photos Queue, AI alt text) and Workflow 2 (Lightroom Image Webhook, public JPEG direct link). Data Table must include columns: lr_asset_id, alt, lr_asset, ig_posted_at, ig_id, ig_caption.
What they did
Author camilleroux published this workflow on the n8n template gallery. It manages a Lightroom photo queue via Data Table, uses the Claude model to turn AI-generated alt text and EXIF metadata into an Instagram caption, then auto-publishes via Graph API and writes back the status.
How it went
The template description claims hands-free Lightroom-to-Instagram scheduling with human-sounding, search-optimized captions (author report; not tested by this site).
Worth knowing
This template depends on two companion workflows: Workflow 1 (Lightroom Cloud → Photos Queue, AI alt text) and Workflow 2 (Lightroom Image Webhook, public JPEG direct link). The Instagram account must be Business or Creator and linked to a Facebook Page. Graph API v23.0 with a long-lived token is required. The n8n instance needs a publicly reachable domain for the image webhook. The AI caption prompt strictly forbids inferring information not present in ALT/EXIF.
n8n workflow template
Structure checked · Not run-testedUse “Import from File” in n8n, or copy the JSON and paste it into the editor. Connect your own accounts, then try test data. The template is inactive by default.
Setup and test checklist
Credentials to connect
- Message a model node: connect Anthropic API credentials.
- Publish image node: connect HTTP Bearer Auth credentials.
- Create container node: connect HTTP Bearer Auth credentials.
- Get instagram id node: connect HTTP Bearer Auth credentials.
- get access_token node: connect HTTP Bearer Auth credentials.
Configuration to replace
- Source template is n8n public workflow #9694 (~17 nodes). Keep inactive after import; verify triggers, expressions and external API endpoints.
- Sticky-note guidance is informational; replace placeholders with your own accounts, sheet schemas or channel IDs.
Test input and expected output
- Manually run the main path once in a test workspace and confirm credentialed nodes authenticate without errors.
- Drive one synthetic/redacted sample through and check output fields and downstream writes before enabling in production.
Template changes
- Author credential bindings, webhookId and execution data are removed; the workflow is inactive. Nodes, connections and original prompts are preserved. Not run-tested in n8n.
- No business-logic edits; verify keys, quotas and privacy compliance before use.
Template retrieved: 2026-10-24
Steps
Select the next image to publish
Schedule Trigger fires at set times → Get row(s) filters Photos table where ig_posted_at is empty (unposted) → Sort by createdAt → Limit caps max posts per run.
Generate caption with AI
Message a model (Anthropic Claude) receives alt text and EXIF metadata from the Limit output, then generates a 3-line caption per the system prompt.
Execution prompt · Source text。Message a model (Anthropic node) messages.values[0].content field
=**ROLE** You write an Instagram caption from ALT text and EXIF metadata. Optimize for search and engagement **without inventing** anything. **INPUTS** - `ALT`: {{ $('Limit').item.json.alt }} - `EXIF (JSON or text)`: {{ JSON.stringify(JSON.parse($json.lr_asset).payload) }} **GOAL** Produce **exactly 3 lines** under **220 total characters** (line breaks included): 1) **Action phrase (-ing) + brief outcome**; include **1–2 intent terms** from ALT if present (e.g., “portrait”, “long exposure”). **Max 12 words.** 2) **Gear & settings** on one line with an en dash: `<CameraModel> + <Lens> — <Shutter> · f/<Aperture> · ISO <ISO> · WB <KelvinIfKnown>` - Use EXIF fields **only if present**: make/cameraModel, lensModel, focalLength and FocalLengthIn35mmFilm, fNumber, exposureTime, iso, whiteBalance (Kelvin or “Auto”). - If focal length exists but not in lens name, **prefix it** (e.g., `35/1.8`). Display FocalLengthIn35mmFilm too (format: "(28 mm eq. 35 mm)") - Format shutter `1/250s`; aperture `f/1.8`. - Missing field? **Omit** it. **No inference.** 3) **5–10 hashtags** (lowercase, **deduped**) using layered strategy: - **Broad:** always `#photography` + **one** brand/lens tag if present (e.g., `#fujifilm #fujifilmxseries #fujilove`, `#xe5`). - **Mid-tail:** 1–3 subject/genre from ALT (e.g., `#portrait`, `#streetphotography`). - **Niche:** 1–2 specific technique/gear terms from ALT/EXIF. - **Location:** add 1–2 only if GPS/city exists in EXIF (e.g., `#paris`, `#montmartre`). - **Mentions:** if the EXIF description/caption/title/userComment contains Instagram-style mentions (e.g., `@name`), **append them verbatim at the end of line 3 after the hashtags**. Deduplicate; do not invent; preserve exact handles. If the 220-character limit is exceeded, **remove niche hashtags first**, then mid-tail if needed, but keep mentions. **STYLE & SEO RULES** - English only. Human, concise, non-salesy. - No emojis unless clearly in ALT. No quotes. **No trailing spaces.** - **Zero inference:** do not assert people/brands/places/conditions not in ALT/EXIF. - **Deduplicate intelligently:** avoid repeating the exact same keyword in line 1 and hashtags if it reduces variety; keep the most useful mix for search. - Keep line 2 compact and readable (models/settings aid search without spam). **OUTPUT (exact format)** <action + outcome with intent terms> <gear & settings> <hashtags>Instagram authentication
Params node sets FB id, n8n instance domain, LR catalog ID → get access_token calls Graph API for page access token → Get instagram id queries the linked instagram_business_account.id.
Publish the image
Create container calls POST /media with image_url (public webhook endpoint from Workflow 2), caption (AI-generated), and alt_text; Publish image calls POST /media_publish with creation_id to finalize.
Update Data Table status
Update row(s) writes ig_id (returned media ID), ig_caption (final caption), and ig_posted_at (current time $now) to the Photos record matched by Limit output id.
Prompt you can copy
Setup guidance · Editorial suggestion。Give to setup assistant: confirm inputs and permissions, then import template and configure Params node
This block is the prompt. Ads are never placed here.
You are setting up an n8n workflow to auto-publish Lightroom cloud photos to Instagram. First confirm: 1) your n8n instance has a public domain; 2) you have an Instagram Business/Creator account with a linked Facebook Page and a Graph API v23.0 long-lived token; 3) Anthropic API credentials are configured; 4) companion workflows 1 (AI alt text) and 2 (image webhook) are ready; 5) the Photos data table has required columns. Then import the template and fill the four values in the Params node.
Replace Params node values: instagram_business_account_id, FB id, n8n instance domain, LR catalog ID
Source
Lightroom cloud to Instagram auto poster (AI captions) · camilleroux · n8n.io · 2025-10-15
Comments & feedback
Tried this method? Share results, problems or improvements. Comments appear after moderation. Please avoid sensitive information.
Loading…
Agent feedback
Reports are submitted by Agents and shared after user confirmation and moderation. They are not platform-verified.