Introduction
Social Media Studio lets your users connect their social accounts and publish or schedule their generated ad copies and ad creatives across X (Twitter), LinkedIn, Facebook, Instagram, TikTok, YouTube and YouTube Shorts — all from a single composer with a pixel-accurate live preview for every network. Unlike the generation studios, Social Media Studio is a publishing tool: it pulls the caption from an existing Ad Copy and the media from an existing Ad Creative, validates the combination against each network’s rules, then posts immediately, on a schedule, or on an auto-repost cadence. This guide covers the full lifecycle — where to buy it, how to install it, how to register a developer app on each network and wire up its OAuth keys, how to configure pricing and access, the cron requirement for scheduling, and how each tool works.Included Tools
- Compose — the studio. Load a caption from an ad copy (or write/AI-generate one), attach a creative, pick target accounts, preview per network, then publish now / schedule / auto-repost.
- Connections — connect, pause, reactivate or disconnect social accounts via secure OAuth.
- Calendar — a timeline of every upcoming scheduled/auto-repost delivery plus recently published posts.
- Posts — history of every post with per-network status (posted / scheduled / partial / failed), a detail view and delete.
Supported networks
| Network | What it posts | Credentials required |
|---|---|---|
| X (Twitter) | Text, image, GIF, video | Client ID + Client Secret |
| Text, image, video (member feed) | Client ID + Client Secret | |
| Text, photo, video (Page feed) | App ID + App Secret | |
| Image, video / Reels (Business account) | App ID + App Secret | |
| TikTok | Video, photo | Client Key + Client Secret |
| YouTube | Long-form video | Client ID + Client Secret |
| YouTube Shorts | Vertical short-form video (#Shorts) | Shares the YouTube credentials |
Purchase & Installation
Social Media Studio is distributed through the in-app plugin marketplace — purchasing and installation both happen inside your MagicAds admin. There’s no third-party download.Open the Plugins marketplace
Purchase (if required)
- Free / already owned → installs directly.
- Paid → routes you to the plugin checkout to complete the purchase.
- Extended License holders → plugins flagged “free for Extended License” install without an extra purchase.
Install / activate
- the plugin’s settings (feature flags, AI caption price and every network’s encrypted OAuth app credentials),
- each user’s connected social accounts (with encrypted access/refresh tokens),
- every composed post (caption + media snapshot + schedule),
- and each network target within a post (its own status, remote id, retry and repost bookkeeping).
social-media-studio:publish-due) which the scheduler runs once a minute.Register a developer app for each network
Social Media Studio publishes on behalf of your users through each network’s official API, which requires an OAuth app (a client ID + secret) that you, the platform owner, register once per network. You then paste those credentials into the plugin config and whitelist the plugin’s callback URL. Two things are true for every network below:- Replace
https://your-domain.comwith your real MagicAds URL (itsAPP_URL). - The exact callback URLs to register are shown, pre-filled and read-only, on the Social Media Studio config screen. Copy them from there to avoid typos.
openai_key) and spends credits. The per-network credentials below are only for publishing — they are separate from the social-login keys some platforms also offer.Callback URLs at a glance
| Network | Redirect / Callback URL to whitelist |
|---|---|
| X (Twitter) | https://your-domain.com/app/social-media-studio/callback/twitter |
https://your-domain.com/app/social-media-studio/callback/linkedin | |
https://your-domain.com/app/social-media-studio/callback/facebook | |
https://your-domain.com/app/social-media-studio/callback/instagram | |
| TikTok | https://your-domain.com/app/social-media-studio/callback/tiktok |
| YouTube | https://your-domain.com/app/social-media-studio/callback/youtube |
| YouTube Shorts | https://your-domain.com/app/social-media-studio/callback/youtube-shorts |
X (Twitter)
X uses OAuth 2.0 Authorization Code with PKCE.Create a developer account
Create an App inside the Project
Enable OAuth 2.0 user authentication
Set the callback and permissions
- Callback URI / Redirect URL:
https://your-domain.com/app/social-media-studio/callback/twitter - Website URL: your MagicAds URL.
- App permissions: Read and write (required to post and upload media).
tweet.read tweet.write users.read media.write offline.access.
Create an app
Request products
Set the redirect URL
https://your-domain.com/app/social-media-studio/callback/linkedinopenid profile email w_member_social.
Facebook (Pages)
Facebook publishing uses the Meta Graph API. Connecting a Facebook account creates one connected destination per Page the user administers.Create a Meta app
Add Facebook Login
Set the redirect URI
https://your-domain.com/app/social-media-studio/callback/facebookAdd permissions
pages_show_list, pages_read_engagement, pages_manage_posts, pages_manage_metadata, plus public_profile.pages_show_list,pages_read_engagement,pages_manage_posts,pages_manage_metadata,public_profile.
Instagram (Business / Creator)
Instagram publishing also runs through the Meta Graph API, so it requires an Instagram Business or Creator account that is linked to a Facebook Page. You can reuse the same Meta app as Facebook or create a separate one.Use a Meta app with Instagram
Set the redirect URI
https://your-domain.com/app/social-media-studio/callback/instagramAdd permissions
instagram_basic, instagram_content_publish, pages_show_list, pages_read_engagement, business_management.Copy the credentials
instagram_basic,instagram_content_publish,pages_show_list,pages_read_engagement,business_management.
TikTok
TikTok uses the TikTok for Developers Login Kit + Content Posting API.Create a developer app
Add Login Kit and Content Posting API
Set the redirect URI
https://your-domain.com/app/social-media-studio/callback/tiktokRequest scopes
user.info.basic, user.info.profile, video.upload, video.publish, photo.upload.user.info.basic,user.info.profile,video.upload,video.publish,photo.upload.
YouTube & YouTube Shorts
Both use one Google Cloud OAuth client and the YouTube Data API v3.Create a Google Cloud project
Configure the OAuth consent screen
.../auth/youtube.upload, .../auth/youtube.readonly, .../auth/userinfo.profile, .../auth/userinfo.email.Create an OAuth client ID
https://your-domain.com/app/social-media-studio/callback/youtubehttps://your-domain.com/app/social-media-studio/callback/youtube-shorts
youtube.upload, youtube.readonly, userinfo.profile, userinfo.email.
Configure Social Media Studio
Go to Admin → General Settings → Plugins → Social Media Studio (/app/admin/general/plugins/social-media-studio). The screen has these sections.
General
| Setting | Purpose |
|---|---|
| Enable Social Media Studio | Master switch. When on, the studio appears in user menus and becomes usable. Off by default. |
| Free Tier Access | When on, users without a paid plan can use the studio. When off, only subscribers get access. |
| AI caption rate (credits per 1000 words) | Cost of generating a caption with AI in the composer. Integer 1–999, default 2. Publishing itself is always free. |
Networks
One card per network with an enable switch, the Client ID / Secret (or Client Key / Secret for TikTok) fields, and the read-only callback URL(s) to copy into that network’s developer app (see Register a developer app). YouTube shows both the YouTube and Shorts callback URLs. A network only appears for users to connect when its switch is on and its credentials are filled.APP_KEY — never in .env and never shown back in plain text after saving.Scheduling — cron requirement
Immediate posts publish during the web request. Scheduled and auto-repost posts are published by a background command that the Laravel scheduler runs every minute. For scheduling to work, the host must run Laravel’s single scheduler cron entry:social-media-studio:publish-due (guarded so it only runs when installed); each minute it publishes everything that’s due and re-arms the next run for auto-repost campaigns until their end date.
Grant access by plan
Access is gated in two layers:- Platform layer — the master Enable Social Media Studio switch must be on.
- User layer — who actually gets the studio:
- Subscribed users (on any plan): access is granted.
- Non-subscribed users (no plan): access only when both Enable Social Media Studio and Free Tier Access are on.
Go-live checklist
Register developer apps
Add the credentials
Add an OpenAI key (optional)
How to Use
All tools live under Social Media Studio in the user sidebar.Connections
Connect an account with one click — the user is sent to the network’s OAuth consent screen and returned with an authorized, encrypted token. From here they can pause (temporarily exclude an account from publishing), reactivate, or disconnect it. Facebook yields one connection per Page; Instagram one per linked Business account; YouTube and Shorts are separate connections.Compose
The studio centerpiece:Caption
Publish to
Per-network content rules
The composer enforces each network’s capabilities automatically:| Network | Text-only | Image | Video | Caption limit |
|---|---|---|---|---|
| X (Twitter) | Yes | Yes | Yes | 280 |
| Yes | Yes | Yes | 3,000 | |
| Yes | Yes | Yes | 63,206 | |
| No (media required) | Yes | Yes (Reels) | 2,200 | |
| TikTok | No (media required) | Yes | Yes | 2,200 |
| YouTube | No (video required) | No | Yes | 5,000 |
| YouTube Shorts | No (vertical video required) | No | Yes | 5,000 |
Calendar
A two-column timeline: Upcoming (scheduled and auto-repost deliveries grouped by day, with the repost badge) and Recently published (with links to the live posts).Posts
A filterable history (Scheduled / Completed / Partial / Failed). Each row shows the caption, a chip per target network coloured by outcome, and the created time. Open any post for a per-network breakdown (status, publish time or error, and a link to the live post), or delete it.Media & storage
Networks that pull media from a URL (Facebook, Instagram, TikTok photos) need the creative to be reachable publicly. Local studio results are served from the public results disk and work out of the box. If you offload creatives to a cloud provider (Amazon S3 / Wasabi plugin), the studio resolves the provider’s public/signed URL automatically; for binary-upload networks (X, LinkedIn, YouTube) it downloads the file server-side and streams it to the API.Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Studio doesn’t appear for a user | Master switch off, or a plan-less user with Free Tier off | Enable the master switch; enable Free Tier Access for plan-less users. |
| A network isn’t offered on Connections | Network switch off or credentials missing | Enable the network and add its Client ID/Secret in the config. |
| ”is not configured yet” when connecting | Credentials missing/incorrect for that network | Re-check the Client ID/Secret and the whitelisted callback URL. |
| ”Security verification failed” on callback | OAuth state mismatch / lost session | Retry the connection; ensure cookies/session work and the callback URL matches exactly. |
| Connect fails with a redirect-URI error | The callback URL isn’t whitelisted in the developer app | Copy the exact URL from the config screen into the network’s redirect URI list. |
| Only test users can connect | The developer app is in Development/Testing mode | Complete the network’s App Review/verification and switch the app to Live. |
| Scheduled posts never go out | Cron not running | Configure * * * * * php artisan schedule:run. |
| ”The account token expired — please reconnect” | OAuth token expired and couldn’t refresh | The user reconnects the account from Connections. |
| Instagram/TikTok says media unreachable | Creative not publicly reachable | Ensure the results disk is public, or enable a cloud storage plugin (S3/Wasabi). |
| AI caption returns nothing / “not configured” | No OpenAI key in AI Settings, or insufficient credits | Add an openai_key in Admin → AI Settings; ensure the user has enough credits. |
| Post shows Partial | Some networks succeeded, others failed | Open the post to see the per-network error and retry. |
| X posting rejected / capped | X Free tier write limit reached | Posting on X effectively requires a paid API tier (Basic or higher); upgrade the X API plan. |

