{"id":323417,"date":"2026-06-13T23:02:17","date_gmt":"2026-06-13T23:02:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/handypay-payments\/"},"modified":"2026-08-10T16:14:01","modified_gmt":"2026-08-10T16:14:01","slug":"handypay-payments","status":"publish","type":"plugin","link":"https:\/\/ssw.wordpress.org\/plugins\/handypay-payments\/","author":23512862,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"7.0.4","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"HandyPay Payments","header_author":"HandyPay","header_description":"Accept card payments on your WordPress site and get paid to a local bank account \u2014 built for the Caribbean: Jamaica, Trinidad &amp; Tobago, St. Lucia, Antigua, Guyana and the Bahamas (plus major markets). Add pay buttons, payment links and a branded checkout via [handypay_pay] or the Gutenberg \/ Elementor \/ Bricks widgets.","assets_banners_color":"f8fdf9","last_updated":"2026-08-10 16:14:01","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/handypay.me","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":175,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"kylekonstnar","date":"2026-06-13 23:01:40"},"1.0.1":{"tag":"1.0.1","author":"kylekonstnar","date":"2026-08-10 16:14:01"}},"upgrade_notice":{"1.0.0":"<p>First stable release with refunds, disputes, and a redesigned admin. Re-activate once to apply database upgrades.<\/p>","0.4.0":"<p>Adds custom font uploads, the Plan &amp; Branding screen, and renames Payment Links to Payment Buttons. Re-activate the plugin once to flush rewrite rules and create the new options.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3640865,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3640865,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3640865,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3590704,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3590704,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"handypay\/pay-button":{"name":"handypay\/pay-button","title":"HandyPay Button"}},"tagged_versions":["1.0.0","1.0.1"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"The dashboard \u2014 KPI cards (today \/ 7 \/ 30 days \/ all-time), revenue chart, recent payments.","2":"Payment Buttons list \u2014 every button you've created, with status, usage, and copy URL\/shortcode actions.","3":"Create button form \u2014 amount, description, reusable toggle, expiration, appearance.","4":"The public payment landing page \u2014 clean Stripe-style checkout with your branding.","5":"Settings \u2192 Appearance \u2014 live preview with color\/font\/size\/padding controls.","6":"Plan &amp; Branding \u2014 upgrade to Pro for reduced fees + custom branding."}},"plugin_section":[],"plugin_tags":[3148,282,209782,1887,5349],"plugin_category":[45],"plugin_contributors":[267010],"plugin_business_model":[],"class_list":["post-323417","plugin","type-plugin","status-publish","hentry","plugin_tags-checkout","plugin_tags-ecommerce","plugin_tags-payment-links","plugin_tags-payments","plugin_tags-stripe","plugin_category-ecommerce","plugin_contributors-kylekonstnar","plugin_committers-kylekonstnar"],"banners":{"banner":"https:\/\/ps.w.org\/handypay-payments\/assets\/banner-772x250.png?rev=3590704","banner_2x":"https:\/\/ps.w.org\/handypay-payments\/assets\/banner-1544x500.png?rev=3590704","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/handypay-payments\/assets\/icon.svg?rev=3640865","icon":"https:\/\/ps.w.org\/handypay-payments\/assets\/icon.svg?rev=3640865","icon_2x":false,"generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>HandyPay<\/strong> lets you accept card payments on your WordPress site without WooCommerce or a complicated checkout setup. Create a payment button, then drop it on a page, share it as a URL, or paste it in an email.<\/p>\n\n<h4>Why HandyPay?<\/h4>\n\n<ul>\n<li><strong>One button, three ways to use it<\/strong> \u2014 embed on a page, share a URL, paste raw HTML on any site.<\/li>\n<li><strong>Unlimited buttons<\/strong> \u2014 one for every service, product, or tier. Manage them all from one screen.<\/li>\n<li><strong>Sharable payment links<\/strong> \u2014 <code>\/handypay\/pay\/your-slug<\/code> URLs you can drop in DMs, emails, social bios.<\/li>\n<li><strong>Reusable or one-time<\/strong> \u2014 pay-me-anytime tip jar, or single-use ticket link that expires after one purchase.<\/li>\n<li><strong>Custom design<\/strong> \u2014 colors, padding, corner radius, font (built-in Matter, Google Fonts, or upload your own).<\/li>\n<li><strong>Live preview<\/strong> \u2014 see the button update as you configure it.<\/li>\n<li><strong>Built-in dashboard<\/strong> \u2014 revenue stats, recent payments, status breakdown, sparkline chart.<\/li>\n<li><strong>Powered by HandyPay<\/strong> \u2014 a complete merchant platform, including a mobile app, payouts, and dispute management.<\/li>\n<\/ul>\n\n<h4>HandyPay Pro<\/h4>\n\n<p>HandyPay Pro is an optional paid upgrade ($29\/month):<\/p>\n\n<ul>\n<li><strong>Reduced transaction fees<\/strong> on every payment.<\/li>\n<li><strong>Custom payment-page branding<\/strong> \u2014 your logo, colors, and a footer message \u2014 added by the separate HandyPay Pro add-on, installed from <a href=\"https:\/\/handypay.me\">handypay.me<\/a>.<\/li>\n<\/ul>\n\n<p>The \"Secure checkout powered by HandyPay\" credit on the payment page is off by default and only appears if you turn it on under HandyPay \u2192 Settings.<\/p>\n\n<h4>What you need<\/h4>\n\n<ol>\n<li>A HandyPay merchant account \u2014 sign up at <a href=\"https:\/\/merchant.handypay.me\/onboarding\">merchant.handypay.me<\/a> (free).<\/li>\n<li>One click to connect \u2014 HandyPay creates your API key and registers the webhook for you.<\/li>\n<li>Two minutes for setup.<\/li>\n<\/ol>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Drop-in <code>[handypay_pay]<\/code> shortcode with attributes for amount, currency, description, button text, colors, font, padding, and size.<\/li>\n<li>Payment Buttons admin: create unlimited buttons, each with its own price and styling.<\/li>\n<li>Sharable payment links at clean URLs.<\/li>\n<li>Webhook reconciliation with HMAC-SHA256 signature verification.<\/li>\n<li>Built-in dashboard mirroring the HandyPay merchant portal.<\/li>\n<li>Custom font uploads (.woff2, .woff, .ttf, .otf).<\/li>\n<li>Curated Google Fonts: Inter, Roboto, Poppins, Manrope, DM Sans, Plus Jakarta, Work Sans, Space Grotesk.<\/li>\n<li>Onboarding wizard for first-time merchants.<\/li>\n<li>Test mode toggle.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to the <strong>HandyPay payments API<\/strong> (<code>https:\/\/api.handypay.me<\/code>) to create payment sessions, render signed buttons, and reconcile payments through HandyPay's payment processor (<strong>Stripe<\/strong>). This connection is required for the plugin to accept payments.<\/p>\n\n<ul>\n<li><strong>When:<\/strong> when a button or payment link is rendered, when a customer starts a payment, when HandyPay sends a webhook to your site, and when the store owner views the dashboard or manages payments.<\/li>\n<li><strong>Data sent:<\/strong> payment amount and currency, button\/link descriptions, the customer's email (if provided at checkout), and your HandyPay API key for authentication. Raw card details are collected by HandyPay\/Stripe directly and are never sent to or stored on your site.<\/li>\n<li><strong>HandyPay:<\/strong> Terms \u2014 https:\/\/handypay.me\/terms \u00b7 Privacy \u2014 https:\/\/handypay.me\/privacy<\/li>\n<li><strong>Stripe (payment processor):<\/strong> Terms \u2014 https:\/\/stripe.com\/legal \u00b7 Privacy \u2014 https:\/\/stripe.com\/privacy<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install <strong>HandyPay Payments<\/strong> from <strong>Plugins \u2192 Add New<\/strong> (search \"HandyPay\"), or upload the <code>handypay-payments<\/code> folder to <code>\/wp-content\/plugins\/<\/code>. Click <strong>Activate<\/strong>.<\/li>\n<li>Go to <strong>HandyPay<\/strong> and click <strong>Connect HandyPay<\/strong>. Sign in at handypay.me and your store is linked in one click \u2014 we create the API key and register the webhook for you automatically. No keys to copy, no webhook to set up by hand.<\/li>\n<li>Go to <strong>HandyPay \u2192 Payment Buttons<\/strong> and create your first button, then drop it on any page with the block, shortcode, or your page builder.<\/li>\n<\/ol>\n\n<p>Prefer to enter credentials manually? You still can under <strong>HandyPay \u2192 Settings<\/strong>.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20woocommerce%3F\"><h3>Do I need WooCommerce?<\/h3><\/dt>\n<dd><p>No. HandyPay is standalone and works on any WordPress site, including page-builder themes like Elementor, Divi, Bricks, Beaver Builder, and the default block editor.<\/p><\/dd>\n<dt id=\"where%20does%20the%20payment%20actually%20happen%3F\"><h3>Where does the payment actually happen?<\/h3><\/dt>\n<dd><p>On a HandyPay-hosted Stripe Checkout page. Customers leave your site, complete payment, and return to your configured success page. PCI compliance is handled by HandyPay + Stripe \u2014 your WordPress site never touches card data.<\/p><\/dd>\n<dt id=\"can%20prices%20be%20tampered%20with%3F\"><h3>Can prices be tampered with?<\/h3><\/dt>\n<dd><p>No. Amounts are signed server-side when the button renders, and re-verified on the way to checkout. Customers can't modify prices via DevTools.<\/p><\/dd>\n<dt id=\"which%20currency%20does%20the%20plugin%20use%3F\"><h3>Which currency does the plugin use?<\/h3><\/dt>\n<dd><p>New payment buttons and shortcode payments default to the site's primary HandyPay payment currency. You can select another supported charge currency when creating a button. Dashboards and charts never add unlike currencies together; detailed reports remain grouped by ISO currency code.<\/p><\/dd>\n<dt id=\"how%20are%20webhooks%20verified%3F\"><h3>How are webhooks verified?<\/h3><\/dt>\n<dd><p>HandyPay signs every webhook with HMAC-SHA256. The plugin verifies in constant time using PHP's <code>hash_equals<\/code> before processing.<\/p><\/dd>\n<dt id=\"can%20i%20use%20my%20own%20fonts%3F\"><h3>Can I use my own fonts?<\/h3><\/dt>\n<dd><p>Yes. Upload <code>.woff2<\/code>, <code>.woff<\/code>, <code>.ttf<\/code>, or <code>.otf<\/code> files via <strong>HandyPay \u2192 Fonts<\/strong>, then pick them in Settings \u2192 Appearance \u2192 Font. Each button can also override the font via the <code>font=\"...\"<\/code> shortcode attribute.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20multisite%3F\"><h3>Does it work on multisite?<\/h3><\/dt>\n<dd><p>Yes. Activate per-site; each site has its own API key and settings.<\/p><\/dd>\n<dt id=\"what%20countries%20are%20supported%3F\"><h3>What countries are supported?<\/h3><\/dt>\n<dd><p>Wherever HandyPay supports onboarding merchants. See <a href=\"https:\/\/handypay.me\">handypay.me<\/a> for the current list.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Added country-aware currency symbols and all currently enabled HandyPay merchant currencies to payment controls.<\/li>\n<li>Payment buttons now default to the site's primary payment currency.<\/li>\n<li>Dashboard and report charts isolate currencies instead of combining unlike amounts.<\/li>\n<li>Fixed webhook subscriptions: the plugin now registers the event names the HandyPay API actually sends, so payments, bookings, and orders confirm automatically again. Existing sites re-register themselves on the next admin visit \u2014 no action needed.<\/li>\n<li>Payment statuses now sync for expired checkouts and delayed (asynchronous) payment methods, and a checkout is only marked paid once the money has actually moved.<\/li>\n<li>New: a floating Feedback button on every HandyPay screen \u2014 report an issue or idea straight to the HandyPay team and get a case reference back.<\/li>\n<li>Plan &amp; Billing: refresh your plan status after subscribing on the HandyPay dashboard, plus clearer past-due billing warnings.<\/li>\n<li>Security hardening from a full audit: stricter refund amount validation with duplicate-submit protection, rate limiting on public checkout endpoints, webhook amount\/site verification, an HTTPS allowlist for the API base URL, safer CSV exports, and multisite-aware uninstall.<\/li>\n<li>Refreshed the HandyPay logo across the plugin to match the current brand icon.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First stable release.<\/li>\n<li>Refund management from the Payments screen.<\/li>\n<li>Dispute management with evidence submission.<\/li>\n<li>Redesigned create-button form and admin tables (shadcn-style), toast and confirm dialogs, and a full-screen admin app shell.<\/li>\n<li>External-services disclosure added (HandyPay API + Stripe).<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>Custom font uploads (.woff2\/.woff\/.ttf\/.otf) + curated Google Fonts.<\/li>\n<li>Payment Buttons (renamed from Payment Links) with per-row Copy URL and Copy Shortcode.<\/li>\n<li>Plan &amp; Branding admin: free vs Pro, upgrade flow, branded payment page (logo, colors, footer text, hide HP branding).<\/li>\n<li>Subscription webhook handlers update the cached plan automatically.<\/li>\n<li>Dashboard nudge for free merchants to upgrade.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Payment Links (now \"Payment Buttons\"): create reusable \/ one-time \/ capped \/ expiring buttons with their own URLs.<\/li>\n<li>Public landing page at <code>\/handypay\/pay\/&lt;slug&gt;<\/code>.<\/li>\n<li><code>[handypay_pay link=\"slug\"]<\/code> shortcode mode.<\/li>\n<li>Webhooks increment use count for one-time and capped links.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Live preview on the settings page.<\/li>\n<li>Button color, hover color, padding, font size, font weight, corner radius controls.<\/li>\n<li>Size presets (Small \/ Medium \/ Large).<\/li>\n<li>Matter typeface (same as the HandyPay merchant portal).<\/li>\n<li>Built-in dashboard mirroring the HandyPay merchant portal.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Accept payments anywhere on your WordPress site with HandyPay. Drop a button, share a payment link, manage everything from one dashboard.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/323417","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=323417"}],"author":[{"embeddable":true,"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/kylekonstnar"}],"wp:attachment":[{"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=323417"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=323417"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=323417"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=323417"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=323417"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ssw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=323417"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}