Component library / Sources & Connections·base · per-plugin · legacy General tab · Manage Sources

Canonical component · three layers

Sources & Connections

One “Manage Sources” card everywhere. Base states every plugin shares → the same row flexing per plugin family (real account types, labels, and error strings from the plugin sources) → the legacy baggage, unified under one warning-token treatment. Expand Spec under any state for triggers, actions, and grounding.

Layer 1 · Base states — shared by every plugin

Instagram shown as the demo family; swap the avatar, accent, and noun per plugin. The anatomy never changes: avatar · name · status line · actions.

B1Connected & healthy Working token, last API call succeeded

Manage Sources

Add or remove connected Instagram accounts.

SB @smashballoonBusinessConnected Feb 4, 2026 · token healthy
Spec

Trigger: source has a working token; last API call succeeded. Actions: add another source, or remove this one (confirm — feeds using it warn).

B2Empty — no sources yet Fresh install or all sources removed

Manage Sources

Add or remove connected Instagram accounts.

Looks like you have not added any source.
Use “Add Source” to add a new one.

Spec

Trigger: fresh install, or every source removed — feeds can’t render without one. Actions: one action, no dead ends: start the connect flow.

Existing Instagram empty-source string. The connect flow never asks for a password: “This does not give us permission to manage your account, it simply allows the plugin to retrieve public content from the API.”

B3Connecting — in flight OAuth handoff to connect.smashballoon.com

Manage Sources

Add or remove connected Instagram accounts.

Connecting…Waiting for authorization at connect.smashballoon.com
Spec

Trigger: user launched the OAuth flow; resolves to B1 or B4 when the redirect returns. Actions: cancel, or complete authorization in the popup.

Grounded in the existing redirect interstitial: “Redirecting to connect.smashballoon.com — you will be redirected to our app so you can connect your account in 5 seconds” (Instagram builder).

B4Connection error Platform/HTTP failure — not the token’s fault

Manage Sources

Add or remove connected Instagram accounts.

Spec

Trigger: connect flow or API call failed for a non-token reason (outage, HTTP error, unexpected response). Existing sources keep serving cached posts. Actions: Try Again, View error (for support).

Headline is the existing errorNotice string. “View error” surfaces the last-10-entries error log already kept by the Facebook/Twitter error reporters.

B5Re-auth needed Token expired, revoked, or undecryptable

Manage Sources

Add or remove connected Instagram accounts.

SB @smashballoonAction requiredInvalid access token. Please reconnect the source.
SB @smashballoon.shopAction requiredAccess token could not be decrypted on this website — usually after a site migration. Why?
Spec

Trigger: the API says the source itself is unusable — token expired, revoked, or undecryptable after a site move. Actions: Reconnect (repeats OAuth in place, keeping feeds and settings), or Remove.

Both messages are real: “Invalid Access Token. Please reconnect the source.” (TikTok SourceErrors) and “Your access token could not be decrypted on this website. Reconnect this account…” (Instagram). TikTok centralizes the reconnect-worthy codes — access_token_invalid, token_decrypt_failed, “The payload is invalid.”, “The MAC is invalid.”, “Could not decrypt the data.” — the converged standard for every family.

Layer 2 · Per-plugin variation — same row, different facts

The component flexes on exactly three axes: identity (avatar/handle/ID), type tag (Business, Page, Group, Place ID…), and platform-imposed states. Nothing else may vary. Pick a family:

P1Instagram — personal vs business OAuth avatar + handle; personal API sunset Dec 2024

Manage Sources

Add or remove connected Instagram accounts.

SB @smashballoonBusinessConnected Feb 4, 2026 · token healthy
AM @aman.codesPersonal — deprecatedAs of December 2024 the personal connection type no longer works. Reconnect as a business account to continue. Why?
TR @theroast.cafeAccess revokedThe Smash Balloon app was deauthorized for this account. Reconnect within 7 days or its Instagram data is automatically deleted from this site (Meta data-privacy rules). 4 days left
Spec

Facts: OAuth via connect.smashballoon.com; account type matters — a live personal source is automatically in a deprecation state; a revoked source starts a 7-day countdown, then L6.

All three grounded: “Action required. Reconnect as a business account” + Dec 2024 notice (feed builder); the revoked-permission 7-day deletion window with automatic data wipe (posts manager / Platform_Data).

P2Facebook — Pages vs Groups Groups API deprecated; 90-day content limit

Manage Sources

Add or remove connected Facebook pages and groups.

SB Smash BalloonPageConnected Jan 12, 2026 · token healthy
WP WP Developers HangoutGroup — API deprecatedFacebook has deprecated the Groups API. Only content from the past 90 days can be displayed, and this source will stop updating. Use a Page for this community if you can. Migration options
Spec

Facts: sources are Pages or Groups; group sources carry a standing 90-day limit and a deprecation state pointing at Pages as the migration path.

Grounded: the 90-day note (“Due to a Facebook API limitation, only content posted to this group in the past 90 days can be displayed”) and the group_deprecation error + dismissible notice in CFF_Error_Reporter. Groups used a separate login endpoint (facebook-group-login.php) — converged flow keeps one Add Source button and asks Page vs Group inside it.

P3Twitter / X — API-tier baggage Site-key relay (weekly cap) vs own v2 app

Twitter Integration

How this site fetches data from the X API.

SK Site KeySmash Balloon relayYour site key is ctf4a2b… · used to fetch data from the X API

Due to X API changes, feed updates are limited to once a week on this connection. Connect your own X app to update more often.

Connected Twitter App

Your own X developer app credentials (Pro).

Requires an X developer account on a paid API tier. Feeds fall back to the site key if these credentials stop working.

Spec

Facts: after the X API pricing change there is no per-account OAuth. Lite fetches through a Smash Balloon site key relay capped at weekly updates; Pro users can connect their own X app (v2 credentials) to update more often.

All labels shipping today: “Site Key — this is used to fetch data from the Twitter API”, “Refresh”, “Connect your Own App (V2)”, “Connected Twitter App”, the four credential fields, and “Due to Twitter API changes, we have to limit feed updates to once a week”.

P4YouTube — API key vs connected channel Missing key = warning state with RSS fallback, not an error

Manage Sources

Connect a channel and provide a YouTube API key.

SB Smash BalloonChannelConnected Mar 2, 2026 · via Google OAuth
API KeyNot enteredImportant: no API key entered. New videos can’t be retrieved without one — feeds are running on the limited RSS fallback. How to create one
Spec

Facts: feeds run keyless on a limited RSS fallback, but most features need a Google API key; a channel can also be connected as an identity source.

Grounded: “Important: No API Key Entered.” (settings), “Unable to retrieve new videos without an API key” + RSS fallback (RSS_Connect), AJAX key validation. The OAuth channel row is inferred in its details — the connect flow exists but its states weren’t verifiable in this snapshot.

P5TikTok — accounts Reference implementation for reconnect handling

Manage Sources

Add or remove connected TikTok accounts.

SB @smashballoonAccountConnected May 18, 2026 · token healthy
DT @dailytoktipsAction requiredInvalid access token. Please reconnect the source.
Spec

Facts: OAuth accounts keyed by open_id; one class defines which errors demand a reconnect and every surface reads from it.

The reconnect-worthy codes live in one place (SourceErrors): access_token_invalid, token_decrypt_failed, “The payload is invalid.”, “The MAC is invalid.”, “Could not decrypt the data.”

P6Reviews — platform sources per collection Google / Yelp / Trustpilot…; API keys; tier gates

Manage Sources

Connect review platforms and manage collections.

G The Roast CaféGoogle · Place IDChIJN1t_tDeu…4F2 · 214 reviews cached
T theroast.cafeTrustpilotNew reviews will not display until an API key is entered for your sources. How to create an API key
Y The Roast CaféYelpPLUSUpgrade to the Plus tier to display reviews from Yelp. Upgrade
Spec

Facts: sources are review platforms (Google, Yelp, Trustpilot, TripAdvisor, Facebook, WordPress.org) identified by Place ID / business URL, gathered into collections. Some platforms need an API key; some are gated by plan tier (cross-ref license state 09).

Grounded: “Place ID” field, “Manage API Keys”, “New reviews will not display until an API key is entered for your sources” + “How to create an API key”, “Import Collection”, Yelp tier gate (“Upgrade to our ‘Plus’ tier…”).

P7Social Wall — sources are other plugins Rows can also be “not installed” or “incompatible”

Wall Sources

Feeds from your other Smash Balloon plugins.

Instagram FeedsActive@smashballoon · feed #2 “Homepage grid”
YouTube FeedsUpdate requiredThe version of this plugin you are using is not compatible with Social Wall and needs to be updated.
TikTok FeedsNot installedDon’t have this plugin? Install it to add TikTok posts to your wall. Get it now
Spec

Facts: a wall’s sources are the feeds of the other Smash Balloon plugins, so each row can additionally be “not installed” or “incompatible version” — states no other family has.

Grounded in the configure template: “The version of the Instagram Feed plugin you are using is not compatible with the Social Wall plugin and needs to be updated” + “Update Instagram Plugin”, “Install Instagram Plugin”, “Don’t have this plugin? Get it now”, per-row “Remove”.

P8Threads — greenfield, pure standard Base component verbatim; no exceptions, no legacy

Manage Sources

Add or remove connected Threads accounts.

SB @smashballoonAccountConnected Jun 20, 2026 · token healthy
Spec

Facts: newest plugin, no history to carry — proof the standard needs zero exceptions when legacy doesn’t force them.

inferred The Threads reference checkout is empty in this snapshot, so this section is designed to the standard rather than extracted from code — intentionally: greenfield means base states only.

Layer 3 · Legacy baggage — one warning-token treatment

Two kinds of baggage exist in the code: legacy feeds (shortcode-era, pre-feed-builder — Instagram pre-v6, Facebook pre-v4, Twitter equivalent; one global settings blob, undeletable from the UI) and legacy sources (old options-format accounts batch-migrated to the sources table, plus sources on APIs the platforms have sunset). Every legacy state uses warning tokens with a dashed border — recognizable at a glance, never red (nothing is broken), always paired with a migration path.

L1Legacy shortcode feeds detected Feed locator finds pre-builder shortcode feeds

Legacy Feeds

Feeds created before the feed builder.

3 legacy feeds are running on this site. Legacy feeds are older feeds from before the feed-builder update — these settings apply to all of them at once, just like they did before. What are legacy feeds?

Spec

Trigger: the feed locator finds pre-builder feeds rendered via shortcode. Actions: open the shared legacy settings (one blob applies to all), or learn what legacy feeds are.

Grounded: Instagram “Legacy feeds are older feeds from before the version 6 update…”, Facebook “…before the version 4 update” + “These settings will impact N legacy feeds on your site”; all three families count legacy feeds via feed locators. “Convert to feeds” is inferred — today only the shared Settings button exists.

L2Unremovable legacy feed Exists only as a shortcode in content

Legacy Feeds

Feeds created before the feed builder.

[instagram-feed num=9]Legacy · shortcodeCan’t be deleted here. To delete a legacy feed, remove the shortcode wherever it is used on your site. Used on: Home, About
Spec

Trigger: user tries to delete a legacy feed from the admin — it can’t be. Actions: see exactly where it’s embedded (feed-locator data) and remove the shortcode there.

Copy grounded: “To delete a legacy feed, simply remove the shortcode wherever it is being used on your site.” (Instagram builder). Locations come from the feed-locator tables that already track where each feed renders.

L3Legacy sources migrating Old connected accounts batch-convert on admin loads

Manage Sources

Add or remove connected Instagram accounts.

Updating your sources…Accounts connected in an earlier version are being moved to the new source system. Batch 2 of 3. Migrating
Spec

Trigger: after updating across the source-model rewrite. Actions: none — informational; sources appear as they convert.

Mechanism grounded: legacy_source_queue / batch_process_legacy_source_queue (Instagram) chunks old connected_accounts per admin load. The user-facing copy is inferred — today this runs silently.

L4Legacy sources migrated Queue drained — shown once, dismissible

Manage Sources

Add or remove connected Instagram accounts.

All set. 2 accounts connected in an earlier version were moved to the new source system. Feeds were not affected.

Spec

Trigger: the migration queue drains. Actions: dismiss, or review the migrated sources.

inferred No confirmation string exists in the code — the queue just empties. Designed so the silent migration becomes legible instead of invisible.

L5Deprecated-API source — migration required Source half-works on a sunset API; cached content keeps serving

Manage Sources

Sources on deprecated platform APIs.

AM @aman.codesPersonal API · sunsetMigration path: reconnect as a business account.
WP WP Developers HangoutGroups API · sunsetMigration path: switch this source to a Page, or keep the last 90 days of cached posts.
Spec

Trigger: the source still works (or half-works) but its API is sunset: Instagram personal (Dec 2024), Facebook Groups, Twitter site-key-only fetching. Actions: one-click migration path; cached content keeps serving meanwhile.

Deprecations grounded per family (see P1–P3). The uniform “migration path” row is the convergence — today each plugin announces these in a different-looking admin notice.

L6Deadline passed — platform data deleted Revoked source not reconnected within 7 days

Manage Sources

Add or remove connected Instagram accounts.

TR @theroast.cafeData deletedThis source wasn’t reconnected within the 7-day limit, so all of its Instagram data was automatically deleted from this website (Meta data-privacy rules). Feeds using it are empty.
Spec

Trigger: a revoked source (P1’s 7-day window) was not reconnected in time; all cached data was wiped per Meta rules. Actions: Reconnect to start fresh, or Remove the dead source.

Grounded: the platform_data_deleted error — “The page was not reconnected within the 7 day limit and all Instagram data was automatically deleted on your website due to Facebook data privacy rules… To fix your feeds, reconnect all accounts that were in use.” Reviews carries the same Facebook-sourced state.