Social media automation with n8n and Aether
Connect n8n to the Aether API and build no-code social media workflows: RSS feed to posts, cron-scheduled publishing, webhook-triggered Slack alerts, auto-reply to DMs, and analytics logging to Google Sheets.
- • n8n — n8n Cloud or self-hosted (Docker recommended)
- • An Aether account with at least one connected social profile
- • Your Aether API key from the dashboard
Workflows covered in this guide
Step 1 — Add Aether credentials to n8n
In n8n, go to Credentials → New → HTTP Header Auth. Set the header name to Authorization and the value to Bearer YOUR_AETHER_API_KEY. Save as "Aether API".
{
"name": "Aether API",
"type": "httpHeaderAuth",
"data": {
"name": "Authorization",
"value": "Bearer YOUR_AETHER_API_KEY"
}
}Select this credential in every HTTP Request node that calls Aether — you won't need to re-enter the key.
Workflow 1 — RSS feed to social posts
This workflow polls an RSS feed, formats each item as a social caption, and posts it to all connected platforms.
Nodes: RSS Feed Trigger → Function → HTTP Request (POST /v1/posts)
In the Function node, transform the RSS item into post text. This example truncates to Instagram's 2,200-character limit:
// Function node — "Format RSS item as social post"
// Input: RSS item from n8n RSS Feed Trigger
const item = $input.first().json;
const title = item.title ?? "";
const link = item.link ?? "";
const summary = item.contentSnippet ?? item.description ?? "";
// Truncate to fit Instagram's 2,200 char limit
const maxLen = 2200 - link.length - 4; // 4 = " — " + newline
const excerpt = summary.length > maxLen
? summary.slice(0, maxLen - 3) + "..."
: summary;
return [{
json: {
postText: `${title}\n\n${excerpt}\n\n${link}`,
sourceTitle: title,
sourceLink: link,
}
}];In the HTTP Request node, POST to https://api.aetherhq.dev/v1/posts using the output from the Function node:
// HTTP Request node — "Post to Social Media"
// Method: POST
// URL: https://api.aetherhq.dev/v1/posts
// Authentication: Aether API (Header Auth)
// Body (JSON):
{
"text": "{{ $json.postText }}",
"profileIds": ["ig_abc123", "li_comp789", "th_user456"],
"scheduledFor": "{{ $json.scheduledFor }}"
}Workflow 2 — Cron-scheduled posts
Fire at a fixed schedule with a cron trigger and publish static or dynamically assembled post content:
// Schedule Trigger — "Daily 9am UTC"
// Trigger rule: Cron — 0 9 * * * (every day at 09:00 UTC)
// Set node — "Build post content"
// postText: "Good morning — here's today's update from the team."
// profileIds: ["ig_abc123", "li_comp789"]
// HTTP Request node — POST https://api.aetherhq.dev/v1/posts
// Body:
{
"text": "{{ $json.postText }}",
"profileIds": {{ $json.profileIds }}
}Workflow 3 — Aether webhooks in n8n
Add a Webhook Trigger node to n8n. n8n gives you a public URL (e.g. https://your-n8n.app/webhook/abc123). Register that URL with Aether once, then route incoming events with a Switch node:
// Webhook Trigger node — n8n provides a URL like:
// https://your-n8n.app/webhook/abc123
// Register it with Aether once (run manually or via API):
// POST https://api.aetherhq.dev/v1/webhooks
// { "url": "https://your-n8n.app/webhook/abc123",
// "events": ["post.published", "post.failed", "message.created"] }
// Switch node — route by event type
// Route 1: event === "post.published" → Slack message "Post live on {{ $json.data.platform }}"
// Route 2: event === "post.failed" → Slack message "⚠ Post failed: {{ $json.data.error.message }}"
// Route 3: event === "message.created" → HTTP Request to reply (see below)x-aether-signature header before processing the event. See the webhook guide for HMAC verification code.Workflow 4 — Auto-reply to DMs
Extend the webhook workflow: when a message.created event fires, add an IF node to filter conditions and an HTTP Request node to reply:
// Auto-reply to incoming DMs — HTTP Request node
// Method: POST
// URL: https://api.aetherhq.dev/v1/inbox/{{ $json.data.messageId }}/reply
// Body:
{
"text": "Thanks for reaching out! Our team will get back to you within 24 hours."
}
// Add an IF node before this to only reply when:
// $json.data.platform === "instagram"
// AND $json.data.direction === "inbound"
// AND $json.data.text does not contain "unsubscribe"Workflow 5 — Weekly analytics to Google Sheets
Schedule a weekly run that pulls account metrics and appends them to a Google Sheet for stakeholder reporting:
// Pull weekly analytics — HTTP Request node
// Method: GET
// URL: https://api.aetherhq.dev/v1/analytics/account
// Query params:
// from: {{ $now.minus({ days: 7 }).toISO() }}
// to: {{ $now.toISO() }}
// granularity: day
// Downstream: Google Sheets node to log the data
// Or: Slack message summarising the week's top metricsPer-platform overrides in n8n
Use n8n expressions ({{ $json.fieldName }}) to pull different copy per platform from upstream Set or Function nodes:
// HTTP Request node — post with per-platform overrides
// Method: POST
// URL: https://api.aetherhq.dev/v1/posts
// Body (JSON):
{
"text": "Default caption for any platform not overridden.",
"profileIds": ["ig_abc123", "li_comp789", "tt_xyz789"],
"overrides": {
"ig_abc123": {
"text": "{{ $json.instagramText }}"
},
"li_comp789": {
"text": "{{ $json.linkedinText }}"
},
"tt_xyz789": {
"text": "{{ $json.tiktokText }}"
}
}
}- →Use the 'Continue on Fail' option on HTTP Request nodes so one failed post doesn't stop the whole workflow.
- →Add a 'Wait' node between multiple post requests to respect platform rate limits when posting in bulk.
- →Store the webhook.secret in n8n's environment variables — don't hardcode it in workflow nodes.
- →Use n8n's Error Trigger to catch workflow failures and send a Slack alert.
- →The Aether API returns structured errors — check $json.error.code in a downstream IF node to handle specific failure cases.
Get your API key and start automating
Free tier: 3 connected accounts, all API endpoints, webhooks — no credit card.