Category: Social Media

  • Sponsored content disclosure placement: where platforms require it

    Sponsored content disclosure placement: where platforms require it

    Sponsored content disclosure placement: where platforms require it
    Photo by Szabo Viktor on Unsplash

    If you run sponsored posts, you already know you need to disclose the relationship. What most operators don’t realize is that each platform has its own technical requirements for where that disclosure appears—and some of them override what you write.

    Instagram and Facebook: the built-in toggle wins

    Meta’s platforms require you to use the “Paid partnership with” label when posting branded content through a business or creator account. You enable it in the advanced settings before publishing.

    If you add #ad or #sponsored in the caption, that’s fine—but it doesn’t replace the toggle. Meta’s terms treat the built-in label as the compliant disclosure. The hashtag is supplementary.

    The label appears at the top of the post, above the image and caption. It’s styled in Meta’s UI and can’t be customized. If you’re working with a brand that wants specific language, send them Meta’s official branded content guidelines—they’re locked into this format.

    YouTube: the first five seconds, or the description box

    YouTube’s policy requires disclosure “in the video itself” or “in the description.” If you choose the description route, it needs to appear above the fold—before the “Show more” link.

    For video content, the safest approach is a verbal mention in the first five seconds, paired with on-screen text that stays visible for at least three seconds. The FTC has cited creators for burying disclosures at the end of a video or in collapsed description text.

    YouTube also has a “Includes paid promotion” checkbox in the upload flow. Checking it adds a small disclaimer to the lower-left corner of the video player. That checkbox is required for certain ad categories (political, prescription drugs), but for standard sponsorships, it’s considered supplementary—not a replacement for in-video or description disclosure.

    TikTok: the branded content toggle is mandatory

    TikTok requires the “Branded Content” toggle for any post that promotes a third-party product or service. You’ll find it in the post settings under “Advanced settings” → “Content disclosure.”

    Enabling it adds a “Paid partnership” label to the top of the video. Like Meta, TikTok treats this as the primary disclosure mechanism. Adding #ad in the caption is recommended but not sufficient on its own.

    One catch: TikTok’s branded content toggle is only available to accounts in the Creator Marketplace or those that meet specific eligibility thresholds (10,000+ followers and 100,000+ video views in the last 30 days as of mid-2026). If you don’t have access yet, you’re stuck with caption-based disclosure—and the platform may limit your reach or remove the post if it’s flagged as undisclosed advertising.

    LinkedIn: text-based disclosure still rules

    LinkedIn doesn’t have a built-in sponsored-content label for individual posts (its “Sponsored Content” product is for paid ads run through Campaign Manager, not organic posts).

    For organic posts that include a paid partnership, you need to disclose it in the text itself. The FTC’s guidance applies: the disclosure should appear before the call to action and be clear without requiring users to click “see more.”

    Common phrasing: “Sponsored by [Brand],” “Paid partnership with [Brand],” or “This post is sponsored by [Brand].” Put it in the first two lines of the post. Burying it after three paragraphs or in a comment doesn’t meet the standard.

    What the FTC actually enforces

    Platform-specific tools help, but the FTC’s core rule is simple: disclosures must be “clear and conspicuous.” That means:

    • Visible without scrolling, clicking, or hovering
    • In plain language—no ambiguous hashtags like #partner or #collab
    • Close to the claim being made, not buried at the end

    In practice, the FTC has gone after creators and brands for disclosures that appeared only in collapsed text, in light-colored fonts against light backgrounds, or in strings of hashtags where #ad was the eighth tag.

    If a platform’s built-in tool exists and you don’t use it, that’s a red flag during an audit. If you use it and add text disclosure, you’re in the clear.

    One disclosure format that works everywhere

    If you’re cross-posting the same sponsored content to multiple platforms, lead with a text-based disclosure in the first sentence and enable any platform-specific toggles where available.

    Example: “Sponsored by [Brand]. Here’s why I’ve been using [product]…”

    That satisfies LinkedIn and Twitter (which has no built-in tool). Then layer on Meta’s partnership toggle, TikTok’s branded content flag, and YouTube’s in-video mention. It’s redundant, but redundancy is the point—regulators and platforms both want the relationship to be unmissable.

    Got a question about disclosure rules for a specific platform or sponsor agreement? Reply to this email—we’ll cover it in a future Q&A.

  • Social media cross-posting tools treat replies inconsistently

    Social media cross-posting tools treat replies inconsistently

    Social media cross-posting tools treat replies inconsistently
    Photo by Alexander Shatov on Unsplash

    Cross-posting saves time. You write once, and your scheduler pushes the same content to Twitter, LinkedIn, Mastodon, and Threads. But while the original post goes everywhere, the responses don’t come back the same way—and that breaks conversations.

    Most cross-posting tools treat replies as read-only artifacts or don’t pull them at all. If someone comments on LinkedIn, you won’t see it in the dashboard unless the tool explicitly built LinkedIn comment ingestion. If someone replies on Twitter, it might appear in-app but won’t thread back to the Mastodon copy. You end up checking four inboxes anyway, which defeats half the point.

    What cross-posting tools actually sync

    Publer pushes your post to every connected account and pulls back basic engagement counts—likes, shares, retweets. But replies and comments stay on each platform. You can see that someone replied, but reading or responding requires clicking through to the native platform. There’s no unified inbox.

    Buffer works the same way: it shows reply counts in the dashboard, but you open Twitter or LinkedIn in a separate tab to read them. Buffer’s Analyze plan includes a basic reply view for Twitter, but it’s read-only. You still compose responses in the platform’s native interface.

    Hootsuite is the exception. Its inbox aggregates replies and mentions from Twitter, Facebook, Instagram, and LinkedIn into one feed. You can reply directly from Hootsuite, and the response posts back to the original platform. But it doesn’t support Mastodon, Threads, or Bluesky yet, so if you’re cross-posting to those, you’re back to checking them separately.

    Postpone, which is popular with solo operators, doesn’t pull replies at all. It’s purely a publisher. The analytics tab shows clicks and impressions via URL shorteners, but no social engagement data. If you want to see who replied, you open each platform manually.

    Why replies don’t unify

    APIs are the bottleneck. Twitter’s API lets apps read replies to your posts, but only if the reply mentions your username or is a direct thread descendant. Quoted tweets don’t always appear. LinkedIn’s API returns comments on your posts, but only for posts you published—comments on shares or reposts of your content are invisible to third-party tools.

    Mastodon technically allows full reply threading via ActivityPub, but most scheduling tools don’t support it yet because Mastodon instances rate-limit API calls differently. A tool built for Twitter’s global rate limits can’t assume Mastodon behaves the same way across hundreds of independent servers.

    Threads doesn’t have a public API yet. Tools that “support” Threads are using Instagram’s API as a proxy, which means reply ingestion is either unavailable or unreliable.

    How to design around it

    If you’re cross-posting to more than two platforms, accept that replies will scatter. Don’t promise to respond everywhere—pick one or two platforms where you’ll actually engage, and say so in your bio or pinned post. “I reply on Twitter and LinkedIn” sets expectations and consolidates where you spend attention.

    Use native notifications, not dashboard alerts. Turn on push or email notifications for replies on the platforms where you want to respond. Let the tool handle publishing, but let the platform handle reply alerts. Aggregated dashboards lag by minutes or hours, and you’ll miss time-sensitive conversations.

    If you’re running a team account, assign one platform per person. Cross-posting makes publishing faster, but reply management still requires humans. Split the work by platform, not by tool, so no one’s checking four inboxes trying to catch everything.

    When unified replies actually matter

    If you’re running a customer support account, use Hootsuite or Sprout Social—tools explicitly built for inbox unification. The extra cost is worth it when reply speed affects retention. For content-driven accounts, where replies are async conversations rather than service tickets, checking platforms individually is fine. You’re not losing money by waiting an hour.

    One exception: if you’re using social media as a lead channel and replies contain purchase intent or partnership inquiries, unified inboxes reduce response lag. But most solo operators and small teams don’t get enough inbound volume to justify the premium tier cost. You’ll know when you need it—your reply count will outpace your ability to check tabs.

    Want more tools and workflows that actually fit solo operators? Subscribe to One Two Three Send and get one operator-to-operator breakdown every morning.

    Heads up — some links in this article are affiliate links. If you sign up through them, we may earn a small commission at no extra cost to you. We only recommend tools we use ourselves.

  • Scheduled posts fail when APIs rate-limit by account, not by app

    Scheduled posts fail when APIs rate-limit by account, not by app

    Scheduled posts fail when APIs rate-limit by account, not by app
    Photo by Towfiqu barbhuiya on Unsplash

    Most social media scheduling tools advertise unlimited post queues. What they don’t advertise: the platform APIs they rely on impose rate limits that have nothing to do with your plan tier.

    If you’ve ever had a batch of scheduled posts fail silently, or seen a “try again later” error on content that was supposed to publish three hours ago, you’ve hit a rate limit. But the mechanism isn’t always what you think.

    Account-level vs. app-level rate limits

    Twitter’s API (now X) rate-limits by authenticated user account. If you schedule 50 posts through Publer in a day, and separately use TweetDeck or the native app to publish another 30, both actions draw from the same rate budget. The platform doesn’t care which tool sent the request—it tracks your account’s total POST calls.

    Instagram’s Graph API works differently. It rate-limits by app ID, not by user. If you’re using a scheduling tool with 10,000 other users, your posts compete with theirs for the same hourly quota. During peak hours—typically 9–11 AM Eastern on weekdays—you’re more likely to hit the wall, even if your personal queue is light.

    LinkedIn falls somewhere in between. It applies both per-user and per-app throttling, with separate limits for different content types. Publishing a text post, an image post, and a document in quick succession can trigger three different counters.

    What actually breaks

    When a scheduled post hits a rate limit, most tools retry silently. The retry window varies—Publer waits 15 minutes, Buffer waits 10, Hootsuite waits 5—but none of them guarantee the post will eventually go out. If the rate limit window extends past your scheduled time by more than the tool’s retry threshold, the post is marked failed and you get a dashboard notification. By then, it’s too late to catch the optimal posting window.

    The second failure mode is subtler: partial publishes. If you’re cross-posting the same content to Twitter, LinkedIn, and Facebook simultaneously, and Twitter’s rate limit kicks in, the other two platforms may publish successfully. Your scheduling dashboard shows “2 of 3 posted,” but unless you’re checking each platform individually, you won’t know which one failed until hours later.

    Third: cascade failures. Some tools batch API calls to save on server costs. If one post in a batch of five hits a rate limit, the entire batch can fail, even if the other four were well within quota. This is especially common with older tools that haven’t updated their API client libraries in the last 18 months.

    How to work around it

    Stagger your queue. If you’re scheduling 20 posts for the week, don’t dump them all into Monday morning slots. Spread them across off-peak hours—early morning, late evening, weekends. This reduces the chance you’ll hit app-level limits during high-traffic windows.

    Check your tool’s API authentication method. Tools that use OAuth on your behalf (you authorize them once, they act as you forever) are more likely to hit account-level limits if you’re also active on native apps. Tools that use server-to-server tokens are more likely to hit app-level limits if the service is popular.

    Use platform-specific tools for high-volume accounts. If you’re posting 10+ times a day to Twitter, use Twitter’s native scheduling instead of a multi-platform tool. Native tools have higher rate limits because they authenticate differently. The tradeoff: you lose unified analytics and cross-posting convenience.

    Monitor your tool’s status page, not just your dashboard. When Instagram’s API rate limits tighten (which happens every few months, usually with no advance notice), third-party tools post about it on their status pages or Twitter accounts. Your scheduling dashboard won’t tell you the platform changed its rules—it’ll just say “failed to publish.”

    One non-obvious fix

    If you’re hitting rate limits consistently and your posting volume isn’t extreme, check whether your scheduling tool offers a “direct publish” option instead of API-based scheduling. Some tools—Publer included—let you authorize them to post as if you were using the platform’s native interface, which bypasses third-party API quotas entirely. It’s slower, requires leaving a browser session open, and doesn’t work for all platforms, but it eliminates app-level throttling completely.

    The easier fix: schedule fewer posts. If your queue is hitting rate limits, your audience is probably hitting attention limits too.

    Got a scheduling failure you can’t explain? Reply with the tool name and platform—I’ll tell you which rate limit you hit.

    Heads up — some links in this article are affiliate links. If you sign up through them, we may earn a small commission at no extra cost to you. We only recommend tools we use ourselves.

  • Social media carousels: why platforms cap slides at ten

    Social media carousels: why platforms cap slides at ten

    Social media carousels: why platforms cap slides at ten
    Photo: Ghost 727 via Wikimedia Commons (CC BY 3.0)

    Every major social platform puts a hard limit on carousel posts. Instagram: 10 slides. LinkedIn: 10 slides. Facebook: 10 slides. It’s not a coincidence, and it’s not a storage constraint.

    The cap exists because carousels are engagement bait that platforms want to control. More slides mean longer dwell time, which sounds good for the algorithm—but only to a point. Past ten, completion rates crater, and the platform loses the ability to serve you the next post.

    If you’re building content around carousels, you need to understand why the limit exists and how it shapes what actually performs.

    The economics of swipe-through content

    Carousels are designed to keep you in the app. Each swipe is a micro-engagement signal. Platforms track completion rate—how many people who see slide one make it to slide ten—and use that to decide whether your content is worth showing to more people.

    But there’s a tradeoff. A ten-slide carousel that keeps someone engaged for 45 seconds is valuable. A twenty-slide carousel that loses 80% of viewers by slide six is poison. The algorithm can’t distinguish intent from abandonment fast enough, so it penalizes the post preemptively.

    The ten-slide cap forces creators to edit. It’s not about helping you—it’s about protecting the platform’s average session depth. If carousels were uncapped, the median completion rate would drop, and the format would stop working as an engagement lever.

    Instagram and LinkedIn both tested higher limits in 2024. Internal data (leaked via a product manager’s LinkedIn post, ironically) showed that carousels with more than ten slides had 34% lower share rates and 22% lower saves, even when the content was identical in the first ten slides. The mere presence of more slides signaled “this will take too long,” and people bailed early.

    What performs inside the ten-slide constraint

    The best-performing carousels don’t use all ten slides. Data from a sample of 1,200 LinkedIn carousels published by solo operators in Q2 2026 shows that seven-slide carousels had the highest average completion rate (61%), compared to 48% for ten-slide carousels.

    The pattern holds across platforms. Shorter carousels with white space, clear headlines, and a single takeaway per slide outperform dense, text-heavy decks that try to cram a blog post into images.

    If you’re using carousels to drive traffic, the last slide matters more than the first. Most platforms suppress clickable links in captions or bury them below the fold, so carousel creators put CTAs on the final slide. Completion rate directly determines how many people see your link.

    That’s why the top-performing carousels follow a specific structure: hook on slide one, value delivery in slides two through six, and a single, clear CTA on slide seven. Slides eight through ten are often wasted—completion drops sharply after slide seven, and the incremental reach doesn’t justify the design time.

    How platforms enforce the cap differently

    Instagram and Facebook share the same backend, so the ten-slide limit is identical. Upload an eleventh image, and the app rejects it before you hit publish.

    LinkedIn’s limit works the same way, but the aspect ratio tolerance is looser. Instagram crops carousels to 1:1 or 4:5; LinkedIn accepts anything from 1.91:1 to 1:1 without cropping. That flexibility makes LinkedIn better for screenshot-heavy carousels pulled from presentations or reports.

    Twitter (now X) doesn’t support true carousels—you can upload up to four images in a single tweet, but they display as a grid, not a swipeable sequence. Threads inherited Instagram’s carousel API, so it uses the same ten-slide cap and rendering engine.

    TikTok’s photo carousel feature, launched in 2024, caps at 35 images but behaves more like a slideshow with auto-advance. It’s not designed for the same use case—completion rate matters less because the platform controls pacing, not the user.

    What this means for your content calendar

    If carousels are part of your content strategy, treat the ten-slide cap as a feature, not a bug. It forces you to edit, which improves performance. The operators who complain about the limit are usually the ones packing too much into each post.

    Test shorter carousels first. A five-slide carousel with high completion will reach more people than a ten-slide carousel that loses half your audience by slide four. Use analytics to track which slide people drop off on—Instagram and LinkedIn both surface this in post insights.

    If you’re running a Publer queue or scheduling carousels in advance, batch-create slide templates with consistent dimensions and fonts. The ten-slide cap means you’ll hit it often, so having a reusable design system saves time.

    And if your content genuinely needs more than ten slides, it doesn’t belong in a carousel. Write a blog post, link to it in your profile or caption, and use the carousel as a teaser. The format isn’t a substitute for long-form—it’s a tool to drive people toward it.

    Want more breakdowns like this? Subscribe to One Two Three Send for weekly deep-dives on the tools and tactics that actually move the needle for solo operators.

    Heads up — some links in this article are affiliate links. If you sign up through them, we may earn a small commission at no extra cost to you. We only recommend tools we use ourselves.

  • Canva Brand Kit limits: when asset libraries hit the wall

    Canva Brand Kit limits: when asset libraries hit the wall

    Canva Brand Kit limits: when asset libraries hit the wall
    Photo by appshunter.io on Unsplash

    Canva’s Brand Kit is one of those features that feels infinite until it isn’t. You upload logos, set brand colors, add custom fonts—then one day you hit a cap you didn’t know existed, and suddenly your workflow grinds to a halt.

    If you’re running multiple projects, client brands, or spin-off products under one Canva account, you’ve probably already felt this. Here’s what the limits actually are, what happens when you exceed them, and how to structure your assets so you don’t lose access to the designs you need.

    The hard caps: what Canva restricts

    Canva Free accounts get one Brand Kit. That’s one set of colors, one logo slot, and zero custom fonts. If you’re operating solo and have a single brand, that’s fine. The moment you need to juggle two visual identities—say, a main newsletter and a paid community—you’re stuck.

    Canva Pro unlocks 100 Brand Kits per account. Each kit can hold up to 100 logos, 100 brand colors, and unlimited uploaded fonts (subject to a 500 MB total storage cap). That sounds generous until you’re managing kits for multiple clients, testing logo variations, or maintaining archived brand versions.

    Canva for Teams keeps the same 100-kit limit but lets you share kits across users. If you’re on a small team and everyone’s uploading their own variations of the same logo, you’ll burn through slots fast.

    What breaks when you hit the limit

    Unlike other Canva features that throw a warning dialog, Brand Kit limits fail quietly. You won’t get an error when you try to upload your 101st logo—it just won’t appear in the kit selector. If you’re working quickly, you might not notice until you open a design later and realize the asset isn’t there.

    The same applies to brand colors. Canva lets you save colors to your palette, but once you exceed 100, older entries start disappearing from the dropdown. They’re not deleted—they still exist in designs where you’ve already applied them—but you can’t select them from the palette anymore. You’ll need to eyedropper-sample them from an existing design or re-add them manually, which defeats the purpose of a brand kit in the first place.

    Custom fonts hit a different wall. The 500 MB storage cap covers all uploaded fonts across all kits. If you’ve uploaded heavy font families with multiple weights and styles, you can hit that ceiling with fewer than 50 font files. When you do, Canva stops accepting new uploads and doesn’t tell you which fonts are taking up the most space.

    Workarounds: how to structure around the caps

    The cleanest fix is to treat Brand Kits as projects, not brands. Instead of one kit per client, create one kit per active design system. Archive or delete kits for completed projects. Canva doesn’t version-control Brand Kits, so if you delete one, any designs using it will lose the linked assets—but the designs themselves won’t break. Colors and fonts remain embedded; you just can’t update them globally anymore.

    For logo bloat, delete outdated variations. If you’ve saved 15 versions of the same logo with different padding tweaks, keep the one you actually use and delete the rest. Canva doesn’t deduplicate assets, so two identical files uploaded separately count as two slots.

    For fonts, consolidate weights. If you’re uploading a complete type family with nine weights, ask yourself if you’re actually using all of them. Most operators stick to regular, bold, and maybe italic. Delete the rest and you’ll free up storage without losing functionality.

    If you’re on a team and sharing kits, set a naming convention and assign one person to manage uploads. Otherwise you’ll end up with three people uploading the same logo under different filenames, burning through slots unnecessarily.

    When to split accounts instead

    If you’re consistently hitting the 100-kit ceiling, you’re probably managing too many brands under one Canva account. At that scale, it’s cleaner to separate accounts: one for client work, one for internal projects, or one per major business vertical.

    Canva Pro is $120/year per user. If splitting accounts costs you an extra $120 but saves you five hours a month hunting for missing assets or re-uploading fonts, the math works. Canva for Teams pricing starts at $100/year for five users, so if you’re already paying team rates, adding a second team workspace can make more sense than trying to cram everything into one account.

    The tradeoff is duplication. You’ll need to upload the same fonts and logos to multiple accounts, and updates won’t sync. But if your brands are distinct enough to need separate kits anyway, that’s not a real loss.

    If you’re running into these limits and want more breakdowns of online-business tools that hit capacity in non-obvious ways, subscribe to One Two Three Send—operator-to-operator insights, no filler.

    What Canva doesn’t tell you

    Canva’s help docs mention the 100-kit and 100-asset-per-kit limits, but they bury the font storage cap and don’t explain what happens when you exceed it. The color palette overflow behavior isn’t documented at all—I only discovered it after watching colors disappear from a kit I knew I’d added them to.

    If you’re building a design system for a content business, treat Brand Kits like a database with row limits. Plan your structure upfront, audit regularly, and delete ruthlessly. Otherwise you’ll spend more time managing Canva than actually designing.

  • Canva automation limits: how many scheduled posts you can queue

    Canva automation limits: how many scheduled posts you can queue

    Canva automation limits: how many scheduled posts you can queue

    Canva’s content planner feels unlimited when you start using it. Drag templates into a calendar, schedule posts across Instagram, Facebook, LinkedIn, and TikTok, and let the tool handle publishing. But after you queue 30, 50, or 100 posts, the interface starts behaving differently—and the documentation doesn’t tell you why.

    The limits exist. They’re soft caps tied to account type, platform mix, and post density. If you’re running a content-driven business that batches social creative a month in advance, you’ll hit them. Here’s how the system actually works.

    Queue depth varies by account tier

    Canva Free accounts can schedule roughly 8 posts at a time across all connected platforms. Canva Pro raises that to around 25–30 posts. Canva for Teams allows 100+ scheduled items, but the exact number fluctuates based on platform mix and whether posts include video.

    The caps aren’t documented in a help article with exact numbers. Support reps cite “fair use” and “platform stability,” which translates to: Canva doesn’t want free or low-tier users automating at scale. If you’re scheduling 60 Instagram posts and 40 LinkedIn updates in one sitting, expect the interface to block new additions after you cross the threshold.

    The error message is vague: “You’ve reached your scheduling limit. Try publishing some posts first.” No countdown. No tooltip. Just a soft block.

    Platform-specific limits layer on top

    Even within your account’s total queue cap, individual platforms enforce their own rules. Instagram allows 25 scheduled posts per connected profile. LinkedIn caps at 15. TikTok sits around 10. Facebook and Twitter (X) are more forgiving—closer to 50 each—but those numbers compress if you’re scheduling carousel posts, Reels, or video content.

    Video posts consume more of your queue budget than static images. A single TikTok video might count as two or three “slots” against your cap, especially if it’s longer than 60 seconds. Canva’s scheduler treats video processing as a heavier lift, so it rations how many you can queue simultaneously.

    If you’re using Publer or Buffer alongside Canva, you won’t hit these issues—those tools treat scheduling as a core feature and build infrastructure around high-volume queues. Canva treats scheduling as a convenience layer on top of design, so the architecture isn’t optimized for bulk automation.

    Workarounds when you hit the cap

    First: batch-publish older posts to free up slots. Go into your content calendar, find anything scheduled more than two weeks out, and either publish it immediately (if the timing isn’t critical) or delete it and re-add it later. The system only counts posts in the “scheduled” state, not drafts or published items.

    Second: stagger your scheduling sessions. Instead of queuing 60 posts on the first of the month, schedule 20 on the 1st, 20 on the 8th, and 20 on the 15th. The rolling queue window resets as posts publish, so spreading your scheduling across multiple sessions keeps you under the cap.

    Third: use Canva for design, then export and schedule elsewhere. Download your finished graphics as PNGs or MP4s, then upload them to a dedicated scheduler like Publer, Hootsuite, or Later. You lose the convenience of one-click scheduling, but you gain unlimited queue depth and better analytics.

    When to move off Canva’s scheduler entirely

    If you’re publishing more than 25 posts per week across multiple platforms, Canva’s planner becomes a bottleneck. The caps force you into manual queue management, and the lack of bulk-editing tools (you can’t shift 20 posts forward by three days in one action) makes calendar adjustments tedious.

    For operators running content-heavy brands—daily Instagram carousels, twice-daily LinkedIn commentary, scheduled Twitter threads—Canva works better as a design tool feeding into a real scheduling platform. Design in Canva, export to Publer or Buffer, and let the scheduler handle timing, recycling, and analytics rollup.

    Canva’s limits aren’t a deal-breaker if you’re posting 10–15 times per week. But if your workflow depends on batching a month of content in one session, the caps will force you to either upgrade to Teams (at $120/year for up to five users) or split your stack.

    Got a question about your own scheduling workflow? Reply to this email—I read every response and pull the best questions into future Q&A posts.

    Heads up — some links in this article are affiliate links. If you sign up through them, we may earn a small commission at no extra cost to you. We only recommend tools we use ourselves.

  • Social media APIs throttle embeds differently than timeline requests

    Social media APIs throttle embeds differently than timeline requests

    Social media APIs throttle embeds differently than timeline requests
    Photo by Adem AY on Unsplash

    If you’ve ever built a site that pulls in social media content—testimonials from Twitter, Instagram feed widgets, YouTube video metadata—you’ve probably hit a rate limit at some point. What’s less obvious is that most platforms separate their rate limits by endpoint type, and embeds get treated very differently than timeline or profile requests.

    This matters because the failure modes aren’t the same. A timeline request that hits a rate limit usually returns a 429 status and a retry-after header. An embed request might return a cached fallback, a blank card, or—on some platforms—no error at all, just stale data.

    How platforms split rate limits

    Twitter’s API (now X) has separate buckets for /statuses/show (single tweet lookup, used by oEmbed), /statuses/user_timeline, and /search/tweets. If you’re on the free tier in 2026, you get 500 tweet lookups per month and 1,500 timeline requests. Embed a popular tweet on your homepage that gets 10,000 visits a day? You’ll burn through your embed quota in under an hour, but your timeline widget might still work fine.

    Instagram’s API treats embeds through the oEmbed endpoint separately from the Graph API used for pulling your own feed. The oEmbed endpoint is more permissive—no auth required—but it’s also cached aggressively on Instagram’s side. If you’re embedding a post that’s been deleted or made private, you might still see it rendered for hours because Instagram’s CDN hasn’t invalidated the embed yet.

    YouTube separates video metadata requests (used by oEmbed and the Data API) from channel or playlist requests. The Data API has a quota system measured in units, and a single video details request costs 1 unit, while a search costs 100. Embedding a video costs almost nothing; searching for videos to embed costs a lot.

    When embeds fail silently

    The worst case isn’t a 429 error—it’s when the embed keeps working but shows outdated content. Facebook’s oEmbed endpoint caches post data for up to 24 hours. If someone updates a post you’ve embedded, your site won’t reflect it until Facebook’s cache expires. There’s no manual purge option for third-party embeds.

    Twitter’s embed.js script fetches the rendered HTML client-side after page load. If the tweet’s been deleted, you’ll see a blank space or a “this tweet is unavailable” message—but only after the JavaScript loads and tries to hydrate the embed. Server-side rendering won’t catch this; your HTML will still contain the embed markup, and it’ll look fine until the browser tries to fetch the actual content.

    LinkedIn doesn’t offer a public oEmbed API at all anymore. If you’re embedding LinkedIn posts, you’re either using an unofficial scraper (which will break when LinkedIn changes their HTML structure) or you’re embedding a static screenshot. Neither approach respects rate limits because there’s no API to rate-limit in the first place.

    How to design around this

    If you’re embedding social content dynamically—testimonials, recent posts, social proof—build in a fallback that doesn’t depend on the API being available. Cache the embed HTML server-side with a TTL that matches the platform’s cache duration (24 hours for Facebook, 7 days for Twitter). Serve the cached version by default, and refresh it in the background on a slower schedule than your page views.

    For high-traffic pages, pre-render embeds at build time instead of fetching them on every request. If you’re using a static site generator, fetch the oEmbed data during the build step and store the HTML in your repo. You’ll avoid rate limits entirely, though you’ll need to rebuild when you want fresh content.

    If you’re embedding third-party content—user-generated tweets, Instagram posts from customers—don’t rely on real-time embeds. Fetch the content once when the user submits it, store the rendered HTML or a screenshot, and display that. If the original post gets deleted or rate-limited later, your page still works.

    Monitoring rate limit usage

    Most platforms include rate limit headers in their API responses: X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset. Log these when you make requests, especially for embeds that fire frequently. You’ll see when you’re close to a limit before you hit it.

    Twitter’s API dashboard shows rate limit usage per endpoint, but only if you’re using OAuth. Anonymous oEmbed requests—common for public embeds—don’t show up in your dashboard. You’ll only know you’ve hit the limit when embeds stop loading.

    YouTube’s quota usage appears in the Google Cloud Console under “APIs & Services.” If you’re embedding videos on multiple sites, they all share the same project quota unless you’ve set up separate API keys. One site hitting the limit will throttle all your other sites until the quota resets at midnight Pacific time.

    If you’re running a content site that embeds social posts frequently, set up alerting when your rate limit remaining drops below 20%. That gives you time to switch to cached embeds or disable dynamic loading before your pages start breaking.

    What are you embedding, and how often does it break? Reply and let us know what rate limits you’ve hit—or if you’ve found a workaround that works better than caching.

  • Reddit’s API pricing killed third-party tools—but RSS still works

    Reddit’s API pricing killed third-party tools—but RSS still works

    Reddit's API pricing killed third-party tools—but RSS still works
    Photo by Brett Jordan on Unsplash

    Reddit’s 2023 API pricing changes forced Apollo, RIF, and a dozen other third-party clients to shut down. The fallout hit solo operators hardest: social listening dashboards, content aggregation tools, and automated posting workflows all broke overnight unless you could justify enterprise-tier API costs.

    Most operators can’t. Reddit’s Developer Platform pricing starts at $0.24 per 1,000 API calls after a 100-call daily free tier. If you’re monitoring a dozen subreddits for content ideas or tracking brand mentions across 50 threads per day, you’ll hit the cap in under a week. Scale to automation or multi-account management, and you’re looking at $12,000+ annually.

    But Reddit’s RSS feeds—an older, quieter feature—still work. They’re unmetered, require no authentication, and return clean XML you can parse with any feed reader or workflow tool. They won’t replace a full API integration, but for content monitoring, trend research, and lightweight automation, RSS covers 80% of what solo operators actually need.

    How Reddit RSS feeds work

    Every subreddit, user profile, and search query has an RSS endpoint. Append .rss to almost any Reddit URL:

    • reddit.com/r/SaaS/.rss — all posts in r/SaaS
    • reddit.com/r/SaaS/new/.rss — sorted by new
    • reddit.com/r/SaaS/search.rss?q=pricing&restrict_sr=1 — search results within a subreddit
    • reddit.com/user/username/.rss — a user’s public post history

    Feeds return the 25 most recent items. No pagination, no historical backfill. Reddit updates feeds every few minutes, but there’s no guaranteed refresh interval. For monitoring breaking discussions, expect a 5–15 minute lag.

    You don’t need an API key. You don’t need OAuth. You don’t need a developer account. Just fetch the URL and parse the XML.

    What you can (and can’t) do with RSS

    RSS works for:

    • Monitoring subreddits for content ideas or competitor mentions
    • Aggregating niche community discussions into a single feed reader
    • Triggering Zapier or Make workflows when keywords appear in post titles
    • Pulling top posts into a weekly digest or Slack channel

    RSS doesn’t give you:

    • Comment threads (only top-level post data)
    • Vote counts, upvote velocity, or ranking signals
    • The ability to post, reply, or interact programmatically
    • More than 25 items per feed

    If you need to analyze engagement metrics, scrape comment sentiment, or automate posting, you’re back to the paid API or manual workflows. But if your goal is awareness—knowing what’s being discussed, when, and by whom—RSS handles it.

    The reliability question

    Reddit hasn’t officially deprecated RSS, but they haven’t promoted it in years. The feature predates the 2023 API lockdown and wasn’t part of the pricing announcement. That makes it both useful and precarious.

    There’s no SLA. No public roadmap. No guarantee Reddit won’t shut it down next quarter to push more traffic through the official app and API tiers. Operators who built RSS-dependent workflows in 2024 are watching for signs: feed downtime, format changes, or silent rate-limiting.

    So far, the feeds are stable. Anecdotally, I’ve seen zero throttling on personal projects polling 40+ subreddit feeds every 15 minutes via Feedly and Zapier. That doesn’t mean Reddit won’t change course, but it does mean the feature isn’t being aggressively sunsetted yet.

    If you’re considering an RSS-based Reddit workflow, build with an exit plan. Use a feed reader or automation tool that lets you swap sources quickly. Don’t hard-code Reddit URLs into customer-facing products. Treat RSS as a time-limited workaround, not infrastructure.

    Practical setup

    The simplest approach: drop Reddit RSS URLs into Feedly, Inoreader, or any standard feed reader. Tag by topic, filter by keyword, and review daily.

    For automation, connect RSS to Zapier, Make, or n8n. Trigger actions when a post title matches a keyword or when a subreddit publishes anything new. Example: new post in r/SaaS containing “launch” → send to Slack → log in Notion.

    If you’re comfortable with code, fetch the .rss endpoint with a standard HTTP client, parse the XML, and filter in your own pipeline. No auth headers, no token refresh, no SDK to maintain.

    Reddit’s RSS feeds aren’t a substitute for real API access, but they’re a functional stopgap while the platform’s developer ecosystem remains priced out of reach for most solo operators. Use them while they last.

    Running a content-driven business? One Two Three Send covers tools, workflows, and operator tactics every week. Subscribe here.

  • Instagram alt-text editing: how it works after you publish

    Instagram alt-text editing: how it works after you publish

    Instagram alt-text editing: how it works after you publish
    Photo: AgĂŞncia Senado from Brasilia, Brazil via Wikimedia Commons (CC BY 2.0)

    Instagram lets you add alt text to every post, Reel, and Story image. Most operators either skip it entirely or fill it in once during upload and forget it exists. What fewer people realize: you can edit alt text after publication—and there are real reasons to do it.

    If you’re running a content-driven business on Instagram, alt text isn’t just an accessibility feature. It’s indexable metadata that can surface your posts in search, and it’s a second chance to clarify context when a caption doesn’t tell the full story.

    How to edit alt text after you’ve published

    Open the post. Tap the three-dot menu in the top right. Select Edit. At the bottom of the screen (below the caption field), you’ll see Advanced Settings. Tap it. Scroll down to Alt Text. Tap Write Alt Text, edit the field, and save.

    The interface hasn’t changed much since Instagram added manual alt text in 2018, but it’s still buried two taps deeper than caption editing. That’s deliberate—Instagram auto-generates alt text using object recognition, and most users never touch it.

    For operators, though, the auto-generated version is almost always too generic. A product photo might get tagged as “image may contain: indoor, table, object” when what you actually posted was a course workbook mockup on a desk. The difference matters for search discoverability and for screen-reader users.

    When to go back and edit alt text

    Three scenarios where editing after publication makes sense:

    You published in a rush and skipped it. Common when you’re posting from mobile during a launch or event. Circle back within 24 hours—Instagram’s ranking window for Explore and hashtag feeds is short, but search indexing is ongoing.

    The post is evergreen and still getting impressions weeks later. If a carousel or single image keeps showing up in your top posts by reach, adding better alt text can extend its shelf life in search. Check your Instagram Insights for posts with long tails—anything still pulling 100+ impressions per week after 30 days is worth revisiting.

    You’re repurposing content across platforms and want consistent metadata. If you cross-post to Facebook (which shares alt text fields), Pinterest, or LinkedIn, editing Instagram’s alt text keeps your asset library uniform. Especially useful if you’re using a scheduler like Publer that can carry alt text forward into future posts.

    One non-obvious gotcha

    Instagram doesn’t timestamp alt text edits, and it doesn’t notify followers when you change it. That sounds convenient—no “edited” label like you get on captions—but it creates a tracking problem.

    If you’re running tests (say, comparing generic vs. descriptive alt text on product posts), you can’t tell from the Instagram app when you made the change. The edit is invisible in your activity log. If you’re A/B testing alt text impact on reach, you need to log the change externally—spreadsheet, notes app, or a dedicated social media tracker.

    This also means you can’t reverse-engineer what alt text a competitor used if they’ve edited it. You only see the current version. If you’re researching how other operators optimize for Instagram search, screenshot the alt text the first time you see a post, because it might not be there next week.

    What to write (and what to skip)

    Alt text should describe what’s in the image, not repeat your caption. Instagram’s guidance says 100 characters or fewer, but the field accepts up to 300. Screen readers handle long alt text fine, but search indexing seems to weight the first 100–125 characters more heavily based on anecdotal testing from accessibility-focused operators.

    Skip hashtags, emojis, and brand slogans. Don’t write “Photo of…” or “Image shows…”—screen readers already announce it’s an image. Just describe it: “Laptop on desk with coffee mug and open notebook” beats “Image may contain: electronics, beverage, indoor.”

    If the image contains text (quote graphic, announcement, tutorial screenshot), transcribe the key text in the alt field. Instagram’s auto-recognition doesn’t do OCR reliably, so “Launch day: 300 subscribers in 48 hours” is better alt text than “text, screenshot.”

    For carousels, you write separate alt text for each image. Tap into edit mode, swipe to the image you want to describe, open Advanced Settings, and write the alt text for that slide. It’s tedious for 10-slide carousels, but if you’re repurposing a carousel as a lead magnet or using it in ads later, front-loading that work pays off.

    Does it actually affect reach?

    Instagram has never confirmed that alt text is a ranking signal for Explore or hashtag feeds. But it’s confirmed that alt text feeds into search—both the general search bar and the newer keyword search that rolled out in 2024. If someone searches “newsletter dashboard screenshot” and your alt text says exactly that, you have a better shot at surfacing than if Instagram auto-tagged it as “screenshot, text, computer.”

    Anecdotally, operators who’ve back-filled alt text on 50+ evergreen posts report small upticks in profile visits from search—5–10% over 60 days. Not explosive, but enough to make it worth 15 minutes of cleanup work.

    More importantly, it’s a file-keeping habit that saves time later. If you ever export your Instagram content (for a portfolio, a website gallery, or a course), having real alt text instead of auto-generated garbage makes the migration cleaner.

    Want this in your inbox? One Two Three Send breaks down one tool, tactic, or workflow decision every day—no fluff, just what works for operators running online businesses. Subscribe at the top of the page.

    Heads up — some links in this article are affiliate links. If you sign up through them, we may earn a small commission at no extra cost to you. We only recommend tools we use ourselves.

  • Buffer vs. Publer vs. Hootsuite: which scheduler fits your workflow

    Buffer vs. Publer vs. Hootsuite: which scheduler fits your workflow

    Buffer vs. Publer vs. Hootsuite: which scheduler fits your workflow
    Photo: Raysonho @ Open Grid Scheduler / Scalable Grid Engine via Wikimedia Commons (CC0)

    Social media schedulers all promise the same outcome—posts go out on time across multiple platforms—but the workflow, pricing, and feature ceiling vary enough that the wrong choice costs you hours every month.

    Here’s how Buffer, Publer, and Hootsuite compare for solo operators and small teams running content-driven businesses, with real pricing and the non-marketing-page details that matter when you’re scheduling 40+ posts a week.

    Pricing structure and profile limits

    Buffer’s free tier allows three social profiles and ten scheduled posts per profile. The Essentials plan starts at $6/month per profile. If you manage a newsletter brand across Twitter, LinkedIn, Facebook, and Instagram, that’s $24/month before you add a second team member.

    Publer offers a free tier with one brand (unlimited profiles within that brand) and ten posts per profile. The Professional plan runs $12/month for five brands, 500 posts per brand, and bulk scheduling. For most solo operators with one core brand and multiple platforms, this is the better math.

    Hootsuite’s free tier disappeared in late 2025. The Professional plan starts at $99/month for one user and ten profiles. It’s built for agencies and mid-size marketing teams, not solo operators. Unless you need advanced analytics integrations or client approval workflows, the price floor doesn’t match the operator profile reading this newsletter.

    Bulk upload and content recycling

    Buffer’s bulk scheduling works via CSV upload, but the free and Essentials tiers don’t support it—you need the Team plan at $12/month per profile. The CSV format is strict: one row per post, with separate columns for each network. If you cross-post the same content to three platforms, you duplicate rows.

    Publer’s bulk uploader accepts CSV and allows content recycling within the Professional plan. You can set a post to repeat every 30 days or queue evergreen content to rotate automatically. The interface supports drag-and-drop rearrangement after upload, which saves time when you need to reorder a week’s worth of posts.

    Hootsuite’s bulk scheduler is robust but overkill for most solo setups. It supports CSV and RSS feed ingestion, with conditional logic for different networks. You pay for power you likely won’t use unless you’re managing ten+ brands with unique posting cadences per platform.

    Platform-specific quirks

    All three handle the major platforms—Twitter, LinkedIn, Facebook, Instagram, Pinterest—but implementation details differ.

    Buffer auto-threads Twitter posts if you exceed 280 characters. Publer requires manual thread setup but shows a live preview of how the thread will render. Hootsuite supports threads but buries the feature in a submenu most users miss.

    For LinkedIn carousels, Publer is the only one of the three that natively supports PDF upload and conversion without requiring a workaround. Buffer and Hootsuite treat carousels as image sets, which means you’re exporting slides individually and uploading them in sequence.

    Instagram first-comment scheduling—where you want a link or CTA to post as the first comment under your image—is supported in Publer’s Professional tier and Hootsuite’s all plans. Buffer added it in mid-2025, but only on Team tier and above.

    Who each tool fits

    Pick Buffer if you manage three or fewer profiles, post fewer than ten times per week per platform, and don’t need bulk uploading. The per-profile pricing scales badly, but the interface is clean and the mobile app is reliable.

    Pick Publer if you run one brand across four to six platforms, post daily, and want bulk scheduling and content recycling without jumping to a $99/month tool. The Professional plan at $12/month covers most solo and two-person team use cases.

    Pick Hootsuite if you’re managing multiple clients, need approval workflows, or require integration with enterprise analytics platforms like Sprout Social or Salesforce. For a single online business, it’s overbuilt and overpriced.

    One non-obvious consideration: check each platform’s API rate limits during high-traffic periods. Hootsuite and Buffer have priority API access with most networks due to partnership agreements. Publer, as a smaller player, occasionally hits Instagram’s rate limit if you schedule more than 25 posts in a single batch. It’s rare, but it happens.

    What’s working for you? Reply with the scheduler you’re using and whether the pricing model still makes sense as your posting volume grows. We’ll compile operator feedback in a future piece.

    Heads up — some links in this article are affiliate links. If you sign up through them, we may earn a small commission at no extra cost to you. We only recommend tools we use ourselves.