Title: PublisherKits SocialPromoter
Author: PublisherKits
Published: <strong>July 24, 2026</strong>
Last modified: October 20, 2026

---

Search plugins

![](https://ps.w.org/publisherkits-socialpromoter/assets/banner-772x250.png?rev=
3621968)

![](https://ps.w.org/publisherkits-socialpromoter/assets/icon-256x256.png?rev=3621968)

# PublisherKits SocialPromoter

 By [PublisherKits](https://profiles.wordpress.org/publisherkits/)

[Download](https://downloads.wordpress.org/plugin/publisherkits-socialpromoter.1.58.2.zip)

 * [Details](https://wordpress.org/plugins/publisherkits-socialpromoter/#description)
 * [Reviews](https://wordpress.org/plugins/publisherkits-socialpromoter/#reviews)
 *  [Installation](https://wordpress.org/plugins/publisherkits-socialpromoter/#installation)
 * [Development](https://wordpress.org/plugins/publisherkits-socialpromoter/#developers)

 [Support](https://wordpress.org/support/plugin/publisherkits-socialpromoter/)

## Description

SocialPromoter by PublisherKits lets publishers post and schedule social media content
from WordPress Posts directly to X (Twitter), LinkedIn, Facebook Pages and Bluesky—
without leaving the editor.

**Core features (free — everything in this plugin is fully functional):**

 * Write social copy with a live character counter (280-character X warning)
 * Click post tags to insert as hashtags
 * Post Now — fires immediately to all selected accounts
 * Schedule — pick a date and time, WP Cron handles the rest
 * Queue view — see all upcoming scheduled posts and cancel any
 * Post history — the full, paginated log of everything sent, with errors
 * Multiple accounts per platform — ideal for agencies and multi-brand publishers
 * Brand hashtags — standing tags blended into every post

**Pro features — supplied in a separate package; their implementation is not included
in this WordPress.org build:**

 * Engagement statistics — likes, comments, shares and clicks on sent posts
 * Campaigns — group posts, UTM-tag every link, PDF/GA4 client reports
 * Automation — new-post suggestions, reposting and story boosts
 * AI copy drafting — tone, goal and technique variants
 * Branded images — platform-sized canvases with your logo and headline bar
 * WP Job Manager support — post and schedule from job listings
 * Author tagging — writers’ handles and hashtags suggested automatically, stored
   in BioBuilder-compatible fields so the two stay in sync
 * Assisted posting — for places that will not accept a post from an app, LinkedIn
   and Facebook groups among them. SocialPromoter does not post to those on your
   behalf and neither does anything else: both platforms closed group posting to
   third-party apps. What it does instead is everything up to the send — writes 
   the copy, prepares the image, holds it until the moment you chose, then reminds
   you and hands it over with one-click copy and a link straight to the destination.
   You paste; it records that you posted it

**Supported platforms:**

 * X (Twitter) — OAuth 1.0a, posts via API v2
 * LinkedIn — personal profiles and company pages
 * Facebook — pages (requires Facebook developer app)
 * Bluesky — app-password login, posts with clickable links

X and Facebook use your own developer app credentials. LinkedIn uses the shared 
PublisherKits relay app so company-page posting can use the approved LinkedIn Community
Management API access.

#### More from PublisherKits

SocialPromoter is one of a small range of tools built for people who actually run
publications. Each works on its own, and all are free on WordPress.org:

 * [PublisherKits BioBuilder](https://wordpress.org/plugins/publisherkits-biobuilder/)–
   stop leaving author profiles blank. When a post is published, BioBuilder finds
   the author’s professional profile and fills in their bio, social handles, job
   title and employer.
 * [PublisherKits ExcerptBuilder](https://wordpress.org/plugins/publisherkits-excerptbuilder/)–
   AI-powered excerpt generation using the WordPress AI Client. Write, rewrite or
   tidy excerpts on demand, or auto-draft them on publish for review.
 * [PublisherKits PluginTidy](https://wordpress.org/plugins/publisherkits-plugintidy/)–
   works out which plugins your site actually uses, records every plugin change,
   and makes removing one safe.

#### External Services

This plugin connects to the following external APIs when you have configured credentials
and connected accounts:

 * **X API** (api.twitter.com and upload.twitter.com) — for OAuth authentication,
   posting tweets and uploading post images. Your post text, link and image are 
   sent when you post; your app credentials are sent when authenticating. [X Developer Terms of Service](https://developer.twitter.com/en/developer-terms/agreement-and-policy)
   | [X Privacy Policy](https://x.com/en/privacy)
 * **Facebook Graph API** (graph.facebook.com) — for OAuth authentication and posting
   to Facebook Pages. Your post text, link and image are sent when you post; your
   app credentials are sent when authenticating. [Meta Platform Terms](https://developers.facebook.com/terms/)
   | [Meta Privacy Policy](https://www.facebook.com/privacy/policy/)
 * **LinkedIn API** (api.linkedin.com) — for OAuth authentication and posting shares.
   Your post text, link and image are sent when you post. [LinkedIn API Terms of Use](https://legal.linkedin.com/api-terms-of-use)
   | [LinkedIn Privacy Policy](https://www.linkedin.com/legal/privacy-policy)
 * **Bluesky API** (bsky.social) — for app-password authentication and posting. 
   Your post text, link and image are sent when you post. [Bluesky Terms of Service](https://bsky.social/about/support/tos)
   | [Bluesky Privacy Policy](https://bsky.social/about/support/privacy-policy)
 * **PublisherKits LinkedIn connect relay** (pkits.org) — LinkedIn connections are
   authorised through a shared PublisherKits developer app, so you do not need your
   own LinkedIn developer app. The relay is operated by us (PublisherKits, Black
   and White Trading Ltd) and is contacted in two situations. During the connect
   step: when you click Connect, your browser is sent to LinkedIn to sign in, and
   your site then posts a one-time ticket, a nonce and a signature to the relay 
   to complete the OAuth handshake and receive the LinkedIn access token, which 
   is stored encrypted on your own site. And to renew access: LinkedIn access expires
   after about 60 days, so up to once a day (and when a post finds access already
   expired) your site posts the connection’s stored LinkedIn refresh token and your
   site’s host name to the relay, which exchanges it with LinkedIn for a new access
   token and returns it; the relay does not store or log either token. No post content,
   personal data or analytics is ever sent to the relay; posts go directly from 
   your site to api.linkedin.com. [PublisherKits Terms of Service](https://publisherkits.com/terms/)
   | [PublisherKits Privacy Policy](https://publisherkits.com/privacy-policy/)
 * **PublisherKits Support Copilot service** (bwtlsupport.com) — optional in-plugin
   support assistant, the Help button on SocialPromoter admin screens. When you 
   use it, your question and recent chat history are sent, together with your site
   address and (where available) its licence installation identifier used to authorise
   the request and apply fair-use limits, the plugin version and those of other 
   installed PublisherKits plugins, the admin screen name, and a short whitelist
   of non-sensitive settings and counts (which social platforms have a connected
   account, how many accounts and how many queued, sent and failed posts exist, 
   and five on/off settings covering reminders, queue auto-cancel, debug logging
   and uninstall clean-up). No account names or handles, access tokens, API keys,
   post copy or scheduled-post content are ever sent, and the assistant is read-
   only — it cannot change anything on your site. Nothing is sent until a user who
   can manage this plugin’s settings accepts the in-widget privacy notice; consent
   can be withdrawn on the Support screen. Ordinary questions are not retained after
   they are answered. Only if you open the ticket form (“Send to support” or “Still
   need to raise a ticket?”) and click “Create ticket” does the plugin send the 
   conversation (up to its 20 most recent messages), the site details, settings 
   and counts above, the question category, the contact email address you enter (
   pre-filled with your WordPress account email) and the first and last name from
   your WordPress user profile; these are kept, to become a support ticket. [PublisherKits Terms of Service](https://publisherkits.com/terms/)
   | [PublisherKits Privacy Policy](https://publisherkits.com/privacy-policy/)

No data is sent to these services until you have configured app credentials and 
connected accounts. Posting only occurs when you explicitly click Post Now or approve
a scheduled post. The Support Copilot sends nothing until its privacy notice is 
accepted.

This plugin also uses the **Freemius SDK** (freemius.com) for licensing, updates
and optional usage diagnostics. No data is sent to Freemius unless you explicitly
opt in on the activation screen — skipping the opt-in keeps the plugin fully functional.
[Freemius Terms of Service](https://freemius.com/terms/) | [Freemius Privacy Policy](https://freemius.com/privacy/)

This free plugin makes no AI requests: AI copy drafting belongs to the separately
distributed Pro version, which uses the AI provider the site configures in WordPress
core’s Settings > Connectors, under that provider’s own terms and privacy policy.

## Screenshots

[⌊Compose: pick any published post, choose X, LinkedIn and Facebook, write your 
copy, and schedule or post now.⌉⌊Compose: pick any published post, choose X, LinkedIn
and Facebook, write your copy, and schedule or post now.⌉[

Compose: pick any published post, choose X, LinkedIn and Facebook, write your copy,
and schedule or post now.

[⌊Activity: see every scheduled post across your platforms at a glance, and cancel
any before it sends.⌉⌊Activity: see every scheduled post across your platforms at
a glance, and cancel any before it sends.⌉[

Activity: see every scheduled post across your platforms at a glance, and cancel
any before it sends.

[⌊Connected Platforms: connect X, LinkedIn, Facebook and Bluesky, and manage all
your accounts in one place.⌉⌊Connected Platforms: connect X, LinkedIn, Facebook 
and Bluesky, and manage all your accounts in one place.⌉[

Connected Platforms: connect X, LinkedIn, Facebook and Bluesky, and manage all your
accounts in one place.

[⌊Settings: control the publish reminders, the post types they apply to, the roles
that see them, and your default post copy.⌉⌊Settings: control the publish reminders,
the post types they apply to, the roles that see them, and your default post copy
.⌉[

Settings: control the publish reminders, the post types they apply to, the roles
that see them, and your default post copy.

## Installation

 1. Upload the plugin folder to `/wp-content/plugins/`
 2. Activate via Plugins in the WordPress admin
 3. Go to **PublisherKits > SocialPromoter** to configure your platform credentials
 4. Add the callback URL shown on the Accounts page to your developer app settings 
    on each platform
 5. Click **Save & Connect** to authorise posting

## FAQ

### Do I need developer accounts for each platform?

You register developer apps for X and Facebook. LinkedIn uses the shared PublisherKits
relay app, so no local LinkedIn developer credentials are required in the plugin.

### What is the callback URL?

It is shown at the top of the Accounts page. Add it to the Redirect URIs / Callback
URLs in each platform’s developer portal before connecting.

### Does this work on shared hosting?

Yes. Scheduled posts use WP Cron, which works on cPanel shared hosting. Posting 
runs as soon as WP Cron fires after the scheduled time, typically within a few minutes
of a site visit.

### Can I connect multiple X accounts?

Yes — you can connect multiple accounts per platform (e.g. separate X accounts for
each of your brands).

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“PublisherKits SocialPromoter” is open source software. The following people have
contributed to this plugin.

Contributors

 *   [ PublisherKits ](https://profiles.wordpress.org/publisherkits/)

[Translate “PublisherKits SocialPromoter” into your language.](https://translate.wordpress.org/projects/wp-plugins/publisherkits-socialpromoter)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/publisherkits-socialpromoter/),
check out the [SVN repository](https://plugins.svn.wordpress.org/publisherkits-socialpromoter/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/publisherkits-socialpromoter/)
by [RSS](https://plugins.trac.wordpress.org/log/publisherkits-socialpromoter/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.58.2

 * Fix: On sites where another plugin changes PHP’s default timezone away from UTC,
   scheduled posts were sent early or late by the timezone’s offset – an hour early
   during British Summer Time where it was set to Europe/London. Every stored time
   is now read explicitly as UTC. On update, posts already scheduled with the wrong
   time are moved back to their correct time automatically.
 * Fix: Campaign start and end dates, and the campaign report’s send times, could
   show a day or an hour off on those same sites. The connection status “last posted…
   ago”, and the Bluesky “connected” time, could likewise be off by the site’s UTC
   offset.

#### 1.58.1

 * Updated Freemius SDK to the latest version.
 * Fix: A social post is no longer sent while the article it links to is unpublished.
   If an article was published and then moved back to a scheduled date, or taken
   back to draft, before its social post went out, the post went out anyway and 
   linked to a page that did not exist yet. Sends now wait for the article: one 
   whose article is scheduled goes out a minute after it is live, and one whose 
   article was taken back to draft goes out once it is published again. A send you
   deliberately scheduled for after the article is left where you put it. While 
   a send is waiting, the Queue screen says so and why. On one live site this had
   happened for seven articles since August, and two of those social posts were 
   still pointing at a missing page weeks later.

#### 1.58.0

 * Maintenance: updated the shared PublisherKits library this plugin bundles (PK
   Core 0.9.25). No change to how SocialPromoter posts, schedules or connects.
 * The shared Site Profile screen is easier to use: the “Where do you want to get
   to” section repeated almost every question above it, which made one long page
   out of two. It is now a single line you can open, and it opens by itself when
   you have set a target there.
 * The Site Profile now asks where your readers are and which spelling you publish
   in, as two separate questions, because WordPress assumes US English even on a
   UK site and the two answers are not always the same. You can also record a second
   market.
 * A profile question added by another PublisherKits plugin now says which plugin
   uses it, instead of reporting that no plugin does.

#### 1.57.0

 * Fix: Scheduled posts can no longer get stuck in “sending” for ever. If the server
   stopped a send part-way – common on busy shared hosting, where WordPress runs
   scheduled tasks inside page visits – the post stayed “sending” indefinitely and
   was never posted; one site had 1,289 such posts. A recovery task now runs every
   15 minutes: a post stuck for more than 15 minutes is retried, up to three attempts,
   then marked failed with the reason. A post more than 24 hours past its scheduled
   time is never sent late – it is marked “Expired” instead. A post whose send stopped
   while the platform was publishing it is not retried automatically, because it
   may already be live; it is marked failed and asks you to check.
 * Fix: Each send now records the step it reached before every network call, so 
   a failed or interrupted post shows where it stopped. The Activity screen now 
   lists posts that are currently sending, with their attempt number and last step–
   previously they appeared nowhere.
 * New: LinkedIn connections now renew themselves. LinkedIn access lasts about 60
   days; the plugin now uses the renewal token LinkedIn already provides (via the
   PublisherKits relay) to renew access automatically 14 days before it expires,
   daily, and again at the moment of sending if access has already run out. LinkedIn’s
   yearly authorisation still needs a person to reconnect once a year: you are now
   warned 30, 14 and 3 days before it ends. The Platforms screen shows each LinkedIn
   connection’s renewal status and has a “Renew access now” button.
 * New: SocialPromoter now tells you when WordPress is not running its scheduled
   tasks on time, on every SocialPromoter screen and by email, with exact instructions
   for adding a server cron job. The plugin cannot add a server cron job itself;
   the notice says so.
 * New: Alert recipients setting (Settings > Advanced). Problems with scheduled 
   posting – stuck or overdue posts, scheduled tasks not running, a connection that
   cannot post, a LinkedIn authorisation about to end – are emailed to the addresses
   you list, or to the site admin email if you leave it empty. The check now runs
   hourly, and while a problem lasts the email repeats once a day instead of being
   sent only once.
 * New: A dashboard widget shows how many posts are stuck, overdue or failed, and
   whether scheduled tasks are running on time.
 * Fix (Pro): The connection-health check now runs hourly instead of daily, and 
   posts that failed because a send was interrupted no longer count against an account’s
   connection – a stopped server process says nothing about whether the account 
   works.
 * Fix (Pro): House campaigns, automation and reposting now count a post that is
   mid-send as posted. They counted only sent and scheduled posts, so a campaign
   whose posts were stuck sending kept queueing replacements.
 * Note: The PublisherKits LinkedIn relay is now also contacted once a day to renew
   LinkedIn access, as described under External Services.

#### 1.56.0

 * New: Support Copilot can now answer Help questions using an AI provider you have
   already connected to this site, instead of our support service. It runs on the
   WordPress core AI Client and reads no licence, token or plugin data, so it works
   the same in the free and Pro builds. If a local answer fails it falls back to
   the support service, sending the question and recent chat history – the privacy
   notice and Answer mode text now say so plainly.
 * Fix: The in-plugin support link now reaches the right place. The Freemius contact
   form was enabled and the support link hidden, which is the wrong way round: that
   form emails us but never raises a ticket, and a customer report went unanswered
   because of it. Paying customers now get the plugin support desk, free users the
   WordPress.org forum.
 * Fix (Pro): Connecting LinkedIn no longer switches on posting for every company
   page you administer. The shared app returns every page you have rights to – thirteen
   on one of our own sites – and all of them used to become live posting targets
   from a single click. Only the page matching this site is pre-selected now; tick
   any others you want. Accounts you have already connected are not affected.
 * Fix (Pro): Disconnecting an account no longer removes it from the list. It stays,
   greyed out, with a Reconnect button, and reconnecting restores the posting selection
   it had. Disconnect also asks for confirmation now, and points out that unticking
   Use for posting is what you want if you only mean to stop posting there.
 * Fix (Pro): Reconnecting a platform keeps your posting selection instead of re-
   enabling every account on it.
 * Fix: Each platform on the Platforms screen now explains its connected state rather
   than repeating the first-time setup instruction forever. LinkedIn in particular
   told you to click Connect even when company pages were already connected and 
   listed underneath it.
 * Fix: The Compose screen now explains each section, including which field prints
   on the image and which is the text of the post. Selecting a post fills the copy
   box with its title, so the two start out identical, and nothing said they were
   different.
 * Fix (Pro): Saving an Image headline now updates an open preview immediately instead
   of asking you to close and reopen it.
 * Fix: Selecting a second or subsequent account no longer scrolls the page down
   to the new panel.

#### 1.55.2

 * Fix: The Compose preview no longer cuts the headline and logo bands off the LinkedIn
   image. The preview box was still shaped to the old 1.91:1 image, so the taller
   4:3 image introduced in 1.55.1 overflowed it and was trimmed top and bottom –
   exactly where the bands sit. The image itself was always correct; only the on-
   screen preview was cropping it, and anything you posted carried its full branding.
 * Fix (Pro): The “Reconnect the account” button on the broken-connection warning
   now takes you to the platform that needs reconnecting, and highlights it. Previously
   it linked to the Platforms screen as a whole – so if the warning appeared while
   you were already on that screen, clicking it reloaded the page and appeared to
   do nothing at all.

#### 1.55.1

 * Fix (Pro): Images posted to LinkedIn are no longer surrounded by blurred grey
   bars. They were being built at 1.91:1, the ratio LinkedIn’s own documentation
   recommends, but the post tiles on your company page and on the page admin dashboard
   are fixed at 4:3 – so roughly a third of every tile was filler. Images are now
   built at 4:3 (1200×900), which fills those tiles and still renders edge to edge
   in the main feed. Applies to company Pages and personal profiles alike; X, Facebook
   and Bluesky are unchanged. Images already posted keep their old shape.
 * Fix (Pro): Less of your featured image is now cropped away on LinkedIn. Because
   most featured images are squarer than 1.91:1, the old canvas had to discard a
   lot of height to fill the frame – a 1868×1443 chart lost 32% of its picture, 
   taking the top and bottom off it. On the new 4:3 canvas the same image loses 
   3%.
 * Fix (Pro): “Rewrite headlines to fit” no longer produces a truncated headline.
   The instruction to the AI set a character budget but nothing checked the reply,
   and a headline that came back over the budget was trimmed mid-word and then cached
   against that post – so it stayed wrong. The budget is now enforced: the AI gets
   one corrective attempt, and if it still overruns, your own headline is used instead.
   An over-length rewrite is never cached.

#### 1.55.0

 * New (Pro): SocialPromoter now tells you when a connection stops working. Until
   now a revoked token or a deleted developer app produced nothing but failed sends:
   on one site LinkedIn had been failing for a fortnight and X for seven weeks, 
   146 consecutive posts, with no warning anywhere. Repeated failures on the same
   account now raise a notice in the admin and send one email per incident, and 
   an account that fails with an expired or revoked token is reported immediately
   rather than after several attempts. One message per incident, not one per failed
   post.
 * Fix: The Platforms page no longer says “Connected” for an account that cannot
   post. The badge was based only on whether an account had ever been added, which
   stays true forever once you have connected once — so a broken connection read
   as healthy. It now reflects the last send attempt and shows “Not working” when
   every account on a platform is failing. If a platform you believed was connected
   now reads “Not working”, it was already broken; the page was not telling you.
 * Fix: The Callback URL box now says what that URL is. It is one URL for the whole
   site, shared by every platform, and it was easy to read it as belonging to whichever
   platform you were looking at — or to hunt for a missing one on each card. It 
   now says so, and splits the instruction: X and Facebook need it pasted into your
   own developer app before connecting, while LinkedIn and Bluesky do not use it
   at all.
 * New: The Platforms page now links the setup guides for each platform, and points
   out the Help button in the bottom-right corner, which opens the support assistant.
   The page’s guidance panel has been rewritten around the things that actually 
   stop a connection working — Facebook’s App domains field, X’s read-only default
   permission, and browsers autofilling an email address into the App ID box.
 * New (Pro): The Health screen now shows a card for platform connections, with 
   the state of each connected account.
 * Update: Support Copilot 2.1.4. Its privacy notice now states exactly what the
   support ticket form sends, rather than describing it in general terms.

#### 1.54.0

 * Security: The Support Copilot now checks who is asking as well as where the request
   came from. Its admin requests were guarded by a single check that proves a request
   originated from a page the plugin rendered — which is not the same as proving
   the person sending it is allowed to make it. Those are now two separate checks,
   and both must pass. Nothing changes in normal use and no action is needed.
 * New: An AI assistant can now read this site’s profile. If you use an assistant
   that speaks MCP, it can ask the site for the publication’s own context — what
   you cover and who you publish for — so it works from the same description SocialPromoter
   already uses when it writes copy. It is read-only, it is limited to users who
   could see that information in the admin anyway, and it needs WordPress 6.9 or
   later. On earlier WordPress nothing changes and nothing breaks.
 * Fix: Clearing a field on the site profile now really clears it. Emptying the 
   site context used to leave the previous wording behind in the older shared setting,
   and that copy kept feeding AI prompts — so a publication that had rewritten its
   description could find the old version still shaping generated posts. One safeguard
   is deliberately kept: an empty value cannot wipe a complete older profile on 
   a site whose profile has never held that field.
 * New: Generated copy is now framed by the publication’s highest-value audience
   where the site profile records one, so posts are pitched at the readers that 
   matter most rather than at a general audience.
 * Fix: Longer site profile notes are no longer flattened onto a single line each
   time they are saved.
 * Fix: The shared profile no longer carries a site name it did not need, and is
   de-identified before it is passed between plugins.
 * Update: Bundles PublisherKits Core 0.8.4 to 0.9.16. The shared Site Profile is
   mirrored onto the older shared options, so other PublisherKits plugins that have
   not moved to the core profile keep reading the same values. On a site running
   SocialPromoter alongside another PublisherKits plugin, this becomes the active
   core for both.

#### 1.53.1

 * Fix (Pro): The Assisted posts screen now uses SocialPromoter’s own styling rather
   than plain WordPress form styling, so it matches the rest of the plugin.
 * Fix (Pro): On the Assisted posts screen, the destination’s name field was labelled
   only “Name”, which could be read as asking for the post’s title. It now says 
   what it wants: the name of the group or community you are posting to. The other
   fields on that form gained short explanations too.
 * Fix (Pro): The composer now shows the assisted destinations card even before 
   you have added any, with a link to add one. Previously the card was hidden entirely
   until a destination existed, so the screen where you decide where a post goes
   never mentioned that assisted destinations were an option.

#### 1.53.0

 * New (Pro): Assisted posting, for the places a plugin is not allowed to post to.
   LinkedIn closed its groups API to third parties, and Meta removed group posting
   from every version of its API in April 2024, so no plugin can post to a LinkedIn
   or Facebook group for you — ours included. Assisted posting does everything else:
   add the group as a destination, schedule to it from the composer exactly as you
   would to a connected account, and SocialPromoter prepares the copy and the image
   and holds it until the moment you chose. Then it tells you it is ready, gives
   you the text on one click and a link straight to the group, and records that 
   you posted it by hand. It can also suggest recent posts you have not offered 
   to a group yet, and you can wave away one suggestion or all of them. Your history
   says a person posted it, never that SocialPromoter did, and there are no engagement
   figures for these — no API returns them, so any number would be invented.
 * Fix: The Social panel in the post editor could show a blank status line, and 
   hide a real one. A group of sends with nothing left to report — after cancelling
   a scheduled post, for instance — was still treated as the most recent activity,
   so it displaced the “Posted to X, LinkedIn” line for a post that really had gone
   out. Sends with nothing to report are now skipped, and a post with no reportable
   activity says so plainly.
 * Fix (Pro): Campaign objective progress no longer counts posts that never went
   out. The channel report worked out which posts belonged to which campaign objective
   by looking for a send timestamp, but that timestamp is written whenever a post
   reaches its final state – including when a send fails – so posts that never reached
   the platform were being counted towards the objective as though they had. Skipped
   assisted posts would have counted the same way. Only posts that actually sent
   are counted now. **Existing campaigns may show a lower figure than before, and
   in some cases noticeably lower.** Nothing has been lost and no data has changed:
   the earlier number was overstating what went out, and the new one is the true
   count.
 * Fix: Two SocialPromoter screens were rendering without the plugin’s own styling.
   Admin styles and scripts were loaded from a hand-maintained list of screens that
   had to be edited whenever a screen was added, and twice it was not — the Support
   screen (added in 1.52.0) and the Pro Channel report have both been showing default
   WordPress form styling rather than SocialPromoter’s, with the SP badge in the
   heading collapsing to plain text. The list is gone; the plugin now works out 
   its own screens automatically, so this cannot happen again as screens are added.
 * Fix: The “Show to user roles” setting under Settings now does what it says. It
   has always been saved, but nothing read it, so the promote-this-post reminder
   and the amber unpromoted banner appeared for every user who could edit the post
   regardless of which roles were ticked. Sites that never changed the setting are
   unaffected: the default is still administrators and editors.

#### 1.52.2

 * Fix: SocialPromoter could clear the site’s primary goal or audience description
   held in the shared PublisherKits site profile. Saving SocialPromoter’s settings
   sent both values even when the form only carried one, so whichever field was 
   absent was blanked – overwriting a value set in another PublisherKits plugin.
   SocialPromoter now sends only the fields the form actually carried, and will 
   no longer clear a value that is already set. Clearing a goal or audience is done
   where it is edited.

#### 1.52.1

 * Security: the Support Copilot now sends its requests through WordPress’s protected
   HTTP function, which validates the destination and refuses private, loopback 
   and link-local addresses — including on redirects. The support endpoint is an
   administrator-editable setting, so this closes off the possibility of it being
   pointed at internal infrastructure. Recommended for all users.
 * Security (Pro): Google Analytics credentials — the service account JSON, and 
   the OAuth client secret and refresh token where they are used — are now encrypted
   before they are stored, so they no longer sit in plain text in database exports
   and backups. Existing connections keep working: the stored values are re-encrypted
   automatically the first time they are read, and nothing needs to be re-entered
   or reconnected.

#### 1.52.0

 * New: Support Copilot — a Help button on SocialPromoter admin screens that answers
   usage and setup questions in a popup chat, grounded in documentation matched 
   to your installed version. It is read-only: it can explain, but it can never 
   change anything on your site. Manage it under SocialPromoter > Support. Nothing
   is sent to the support service until a user who can manage this plugin’s settings
   accepts the in-widget privacy notice, and consent can be withdrawn at any time.
   Your connected account names and handles, access tokens, post copy and scheduled
   posts are never sent. See the External Services section for the full disclosure.

#### 1.51.13

 * Automated posting now spreads posts published close together across your posting
   window, instead of sending them all at once. The minimum gap was previously measured
   only from the last post that had actually been sent, so several articles published
   within a few minutes of each other could each be given the same slot and go out
   together.

#### 1.51.12

 * Facebook: image posts are now published explicitly as Page feed posts — the image
   is uploaded first, then attached to a feed post. This is a clearer publishing
   path and returns a proper post ID for engagement statistics.
 * Branded images (Pro): the automatic crop now keeps faces in frame, anchoring 
   to the head with headroom above it so crowns are no longer clipped on portrait
   photos.

#### 1.51.11

 * Fixed the History screen capability so it and its manage actions require the 
   same permission (administrator), instead of appearing for editors who would then
   be refused.
 * Hardened the Compose screen’s JavaScript: AJAX result text and all preview image
   URLs are now inserted as text/attributes rather than built into HTML strings.
 * Removed the last vestigial licence-flag branches and comments from the free build;
   upgrade notices render through a small, clearly-named helper.
 * Tidied several stale comments and one External Services wording detail.

#### 1.51.10

 * Post history is now a full, paginated free feature: a dedicated History screen
   lists every sent post and any failures, grouped by send, with per-send error 
   messages and delete/clear-all. Engagement statistics on that screen remain a 
   Pro feature. (Previously the free build showed only the most recent sends.)
 * Removed the Pro licence flag from the free package entirely (it was already unused
   there); the upgrade notices simply always show, since this is the free tier.
 * Removed the remaining branded-image preview fields and hooks from the free Compose
   screen; an add-on now enhances the preview through a neutral event.
 * Minor: readme description and the accounts screen no longer mention Pro-only 
   surfaces; tidied a few stale comments.

#### 1.51.9

 * Review-hardening: the bundled PublisherKits core library’s admin strings now 
   use this plugin’s text domain in the shipped build; the plugin’s own Freemius
   bootstrap helpers and admin script globals were standardised to the plugin’s 
   pkits_sp / pkitsSp prefix; and the free build no longer references the Pro licence
   flag at all (upgrade notices show unconditionally, since this package is the 
   free tier).
 * Compose: added a native Bluesky post preview (300-character layout) instead of
   falling back to the X preview; moved the last branded-image preview labels into
   the premium package.

#### 1.51.8

 * Fixed a fatal JavaScript syntax error in the free admin script left by the previous
   build’s code separation; every queue and posting behaviour it carries works again,
   verified by parser check on the shipped file.
 * Fixed a Compose script error when clearing a selected post (a variable owned 
   by the premium author-tagging module leaked into the free script).
 * Completed the free/Pro separation the previous passes missed: the History screen’s
   row-management script, the signposting content-class subsystem and its term-search
   endpoint, the topic-balance scorer, the AI prompt-framing helper, the queue-item
   delete endpoint (premium History is its only caller), the branded-image font,
   and the Pro campaign-editor media screens now all live only in the premium package.
 * Brand hashtags’ Fallback mode is now honoured on the free send path (skips posts
   already carrying two or more of their own hashtags).
 * External Services now discloses upload.twitter.com (X image uploads); Bluesky
   wording corrected to “posts with clickable links”; settings copy no longer describes
   AI behaviour the free build does not have; the LinkedIn relay URL is written 
   plainly in code.

#### 1.51.7

 * WordPress.org review compliance, final pass: the Compose screen’s remaining Pro
   scaffolding (author-tags container, image-headline editor script, branded-image
   fit notes, campaign field wiring) and the Pro admin script behaviours (engagement-
   stat refresh, clear-all-history, author-tag insertion) now live in separate premium-
   only files; the free package’s JavaScript references only AJAX actions the free
   package registers.
 * Removed the Pro campaign link and page scaffolding from the free Accounts screen
   and admin loader.
 * Security: publishing from Compose now requires the publish_posts capability plus
   per-post edit permission, and the publish-reminder status endpoint now checks
   per-post edit permission.
 * Fixed: “Delete all failed” on the queue screen was rejected by its own handler;
   the delete-all sentinel now works.
 * Renamed the private crypto class to the plugin prefix (PKITS_SP_Crypto) and removed
   its class_exists wrapper.

#### 1.51.6

 * WordPress.org review compliance, third pass — the free/Pro boundary is now implementation-
   level, not gate-level. Removed from the free build: the per-platform engagement-
   stat fetchers inside each connector (and the Facebook read_insights opt-in and
   OAuth scope), the “Boost this story” metabox controls and save handling, the 
   reporting/GA4 configuration store, the analytics read API, the campaign/stats/
   campaign-link database tables and their migrations, automation-suggestion storage
   and approval surfaces, the full-history links and clear-history action, and the
   Compose screen’s AI drafting, campaign and author-tagging scaffolding (now separate
   premium files).
 * The free build’s licence flag is now a plain false constant: nothing is consulted
   and nothing can be unlocked, because no premium implementation exists in the 
   package.
 * Brand hashtags now genuinely blend on the free build’s sends (previously the 
   blending only ran in Pro); modes and per-platform caps are honoured (‘fallback’
   applies when a post carries fewer than two of its own hashtags).
 * The plugin description and platform list now describe the free plugin only, and
   include Bluesky.

#### 1.51.5

 * WordPress.org review compliance, second pass: every Pro feature is now delivered
   as separate premium-only code that is physically absent from the free build —
   engagement statistics (class, scheduled refresh, queue display and refresh actions),
   WP Job Manager support (now a Pro integration module the free code exposes filters
   for), AI copy drafting (client, prompt library, settings and defaults), the GA4
   connection, channel-report and PDF/UTM settings and their save handling, and 
   the metabox author-tagging helpers. The free build no longer contains any licence-
   gated functionality, and the licence flag no longer carries a force override 
   there.
 * Multiple accounts per platform is now correctly listed as a free feature (the
   code never limited it), and brand hashtags are listed free too. Engagement statistics
   move to the Pro list, matching the code.
 * Removed the remote Google Fonts stylesheet from admin screens; the UI now uses
   bundled system font stacks (no external requests).
 * Fixed a Compose-screen script error: a PHP constant leaked into JavaScript as
   an undefined name when a post was selected.
 * WordPress.org review compliance: the Pro branded-image pipeline (resizing to 
   platform canvases, logo watermark, headline bars) no longer ships in the free
   build in any form. The image code is split into a free handler (fetch, validate,
   clean up – free posting is unchanged and posts images exactly as supplied) and
   a separate Pro-only brander that is physically removed from the free build, along
   with its settings panel, live preview, save handling and Compose headline editor.
 * Fixed: the Compose screen could fatal on the free build (an unguarded reference
   to the Pro AI copy class).
 * Fixed: the Brand hashtags settings (a free feature) were only saved when Pro 
   was active; they now save on the free build too.
 * The AI connector diagnostic no longer reads any core AI credential option; it
   only reports whether a connector’s provider plugin is active.
 * External Services: the PublisherKits LinkedIn connect relay entry now spells 
   out exactly what is sent (a one-time ticket, nonce and signature during the connect
   step – never post content or personal data) with terms and privacy policy links,
   and every platform API entry now carries both terms and privacy links.
 * Escaping: admin-ajax URLs printed into inline scripts now use esc_url (output
   escaping) rather than esc_url_raw.

#### 1.51.4

 * Facebook: new optional “Show link-click counts” setting on the Platforms page.
   Tick it (after adding the read_insights permission to your own Facebook app –
   available at Standard Access for Pages you administer, no App Review) and reconnect
   the Page to see link clicks on sent posts, alongside likes and comments.
 * Facebook: post impressions and reach are no longer requested – Facebook removed
   those metrics from its API for all apps, so they cannot be shown. Requesting 
   them alongside the working metrics was also occasionally stopping likes, comments
   and clicks from appearing; that is fixed.
 * Updated the on-screen stats notes so they describe what each platform actually
   provides today.

#### 1.51.3

 * Fixed: campaign report PDFs could fail on sites running another PDF-generating
   plugin. The bundled PDF library now ships its complete font set, always uses 
   its own fonts, and a PDF failure now shows a clear error instead of a broken 
   page. The PDF library is no longer included in the free build (campaign reports
   are a Pro feature).

#### 1.51.2

 * Fixed: two features had silently never worked – the author tagger’s curated-topic
   candidates and the channel report’s topic axis both called a Classifier method
   that never existed, so they always fell back to tags/taxonomy. Both now read 
   the shared PublisherKits topic framework, so they work on every site with topics
   set up (deterministic everywhere, AI where the Classifier runs).

#### 1.51.1

 * The “Brand voice / extra context” setting is now the …

## Meta

 *  Version **1.58.2**
 *  Last updated **3 days ago**
 *  Active installations **10+**
 *  WordPress version ** 6.2 or higher **
 *  Tested up to **7.1.3**
 *  PHP version ** 7.4 or higher **
 * Tags
 * [facebook](https://wordpress.org/plugins/tags/facebook/)[LinkedIn](https://wordpress.org/plugins/tags/linkedin/)
   [post scheduler](https://wordpress.org/plugins/tags/post-scheduler/)[social media](https://wordpress.org/plugins/tags/social-media/)
   [twitter](https://wordpress.org/plugins/tags/twitter/)
 *  [Advanced View](https://wordpress.org/plugins/publisherkits-socialpromoter/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/publisherkits-socialpromoter/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/publisherkits-socialpromoter/reviews/)

## Contributors

 *   [ PublisherKits ](https://profiles.wordpress.org/publisherkits/)

## Support

Issues resolved in last two months:

     0 out of 1

 [View support forum](https://wordpress.org/support/plugin/publisherkits-socialpromoter/)