Description
Orazio Puglisi Paywall turns any WordPress page or post into paid content with a simple shortcode or block:
[veo_pa_premium]Your content here[/veo_pa_premium]
No WooCommerce, no shop to set up, no user accounts to manage. Visitors pay once (no recurring subscription) with PayPal — PayPal account or credit card — and instantly unlock access.
Free features
- Unlimited, fully customizable pricing tiers (name, description, price, access duration)
- One-time payments only — no subscriptions, no automatic renewals
- PayPal Checkout: pay with a PayPal account or a credit card, no PayPal account needed
- Personal 4-digit login code sent by email, so customers can unlock their purchase on any device, with a self-service “Forgot your code?” link
- Customers page: search, manual add, resend or renew a code, CSV export
- Lock a whole category in one click: every post in it becomes paid content, with a free preview of the first paragraphs
- “My access” page where customers see their plans and expiry dates
- Structured data telling Google which part of a page is paid, so your SEO is preserved
- One-click buttons to get your PayPal (live and sandbox) keys
- Gutenberg blocks: “Orazio Puglisi Paywall – Premium content”, “Orazio Puglisi Paywall – Pricing tiers”, “Orazio Puglisi Paywall – Code login” and “Orazio Puglisi Paywall – My access” (shortcodes also available)
- Brute-force protection on the login form
- Payment form, emails and admin available in 24 languages, independent of the site’s language
- Customizable accent color and a “Most popular” badge
- Secret owner link to see all premium content without logging in
- Export / import of all your settings in one file (backup, or copy to another site)
- “Premium content” padlock button in the classic editor: select the paid part, click, done
Three steps: Free, Essential, Pro
Start simple and move up a step when you are ready — your settings and customers are kept.
- Essential adds: Stripe (card, Apple Pay, Google Pay), pay what you want and donations (with a “Support” page), pay-per-article, numbered receipts with VAT details, sales statistics.
- Pro adds everything below.
Pro features
- Renewable access (optional): a tier can be charged automatically every period through Stripe or PayPal subscriptions, and customers stop it in one click from their “My access” page. One-time payment stays the default.
- Metered paywall: offer a few paid articles to each visitor before showing the payment options
- Pay what you want (the tier price becomes a minimum) and support donations
- Protected files (PDF, PGN, ZIP, audio…) downloadable only by readers with access, stored in a closed folder
- Numbered receipts sent by email after each payment, with your details, VAT breakdown and tax note
- “Subscribe to the newsletter” checkbox connected to Brevo or Mailchimp
- Conversion rate in the statistics (paywall views, started and completed payments, active subscriptions, renewals)
- Pay-per-article: a “This article only” option next to your plans, with a price per post or a default price
- Category tiers: a plan that unlocks only one category (e.g. “Openings pack”)
- Promo codes with a percentage, an end date and a maximum number of uses
- Expiry reminder: an email with a one-click renewal link a few days before access ends (no automatic renewal)
- Stripe Checkout: credit cards, Apple Pay and Google Pay, alongside or instead of PayPal
- “Email booking” tiers for services such as one-on-one lessons or consultations
- Gift codes: create them yourself, or let customers buy a gift online
- Automatic referral codes with a discount for the new customer and free days for the referrer
- Sales statistics (revenue, average order, sales by tier, payment method and month) and CSV export
- Send an email to all your customers at once, in small batches, with an unsubscribe link
- Customer reviews, published after your approval
Just want to sell each article at its own price?
Orazio Puglisi Paywall Ultra Lite is a separate, even simpler plugin: write [paywall price="3"] where the text becomes paid, and each article has its own price. PayPal, one settings screen, $10 lifetime licence. Your settings and customers carry over if you later move up to Orazio Puglisi Paywall Essential or Pro.
External services
This plugin connects to the following third-party services. No data is sent to them until you configure the related credentials, and only when a visitor makes a payment.
- PayPal (payments). The PayPal JavaScript SDK is loaded from paypal.com on pages showing the payment tiers, and the plugin calls the PayPal REST API (api-m.paypal.com, or api-m.sandbox.paypal.com in test mode) to create and capture orders. Data sent: order amount, currency and tier name. The customer’s payment details are entered on PayPal’s own form and never pass through your site. PayPal terms, PayPal privacy statement.
- Stripe (Pro version only, when enabled). The customer is redirected to Stripe Checkout (checkout.stripe.com) and the plugin calls the Stripe API (api.stripe.com) to create and verify the payment. Data sent: amount, currency, tier name and the customer’s email. Stripe terms, Stripe privacy policy.
- Brevo / Mailchimp (Pro version only, when configured). When a customer ticks the newsletter box, the plugin sends their email, first name and last name to api.brevo.com or to your Mailchimp data center (*.api.mailchimp.com) to add them to your list. Brevo privacy policy, Mailchimp privacy policy.
- Freemius (licensing and updates of the Pro version, optional usage data). Freemius only collects data if you explicitly opt in when activating the plugin. Freemius terms, Freemius privacy policy.
Screenshots






Installation
- Install the plugin from the WordPress plugins screen, or upload it to the
/wp-content/plugins/orazio-puglisi-paywalldirectory. - Activate the plugin through the “Plugins” screen.
- Open the “Orazio Puglisi Paywall” menu, enter your PayPal Client ID and Secret (free, from the PayPal Developer Dashboard) and set up your pricing tiers.
- Wrap the content you want to lock with
[veo_pa_premium]...[/veo_pa_premium](or the “Orazio Puglisi Paywall – Premium content” block). - Optionally, tick categories under “Category lock” to reserve all their posts for paying readers.
- Create a page with
[veo_pa_login](or the “Orazio Puglisi Paywall – Code login” block) so customers can log back in with their email and code. - Create a “My access” page with
[veo_pa_account](or the “Orazio Puglisi Paywall – My access” block). - If you use a caching plugin, exclude these pages from the cache and clear it after changing your tiers.
FAQ
-
How do I create a “Support” (donations) page?
-
Create a page, switch the editor to “Text” (or use a Shortcode block) and insert [veo_pa_paywall formules=”don”] with straight quotes. Do not add [veo_pa_premium] markers on this page. Only your donation tiers are shown, with a simplified form (receipt by email, no access code); existing subscribers can donate too. Add the page to your menu and clear your cache plugin. Use formules=”acces” to show every tier except donations.
-
How do I protect a downloadable file (Pro)?
-
In Orazio Puglisi Paywall Protected files, upload the file, copy its [veo_pa_file id=”…”] shortcode and paste it inside the paid part of a post (between [veo_pa_premium] and [/veo_pa_premium], or in a locked category). Only readers with access to that post can download it; the file cannot be opened from its direct address.
-
Do my customers need to create an account?
-
No. Access is granted automatically after payment, and customers can log back in from any device with their email and their personal 4-digit code (or get it re-sent by email with one click).
-
Is this a subscription plugin?
-
No. By default every tier is a one-time payment, with no automatic renewal. The Pro version lets you tick “Renewable” on a tier if you want a recurring payment; customers can stop it at any time in one click.
-
Can customers pay by credit card without a PayPal account?
-
Yes. PayPal Checkout offers a “Debit or Credit Card” button: no PayPal account is required. The Pro version also adds Stripe (cards, Apple Pay, Google Pay).
-
Is there a simpler version to sell articles one by one?
-
Yes: Orazio Puglisi Paywall Ultra Lite ($10, lifetime licence). Add
[paywall price="3"]to any post: everything above stays free as a teaser, everything below is unlocked after a PayPal payment, at the price written in the shortcode. An optional “Whole blog” pass can be offered too. -
Can I test before accepting real payments?
-
Yes. Tick “PayPal Sandbox test mode” in the settings and use sandbox credentials: no real money is involved.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“Orazio Puglisi Paywall” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Orazio Puglisi Paywall” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
3.2.1
- New: the free version mentions Orazio Puglisi Paywall Ultra Lite, a separate plugin to sell each article at its own price.
- Improvement: the four editor blocks now declare their names and titles in block.json files (“Orazio Puglisi Paywall – Premium content”, “– Pricing tiers”, “– Code login”, “– My access”).
3.2.0
- Change: all strings in the plugin are now written in English (the WordPress.org source language). French and the 22 other bundled languages are provided as translations, so translators on translate.wordpress.org can work from English.
- Fix: in the free version, the referral field check is nested inside the premium-only block.
3.1.2
- New: the readers’ login page ([veo_pa_login]) is created automatically on every plan, and recreated if it is deleted or unpublished; a “recover my access” link that lands on a missing page now redirects to the new one.
- Improvement: under [paywall price=”…”], booking tiers (consultations) are no longer offered next to “This article only”.
3.1.1
- Fix: [[paywall price=”3″]] with double brackets is shown as text (to explain the shortcode in an article) instead of starting the paywall.
- Fix: the metered paywall no longer offers content sold at its own price with [paywall price=”…”].
3.1.0
- New: [paywall price=”3″] (or prix=”3″) sells an article in one line: everything below the shortcode is paid, at the price written in it (“This article only”, Essential and Pro plans).
- New: redesigned login page for the 4-digit code (card layout, larger fields, accent-colored button).
- New: statistics never show more than 100 %, and a deleted tier is shown as “Deleted tier”.
- Fix: booking and category tiers are hidden and cannot be bought on a plan that does not include them.
- Fix: the card payment button only appears on plans that include Stripe.
- Fix: the classic editor button code is now loaded only once when two copies of the plugin are present (no more “Cannot redeclare” error).
3.0.0
- Includes the 2.7.2 to 2.7.4 fixes: output escaped with wp_kses(), translated attributes escaped with esc_attr(), renewals of daily subscriptions detected.
- Security: all HTML returned by the shortcodes, blocks and content filters is escaped with wp_kses.
- New: three steps — Free, Essential and Pro. Essential adds Stripe, pay what you want, donations, pay-per-article, receipts and sales statistics; Pro adds everything else. Existing Pro licences keep every feature.
- New: “Your plan” indicator and a “Move up a step” panel in the settings; features of the next step are shown locked, with a one-click upgrade.
- The classic editor “Premium content” padlock button is now available in the free version too.
2.7.1
- Export: any setting that looks like a key or secret is now left out unless you tick “include payment keys”.
- Fix: uploading a protected file caused a critical error (endless loop on the upload folder).
- New: [veo_pa_paywall formules=”don”] shows only the donation tiers (ideal for a “Support” page, simplified form with receipt, also visible to existing subscribers); formules=”acces” shows everything except donations, or list tier keys.
- New: “Premium content” button in the classic editor (TinyMCE): select the paid part and click the lock to insert the [veo_pa_premium] markers.
- Metered paywall: the “free article” notice now appears at the top of the article, with a clearer wording.
- Donation tiers are hidden in the paywall of locked articles (they stay visible with [veo_pa_paywall] on your support page).
- “From” label above pay-what-you-want prices is now smaller.
- Prices on the payment tiers and amounts in donation and gift emails use the site number format (e.g. 2,50).
- Fix: apostrophes in tier names and descriptions no longer gain backslashes on each save (existing texts are repaired automatically).
- Help: category list explanation and protected files shortcode in the “Usage” box.
2.7.0
- New: export / import all settings in one .json file (payment keys only if you ask for them).
- Pro: renewable access (optional) with Stripe and PayPal subscriptions; renewals are detected automatically, extend the access, send a receipt and count in the statistics; customers stop the renewal in one click from “My access”, and you can stop it from the Customers page.
- Pro: metered paywall (X free paid articles per period, counted in the visitor’s browser).
- Pro: pay-what-you-want tiers and support donations (no access, thank-you email and receipt).
- Pro: protected files with the [veo_pa_file id=”…”] shortcode, served only to readers with access to the post.
- Pro: numbered email receipts with seller details, VAT breakdown and tax note, optional copy to the administrator.
- Pro: newsletter checkbox connected to Brevo or Mailchimp, with a “Test the connection” button.
- Pro: conversion rate, started / completed payments, active subscriptions and renewals in the statistics.
- Fix: choosing “Français” as the form language on a site in another language no longer shows the admin partly translated.
- Translations: all new texts in the 23 available languages.
2.5.0
- New: lock a whole category (free preview of the first paragraphs, rest replaced by the payment options).
- New: “My access” page ([veo_pa_account] shortcode and block): customers see their plans and expiry dates.
- New: structured data for paid content (Google indexing).
- New: “An idea for an improvement?” box in the settings.
- Pro: pay-per-article, category tiers, promo codes and expiry reminder emails.
- A customer’s purchases now add up: an article bought on its own no longer shortens a running yearly plan.
- Longer tier keys are now stored in full.
2.3.1
- New name: Orazio Puglisi Paywall (text domain orazio-puglisi-paywall).
- New shortcodes [veo_pa_paywall], [veo_pa_premium]…[/veo_pa_premium] and [veo_pa_login]. The Pro version still accepts the former [veo_paywall], [veo_premium] and [veo_login].
- Scripts and styles are now loaded with the WordPress enqueue functions.
2.2.2
- Two separate PayPal buttons: “Get CLIENT ID & SECRET KEY” (live) and “Get Sandbox keys” (test); the one matching the test-mode checkbox is highlighted.
- Pro: “Get Stripe test key” is now a button too.
2.2.1
- Clearer PayPal test-mode label: it now says it lets you simulate and test a sale with no real money.
2.2.0
- New “Get CLIENT ID & SECRET KEY” button under the PayPal fields: opens the right PayPal Developer page (Sandbox or Live, following the test-mode checkbox).
- Pro: buttons to get the Stripe secret key and open Stripe webhooks.
- These buttons and their help texts switch instantly with the “Form language” setting.
2.1.1
- The admin menu and settings page switch to the chosen language immediately after saving.
2.1.0
- New name: Orazio Puglisi Paywall. Shortcodes, blocks, settings and customers are unchanged.
2.0.4
- The free version now has unlimited pricing tiers.
2.0.3
- Code-quality annotations adjusted so they are kept in the automatically generated free version.
2.0.2
- Tested up to WordPress 7.1.
- Code-quality notes for WordPress Plugin Check (bundled translations, email batches).
2.0.1
- Security and code quality: every database query is prepared, all input is unslashed and sanitized, all output is escaped (WordPress Plugin Check).
- The PayPal SDK is now loaded with wp_enqueue_script().
- Translations: translator comments added and numbered placeholders in all 23 languages.
- Requires WordPress 6.2 or later.
2.0.0
- New: a free version is available on WordPress.org (PayPal, unlimited pricing tiers, 4-digit login code, customers page, Gutenberg blocks, 24 languages). The Pro version keeps every feature.
- Improvement: the free and Pro versions can never run at the same time: activating one automatically deactivates the other, with no data loss.
- Improvement: the Freemius account and upgrade pages now appear under the “Orazio Puglisi Paywall” menu.
1.9.2
- Improvement: when Stripe is enabled, PayPal’s own “Debit or Credit Card” button is hidden, so customers see a single card button (Stripe) next to “Pay with PayPal”. Without Stripe, nothing changes.
1.9.1
- Correctif : durée de validité de la page de paiement Stripe portée à 1 heure (Stripe refusait parfois 30 minutes).
- Diagnostic : la dernière erreur Stripe est affichée dans les réglages.
1.9.0
- New: Stripe Checkout payments (cards, Apple Pay, Google Pay), alongside or instead of PayPal. Customers are redirected to Stripe’s secure page and come back with their access unlocked; the price is always computed and checked on the server. Optional signed webhook (checkout.session.completed) grants access and sends the code even if the customer closes the page after paying.
- New: Gutenberg blocks “Orazio Puglisi Paywall – Premium content” (wraps any blocks), “Orazio Puglisi Paywall – Pricing tiers” and “Orazio Puglisi Paywall – Code login”.
- New: “Statistics” admin page: total revenue, this month, last 30 days, average order, gift codes sold, sales with referral, sales by tier, by payment method and over the last 12 months, plus a CSV export of all sales.
- Improvement: payment finalization is shared by PayPal and Stripe and protected against double processing (double click, browser return + webhook at the same time).
- Improvement: PayPal credentials are no longer mandatory when Stripe is used alone.
- Translations: all new texts translated in all 23 available languages (plus French, the source language).
1.8.0
- New: personal 4-digit login code linked to the customer’s email, usable on any device. A self-service “Forgot your code?” link re-sends it by email. Codes previously issued with 8 characters keep working until the customer requests a new one.
- New: first name, last name and email are now collected for every tier (the “Email required” tier option is gone since it always applies).
- New: “Customers” admin page (search, manual add, resend or renew a code, CSV export).
- New: gift codes. Generate them from the admin (“Gift codes” page) or let customers buy one online with the “This is a gift” checkbox; the access period starts when the code is redeemed.
- New: “Send an email” admin page to write to all your customers at once, sent in small batches with an unsubscribe link.
- New: brute-force protection on the login and gift-code forms; a “veo_pa_client_ip” filter is available for sites behind a proxy or CDN.
- New: the login-code and gift-code emails can be customized per language, like the other emails. Login-code emails now include a reminder of what to do if the access is no longer recognized.
- New: the plugin now follows Freemius’s recommended structure (set_basename() + all plugin logic loaded inside an is__premium_only() check), so a bundled free version (if any) is deactivated automatically when the premium version activates.
- Improvement: the database is now upgraded automatically after an update (no need to deactivate and reactivate the plugin).
- Improvement: pages containing the paywall, the login form or protected content are no longer cached by most caching plugins; an admin note explains how to exclude them if needed.
- Improvement: dates follow your WordPress date and time format. Fixed a few texts that were always displayed in French.
- Translations: all new texts translated in all 23 available languages (plus French, the source language). Duration wording follows each language’s plural rules.
1.7.0
- Added Hebrew (RTL) to the payment form language selector (24 languages total).
1.6.0
- Added Dutch, Polish, Turkish, Ukrainian, Czech, Hungarian, Greek, Finnish and Hindi to the payment form language selector (23 languages total).
1.5.0
- Added Norwegian (Bokmål), Danish and Swedish to the payment form language selector (14 languages total).
1.4.0
- Reworked how the 3 customizable emails (admin, student, login code) store their text: each language now has its own independent slot instead of a single value that could freeze in whatever language was active when it was saved. Removed the “Reset to automatic translation” buttons — no longer needed, since leaving a field unchanged (or clearing it) for a given language keeps it on automatic translation for that language only, without affecting the other 10.
- The “Form language” dropdown now instantly switches which language’s email fields are shown and edited, live in the browser, with no need to save and reload between languages.
1.3.5
- Added a “Reset to automatic translation” button next to each of the 3 automatic emails (admin, student, login code). Fixes the case where an email subject/body had been frozen in French long before the language-consistency system existed (v1.3.1) — simply resaving the settings page wasn’t enough for these older values. One click now releases the email to follow the chosen form language again.
1.3.4
- Fixed two admin-settings notices (“clear your cache” warning and the “fields follow the form language” note) that were missing from all 10 translation files and always displayed in French regardless of the chosen language. Now translated in all languages.
1.3.3
- Right-to-left (RTL) layout for the payment form and the multi-device login form when Arabic (or another RTL language) is selected. The 8-character login code stays left-to-right for readability, even on an RTL page.
1.3.2
- Added Arabic to the payment form language selector (11 languages total).
1.3.1
- Fixed a language-consistency bug: reservation and login-code emails could stay stuck in whichever language was active the first time settings were saved, even after changing the form language later. Untouched email subject/body fields now automatically follow the selected form language; only fields you actually customize stay fixed in the language you typed them in.
1.3.0
- Added Korean and Japanese to the payment form language selector (10 languages total).
1.2.0
- Added Spanish, German, Portuguese and Italian to the payment form language selector.
1.1.1
- Added a visible warning notice in the admin settings page, reminding admins to clear their site cache after any change to the pricing tiers.
1.1.0
- Added a language selector for the payment form (French, English, Russian, Chinese), independent of the site’s WordPress language.
1.0.0
- Initial release.
