Description
Let HighLevel manage the relationship. Let WordPress manage the experience.
GHL-WP Membership connects a configured HighLevel contact tag to a WordPress membership. Add the tag to create a Subscriber and grant access. Remove it to revoke access. Add it again to restore the same account—without an administrator reset.
Membership checks happen in your local WordPress database. Your members’ page views and downloads do not wait for a CRM API call.
What you can do today
- 01Create members automatically
A verified GHL tag creates a Subscriber account. Existing email collisions are stopped for review instead of silently linking accounts.
- 02Choose the pages that need membership
Tick “Require active membership” in the page editor. Direct views, core REST responses, search, feeds and comments respect protection.
- 03Share a link. Keep the file private.
Store PDFs, ZIPs and other supported uploads outside the public web folder. Every new download request checks membership—even when someone copies the direct link.
- 04Recover from failed syncs
A durable queue retries temporary failures with increasing delays. See attempts and errors in WordPress, with a fresh-sync option when review is needed.
Simple for members. Careful with access.
Syncs read the contact’s current GHL state, so an old webhook cannot replay an outdated tag decision. File downloads use private, no-store responses and support authorized range requests.
A focused foundation
This build supports one configured Lab location, contact and tag. It is designed to prove the access flow before adding a multi-plan setup wizard, payments, production onboarding and wider compatibility testing.
Independent software by Arifur Rahman. Not affiliated with or endorsed by HighLevel or the WordPress project.
Installation
This release is for an isolated development environment. Back up your site before installing experimental software.
Install the plugin ZIP
Open WordPress → Plugins → Add New → Upload Plugin. Upload the Lab build and activate it. PHP 8.3 or newer is required.
Configure the GHL connection
Use a location-scoped private integration with
contacts.readonly. Store its token server-side asGHLM_CONTACTS_TOKEN. Configure the location, contact, tag and hashed webhook secret in the plugin’s Lab settings. This version does not include a connection wizard.Connect the tag workflow
Use Contact Tag added and removed triggers, allow re-entry, and send a POST webhook to
/wp-json/ghlm/v1/tag-syncwith theX-GHLM-Keyheader. Use HTTPS on a hosted environment.Protect pages and files
In a page’s editor, enable Membership access → Require active membership. For files, configure
GHLM_PRIVATE_DIRoutside all web-served directories, then use Media → Member downloads. Upload privately or move an existing Media Library attachment.Enable reliable retries
Run WordPress cron each minute with your server scheduler. Exclude protected pages and download URLs from page/CDN caches. Purge previously public copies when migrating files.
Run the acceptance flow
Add the tag → log in → open a protected page and download a file. Remove the tag and confirm both are denied. Re-add it and confirm both work for the same member.
Screenshots & demos
Real screenshots from the isolated WordPress Lab. The animated demos sequence captured states; they are not a continuous screen recording.
Upload new files privately or move existing Media Library files.
Choose exactly which pages require access.
The live Lab sync completed automatically on attempt two.
Grant → revoke → restore

Failed sync → automatic recovery

Frequently asked questions
Can someone bypass protection with a direct file URL?
Not for files managed by Member downloads. Their bytes live outside the public web root. The protected URL checks the current local membership on each request. Migrating a Media Library file removes its public original and known generated copies. External caches, backups and copies hosted elsewhere must be handled separately.
What happens when I remove the membership tag?
Once the tag event is successfully reconciled, WordPress denies new protected page and download requests. Re-adding the tag restores access to the same account. Already downloaded files cannot be recalled, and a stream authorized before revocation may finish.
What happens during a CRM outage?
Temporary failures are saved for retry. Delays increase from one minute up to one hour, with eight total attempts. The last confirmed membership state remains until a successful sync. Events that never reach WordPress are not recovered by this queue.
Which files can I protect?
PDF, ZIP, DOCX, XLSX, PPTX, TXT, CSV, JPEG, PNG, WebP, GIF, MP3 and MP4. The plugin caps uploads at 50 MB; your server may have a lower limit. Downloads are sent as attachments, with range support for authorized requests.
Do administrators need a membership?
Administrators can manage and preview private files. Editorial users can preview protected pages. Ordinary members need an active grant.
Does it protect every existing upload automatically?
No. Upload through Member downloads or explicitly move an existing Media Library attachment. Public Media Library files remain public until migrated. Page protection does not automatically protect linked media or child pages.
Is this available in the WordPress plugin repository?
Not yet. This is an independent plugin website styled for familiar plugin browsing. The download is a development build, not a WordPress.org-approved release.
Does this version handle payments or multiple membership plans?
No. The current milestone uses one configured contact and tag. Payments, multi-plan configuration and a production onboarding wizard remain future work.
Changelog
Private downloads & a new name
GHL-WP Membership. Private storage outside the web root, authenticated file streaming, range support, existing-media migration and this plugin website.
Retries & page protection
Durable sync queue, increasing retry delays, page-editor access checkbox, protected core content endpoints and author information.
Automatic membership lifecycle
Subscriber creation and grant → revoke → restore on the same account, using the current GHL contact state.
First live tag proof
Verified GHL workflow webhook to local WordPress membership access in an isolated Lab.