{"id":385725,"date":"2026-10-16T11:06:22","date_gmt":"2026-10-16T11:06:22","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/fair-member-fees\/"},"modified":"2026-10-16T11:06:10","modified_gmt":"2026-10-16T11:06:10","slug":"fair-member-fees","status":"publish","type":"plugin","link":"https:\/\/cy.wordpress.org\/plugins\/fair-member-fees\/","author":5779233,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.3","requires":"6.6","requires_php":"8.0","requires_plugins":null,"header_name":"Fair Member Fees","header_author":"globus2008","header_description":"Membership register with a change history, volunteer hours and a fair membership fee: members who volunteer more pay less. Optional discount and payment through Stripe. Built with blocks.","assets_banners_color":"097673","last_updated":"2026-10-16 11:06:10","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":74,"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":"globus2008","date":"2026-10-16 11:06:10","revision":3750259}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3750259,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3750259,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3750259,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500-cs_CZ.png":{"filename":"banner-1544x500-cs_CZ.png","revision":3753083,"resolution":"1544x500","location":"assets","locale":"cs_CZ","width":1544,"height":500},"banner-1544x500-es_CL.png":{"filename":"banner-1544x500-es_CL.png","revision":3753083,"resolution":"1544x500","location":"assets","locale":"es_CL","width":1544,"height":500},"banner-1544x500-es_MX.png":{"filename":"banner-1544x500-es_MX.png","revision":3753083,"resolution":"1544x500","location":"assets","locale":"es_MX","width":1544,"height":500},"banner-1544x500-nl_NL.png":{"filename":"banner-1544x500-nl_NL.png","revision":3753083,"resolution":"1544x500","location":"assets","locale":"nl_NL","width":1544,"height":500},"banner-1544x500-ru_RU.png":{"filename":"banner-1544x500-ru_RU.png","revision":3753083,"resolution":"1544x500","location":"assets","locale":"ru_RU","width":1544,"height":500},"banner-1544x500-sv_SE.png":{"filename":"banner-1544x500-sv_SE.png","revision":3753083,"resolution":"1544x500","location":"assets","locale":"sv_SE","width":1544,"height":500},"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3750259,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250-cs_CZ.png":{"filename":"banner-772x250-cs_CZ.png","revision":3753083,"resolution":"772x250","location":"assets","locale":"cs_CZ","width":772,"height":250},"banner-772x250-es_CL.png":{"filename":"banner-772x250-es_CL.png","revision":3753083,"resolution":"772x250","location":"assets","locale":"es_CL","width":772,"height":250},"banner-772x250-es_MX.png":{"filename":"banner-772x250-es_MX.png","revision":3753083,"resolution":"772x250","location":"assets","locale":"es_MX","width":772,"height":250},"banner-772x250-nl_NL.png":{"filename":"banner-772x250-nl_NL.png","revision":3753083,"resolution":"772x250","location":"assets","locale":"nl_NL","width":772,"height":250},"banner-772x250-ru_RU.png":{"filename":"banner-772x250-ru_RU.png","revision":3753083,"resolution":"772x250","location":"assets","locale":"ru_RU","width":772,"height":250},"banner-772x250-sv_SE.png":{"filename":"banner-772x250-sv_SE.png","revision":3753083,"resolution":"772x250","location":"assets","locale":"sv_SE","width":772,"height":250},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3750259,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3753105,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"meta\":{\"title\":\"Fair Member Fees demo\",\"description\":\"Demo club with members, volunteer hours, payments and pages with all five blocks.\",\"author\":\"globus2008\",\"categories\":[\"Membership\"]},\"landingPage\":\"\\\/?pagename=membership-fees\",\"preferredVersions\":{\"php\":\"8.3\",\"wp\":\"latest\"},\"login\":true,\"steps\":[{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"fair-member-fees\"},\"options\":{\"activate\":true}},{\"step\":\"runPHP\",\"code\":\"<?php\\n\\\/\\\/ Demo data for the wordpress.org Live Preview (WordPress Playground).\\nrequire_once '\\\/wordpress\\\/wp-load.php';\\nwp_set_current_user(1);\\nwp_update_user(['ID' => 1, 'first_name' => 'Demo', 'last_name' => 'Manager', 'display_name' => 'Demo Manager']);\\n\\nupdate_option('famefe_settings', array_merge(famefe_settings(), ['currency' => 'USD', 'decimals' => 0]));\\n\\n$year = intval(substr(famefe_today(), 0, 4));\\n$start = $year . '-01-01';\\n$end = $year . '-12-31';\\n$day = function (int $days_ago) use ($start): string {\\n\\treturn max($start, famefe_days_ago($days_ago));\\n};\\n$base_fee = 100;\\n$discount = ['discount_share' => 40, 'discount_rate' => 20];\\n\\n\\\/\\\/ The administrator is a member too, so the hours form and the \\\"your fee\\\" row work right away.\\n$people = [\\n\\t['Demo', 'Manager', 'regular', [[3, 4, 'Court maintenance'], [40, 6, 'Clean-up of the courts'], [90, 2, 'Club website']], 1],\\n\\t['Roger', 'Federer', 'regular', [[5, 8, 'Club tournament organisation'], [60, 12, 'Clean-up of the courts']], 0],\\n\\t['Serena', 'Williams', 'regular', [[10, 6, 'Coaching juniors'], [70, 9, 'Line painting']], 0],\\n\\t['Rafael', 'Nadal', 'regular', [[12, 4, 'Net repair'], [80, 6, 'Clean-up of the courts']], 0],\\n\\t['Steffi', 'Graf', 'regular', [[2, 8, 'Club tournament organisation'], [30, 8, 'Coaching juniors'], [65, 9, 'Line painting']], 0],\\n\\t['Novak', 'Djokovic', 'regular', [[7, 5, 'Clubhouse cleaning']], 0],\\n\\t['Martina', 'Navratilova', 'regular', [[20, 3, 'Net repair']], 0],\\n\\t['Andre', 'Agassi', 'regular', [], 0],\\n\\t['Billie Jean', 'King', 'honorary', [[15, 6, 'Coaching juniors']], 0],\\n\\t['Rod', 'Laver', 'honorary', [], 0],\\n];\\n$ids = [];\\nforeach ($people as $i => [$first, $last, $type, $hours, $user_id]) {\\n\\t$saved = famefe_service_save_member([\\n\\t\\t'first_name' => $first,\\n\\t\\t'last_name' => $last,\\n\\t\\t'email' => $user_id ? '' : strtolower(str_replace(' ', '', $first . '.' . $last)) . '@example.com',\\n\\t\\t'user_id' => $user_id,\\n\\t\\t'member_type' => $type,\\n\\t\\t'member_since' => ($year - 1 - $i) . '-04-01',\\n\\t]);\\n\\tif (is_wp_error($saved)) {\\n\\t\\tcontinue;\\n\\t}\\n\\t$ids[$last] = $saved['id'];\\n\\tforeach ($hours as [$days_ago, $count, $description]) {\\n\\t\\tfamefe_service_add_hours([\\n\\t\\t\\t'member_id' => $saved['id'],\\n\\t\\t\\t'work_date' => $day($days_ago),\\n\\t\\t\\t'hours' => $count,\\n\\t\\t\\t'description' => $description,\\n\\t\\t]);\\n\\t}\\n}\\n\\n\\\/\\\/ A former member, shown in the members list.\\n$former = famefe_service_save_member([\\n\\t'first_name' => 'Boris',\\n\\t'last_name' => 'Becker',\\n\\t'email' => 'boris.becker@example.com',\\n\\t'member_type' => 'regular',\\n\\t'member_since' => ($year - 5) . '-04-01',\\n]);\\nif (!is_wp_error($former)) {\\n\\tfamefe_service_change_member($former['id'], 'left', ($year - 1) . '-12-31');\\n}\\n\\n\\\/\\\/ Two members have already paid their fee.\\n$fees = famefe_period_fees($start, $end, $base_fee, $discount);\\nforeach (['Williams' => 'transfer', 'Federer' => 'cash'] as $last => $method) {\\n\\t$id = $ids[$last] ?? 0;\\n\\tif (isset($fees['calc']['rows'][$id])) {\\n\\t\\tfamefe_service_record_payment([\\n\\t\\t\\t'member_id' => $id,\\n\\t\\t\\t'period_start' => $start,\\n\\t\\t\\t'period_end' => $end,\\n\\t\\t\\t'amount' => $fees['calc']['rows'][$id]['final_fee'],\\n\\t\\t\\t'method' => $method,\\n\\t\\t\\t'paid_on' => $day(1),\\n\\t\\t]);\\n\\t}\\n}\\n\\n$block = function (string $name, array $attrs = []): string {\\n\\treturn serialize_block(['blockName' => $name, 'attrs' => $attrs, 'innerBlocks' => [], 'innerHTML' => '', 'innerContent' => []]);\\n};\\n$paragraph = function (string $text): string {\\n\\treturn '<!-- wp:paragraph --><p>' . esc_html($text) . '<\\\/p><!-- \\\/wp:paragraph -->';\\n};\\n$heading = function (string $text): string {\\n\\treturn '<!-- wp:heading --><h2 class=\\\"wp-block-heading\\\">' . esc_html($text) . '<\\\/h2><!-- \\\/wp:heading -->';\\n};\\n$period = ['periodStart' => $start, 'periodEnd' => $end];\\n\\n$pages = [\\n\\t'membership-fees' => ['Membership fees', implode(\\\"\\\\n\\\\n\\\", [\\n\\t\\t$paragraph('Demo data: members who volunteered more pay less. Record some hours below and watch the fees change.'),\\n\\t\\t$block('famefe\\\/membership-fees', $period + ['blockId' => 'demofees', 'baseFee' => $base_fee, 'discountEnabled' => true, 'discountShare' => 40, 'discountRate' => 20, 'showHonorary' => true, 'showShare' => true]),\\n\\t\\t$heading('Record volunteer hours'),\\n\\t\\t$block('famefe\\\/hours-form', ['blockId' => 'demohoursform', 'allowDateChange' => true]),\\n\\t\\t$heading('Volunteer hours'),\\n\\t\\t$block('famefe\\\/hours-list', $period + ['blockId' => 'demohourslist']),\\n\\t])],\\n\\t'members' => ['Members', $block('famefe\\\/members-list', ['showFormer' => true])],\\n\\t'fee-calculation' => ['How the fee is calculated', $block('famefe\\\/fee-explanation', ['baseFee' => $base_fee])],\\n];\\nforeach ($pages as $slug => [$title, $content]) {\\n\\twp_insert_post(['post_type' => 'page', 'post_status' => 'publish', 'post_name' => $slug, 'post_title' => $title, 'post_content' => $content]);\\n}\\n\"}]}"}},"all_blocks":{"famefe\/members-list":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"version":"1.0.0","category":"widgets","textdomain":"fair-member-fees","name":"famefe\/members-list","title":"Members list","icon":"groups","description":"The membership register: members, their type, membership changes and who recorded them.","keywords":["members","fair member fees","register","membership"],"attributes":{"showRegular":{"type":"boolean","default":true},"showHonorary":{"type":"boolean","default":true},"showFormer":{"type":"boolean","default":false},"nameDisplay":{"type":"string","default":"default"},"showMemberType":{"type":"boolean","default":true},"showMemberSince":{"type":"boolean","default":true},"showLastChange":{"type":"boolean","default":true},"showChangeDate":{"type":"boolean","default":true},"showRecordedBy":{"type":"boolean","default":true},"showRecordedAt":{"type":"boolean","default":false},"onlyLoggedIn":{"type":"boolean","default":true},"showSearch":{"type":"boolean","default":true},"showTotals":{"type":"boolean","default":true},"headerBackground":{"type":"string","default":""},"headerText":{"type":"string","default":""},"totalsBackground":{"type":"string","default":""},"totalsText":{"type":"string","default":""}},"supports":{"html":false,"align":["wide","full"],"color":{"background":true,"text":true,"link":true},"spacing":{"margin":true,"padding":true},"typography":{"fontSize":true}},"editorScript":"file:.\/index.js","style":"famefe-blocks","render":"file:.\/render.php","viewScript":"famefe-tables"},"famefe\/hours-form":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"version":"1.0.0","category":"widgets","textdomain":"fair-member-fees","name":"famefe\/hours-form","title":"Volunteer hours form","icon":"clock","description":"Logged-in members record the hours they volunteered.","keywords":["hours","fair member fees","volunteer","work","form"],"attributes":{"blockId":{"type":"string","default":""},"maxHours":{"type":"number","default":8},"step":{"type":"number","default":0.5},"allowDateChange":{"type":"boolean","default":false},"daysBack":{"type":"number","default":30},"requireDescription":{"type":"boolean","default":true},"buttonText":{"type":"string","default":""},"showRecent":{"type":"boolean","default":true},"recentCount":{"type":"number","default":5}},"supports":{"html":false,"align":["wide","full"],"color":{"background":true,"text":true,"link":true},"spacing":{"margin":true,"padding":true},"typography":{"fontSize":true}},"editorScript":"file:.\/index.js","style":"famefe-blocks","render":"file:.\/render.php"},"famefe\/fee-explanation":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"version":"1.0.0","category":"widgets","textdomain":"fair-member-fees","name":"famefe\/fee-explanation","title":"Fee calculation explained","icon":"editor-help","description":"Explains on an example how the fair membership fee is calculated.","keywords":["fee","fair member fees","calculation","example","help"],"attributes":{"baseFee":{"type":"number","default":1000},"regularHours":{"type":"string","default":"0, 10, 15, 20, 25"},"honoraryHours":{"type":"string","default":"20"},"discountEnabled":{"type":"boolean","default":false},"discountShare":{"type":"number","default":60},"discountRate":{"type":"number","default":20},"discountMode":{"type":"string","enum":["rate","total"],"default":"rate"},"discountTarget":{"type":"number","default":0}},"supports":{"html":false,"align":["wide","full"],"color":{"background":true,"text":true,"link":true},"spacing":{"margin":true,"padding":true},"typography":{"fontSize":true}},"editorScript":"file:.\/index.js","style":"famefe-blocks","render":"file:.\/render.php"},"famefe\/membership-fees":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"version":"1.0.0","category":"widgets","textdomain":"fair-member-fees","name":"famefe\/membership-fees","title":"Membership fees","icon":"money-alt","description":"Fair membership fees for a period: members who volunteered more pay less. Once the hours of the period are closed, members can pay online; administrators and editors record cash and bank payments.","keywords":["fee","fair member fees","membership","payment","volunteer"],"attributes":{"blockId":{"type":"string","default":""},"periodStart":{"type":"string","default":""},"periodEnd":{"type":"string","default":""},"baseFee":{"type":"number","default":1000},"discountEnabled":{"type":"boolean","default":false},"discountShare":{"type":"number","default":60},"discountRate":{"type":"number","default":20},"discountMode":{"type":"string","enum":["rate","total"],"default":"rate"},"discountTarget":{"type":"number","default":0},"showMemberType":{"type":"boolean","default":true},"showHonorary":{"type":"boolean","default":false},"showHours":{"type":"boolean","default":true},"showShare":{"type":"boolean","default":false},"showGross":{"type":"boolean","default":false},"showDiscount":{"type":"boolean","default":true},"showPaidOn":{"type":"boolean","default":true},"summaryAbove":{"type":"boolean","default":true},"showTotals":{"type":"boolean","default":true},"nameDisplay":{"type":"string","default":"default"},"headerBackground":{"type":"string","default":""},"headerText":{"type":"string","default":""},"totalsBackground":{"type":"string","default":""},"totalsText":{"type":"string","default":""},"highlightCurrent":{"type":"boolean","default":true},"showPayButton":{"type":"boolean","default":false}},"supports":{"html":false,"align":["wide","full"],"color":{"background":true,"text":true,"link":true},"spacing":{"margin":true,"padding":true},"typography":{"fontSize":true}},"editorScript":"file:.\/index.js","style":"famefe-blocks","render":"file:.\/render.php","viewScript":"famefe-tables"},"famefe\/hours-list":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"version":"1.0.0","category":"widgets","textdomain":"fair-member-fees","name":"famefe\/hours-list","title":"Volunteer hours list","icon":"list-view","description":"Recorded volunteer hours of a period.","keywords":["hours","fair member fees","volunteer","list"],"attributes":{"blockId":{"type":"string","default":""},"periodStart":{"type":"string","default":""},"periodEnd":{"type":"string","default":""},"count":{"type":"number","default":100},"onlyMine":{"type":"boolean","default":false},"nameDisplay":{"type":"string","default":"default"},"showName":{"type":"boolean","default":true},"showDescription":{"type":"boolean","default":true},"showRecordedAt":{"type":"boolean","default":false},"showTotal":{"type":"boolean","default":true},"allowDelete":{"type":"boolean","default":true},"memberDeleteDays":{"type":"number","default":7},"managerDeleteDays":{"type":"number","default":7}},"supports":{"html":false,"align":["wide","full"],"color":{"background":true,"text":true,"link":true},"spacing":{"margin":true,"padding":true},"typography":{"fontSize":true}},"editorScript":"file:.\/index.js","style":"famefe-blocks","render":"file:.\/render.php","viewScript":"famefe-tables"}},"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1-cs_CZ.png":{"filename":"screenshot-1-cs_CZ.png","revision":3753064,"resolution":"1","location":"assets","locale":"cs_CZ","width":1232,"height":868},"screenshot-1-en_GB.png":{"filename":"screenshot-1-en_GB.png","revision":3753064,"resolution":"1","location":"assets","locale":"en_GB","width":1232,"height":868},"screenshot-1-es_CL.png":{"filename":"screenshot-1-es_CL.png","revision":3753064,"resolution":"1","location":"assets","locale":"es_CL","width":1232,"height":897},"screenshot-1-es_MX.png":{"filename":"screenshot-1-es_MX.png","revision":3753064,"resolution":"1","location":"assets","locale":"es_MX","width":1232,"height":897},"screenshot-1-nl_NL.png":{"filename":"screenshot-1-nl_NL.png","revision":3753064,"resolution":"1","location":"assets","locale":"nl_NL","width":1232,"height":1329},"screenshot-1-ru_RU.png":{"filename":"screenshot-1-ru_RU.png","revision":3753064,"resolution":"1","location":"assets","locale":"ru_RU","width":1232,"height":951},"screenshot-1-sv_SE.png":{"filename":"screenshot-1-sv_SE.png","revision":3753064,"resolution":"1","location":"assets","locale":"sv_SE","width":1232,"height":954},"screenshot-1.png":{"filename":"screenshot-1.png","revision":3750259,"resolution":"1","location":"assets","locale":"","width":1232,"height":868},"screenshot-2-cs_CZ.png":{"filename":"screenshot-2-cs_CZ.png","revision":3753064,"resolution":"2","location":"assets","locale":"cs_CZ","width":1072,"height":1046},"screenshot-2-en_GB.png":{"filename":"screenshot-2-en_GB.png","revision":3753064,"resolution":"2","location":"assets","locale":"en_GB","width":1072,"height":1046},"screenshot-2-es_CL.png":{"filename":"screenshot-2-es_CL.png","revision":3753064,"resolution":"2","location":"assets","locale":"es_CL","width":1072,"height":1046},"screenshot-2-es_MX.png":{"filename":"screenshot-2-es_MX.png","revision":3753064,"resolution":"2","location":"assets","locale":"es_MX","width":1072,"height":1046},"screenshot-2-nl_NL.png":{"filename":"screenshot-2-nl_NL.png","revision":3753064,"resolution":"2","location":"assets","locale":"nl_NL","width":1072,"height":1046},"screenshot-2-ru_RU.png":{"filename":"screenshot-2-ru_RU.png","revision":3753064,"resolution":"2","location":"assets","locale":"ru_RU","width":1072,"height":1046},"screenshot-2-sv_SE.png":{"filename":"screenshot-2-sv_SE.png","revision":3753064,"resolution":"2","location":"assets","locale":"sv_SE","width":1072,"height":1046},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3750259,"resolution":"2","location":"assets","locale":"","width":1072,"height":1046},"screenshot-3-cs_CZ.png":{"filename":"screenshot-3-cs_CZ.png","revision":3753064,"resolution":"3","location":"assets","locale":"cs_CZ","width":1072,"height":696},"screenshot-3-en_GB.png":{"filename":"screenshot-3-en_GB.png","revision":3753064,"resolution":"3","location":"assets","locale":"en_GB","width":1072,"height":696},"screenshot-3-es_CL.png":{"filename":"screenshot-3-es_CL.png","revision":3753064,"resolution":"3","location":"assets","locale":"es_CL","width":1072,"height":696},"screenshot-3-es_MX.png":{"filename":"screenshot-3-es_MX.png","revision":3753064,"resolution":"3","location":"assets","locale":"es_MX","width":1072,"height":696},"screenshot-3-nl_NL.png":{"filename":"screenshot-3-nl_NL.png","revision":3753075,"resolution":"3","location":"assets","locale":"nl_NL","width":1072,"height":696},"screenshot-3-ru_RU.png":{"filename":"screenshot-3-ru_RU.png","revision":3753064,"resolution":"3","location":"assets","locale":"ru_RU","width":1072,"height":696},"screenshot-3-sv_SE.png":{"filename":"screenshot-3-sv_SE.png","revision":3753064,"resolution":"3","location":"assets","locale":"sv_SE","width":1072,"height":696},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3750259,"resolution":"3","location":"assets","locale":"","width":1072,"height":696},"screenshot-4-cs_CZ.png":{"filename":"screenshot-4-cs_CZ.png","revision":3753064,"resolution":"4","location":"assets","locale":"cs_CZ","width":1072,"height":1614},"screenshot-4-en_GB.png":{"filename":"screenshot-4-en_GB.png","revision":3753064,"resolution":"4","location":"assets","locale":"en_GB","width":1072,"height":1642},"screenshot-4-es_CL.png":{"filename":"screenshot-4-es_CL.png","revision":3753064,"resolution":"4","location":"assets","locale":"es_CL","width":1072,"height":1671},"screenshot-4-es_MX.png":{"filename":"screenshot-4-es_MX.png","revision":3753064,"resolution":"4","location":"assets","locale":"es_MX","width":1072,"height":1671},"screenshot-4-nl_NL.png":{"filename":"screenshot-4-nl_NL.png","revision":3753075,"resolution":"4","location":"assets","locale":"nl_NL","width":1072,"height":1671},"screenshot-4-ru_RU.png":{"filename":"screenshot-4-ru_RU.png","revision":3753064,"resolution":"4","location":"assets","locale":"ru_RU","width":1072,"height":1671},"screenshot-4-sv_SE.png":{"filename":"screenshot-4-sv_SE.png","revision":3753064,"resolution":"4","location":"assets","locale":"sv_SE","width":1072,"height":1671},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3750259,"resolution":"4","location":"assets","locale":"","width":1072,"height":1642},"screenshot-5-cs_CZ.png":{"filename":"screenshot-5-cs_CZ.png","revision":3753064,"resolution":"5","location":"assets","locale":"cs_CZ","width":1440,"height":1000},"screenshot-5-en_GB.png":{"filename":"screenshot-5-en_GB.png","revision":3753064,"resolution":"5","location":"assets","locale":"en_GB","width":1440,"height":1000},"screenshot-5-es_CL.png":{"filename":"screenshot-5-es_CL.png","revision":3753064,"resolution":"5","location":"assets","locale":"es_CL","width":1440,"height":1000},"screenshot-5-es_MX.png":{"filename":"screenshot-5-es_MX.png","revision":3753064,"resolution":"5","location":"assets","locale":"es_MX","width":1440,"height":1000},"screenshot-5-nl_NL.png":{"filename":"screenshot-5-nl_NL.png","revision":3753064,"resolution":"5","location":"assets","locale":"nl_NL","width":1440,"height":1000},"screenshot-5-ru_RU.png":{"filename":"screenshot-5-ru_RU.png","revision":3753064,"resolution":"5","location":"assets","locale":"ru_RU","width":1440,"height":1000},"screenshot-5-sv_SE.png":{"filename":"screenshot-5-sv_SE.png","revision":3753064,"resolution":"5","location":"assets","locale":"sv_SE","width":1440,"height":1000},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3750259,"resolution":"5","location":"assets","locale":"","width":1440,"height":1000},"screenshot-6-cs_CZ.png":{"filename":"screenshot-6-cs_CZ.png","revision":3753064,"resolution":"6","location":"assets","locale":"cs_CZ","width":1280,"height":820},"screenshot-6-en_GB.png":{"filename":"screenshot-6-en_GB.png","revision":3753064,"resolution":"6","location":"assets","locale":"en_GB","width":1280,"height":820},"screenshot-6-es_CL.png":{"filename":"screenshot-6-es_CL.png","revision":3753064,"resolution":"6","location":"assets","locale":"es_CL","width":1280,"height":820},"screenshot-6-es_MX.png":{"filename":"screenshot-6-es_MX.png","revision":3753064,"resolution":"6","location":"assets","locale":"es_MX","width":1280,"height":820},"screenshot-6-nl_NL.png":{"filename":"screenshot-6-nl_NL.png","revision":3753064,"resolution":"6","location":"assets","locale":"nl_NL","width":1280,"height":820},"screenshot-6-ru_RU.png":{"filename":"screenshot-6-ru_RU.png","revision":3753064,"resolution":"6","location":"assets","locale":"ru_RU","width":1280,"height":820},"screenshot-6-sv_SE.png":{"filename":"screenshot-6-sv_SE.png","revision":3753064,"resolution":"6","location":"assets","locale":"sv_SE","width":1280,"height":820},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3750259,"resolution":"6","location":"assets","locale":"","width":1280,"height":820},"screenshot-7-cs_CZ.png":{"filename":"screenshot-7-cs_CZ.png","revision":3753064,"resolution":"7","location":"assets","locale":"cs_CZ","width":1280,"height":900},"screenshot-7-en_GB.png":{"filename":"screenshot-7-en_GB.png","revision":3753064,"resolution":"7","location":"assets","locale":"en_GB","width":1280,"height":900},"screenshot-7-es_CL.png":{"filename":"screenshot-7-es_CL.png","revision":3753064,"resolution":"7","location":"assets","locale":"es_CL","width":1280,"height":900},"screenshot-7-es_MX.png":{"filename":"screenshot-7-es_MX.png","revision":3753064,"resolution":"7","location":"assets","locale":"es_MX","width":1280,"height":900},"screenshot-7-nl_NL.png":{"filename":"screenshot-7-nl_NL.png","revision":3753075,"resolution":"7","location":"assets","locale":"nl_NL","width":1280,"height":900},"screenshot-7-ru_RU.png":{"filename":"screenshot-7-ru_RU.png","revision":3753064,"resolution":"7","location":"assets","locale":"ru_RU","width":1280,"height":900},"screenshot-7-sv_SE.png":{"filename":"screenshot-7-sv_SE.png","revision":3753064,"resolution":"7","location":"assets","locale":"sv_SE","width":1280,"height":900},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3750259,"resolution":"7","location":"assets","locale":"","width":1280,"height":900},"screenshot-8-cs_CZ.png":{"filename":"screenshot-8-cs_CZ.png","revision":3753064,"resolution":"8","location":"assets","locale":"cs_CZ","width":1280,"height":820},"screenshot-8-en_GB.png":{"filename":"screenshot-8-en_GB.png","revision":3753064,"resolution":"8","location":"assets","locale":"en_GB","width":1280,"height":820},"screenshot-8-es_CL.png":{"filename":"screenshot-8-es_CL.png","revision":3753064,"resolution":"8","location":"assets","locale":"es_CL","width":1280,"height":820},"screenshot-8-es_MX.png":{"filename":"screenshot-8-es_MX.png","revision":3753064,"resolution":"8","location":"assets","locale":"es_MX","width":1280,"height":820},"screenshot-8-nl_NL.png":{"filename":"screenshot-8-nl_NL.png","revision":3753064,"resolution":"8","location":"assets","locale":"nl_NL","width":1280,"height":820},"screenshot-8-ru_RU.png":{"filename":"screenshot-8-ru_RU.png","revision":3753064,"resolution":"8","location":"assets","locale":"ru_RU","width":1280,"height":820},"screenshot-8-sv_SE.png":{"filename":"screenshot-8-sv_SE.png","revision":3753064,"resolution":"8","location":"assets","locale":"sv_SE","width":1280,"height":820},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3750259,"resolution":"8","location":"assets","locale":"","width":1280,"height":820},"screenshot-9-cs_CZ.png":{"filename":"screenshot-9-cs_CZ.png","revision":3753064,"resolution":"9","location":"assets","locale":"cs_CZ","width":1280,"height":900},"screenshot-9-en_GB.png":{"filename":"screenshot-9-en_GB.png","revision":3753064,"resolution":"9","location":"assets","locale":"en_GB","width":1280,"height":900},"screenshot-9-es_CL.png":{"filename":"screenshot-9-es_CL.png","revision":3753064,"resolution":"9","location":"assets","locale":"es_CL","width":1280,"height":900},"screenshot-9-es_MX.png":{"filename":"screenshot-9-es_MX.png","revision":3753064,"resolution":"9","location":"assets","locale":"es_MX","width":1280,"height":900},"screenshot-9-nl_NL.png":{"filename":"screenshot-9-nl_NL.png","revision":3753064,"resolution":"9","location":"assets","locale":"nl_NL","width":1280,"height":900},"screenshot-9-ru_RU.png":{"filename":"screenshot-9-ru_RU.png","revision":3753064,"resolution":"9","location":"assets","locale":"ru_RU","width":1280,"height":900},"screenshot-9-sv_SE.png":{"filename":"screenshot-9-sv_SE.png","revision":3753064,"resolution":"9","location":"assets","locale":"sv_SE","width":1280,"height":900},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3750259,"resolution":"9","location":"assets","locale":"","width":1280,"height":900}},"screenshots":{"1":"The Membership fees block: the fee of every member calculated from the volunteer hours, with the optional discount and the totals rows.","2":"The Members list block with the totals of regular and honorary members.","3":"The Volunteer hours form and list: members record their own hours, administrators and editors record them for anybody.","4":"The Fee calculation explained block shows the method on an example with your own base fee and discount.","5":"All options of the blocks are in the block settings: the period, the base fee, the discount, the payment button, columns, names and table colours.","6":"Member Fees \u2192 Members: the membership register.","7":"Every change of a membership is kept in the history with the date of the change, who recorded it and when.","8":"Member Fees \u2192 Volunteer hours: all recorded hours with filters.","9":"Member Fees \u2192 Settings: currency and Stripe keys for online payments."}},"plugin_section":[],"plugin_tags":[14241,1932,287094,5349,65258],"plugin_category":[45,58],"plugin_contributors":[223566],"plugin_business_model":[],"class_list":["post-385725","plugin","type-plugin","status-publish","hentry","plugin_tags-club","plugin_tags-membership","plugin_tags-membership-fee","plugin_tags-stripe","plugin_tags-volunteers","plugin_category-ecommerce","plugin_category-user-management","plugin_contributors-globus2008","plugin_committers-globus2008"],"banners":{"banner":"https:\/\/ps.w.org\/fair-member-fees\/assets\/banner-772x250.png?rev=3750259","banner_2x":"https:\/\/ps.w.org\/fair-member-fees\/assets\/banner-1544x500.png?rev=3750259","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/fair-member-fees\/assets\/icon.svg?rev=3750259","icon":"https:\/\/ps.w.org\/fair-member-fees\/assets\/icon.svg?rev=3750259","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/fair-member-fees\/assets\/screenshot-1.png?rev=3750259","caption":"The Membership fees block: the fee of every member calculated from the volunteer hours, with the optional discount and the totals rows."},{"src":"https:\/\/ps.w.org\/fair-member-fees\/assets\/screenshot-2.png?rev=3750259","caption":"The Members list block with the totals of regular and honorary members."},{"src":"https:\/\/ps.w.org\/fair-member-fees\/assets\/screenshot-3.png?rev=3750259","caption":"The Volunteer hours form and list: members record their own hours, administrators and editors record them for anybody."},{"src":"https:\/\/ps.w.org\/fair-member-fees\/assets\/screenshot-4.png?rev=3750259","caption":"The Fee calculation explained block shows the method on an example with your own base fee and discount."},{"src":"https:\/\/ps.w.org\/fair-member-fees\/assets\/screenshot-5.png?rev=3750259","caption":"All options of the blocks are in the block settings: the period, the base fee, the discount, the payment button, columns, names and table colours."},{"src":"https:\/\/ps.w.org\/fair-member-fees\/assets\/screenshot-6.png?rev=3750259","caption":"Member Fees \u2192 Members: the membership register."},{"src":"https:\/\/ps.w.org\/fair-member-fees\/assets\/screenshot-7.png?rev=3750259","caption":"Every change of a membership is kept in the history with the date of the change, who recorded it and when."},{"src":"https:\/\/ps.w.org\/fair-member-fees\/assets\/screenshot-8.png?rev=3750259","caption":"Member Fees \u2192 Volunteer hours: all recorded hours with filters."},{"src":"https:\/\/ps.w.org\/fair-member-fees\/assets\/screenshot-9.png?rev=3750259","caption":"Member Fees \u2192 Settings: currency and Stripe keys for online payments."}],"raw_content":"<!--section=description-->\n<p>Clubs live from the work of their members. Fair Member Fees rewards it: every member records the hours they volunteered, and the membership fee of each member is calculated from them. Whoever works for the club pays less; whoever does not, pays twice the base fee \u2013 paying instead of working is never the cheaper choice.<\/p>\n\n<p><strong>Features<\/strong><\/p>\n\n<ul>\n<li>Membership register with regular and honorary members (honorary members pay no fee).<\/li>\n<li>Full history of every member: joined, membership type changed, membership ended, rejoined \u2013 each with the date of the change, who recorded it and when.<\/li>\n<li>Volunteer hours recorded by the members themselves, or by administrators and editors for anybody.<\/li>\n<li>Fair calculation of the fees for any period (season), see below.<\/li>\n<li>Optional discount for the members with the lowest fees.<\/li>\n<li>Online payment of the fee through Stripe Checkout; cash and bank payments recorded by administrators and editors.<\/li>\n<li>Five blocks, all set up in the block settings \u2013 no shortcodes:\n\n<ul>\n<li><strong>Membership fees<\/strong> \u2013 the fee table of a period; its payment button is turned on once the hours of the period are closed,<\/li>\n<li><strong>Volunteer hours form<\/strong>,<\/li>\n<li><strong>Volunteer hours list<\/strong>,<\/li>\n<li><strong>Members list<\/strong>,<\/li>\n<li><strong>Fee calculation explained<\/strong> \u2013 the method on an example with your own numbers.<\/li>\n<\/ul><\/li>\n<li>Ready for translation.<\/li>\n<\/ul>\n\n<p><strong>How the fee is calculated<\/strong><\/p>\n\n<ol>\n<li>Expected total = base fee \u00d7 number of regular members.<\/li>\n<li>Share of hours = hours of the member \/ hours of all regular members.<\/li>\n<li>Unreduced fee = expected total \u00d7 (1 \u2212 share of hours).<\/li>\n<li>The unreduced fees add up to more than the expected total; the difference is taken off every fee equally. No fee goes below zero (the rest is shared by the others).<\/li>\n<li>A member without any recorded hours in the period always pays twice the base fee.<\/li>\n<\/ol>\n\n<p>Whoever does not volunteer pays twice the base fee, so paying instead of working is never the cheaper choice. Hours of honorary members and non-members are shown in the totals but do not change the fees.<\/p>\n\n<p><strong>Discount (optional)<\/strong><\/p>\n\n<p>Set a share of members (e.g. 60 %) and a discount (e.g. 20 %) in the Membership fees block: the given share of regular members with the lowest fees pays the given percentage less. Members with the same fee as the last of them get it too; members without hours never get it. The discount is not added to the fees of the others.<\/p>\n\n<p>Instead of the percentage, you can set the total to collect: the discount of the same members is then calculated so that all regular members pay exactly this amount together (for example to give back what the double fees of members without hours brought above the expected total).<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to <strong>Stripe<\/strong> (https:\/\/stripe.com) to let members pay their membership fee by card. It is used only when you enter a Stripe secret key in the plugin settings.<\/p>\n\n<ul>\n<li>When a member clicks the payment button, the plugin sends to Stripe: the amount and currency, the name of the payment (\"Membership fee\" and the period), the member's e-mail address, the member ID and the period, and the addresses of your page to return to. The member then enters the card details directly on the Stripe payment page.<\/li>\n<li>When the member returns, the plugin asks Stripe whether the payment was completed. Stripe also sends the result to the webhook address of the plugin.<\/li>\n<\/ul>\n\n<p>Stripe terms of service: https:\/\/stripe.com\/legal\/ssa \u2013 Stripe privacy policy: https:\/\/stripe.com\/privacy<\/p>\n\n<h3>Source code<\/h3>\n\n<p>The editor scripts in <code>build\/<\/code> are compiled from the human-readable sources in <code>src\/<\/code> (included in the plugin) with <code>@wordpress\/scripts<\/code> (<code>npm install<\/code>, <code>npm run build<\/code>). The development repository is public: https:\/\/github.com\/globus2008\/fair-member-fees<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>Go to <strong>Member Fees \u2192 Members<\/strong> and add your members; link them to their user accounts so that they can record hours and pay online.<\/li>\n<li>In <strong>Member Fees \u2192 Settings<\/strong> set the currency and, for online payments, your Stripe keys and the webhook.<\/li>\n<li>Add the blocks to your pages (search for \"Fair Member Fees\" in the block inserter). Set the period, the base fee and the discount in the Membership fees block.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"why%20do%20members%20not%20see%20the%20payment%20button%3F\"><h3>Why do members not see the payment button?<\/h3><\/dt>\n<dd><p>The button is off until you turn it on in the Membership fees block (\"Payment button\"). Turn it on once the volunteer hours of the period are closed and the fees are final; until then members see the fee calculated from the hours recorded so far. Online payment also needs the Stripe keys in the settings. If your club only keeps records of hours, simply leave the button off.<\/p><\/dd>\n<dt id=\"who%20can%20record%20hours%3F\"><h3>Who can record hours?<\/h3><\/dt>\n<dd><p>Every logged-in member records own hours. Administrators and editors can record hours for any member. In the settings you can allow logged-in non-members to record hours too; their hours count only in the totals.<\/p><\/dd>\n<dt id=\"who%20sees%20the%20form%20for%20cash%20payments%3F\"><h3>Who sees the form for cash payments?<\/h3><\/dt>\n<dd><p>Only administrators and editors (the capability <code>famefe_manage<\/code>).<\/p><\/dd>\n<dt id=\"can%20the%20amount%20to%20pay%20be%20changed%20in%20the%20browser%3F\"><h3>Can the amount to pay be changed in the browser?<\/h3><\/dt>\n<dd><p>No. The server always calculates the fee from the saved block settings and the recorded hours.<\/p><\/dd>\n<dt id=\"what%20happens%20with%20the%20data%20when%20i%20delete%20the%20plugin%3F\"><h3>What happens with the data when I delete the plugin?<\/h3><\/dt>\n<dd><p>Nothing, unless you turn on \"Delete data\" in the settings.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Membership register, volunteer hours and a fair membership fee: members who volunteer more pay less. Optional discount and Stripe payments.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/cy.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/385725","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cy.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/cy.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/cy.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=385725"}],"author":[{"embeddable":true,"href":"https:\/\/cy.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/globus2008"}],"wp:attachment":[{"href":"https:\/\/cy.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=385725"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/cy.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=385725"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/cy.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=385725"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/cy.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=385725"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/cy.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=385725"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/cy.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=385725"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}