{"id":368891,"date":"2026-09-17T07:51:50","date_gmt":"2026-09-17T07:51:50","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/plugupp-live-freemius-pricing\/"},"modified":"2026-09-17T07:51:26","modified_gmt":"2026-09-17T07:51:26","slug":"plugupp-live-pricing-for-freemius","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/plugupp-live-pricing-for-freemius\/","author":23510969,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.4","stable_tag":"1.0.4","tested":"7.1","requires":"6.3","requires_php":"7.4","requires_plugins":null,"header_name":"PlugUpp Live Pricing for Freemius","header_author":"PlugUpp","header_description":"Shows live Freemius prices on your own pages through blocks and shortcodes, refreshed by webhook, with a visitor currency toggle and currency-aware checkout links.","assets_banners_color":"353a65","last_updated":"2026-09-17 07:51:26","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/plugupp.com\/plugins\/live-pricing-for-freemius\/","header_author_uri":"https:\/\/plugupp.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":31,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.4":{"tag":"1.0.4","author":"plugupp","date":"2026-09-17 07:51:26","revision":3699730}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3699725,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3699725,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3699725,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3699725,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3699725,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"pflp\/price":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"pflp\/price","title":"Freemius price","category":"widgets","icon":"tag","description":"One live Freemius price: a plan, a licence tier and a billing cycle, in the visitor's own currency.","keywords":["Freemius","price","checkout","buy"],"textdomain":"plugupp-live-pricing-for-freemius","attributes":{"product":{"type":"string","default":""},"plan":{"type":"string","default":""},"licenses":{"type":"string","default":""},"cycle":{"type":"string","default":""},"currency":{"type":"string","default":""},"format":{"type":"string","default":"symbol"},"align":{"type":"string","default":""}},"supports":{"html":false,"color":{"text":true,"background":true,"gradients":false},"typography":{"fontSize":true,"lineHeight":true,"__experimentalFontFamily":true,"__experimentalFontWeight":true,"__experimentalFontStyle":true,"__experimentalLetterSpacing":true,"__experimentalTextTransform":true,"__experimentalTextDecoration":true},"spacing":{"margin":true,"padding":true}},"example":{"attributes":{},"viewportWidth":320},"editorScript":"pflp-blocks-editor"},"pflp\/button":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"pflp\/button","title":"Freemius buy button","category":"widgets","icon":"cart","description":"A buy button linking to your Freemius checkout for one plan, licence tier and billing cycle.","keywords":["Freemius","price","checkout","buy"],"textdomain":"plugupp-live-pricing-for-freemius","attributes":{"product":{"type":"string","default":""},"plan":{"type":"string","default":""},"licenses":{"type":"string","default":""},"cycle":{"type":"string","default":""},"currency":{"type":"string","default":""},"label":{"type":"string","default":""},"width":{"type":"string","default":""},"align":{"type":"string","default":""}},"supports":{"html":false,"anchor":true,"color":{"text":true,"background":true,"gradients":false},"typography":{"fontSize":true,"lineHeight":true,"__experimentalFontFamily":true,"__experimentalFontWeight":true,"__experimentalFontStyle":true,"__experimentalLetterSpacing":true,"__experimentalTextTransform":true,"__experimentalTextDecoration":true},"spacing":{"padding":true,"margin":true},"__experimentalBorder":{"color":true,"radius":true,"width":true}},"example":{"attributes":{},"viewportWidth":320},"editorScript":"pflp-blocks-editor"},"pflp\/currency":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"pflp\/currency","title":"Freemius currency toggle","category":"widgets","icon":"money-alt","description":"Lets a visitor switch every price and buy button on the page between the currencies your product is sold in.","keywords":["Freemius","price","checkout","buy","currency"],"textdomain":"plugupp-live-pricing-for-freemius","attributes":{"product":{"type":"string","default":""},"align":{"type":"string","default":""}},"supports":{"html":false,"color":{"text":true,"background":true,"gradients":false},"typography":{"fontSize":true,"lineHeight":true}},"example":{"attributes":{},"viewportWidth":320},"editorScript":"pflp-blocks-editor"}},"tagged_versions":["1.0.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3699725,"resolution":"1","location":"assets","locale":"","width":3520,"height":1696},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3699725,"resolution":"2","location":"assets","locale":"","width":3436,"height":706},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3699725,"resolution":"3","location":"assets","locale":"","width":3436,"height":1406},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3699725,"resolution":"4","location":"assets","locale":"","width":3840,"height":1194},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3699725,"resolution":"5","location":"assets","locale":"","width":3840,"height":1194},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3699725,"resolution":"6","location":"assets","locale":"","width":3520,"height":714}},"screenshots":{"1":"The Products screen: every configured product, named by Freemius, with its plans, currencies, last fetch, last webhook and status.","2":"A product's own screen: the API Bearer Authorization Token with a Test button and the secret key on file, read with the token. The webhook registers itself and the Status list says so.","3":"The Shortcodes section: the shortest working form of each shortcode, then every plan and pricing row the API returned with a ready-made price shortcode and button shortcode on each line.","4":"A pricing page rendering live prices, with the currency toggle.","5":"The same page in a second currency, swapped in the visitor's browser.","6":"The Logs tab, showing fetches and webhook deliveries."}},"plugin_section":[],"plugin_tags":[1220,8504,139562,4394,80],"plugin_category":[43,45],"plugin_contributors":[266955],"plugin_business_model":[],"class_list":["post-368891","plugin","type-plugin","status-publish","hentry","plugin_tags-block","plugin_tags-currency","plugin_tags-freemius","plugin_tags-pricing","plugin_tags-shortcode","plugin_category-customization","plugin_category-ecommerce","plugin_contributors-plugupp","plugin_committers-plugupp"],"banners":{"banner":"https:\/\/ps.w.org\/plugupp-live-pricing-for-freemius\/assets\/banner-772x250.png?rev=3699725","banner_2x":"https:\/\/ps.w.org\/plugupp-live-pricing-for-freemius\/assets\/banner-1544x500.png?rev=3699725","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/plugupp-live-pricing-for-freemius\/assets\/icon.svg?rev=3699725","icon":"https:\/\/ps.w.org\/plugupp-live-pricing-for-freemius\/assets\/icon.svg?rev=3699725","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/plugupp-live-pricing-for-freemius\/assets\/screenshot-1.png?rev=3699725","caption":"The Products screen: every configured product, named by Freemius, with its plans, currencies, last fetch, last webhook and status."},{"src":"https:\/\/ps.w.org\/plugupp-live-pricing-for-freemius\/assets\/screenshot-2.png?rev=3699725","caption":"A product's own screen: the API Bearer Authorization Token with a Test button and the secret key on file, read with the token. The webhook registers itself and the Status list says so."},{"src":"https:\/\/ps.w.org\/plugupp-live-pricing-for-freemius\/assets\/screenshot-3.png?rev=3699725","caption":"The Shortcodes section: the shortest working form of each shortcode, then every plan and pricing row the API returned with a ready-made price shortcode and button shortcode on each line."},{"src":"https:\/\/ps.w.org\/plugupp-live-pricing-for-freemius\/assets\/screenshot-4.png?rev=3699725","caption":"A pricing page rendering live prices, with the currency toggle."},{"src":"https:\/\/ps.w.org\/plugupp-live-pricing-for-freemius\/assets\/screenshot-5.png?rev=3699725","caption":"The same page in a second currency, swapped in the visitor's browser."},{"src":"https:\/\/ps.w.org\/plugupp-live-pricing-for-freemius\/assets\/screenshot-6.png?rev=3699725","caption":"The Logs tab, showing fetches and webhook deliveries."}],"raw_content":"<!--section=description-->\n<p>If you sell through Freemius, the prices on your website are a copy of the prices in your Freemius dashboard, and copies go stale. Change a price in the dashboard and you then have to remember every page, tile and sentence on your own site that quotes it, open each one in the editor, retype the figure and save. Miss one and a visitor is reading a price you no longer charge.<\/p>\n\n<p>This plugin keeps the figure in the page bound to the price in the dashboard. Blocks in the editor, shortcodes everywhere else, both rendering the same live figure. Prices are fetched from the Freemius API on your server, stored on your site, and refetched within seconds of a dashboard change. Your pages render the stored figure, so nothing about this makes a visitor wait on an API call, and nobody has to re-save a page for a new price to appear.<\/p>\n\n<p>A figure typed into a page is correct on the day and drifts from then on. This plugin never types one: every price on the page is read from the stored copy at render time, and the stored copy follows the dashboard.<\/p>\n\n<p>Freemius is a trademark of Freemius, Inc. This plugin is an independent integration built by PlugUpp on the public Freemius API; it is not affiliated with, endorsed by or maintained by Freemius, and it is not the Freemius for WordPress plugin.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li>A <strong>Freemius price<\/strong> block renders any plan, licence tier and billing cycle, picked from dropdowns that offer only the combinations your product sells. There is a <strong>Freemius buy button<\/strong> block and a <strong>Freemius currency toggle<\/strong> block beside it, all three under Widgets in the inserter.<\/li>\n<li><code>[pflp_price]<\/code> does the same thing as a shortcode, for page builders, the classic editor, widget areas and template files. The blocks and the shortcodes are the same code, so the two can never drift apart, and an existing shortcode converts to a block in one click.<\/li>\n<li><code>[pflp_button]<\/code> renders a buy button linking to the hosted checkout for that same row, carrying the <code>wp-element-button<\/code> class WordPress gives its own buttons.<\/li>\n<li><code>[pflp_currency]<\/code> renders a currency toggle, and renders nothing at all when a product is sold in a single currency.<\/li>\n<li>Every attribute is optional. <code>[pflp_price]<\/code> and <code>[pflp_button]<\/code> with nothing at all render your headline price and the checkout that sells it, so the shortest thing you can type is already the right one.<\/li>\n<li>A webhook receiver refetches within seconds of a price or plan change in the dashboard. A staleness check is the backstop, and a daily job is the backstop for that.<\/li>\n<li>Every price carries all of its currencies, so a visitor sees theirs through a swap in their own browser. No request comes back to your site, which means a page cache or a CDN can never serve one visitor's currency to another.<\/li>\n<li>Buy buttons stay ordinary links to the hosted checkout and gain the visitor's currency, whether the plugin rendered them or your theme did. One setting opens the checkout in an overlay instead.<\/li>\n<li>If the Freemius API is ever unreachable, the last good prices stay on the page and an admin notice tells you. Nothing goes blank, and no figure is ever invented or shown as zero.<\/li>\n<li>Every product's plans and pricing rows are listed in the admin, with a ready-made price shortcode and button shortcode on each line to copy into a page.<\/li>\n<\/ul>\n\n<h4>Who it is for<\/h4>\n\n<p>Anyone selling a WordPress plugin or theme through Freemius who publishes prices on their own site: a pricing page, a comparison table, a landing page, or a price quoted in a paragraph of copy. It is most useful if you sell in more than one currency, or change prices more than once a year.<\/p>\n\n<h3>About PlugUpp<\/h3>\n\n<p>PlugUpp builds WordPress plugins for people who publish and sell on their own site. This one is free because everyone who needs it is a plugin or theme seller with a marketing site, which is exactly who PlugUpp builds for. Three more for the same site:<\/p>\n\n<ul>\n<li><strong>PlugUpp Link &amp; Image Health Audit<\/strong> finds the broken links and broken images on the site you sell from, checked on your own server with no external crawler and no quota. <a href=\"https:\/\/plugupp.com\/plugins\/link-image-health-audit\/\">See it on plugupp.com<\/a><\/li>\n<li><strong>PlugUpp Search &amp; Social Appearance Audit<\/strong> shows how every page looks in Google and on social platforms, from the page as it actually ships, before a buyer sees it. <a href=\"https:\/\/plugupp.com\/plugins\/search-social-appearance-audit\/\">See it on plugupp.com<\/a><\/li>\n<li><strong>PlugUpp Dynamic OG Image Generator<\/strong> gives each page a real browser screenshot of itself as its share image, so a shared link shows the page as it is. <a href=\"https:\/\/plugupp.com\/plugins\/dynamic-og-image-generator\/\">See it on plugupp.com<\/a><\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin relies on the Freemius platform. Three separate calls are involved, and they are described here in full, followed by one call to WordPress.org on two admin screens.<\/p>\n\n<p><strong>1. Reading your prices from the Freemius API<\/strong><\/p>\n\n<p>Your server requests <code>https:\/\/api.freemius.com\/v1\/products\/{product ID}\/pricing.json<\/code>. It sends the numeric Freemius product ID in the URL and your Freemius API Bearer Authorization Token in an authorization header. Nothing else is sent, and nothing about your visitors is sent. The call happens only on your server, never during a visitor's page view: when you press Refresh now or Test token in the admin, when a webhook arrives, when a scheduled refresh runs, and whenever you save the product. If no token is configured, the call is never made.<\/p>\n\n<p>When a save has proved the token, your server also reads the product's secret key from <code>https:\/\/api.freemius.com\/v1\/products\/{product ID}.json<\/code> (it signs every webhook delivery; it is stored on your site and never shown or logged) and registers this site's webhook with the same API: it lists the product's webhooks at <code>https:\/\/api.freemius.com\/v1\/products\/{product ID}\/webhooks.json<\/code>, then creates one for this site or brings its own up to date, and removes its own when you delete the product. The only thing sent is this site's webhook URL and the six event types it subscribes to. Webhooks pointing anywhere else are never touched.<\/p>\n\n<p><strong>2. Choosing the visitor's currency<\/strong><\/p>\n\n<p>The visitor's browser requests <code>https:\/\/checkout.freemius.com\/geo.json<\/code>. The request carries nothing beyond the request itself, which necessarily includes the visitor's IP address as any web request does. The answer is a currency code, which the browser keeps for one hour so the call is not repeated on every page. This happens only on pages where a price or a currency toggle has been rendered, and only when the visitor has not already chosen a currency.<\/p>\n\n<p><strong>3. The overlay checkout<\/strong><\/p>\n\n<p>When you switch the Checkout setting to \"Open the checkout in an overlay\", the visitor's browser loads the Freemius checkout script from <code>https:\/\/checkout.freemius.com\/js\/v1\/<\/code> so the checkout can open in place. With the default hosted setting, this script is never loaded and your buy buttons remain ordinary links.<\/p>\n\n<p><strong>4. The More from PlugUpp panel<\/strong><\/p>\n\n<p>On this plugin's own Products and Settings screens, and nowhere else, your site asks the WordPress.org plugins API (<code>https:\/\/api.wordpress.org\/plugins\/info\/1.2\/<\/code>) for the list of plugins published by the PlugUpp account, once a day, and shows them as cards with their WordPress.org icons (served from <code>https:\/\/ps.w.org\/<\/code>). The request carries the author name and nothing about your site. This is the same API WordPress itself uses for the Add New plugin screen and for update checks. If it cannot be reached, a short built-in list is shown instead.<\/p>\n\n<p><strong>Webhooks are inbound.<\/strong> A webhook is a call from Freemius to your site, not from your site to Freemius. Your site never initiates it and sends nothing. Each delivery is verified twice before it is acted on: the URL carries a key this plugin generated, and the body carries a signature checked against your product's secret key.<\/p>\n\n<p>Freemius is operated by Freemius, Inc. Their terms of service are at https:\/\/freemius.com\/terms\/ and their privacy policy is at https:\/\/freemius.com\/privacy\/.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install the plugin through Plugins, Add New, or upload the plugin folder to <code>wp-content\/plugins\/<\/code>, then activate it.<\/li>\n<li>Open Freemius Pricing in the WordPress admin menu. It lands on Products.<\/li>\n<li>Press Add product and fill in the numeric Freemius product ID and its API Bearer Authorization Token, from the Freemius dashboard under the product, then Settings, then Keys. Nothing else is typed: the product's name arrives with the prices, and the product secret key, which signs webhooks, is read with the token. Both the token and the secret come from the Freemius dashboard, under the product, then Settings, then Keys.<\/li>\n<li>Press Test token to check it, then Add product to save.<\/li>\n<li>You are now on the product's own screen, and the webhook is already registered with Freemius: the save did it, and the Status list says so. If it could not be, the same line says why and shows the URL and the six events to paste into the Freemius dashboard, under the product, then Webhooks, then Listeners, yourself.<\/li>\n<li>The same screen has a Shortcodes section: the shortest working form of each shortcode with what it renders for your product, then every plan and pricing row with a ready-made price shortcode and button shortcode on each line. Copy the one you want into a page. In the block editor, insert Freemius price, Freemius buy button or Freemius currency toggle from the inserter under Widgets instead, and pick the row from dropdowns.<\/li>\n<li>Freemius Pricing, then Settings holds the site-wide choices: default currency, whether a visitor's currency choice is remembered, hosted or overlay checkout, how stale prices may get before a background refresh, and the default label and CSS classes for buy buttons. Freemius Pricing, then Logs shows what the plugin has been doing.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20freemius%27s%20own%20wordpress%20plugin%20as%20well%3F\"><h3>Do I need Freemius's own WordPress plugin as well?<\/h3><\/dt>\n<dd><p>No. This plugin talks to the Freemius API directly and does not depend on any other plugin. The two can coexist if you already run the official one. This plugin renders its own blocks and shortcodes, and the one thing it does to the rest of the page is add the visitor's currency to any link pointing at the Freemius checkout, whoever rendered it, so a button you built yourself opens in the currency the visitor was reading. With the overlay checkout setting on, it also opens those links in the overlay. Nothing else on the page is touched.<\/p><\/dd>\n<dt id=\"where%20do%20i%20get%20the%20api%20bearer%20authorization%20token%3F\"><h3>Where do I get the API Bearer Authorization Token?<\/h3><\/dt>\n<dd><p>In the Freemius dashboard, open the product, then Settings, then Keys. The token this plugin needs is the one Freemius labels API Bearer Authorization Token. It is read only for this purpose: the plugin makes exactly one kind of request with it, a read of that product's plans and prices. Paste it into the API Bearer Authorization Token field on the product's screen under Freemius Pricing, press Test token, then save. The field is masked, the value is never written to the log, and it is never sent anywhere except to api.freemius.com.<\/p><\/dd>\n<dt id=\"do%20i%20have%20to%20set%20up%20the%20webhook%3F\"><h3>Do I have to set up the webhook?<\/h3><\/dt>\n<dd><p>No. Saving the product with a working token registers it with Freemius for you, and keeps it up to date on every save; the Status list on the product's screen says so. It is what makes a price change appear in seconds. Without it, a page view notices that the stored prices are older than the refresh interval you set and schedules a background refresh, and a daily job catches anything missed. With it, Freemius tells your site the moment something changes. The webhook URL is generated for you on the product's own screen; it contains a key only your site and your Freemius dashboard know, and every delivery is also checked against your product's secret key before it is acted on.<\/p><\/dd>\n<dt id=\"freemius%20said%20my%20plan%20doesn%27t%20support%20creating%20webhooks.%20is%20the%20token%20wrong%3F\"><h3>Freemius said my plan doesn't support creating webhooks. Is the token wrong?<\/h3><\/dt>\n<dd><p>No. The same token has just fetched your prices and your secret key, and the product is saved and live. Freemius reserves webhooks, along with some other features, for products it considers actively selling, and unlocks them after a few production sales; a product that has not reached that point gets that sentence, from the API and from the dashboard alike, so there is nothing to paste by hand. The plugin says so on the product's screen and marks the save as a warning rather than an error. Until Freemius enables them, the prices refresh on the interval set under Settings, and once a day regardless; every later save tries the registration again, so the webhook appears by itself once Freemius allows it.<\/p><\/dd>\n<dt id=\"which%20currencies%20are%20supported%3F\"><h3>Which currencies are supported?<\/h3><\/dt>\n<dd><p>Whatever your product is priced in, taken from the pricing rows the Freemius API returns. The plugin ships symbols for US dollars, euros and pounds sterling, which are the currencies the Freemius pricing API offers; a currency added later still renders, using its three letter code in place of a symbol. The currency toggle lists only the currencies a product is actually sold in, and does not render at all when there is only one.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20the%20freemius%20api%20is%20down%3F\"><h3>What happens if the Freemius API is down?<\/h3><\/dt>\n<dd><p>Your prices stay exactly as they are. The stored copy on your site is only ever replaced by a successful fetch, so a failed refresh changes nothing a visitor sees. You get an admin notice saying which product could not be refreshed, and the reason is recorded in the log. A page never waits on the API, so an outage at Freemius cannot slow down or break your site.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20caching%20plugins%20and%20cdns%3F\"><h3>Does this work with caching plugins and CDNs?<\/h3><\/dt>\n<dd><p>Yes, and it is built for them. Prices are rendered into the page from the copy stored on your site, so a cached page is a correct page. The visitor's currency is applied in their own browser from data already in the HTML, with no request back to your server, so a cached page can never show one visitor another visitor's currency. Nothing here varies the HTML by visitor, which is what would defeat a page cache.<\/p><\/dd>\n<dt id=\"how%20often%20are%20the%20prices%20refetched%3F\"><h3>How often are the prices refetched?<\/h3><\/dt>\n<dd><p>On a webhook, immediately. Otherwise, the first page view after the stored copy passes the refresh interval you set under Freemius Pricing, then Settings schedules a background refresh, and a daily scheduled job refreshes every product regardless. The interval is a backstop for a webhook that never arrived, not a polling frequency: a site nobody visits still refreshes once a day.<\/p><\/dd>\n<dt id=\"what%20external%20services%20does%20this%20plugin%20use%3F\"><h3>What external services does this plugin use?<\/h3><\/dt>\n<dd><p>The Freemius platform, in three ways. Your server reads your prices from <code>https:\/\/api.freemius.com\/v1\/products\/{product ID}\/pricing.json<\/code>, sending the product ID and your API Bearer Authorization Token and nothing else, and only when you refresh, test a token, receive a webhook or a scheduled refresh runs. The visitor's browser calls <code>https:\/\/checkout.freemius.com\/geo.json<\/code> to work out which currency to show, sending nothing beyond the request itself, and caching the answer for an hour. If you turn on overlay checkout, the visitor's browser also loads the checkout script from <code>https:\/\/checkout.freemius.com\/js\/v1\/<\/code>; with the default hosted checkout it does not. Webhooks run the other way, inbound from Freemius to your site, and each one is verified by both a generated URL key and a body signature. Freemius terms: https:\/\/freemius.com\/terms\/ . Freemius privacy policy: https:\/\/freemius.com\/privacy\/ .<\/p><\/dd>\n<dt id=\"are%20there%20blocks%2C%20or%20only%20shortcodes%3F\"><h3>Are there blocks, or only shortcodes?<\/h3><\/dt>\n<dd><p>Both, and they are the same thing. Three blocks under Widgets in the inserter: Freemius price, Freemius buy button and Freemius currency toggle. Each one renders your headline row as soon as it is inserted, and the sidebar fills its Plan, Licences and Billing cycle dropdowns from the rows your product actually sells, so an impossible combination cannot be chosen. They are dynamic blocks: nothing is written into the post, and the page renders through exactly the same code the shortcode of the same name uses, which is why a price in a block and a price in a shortcode can never disagree. Select a Shortcode block holding one of the three and the editor offers to convert it, carrying every attribute across, and the block type menu converts a block back into a shortcode the same way. The shortcodes are not deprecated and are not going anywhere: they are what a page builder, the classic editor, a widget area or a template file wants.<\/p><\/dd>\n<dt id=\"can%20i%20turn%20a%20block%20back%20into%20a%20shortcode%3F\"><h3>Can I turn a block back into a shortcode?<\/h3><\/dt>\n<dd><p>Yes. Select the block, open the block type button at the left of its toolbar and choose Shortcode. You get an ordinary Shortcode block holding the equivalent shortcode, ready for a page builder, a widget area or a template file, and anything left at its default is left out so a block nobody configured becomes a plain <code>[pflp_price]<\/code>. One thing does not survive the trip: styling set in the colour, typography and spacing panels is inline CSS on the block, and a shortcode has nowhere to carry inline CSS. The editor says so once, the first time you convert a styled block. Anything you picked from a preset does survive, because a preset is a class name your theme already defines, and those class names are added to the shortcode's <code>class<\/code> attribute.<\/p><\/dd>\n<dt id=\"can%20i%20style%20the%20buy%20button%20in%20the%20editor%3F\"><h3>Can I style the buy button in the editor?<\/h3><\/dt>\n<dd><p>Yes. The buy button block carries the WordPress colour, typography, spacing and border panels, a Width setting with the same four choices as the core Buttons block, and the price and the toggle carry colour and typography. A hover effect is one choice for the whole site, under Buttons on the Settings screen, because the panels cannot set one. Underneath, the button still leads with <code>wp-element-button<\/code>, the class WordPress gives its own buttons, so in most block themes it already matches before you change a thing. The Advanced panel's Additional CSS class(es) is the block spelling of the shortcode's <code>class<\/code> attribute, which all three take, and classes are added to the ones the price, button or toggle already carries rather than replacing them.<\/p><\/dd>\n<dt id=\"do%20i%20have%20to%20write%20out%20every%20attribute%3F\"><h3>Do I have to write out every attribute?<\/h3><\/dt>\n<dd><p>No. Every attribute on every shortcode is optional. <code>[pflp_price]<\/code> on its own renders your headline price, and <code>[pflp_button]<\/code> on its own links to the checkout that sells it. Left out, <code>plan<\/code> means the plan Freemius marks as featured (otherwise the first plan that has a price), <code>licenses<\/code> means that plan's lowest numbered tier, and <code>cycle<\/code> means annual, falling through to monthly and then lifetime if that row has no annual price. Name an attribute only where you want something other than that. An attribute you do write is never second-guessed: <code>cycle=\"annual\"<\/code> against a row with no annual price renders nothing rather than quietly showing a monthly figure.<\/p><\/dd>\n<dt id=\"how%20do%20i%20add%20a%20buy%20button%3F\"><h3>How do I add a buy button?<\/h3><\/dt>\n<dd><p>[pflp_button] renders one, taking the same plan, licences and cycle attributes as a price. It is an ordinary link to your Freemius hosted checkout, carrying the <code>wp-element-button<\/code> class WordPress gives its own buttons, so in most block themes it already matches the rest of your site. <code>label<\/code> sets the words on one button and Settings sets the words on all of them; <code>class<\/code> is there for a theme that needs its own hooks, on all three shortcodes, and <code>id<\/code> on the button; and <code>align=\"center\"<\/code> puts the button in a block of its own and moves it across the line, which all three shortcodes take. As blocks, all three carry the usual alignment buttons in the block toolbar. A button you built yourself still works: the plugin adds the visitor's currency to any link pointing at the Freemius checkout.<\/p><\/dd>\n<dt id=\"what%20about%20the%20free%20plan%3F\"><h3>What about the free plan?<\/h3><\/dt>\n<dd><p>Nothing from this plugin: a plan with no price has no figure to show and no checkout to link to, so the block's Plan dropdown does not offer it and a shortcode naming it renders nothing. For the free tier of a pricing table, use an ordinary button, the core Buttons block or your theme's, linking to the plugin's download page (its WordPress.org listing, usually). That link is a fixed fact rather than a live price, so there is nothing to keep current.<\/p><\/dd>\n<dt id=\"can%20i%20show%20a%20price%20in%20a%20fixed%20currency%3F\"><h3>Can I show a price in a fixed currency?<\/h3><\/dt>\n<dd><p>Yes. Add <code>currency=\"gbp\"<\/code> to the shortcode and that price is pinned: it is never swapped and it is not counted as a currency the rest of the page offers. Useful for a sentence that has to read in one currency regardless.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20a%20shortcode%20names%20a%20plan%20or%20tier%20that%20does%20not%20exist%3F\"><h3>What happens if a shortcode names a plan or tier that does not exist?<\/h3><\/dt>\n<dd><p>Nothing is shown for it, and a warning goes to the log naming which shortcode asked and what could not be found. A price leaves a gap and a button is not rendered at all, because a link to a checkout that sells nothing is worse than no link. Both are deliberate. Showing a zero, or falling back to some other row's price, would put a wrong figure in front of a customer, which is worse than showing nothing.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Fixed: deleting an older copy of the plugin from the Plugins screen while the renamed copy is active no longer removes the products, tokens and prices the active copy is using.<\/li>\n<li>Changed: the plugin is now called PlugUpp Live Pricing for Freemius, with the slug and text domain plugupp-live-pricing-for-freemius, at the WordPress.org review team's request that a third-party name be framed as an integration. Nothing about how it works changes; settings, stored prices and webhooks carry over, because they are filed under the pflp prefix, not the slug.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Fixed: a border set in the buy button block's border panel now draws. WordPress zeroes the border width on every button and never writes a border style, so the panel's width and colour rendered as no border at all.<\/li>\n<li>Added: a Width setting on the buy button, the 25, 50, 75 and 100 percent that the core Buttons block offers, so a button can span a pricing card. <code>[pflp_button width=\"100\"]<\/code> does the same.<\/li>\n<li>Added: a Hover effect option under Buttons on the Settings screen. Lift raises every button 1px under the pointer with a soft shadow of its own colour, on screens 1025px and wider only, so a touch screen never leaves a tapped button lifted. Off by default.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Changed: the block's Plan dropdown offers only plans that sell something. A plan with no price has no figure to show and no checkout to link to, so nothing could render from it; the product's own screen says so, and the free tier of a pricing table is an ordinary button linking to the download page.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Added: only the product ID and the API Bearer Authorization Token are typed. The product secret key is read from Freemius with the token on every save, so there is no third field.<\/li>\n<li>Added: the webhook registers itself with Freemius when a product is saved with a working token, is kept up to date on every save, and is removed when the product is deleted. The product's Status list says so; the URL and the six events sit behind Show webhook URL for pasting by hand if that cannot happen. A product for which Freemius has not yet enabled webhooks (it reserves them until a product is actively selling) is saved with a warning that says so, and the token is not blamed.<\/li>\n<li>Changed: the product's name comes from Freemius with the prices and is refreshed with every fetch and every save, and the Label field is gone. The Products list, the product's own screen, the Test token result and the block editor's product dropdown all show the name the Freemius dashboard gives it, and <code>product=\"...\"<\/code> on a shortcode takes the product ID, its Freemius slug or its name.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First public release. Freemius price, Freemius buy button and Freemius currency toggle blocks, the matching <code>[pflp_price]<\/code>, <code>[pflp_button]<\/code> and <code>[pflp_currency]<\/code> shortcodes rendering through the same code, prices fetched from the Freemius API and stored on the site, webhook and scheduled refreshes, a visitor currency toggle with geo detection, currency-aware checkout links with an optional overlay, and a Freemius Pricing admin menu with a products list, a per-product screen carrying the webhook URL and a Shortcodes section with a ready-made price and button shortcode for every plan and pricing row, site-wide settings and a log. The blocks fill their plan, licence tier and billing cycle dropdowns from the stored rows, preview through the server so the editor shows what the page renders, carry the editor's own colour, typography, spacing and border panels, align all three from the block toolbar, and convert to and from a shortcode in one click.<\/li>\n<\/ul>","raw_excerpt":"Freemius pricing, live on your own pages with blocks or shortcodes, in each visitor&#039;s currency, refreshed so it never goes stale.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/368891","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=368891"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/plugupp"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=368891"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=368891"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=368891"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=368891"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=368891"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=368891"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}