bulkpublish.com logo
bulkpublish.com

adjust-copy-for-platforms

Installation

Adds this website's skill for your agents

 

Summary

Take one piece of source copy and produce platform-tailored variants (length, truncation-safe lead, hashtags, line breaks) for Facebook, Instagram, X, TikTok, YouTube, Threads, Bluesky, Pinterest, LinkedIn, Google Business, and Mastodon — then publish through BulkPublish's Multi-Platform Composer.

FIG. 01
FIG. 02
FIG. 03
FIG. 04
FIG. 05
FIG. 06
FIG. 07

Replay unavailable for this skill yet.

SKILL.md
226 lines

Adjust Copy For Platforms And Publish With BulkPublish

Purpose

Take a single piece of source copy and produce platform-tailored variants (length, truncation-safe lead, hashtag handling, line breaks) for every social network BulkPublish supports — Facebook, Instagram, X (Twitter), TikTok, YouTube, Threads, Bluesky, Pinterest, LinkedIn, Google Business Profile, and Mastodon — then publish or schedule them through BulkPublish's Multi-Platform Composer at app.bulkpublish.com. The skill has two distinct surfaces:

  1. Public, no-auth surface at app.bulkpublish.com/tools/* — caption length checker + per-platform character counters. Use these to prepare the platform-specific variants. Anyone can use these without an account.
  2. Authenticated app at app.bulkpublish.com (Multi-Platform Composer) — required to actually publish. The composer keeps per-platform copy variants and pushes them to each connected channel in one click.

This skill is read+write on the user's own BulkPublish account; it does not publish to third-party social platforms directly — BulkPublish does, on the user's behalf, using channels the user has previously connected via OAuth.

When to Use

  • A marketer hands you one long-form announcement and wants 11 platform-tailored variants ready to schedule.
  • A creator wants the same post to land on Instagram (caption 2,200), X (post 280), and LinkedIn (post 3,000) without manually trimming for each.
  • An agent that already drafts copy needs to validate per-platform character limits and "See more" truncation points before publishing.
  • Bulk-scheduling a campaign of multiple posts where each post needs minor per-platform adjustments (e.g., link-in-bio for Instagram vs. inline URL for X).
  • Re-purposing a long-form blog excerpt as a Mastodon toot (500), Bluesky post (300), Threads post (500), and X post (280) with the first sentence guaranteed visible before truncation.

Workflow

Recommended method is hybrid: prepare with the free tools (no auth, no anti-bot), then publish with the authenticated Multi-Platform Composer. Most of the platform-adaptation work is determinate text manipulation and can be done client-side once you know the limits — BulkPublish's free tools just confirm the math. The only step that requires BulkPublish is the actual cross-platform publishing/scheduling.

Step 1 — Adjust copy per platform (no-auth)

Open https://app.bulkpublish.com/tools/caption-length-checker-online-free and paste the source copy into the textarea (a11y ref textbox: Paste your caption text here...). The page renders a live per-platform preview showing exactly where each network truncates with "See more" / "...more" / "Show more" and flags any platform where the post would be over-limit. No login, no API key, no anti-bot.

Use the following table to budget the visible (above-the-fold) portion of each variant. The first column is the hard post limit — exceed it and the post fails to publish; the second is the truncation point — text past it is hidden behind a "See more" affordance in-feed.

PlatformHard post limitTruncated atTruncation marker
X (Twitter) — standard280— (full visible)n/a — over-limit posts fail
X (Twitter) — Premium25,000n/a
Bluesky300— (full visible)n/a — over-limit posts fail
Threads500— (full visible)n/a
Mastodon500— (full visible)n/a (instance-dependent, default 500)
Pinterest (pin description)500n/a
Google Business1,500n/a
Instagram (caption)2,200125...more
TikTok (caption)2,200150more
LinkedIn (post)3,000140...see more
YouTube (description)5,000100Show more (also title hard cap 100)
Facebook (post)63,206477See more

Practical adaptation rules — apply in this order:

  1. Lead with the hook in the first ~100 characters. YouTube cuts off the description at 100, Instagram at 125, LinkedIn at 140, TikTok at 150 — your first sentence must work as a standalone teaser across all four.
  2. Generate the X/Bluesky variant first (280/300 hard cap). If you can land the message in 280 chars, every other platform fits trivially. Strip URLs to a shortener if needed; drop hashtags to ≤2.
  3. Cross-platform hashtag handling: Instagram allows up to 30 hashtags per post; X/Bluesky punish more than 2; LinkedIn convention is 3–5. Move hashtags to the bottom for Instagram (after a couple of blank lines) so they don't pollute the truncated preview; inline for X/Threads.
  4. Line breaks — Instagram, Facebook, X, TikTok, YouTube, Threads, Bluesky, LinkedIn, Pinterest, Google Business, and Mastodon all eat raw double-newlines in their composers and collapse them. Use the per-platform line-breaker tools at app.bulkpublish.com/tools/{platform}-line-breaker-free to inject the right invisible character if line preservation matters; the composer accepts paste-through.
  5. YouTube has two limits, not one — title 100, description 5,000. The skill is for descriptions/captions; if the source content is a video, copy adjustment must split into title-line + description-body.
  6. Pinterest needs a title (100 chars) separate from the pin description (500). Both fields are exposed in the composer.
  7. URLs — X, Bluesky, Threads, and Mastodon count the entire URL toward the character limit (no t.co-style auto-shortening on X anymore). Use a shortener (bit.ly, ow.ly) before pasting into the composer for short-limit platforms.

For platforms with multiple text fields (Facebook ad headline 40 / ad description 125, X bio 160 / DM 10,000, Pinterest pin title 100 / board name 50, YouTube title 100 / description 5,000, LinkedIn headline 220 / comment 1,250), use the per-platform character counter at app.bulkpublish.com/tools/{platform}-character-counter-free to validate each field individually before pasting into the composer.

Step 2 — Publish with the Multi-Platform Composer (auth required)

The composer lives inside app.bulkpublish.com after login. The user must already have a BulkPublish account and at least one channel per target platform connected (one-time OAuth setup, outside this skill's scope).

  1. Navigate to https://app.bulkpublish.com/login. Fill textbox: Email and textbox: Password; click button: Sign In. Google SSO is available at button: Sign in with Google — defer to whichever auth method the user has configured.
  2. The composer entry point is the dashboard's "New post" / "Compose" CTA. From there:
    • Select channels: one channel per target platform, multi-select.
    • Paste base copy: this is what gets sent to platforms whose variant box you leave blank.
    • Toggle per-platform overrides for any platform that needs the variant you prepared in Step 1. The composer exposes a side-by-side editor with the platform's character count and a live preview card.
    • Attach media (image/video) — uploaded to BulkPublish's media library first (Free plan: 100 MB cap; Pro: 2 GB; Business: 10 GB).
    • Schedule or publish now. Free plan caps scheduled posts at 1; Pro 30/day; Business 50/day. Free plan also caps posting at 3 posts/day total across all platforms.
  3. Confirm. BulkPublish enqueues per-channel publishes; the dashboard shows per-platform status (queued / publishing / posted / failed) within ~60s for most networks.

Plan gotcha — X requires Pro

The Free tier ($0) supports all platforms except X (Twitter). To publish to X via BulkPublish, the user must be on Pro ($13.99/mo) or Business ($39.99/mo). If the user is on Free and the target set includes X, BulkPublish will surface a checkout-required modal at the publish step.

Browser fallback for the composer

If automating the composer end-to-end, drive app.bulkpublish.com with a logged-in Browserbase session (the site has no aggressive anti-bot — bare --verified proxies are unnecessary on free tools; the authenticated app behaves like a normal SaaS dashboard). Persist a Browserbase context after first login to skip re-auth in subsequent runs.

Site-Specific Gotchas

  • Two surfaces, not one. bulkpublish.com is the marketing site (Astro, static, noindex,nofollow, ETag-cacheable). app.bulkpublish.com is the actual app (Astro + Sentry instrumented, X-Frame-Options: DENY, Strict-Transport-Security, Referrer-Policy: strict-origin-when-cross-origin). The free tools live on the app subdomain (app.bulkpublish.com/tools/...), not the marketing subdomain — naïve URL guessing puts you on 404s.
  • All free tools are public, no auth, no rate limit observed. Caption length checker, character counters, line breakers, image-size checkers, thread makers, grid maker, carousel splitter, feed planner, UTM builder, engagement calculator, aspect ratio calculator, follower growth calculator, CPM/CPC calculator, hashtag counter — all reachable cookieless. Use them as deterministic helpers; don't try to script the full app for prep work.
  • The Caption Length Checker is the canonical "adjust for platforms" surface. It shows seven platforms (Instagram, Facebook, LinkedIn, X, TikTok, Threads, YouTube) side-by-side with live truncation marks. The full eleven-platform set is not on this page — for Bluesky/Pinterest/Google Business/Mastodon, fall through to the per-platform character counter pages.
  • Per-platform character counters expose secondary limits. E.g., the X counter shows post 280, Premium post 25,000, bio 160, DM 10,000 — not just the headline number. When the user's copy needs to land in a non-primary field (bio rewrite, ad headline), don't trust the "primary limit" label alone; read the secondary-limit grid on the same page.
  • "Multi-Platform Composer" requires auth and a connected channel per platform. The marketing page lists "Multi-Platform Composer" as a top feature but there is no anonymous demo — the composer URL redirects to /login. Bring credentials or expect to surface a "log in to continue" wall.
  • Free plan blocks X publishing. All other platforms work on Free; X is paywalled to Pro/Business. The composer doesn't gray out X — it lets you select the channel and only blocks at the publish-button step with a checkout modal.
  • Free plan post-volume caps are aggressive: 3 posts/day total, 1 scheduled post in the queue. For agentic bulk workflows assume Pro tier minimum.
  • Login page has Google SSO + email/password. Refs after a fresh load: email textbox: Email, password textbox: Password, button: Sign In, button: Sign in with Google. No reCAPTCHA observed at the login step. Persist a Browserbase context to skip re-auth.
  • Site is Sentry-instrumented. Every app page injects meta name="sentry-trace" — agent runs may surface in the operator's Sentry dashboard. Identify your runs with a stable user-agent or session label if the operator cares.
  • Line breaks are eaten by composer paste-through. When pasting copy that uses double-newline paragraph breaks, BulkPublish's composer (like Instagram and several others) collapses them on publish. Run the platform-specific line-breaker tool at /tools/{platform}-line-breaker-free first if line preservation matters; it injects an invisible character (zero-width space variants) that the receiving platform respects.
  • No public API for "adjust copy for X platform" as a single endpoint. BulkPublish offers API access (Pro: 5 keys, Business: 10), but the docs are gated behind login and the free-tools surface does not expose a JSON API — they are HTML+JS-rendered text pages. Don't waste time hunting for /api/v1/adjust — the deterministic adjustment is a client-side text operation parameterized by the limits table above.
  • Title at YouTube and Pinterest is a separate field from body copy. The skill must produce a {title, body} tuple for those two platforms, not a single string. Other platforms take a single text field.

Expected Output

The skill output is a per-platform variant set plus a publish-status report. Two distinct shapes depending on whether the user wanted "just adjust" (no publish) or "adjust and publish":

// Shape A — adjust only (no auth, no publish)
{
  "success": true,
  "source_copy": "Big news this week — we are launching ...",
  "source_length": 486,
  "variants": {
    "x_twitter": {
      "text": "Big news: BulkPublish now lets you compose once + post everywhere. Try it free → bit.ly/abc",
      "length": 91,
      "limit": 280,
      "over_limit": false,
      "first_125_visible": "Big news: BulkPublish now lets you compose once + post everywhere. Try it free → bit.ly/abc"
    },
    "instagram": {
      "text": "Big news this week — we are launching ... \n\n#socialmedia #marketing",
      "length": 510,
      "limit": 2200,
      "truncated_at": 125,
      "hook_within_125": true
    },
    "linkedin":  { "text": "...", "length": 612, "limit": 3000, "truncated_at": 140, "hook_within_140": true },
    "facebook":  { "text": "...", "length": 486, "limit": 63206, "truncated_at": 477, "hook_within_477": true },
    "tiktok":    { "text": "...", "length": 198, "limit": 2200, "truncated_at": 150 },
    "youtube":   { "title": "Compose Once, Publish Everywhere", "title_length": 33, "title_limit": 100,
                   "description": "...", "description_length": 486, "description_limit": 5000 },
    "threads":   { "text": "...", "length": 312, "limit": 500 },
    "bluesky":   { "text": "...", "length": 287, "limit": 300, "over_limit": false },
    "pinterest": { "title": "Bulk publish across 11 platforms", "title_length": 32, "title_limit": 100,
                   "description": "...", "description_length": 312, "description_limit": 500 },
    "google_business": { "text": "...", "length": 612, "limit": 1500 },
    "mastodon":  { "text": "...", "length": 312, "limit": 500 }
  }
}

// Shape B — adjust + publish (requires authenticated session)
{
  "success": true,
  "published": true,
  "scheduled_at": null,
  "post_ids": {
    "facebook": "fb_8e3a...",
    "instagram": "ig_22b1...",
    "x_twitter": "x_7f01...",
    "linkedin": "li_5d92...",
    "tiktok": null,
    "youtube": null,
    "threads": "th_b045...",
    "bluesky": "bs_1a2c...",
    "pinterest": "pi_9e88...",
    "google_business": "gbp_44...",
    "mastodon": "ma_3f12..."
  },
  "channel_results": [
    {"platform": "x_twitter", "status": "posted", "url": "https://x.com/user/status/...", "at": "2026-05-19T22:39:47Z"},
    {"platform": "tiktok",    "status": "skipped", "reason": "no_channel_connected"},
    {"platform": "youtube",   "status": "failed",  "reason": "video_required_for_youtube"}
  ],
  "warnings": [
    "X channel requires Pro plan — upgraded at checkout",
    "Instagram caption truncated at 125 in feed preview"
  ]
}

// Shape C — auth blocker (publish attempt without login)
{
  "success": false,
  "reason": "auth_required",
  "next_action": "navigate_to_login",
  "prepared_variants": { "...same shape as Shape A.variants..." }
}

// Shape D — plan blocker (X selected on Free)
{
  "success": false,
  "reason": "plan_upgrade_required",
  "blocked_platforms": ["x_twitter"],
  "current_plan": "free",
  "required_plan": "pro",
  "checkout_url": "https://app.bulkpublish.com/checkout/pro-monthly",
  "prepared_variants": { "..." }
}