{"id":374795,"date":"2026-09-26T14:58:06","date_gmt":"2026-09-26T14:58:06","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/gather-grove-sync-for-notion\/"},"modified":"2026-09-26T14:46:38","modified_gmt":"2026-09-26T14:46:38","slug":"gather-grove-notion-sync","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/gather-grove-notion-sync\/","author":23506124,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.52.0","stable_tag":"0.52.0","tested":"7.1.2","requires":"6.8","requires_php":"8.2","requires_plugins":null,"header_name":"Gather Grove Sync for Notion","header_author":"Rob Hewitt \/ Gather Grove","header_description":"Sync WordPress data to Notion \u2014 Elementor, Contact Form 7, WPForms, Fluent Forms, WooCommerce orders, incoming webhooks, and any source via the public API. Auto-extends columns, merges duplicates, routes per form, backfills history.","assets_banners_color":"254032","last_updated":"2026-09-26 14:46:38","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/gathergrove.io","rating":0,"author_block_rating":0,"active_installs":0,"downloads":40,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.52.0":{"tag":"0.52.0","author":"gturtle108","date":"2026-09-26 14:46:38","revision":3714350}},"upgrade_notice":{"0.34.0":"<p>Notion Sync now folds into the unified Gather Grove admin menu when other Gather Grove plugins are active; standalone installs are unchanged. Purely additive.<\/p>","0.32.0":"<p>Gather Grove Booking guest bookings now sync to Notion (not just members). Tested up to WordPress 7.0. Purely additive.<\/p>","0.31.0":"<p>Adds Gather Grove Booking sync (bookings\/attendance\/purchases \u2192 a Notion CRM, when Booking is active) and a friendlier database dropdown on the Sources tab. Purely additive.<\/p>","0.30.0":"<p>Adds a Sources tab to see and control every connected source, one-click webhook setup, and a first-run setup checklist. Purely additive \u2014 existing syncs are unchanged.<\/p>","0.29.0":"<p>Adds native sync for Contact Form 7, WPForms, Fluent Forms, and WooCommerce orders, plus a secure incoming webhook. Auto-detected \u2014 no setup for installed form plugins. Purely additive; your Elementor sync is unchanged.<\/p>","0.28.0":"<p>Renames internal tables\/options to the gg_notion_sync_ prefix automatically on update \u2014 your connection, settings, mappings, and history are preserved (no reconnect needed). Also drops the admin-page Google Fonts request for privacy.<\/p>","0.14.0":"<p>Adds optional per-database overrides on the Column Rename Map. No action required \u2014 existing global renames keep working as-is. Visit the new &quot;Per-database overrides&quot; subsection only if a single column name needs different renames in different databases.<\/p>","0.13.0":"<p>Adds a persistent retry queue: failed Notion writes now retry automatically via WP-Cron with exponential backoff (5 attempts over ~14 hours). Transient outages no longer lose live submissions. Installs a new DB table on activation. Strongly recommended.<\/p>","0.12.0":"<p>Adds a scope picker in the Backfill section so you can target a specific form (or a few) for a one-off backfill without flipping your live sync mode. No behavior change unless you opt in.<\/p>","0.11.0":"<p>Adds dedup conflict detection \u2014 surfaces silent multi-match cases in the activity log so duplicates in Notion don&#039;t go unnoticed. Recommended.<\/p>","0.10.0":"<p>Multi-select Elementor fields now create proper Notion multi_select columns (one chip per selection) instead of one comma-joined value. Existing single-select columns from older versions are not re-typed; delete + re-sync in Notion to convert.<\/p>","0.9.0":"<p>Fixes the within-chunk dedup race that caused duplicate rows during backfill bursts. Adds a Send Test Row diagnostic button and Export CSV for the activity log. Recommended.<\/p>","0.8.0":"<p>Adds three aggregation columns auto-populated on dedup-merge: Forms Submitted (chips), Submission Count, First Submitted. See at a glance which forms a person filled out and how many times.<\/p>","0.7.5":"<p>New Column Rename Map: rename auto-generated columns in Notion&#039;s UI, then add a <code>Old Name -&amp;gt; New Name<\/code> entry in settings to keep the plugin writing to the renamed column.<\/p>","0.7.4":"<p>Auto-cleans pasted-from-URL database IDs (trailing <code>?<\/code>, query params, full URLs). Self-heals existing bad data without re-save.<\/p>","0.7.3":"<p>Activity log auto-recovers if missing; backfill errors surface the actual Notion API message inline. Strongly recommended.<\/p>","0.7.2":"<p>Fix for backfill silently skipping all submissions on certain Elementor Pro versions. Recommended.<\/p>","0.7.1":"<p>WP.org packaging. No functional changes.<\/p>","0.7.0":"<p>Notion database creation moved inside the plugin. No need to bootstrap databases manually anymore.<\/p>","0.6.0":"<p>Multi-database routing. Schema cache is now per-DB. No action required for existing installs \u2014 overrides default to empty.<\/p>","0.5.0":"<p>Notion token now encrypted at rest. Migration runs automatically on first load after upgrade.<\/p>","0.4.0":"<p>New activity log + connection banner. Default shared fields trimmed \u2014 if you were relying on name-based merging, edit the shared fields list to add it back.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3714351,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3714351,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3714351,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3714351,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.52.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3714351,"resolution":"1","location":"assets","locale":"","width":1456,"height":730},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3714351,"resolution":"2","location":"assets","locale":"","width":1456,"height":730},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3714351,"resolution":"3","location":"assets","locale":"","width":1456,"height":730},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3714351,"resolution":"4","location":"assets","locale":"","width":1456,"height":730},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3714351,"resolution":"5","location":"assets","locale":"","width":1456,"height":730},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3714351,"resolution":"6","location":"assets","locale":"","width":1456,"height":730}},"screenshots":{"1":"Setup \u2014 one-click Connect to Notion, the default database picker, and a manual-token option for self-hosters.","2":"Sources \u2014 every installed form and store plugin syncs automatically; flip a source off or route it to a different database.","3":"Form selection \u2014 sync every form or only the ones you tick, with a per-form database override and one-click database creation.","4":"Per-form field mapping \u2014 how each field lands in Notion, with a rescan when a form changes.","5":"Tools \u2014 test the connection, refresh the schema, and backfill historical submissions with live counts.","6":"Activity \u2014 the recent sync log with created, updated and failed badges and direct \"View in Notion\" links."}},"plugin_section":[],"plugin_tags":[76538,601,209420,1558,286],"plugin_category":[42,45],"plugin_contributors":[282128],"plugin_business_model":[],"class_list":["post-374795","plugin","type-plugin","status-publish","hentry","plugin_tags-elementor","plugin_tags-forms","plugin_tags-notion","plugin_tags-sync","plugin_tags-woocommerce","plugin_category-contact-forms","plugin_category-ecommerce","plugin_contributors-gturtle108","plugin_committers-gturtle108"],"banners":{"banner":"https:\/\/ps.w.org\/gather-grove-notion-sync\/assets\/banner-772x250.png?rev=3714351","banner_2x":"https:\/\/ps.w.org\/gather-grove-notion-sync\/assets\/banner-1544x500.png?rev=3714351","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/gather-grove-notion-sync\/assets\/icon-128x128.png?rev=3714351","icon_2x":"https:\/\/ps.w.org\/gather-grove-notion-sync\/assets\/icon-256x256.png?rev=3714351","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/gather-grove-notion-sync\/assets\/screenshot-1.png?rev=3714351","caption":"Setup \u2014 one-click Connect to Notion, the default database picker, and a manual-token option for self-hosters."},{"src":"https:\/\/ps.w.org\/gather-grove-notion-sync\/assets\/screenshot-2.png?rev=3714351","caption":"Sources \u2014 every installed form and store plugin syncs automatically; flip a source off or route it to a different database."},{"src":"https:\/\/ps.w.org\/gather-grove-notion-sync\/assets\/screenshot-3.png?rev=3714351","caption":"Form selection \u2014 sync every form or only the ones you tick, with a per-form database override and one-click database creation."},{"src":"https:\/\/ps.w.org\/gather-grove-notion-sync\/assets\/screenshot-4.png?rev=3714351","caption":"Per-form field mapping \u2014 how each field lands in Notion, with a rescan when a form changes."},{"src":"https:\/\/ps.w.org\/gather-grove-notion-sync\/assets\/screenshot-5.png?rev=3714351","caption":"Tools \u2014 test the connection, refresh the schema, and backfill historical submissions with live counts."},{"src":"https:\/\/ps.w.org\/gather-grove-notion-sync\/assets\/screenshot-6.png?rev=3714351","caption":"Activity \u2014 the recent sync log with created, updated and failed badges and direct \"View in Notion\" links."}],"raw_content":"<!--section=description-->\n<p>Gather Grove Sync for Notion sends your WordPress data to a Notion database \u2014 form submissions (Elementor Pro, Contact Form 7, WPForms, Fluent Forms), WooCommerce orders, Gather Grove Booking activity, and anything else via an incoming webhook or the developer API. The plugin owns the Notion schema for you \u2014 columns auto-extend as data arrives, with smart type mapping (email \u2192 Email, tel \u2192 Phone, date \u2192 Date) and a rich_text fallback for anything unrecognized.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>Many sources, one Notion pipe<\/strong> \u2014 Elementor Pro, Contact Form 7, WPForms (incl. Lite), Fluent Forms, and WooCommerce orders sync out of the box; any other service can POST to a secure incoming webhook. Every source funnels through the same dedup \/ column-auto-extend \/ retry \/ activity-log pipeline.<\/li>\n<li><strong>Auto-extending schema<\/strong> \u2014 submit a new form, the columns appear in Notion. No manual mapping.<\/li>\n<li><strong>Smart type mapping<\/strong> \u2014 Elementor email\/tel\/url\/number\/date\/select\/checkbox fields map to the matching Notion property types so your data is sortable and filterable.<\/li>\n<li><strong>Multi-database routing<\/strong> \u2014 send different forms to different Notion databases via per-form overrides, with a global default for everything else.<\/li>\n<li><strong>Deduplication<\/strong> \u2014 merge submissions by Email (or any column you choose) so the same person's submissions across forms collect into one row, with a chronological log appended to the page body. Original page title is preserved on update so \"first contact\" stays visible.<\/li>\n<li><strong>Backfill historical submissions<\/strong> \u2014 paginate through Elementor's Submissions storage in 25-row chunks. Idempotent \u2014 re-runs skip already-synced submissions.<\/li>\n<li><strong>Activity log<\/strong> \u2014 every sync attempt is recorded to a custom DB table, visible in the admin with success\/failure badges and direct \"View in Notion\" links. Capped at 1000 entries with auto-prune.<\/li>\n<li><strong>Encrypted token storage<\/strong> \u2014 Notion integration token is stored encrypted at rest using AES-256-GCM, with the key derived from your WordPress AUTH_KEY.<\/li>\n<li><strong>Connection retry<\/strong> \u2014 one in-process retry on transient API failures (429, 5xx), then a background retry ladder for anything still failing.<\/li>\n<li><strong>One-click database creation<\/strong> \u2014 search for a parent page, set a title, click Create. New database starts pre-configured with the plugin's system columns.<\/li>\n<li><strong>Connection status banner<\/strong> \u2014 green\/red status at the top of the settings page with per-database breakdown when multiple databases are configured.<\/li>\n<\/ul>\n\n<h4>How it works<\/h4>\n\n<ol>\n<li>Create a Notion integration at https:\/\/www.notion.so\/profile\/integrations and copy the token.<\/li>\n<li>Install and activate the plugin, then go to Settings \u2192 Gather Grove Sync for Notion.<\/li>\n<li>Paste the token (or use the one-click \"Connect to Notion\"). Either paste an existing database ID, or use the built-in <strong>Create a Notion Database<\/strong> tool to make a fresh one.<\/li>\n<li>The integration must be invited to your Notion database (in Notion: open the database \u2192 \u00b7\u00b7\u00b7 \u2192 Connections \u2192 add your integration).<\/li>\n<li>Submit a form, place a WooCommerce order, or send a webhook \u2014 the plugin auto-creates whatever columns it needs and writes the record. See and control every source on the <strong>Sources<\/strong> tab.<\/li>\n<\/ol>\n\n<h4>What's not included<\/h4>\n\n<ul>\n<li>The plugin does not provide a manual field-mapping UI \u2014 it owns the schema. Field labels become column names automatically. (If you need manual mapping, a different integration may suit you better.)<\/li>\n<li>The Elementor source requires Elementor <strong>Pro<\/strong> (free Elementor has no form widget). Every other source \u2014 Contact Form 7, WPForms, Fluent Forms, WooCommerce, Gather Grove Booking, the webhook \u2014 works on its own.<\/li>\n<\/ul>\n\n<h3>External Services<\/h3>\n\n<p>This plugin connects to two external services. Neither is contacted until you\nchoose to connect the plugin to Notion, and nothing is transmitted on a fresh\ninstall that has not been configured.<\/p>\n\n<p><strong>1. Notion API (api.notion.com)<\/strong><\/p>\n\n<p>This is the service the plugin exists to talk to. It is used to read your\nNotion database schema and to create and update pages in the database you\nselect.<\/p>\n\n<p>What is sent, and when:<\/p>\n\n<ul>\n<li>When you connect and pick a database: a request to <code>api.notion.com\/v1\/search<\/code>\nand <code>api.notion.com\/v1\/databases\/{id}<\/code> to list the databases and pages your\nintegration can see, and to read the chosen database's column schema. Sends\nyour Notion integration token.<\/li>\n<li>When a form is submitted, an order is placed, or a webhook arrives: a request\nto <code>api.notion.com\/v1\/pages<\/code> containing the submitted field values that are\nbeing synced \u2014 this can include personal data such as name, email address,\nphone number, and any other field your form collects. Sends your Notion\nintegration token.<\/li>\n<li>When you create a database from inside the plugin, run a backfill, or send a\ntest row: the same page\/database endpoints, with the same kinds of data.<\/li>\n<li>When a sync fails and is retried: the same page data is sent again.<\/li>\n<\/ul>\n\n<p>Data is only sent for the sources you have enabled and the forms you have\nselected. The plugin does not send site analytics, usage telemetry, or\nadministrator details.<\/p>\n\n<p>Service provided by Notion Labs, Inc.\nTerms of service: https:\/\/www.notion.com\/terms\nPrivacy policy: https:\/\/www.notion.so\/notion\/Notion-Privacy-Policy-3468d120cf614d4c9014c09f6adc9091<\/p>\n\n<p><strong>2. Gather Grove OAuth broker (gathergrove.io)<\/strong><\/p>\n\n<p>Optional. This is used only by the one-click \"Connect to Notion\" button, which\nexists so you do not have to create your own Notion integration by hand. It\nholds the Notion OAuth application credentials, which cannot be shipped inside\na public plugin, and exchanges them for a token belonging to your workspace.<\/p>\n\n<p>What is sent, and when:<\/p>\n\n<ul>\n<li>When you click \"Connect to Notion\": your browser is redirected to\n  gathergrove.io\/wp-json\/gg-notion-oauth\/v1\/start with the WordPress admin\nURL to return to and a random one-time CSRF value. No site content, form\ndata, or credentials are included.<\/li>\n<li>Immediately after you approve the connection in Notion: one server-to-server\nrequest from your site to\n  gathergrove.io\/wp-json\/gg-notion-oauth\/v1\/redeem containing only the\nsingle-use handoff code from the previous step. The broker responds with the\nNotion access token for your workspace, which is then stored encrypted on\nyour own site.<\/li>\n<\/ul>\n\n<p>The broker is contacted only during these two steps of the connection flow. It\nis never contacted during syncing, and no submitted form data ever passes\nthrough it.<\/p>\n\n<p>You can avoid this service entirely: create your own Notion internal\nintegration and paste its token into the \"Connect manually instead\" field on\nthe Setup tab. The broker is then never contacted.<\/p>\n\n<p>Service provided by Gather Grove (Golden Turtle Sound).\nPrivacy policy: https:\/\/gathergrove.io\/privacy\/<\/p>\n\n<p><strong>Bundled third-party library<\/strong><\/p>\n\n<p>This plugin bundles Action Scheduler (https:\/\/actionscheduler.org\/), a\nbackground-processing library, which it uses to retry failed Notion writes.\nAction Scheduler runs entirely on your own server and makes no external\nrequests. It creates four database tables (<code>actionscheduler_actions<\/code>,\n    actionscheduler_claims, <code>actionscheduler_groups<\/code>, <code>actionscheduler_logs<\/code>).\nThese tables are shared with any other plugin that bundles Action Scheduler, so\nuninstalling this plugin deliberately leaves them in place.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>gather-grove-notion-sync<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, <strong>or<\/strong> install via Plugins \u2192 Add New \u2192 Upload Plugin and choose the zip.<\/li>\n<li>Activate through the WordPress Plugins menu.<\/li>\n<li>Go to <strong>Settings \u2192 Gather Grove Sync for Notion<\/strong> and connect your Notion workspace (one-click \"Connect to Notion\", or paste an integration token).<\/li>\n<li>Either paste an existing database ID into the <strong>Default Notion Database ID<\/strong> field, or use the <strong>Create a Notion Database<\/strong> section to make a fresh one.<\/li>\n<li>In Notion, open the database as a full page \u2192 click <code>\u2022\u2022\u2022<\/code> \u2192 <strong>Connections<\/strong> \u2192 add your integration. (If you used the in-plugin creation tool, this is automatic.)<\/li>\n<li>Click <strong>Test Connection &amp; Refresh Schema<\/strong> to verify everything's wired up.<\/li>\n<li>Submit a form on your site to test.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20work%20with%20the%20free%20version%20of%20elementor%3F\"><h3>Does this work with the free version of Elementor?<\/h3><\/dt>\n<dd><p>No. The plugin hooks into <code>elementor_pro\/forms\/new_record<\/code>, which is only available in Elementor Pro.<\/p><\/dd>\n<dt id=\"which%20sources%20are%20supported%3F\"><h3>Which sources are supported?<\/h3><\/dt>\n<dd><p>Out of the box: Elementor Pro, Contact Form 7, WPForms (including the free Lite version), Fluent Forms, WooCommerce orders, and Gather Grove Booking (bookings, attendance, and purchases \u2014 members and guests). Any other service can POST to a secure incoming webhook, and developers can push records with <code>gather_grove_notion_record()<\/code>. Each source auto-activates when its plugin is present \u2014 see and manage them all on the <strong>Sources<\/strong> tab.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20columns%20i%20don%27t%20configure%3F\"><h3>What happens to columns I don't configure?<\/h3><\/dt>\n<dd><p>The plugin auto-extends the database schema. Field labels become column names; types are inferred from the source field type (email \u2192 Email, number \u2192 Number, etc.) with a rich_text fallback for anything unrecognized.<\/p><\/dd>\n<dt id=\"will%20deduplication%20accidentally%20merge%20two%20different%20%22john%20smiths%22%20by%20name%3F\"><h3>Will deduplication accidentally merge two different \"John Smiths\" by name?<\/h3><\/dt>\n<dd><p>Only if you configure name fields as shared. By default, only <code>Email<\/code>, <code>Phone<\/code>, and <code>Phone Number<\/code> are treated as merge keys \u2014 they're the only fields reliably unique per person. You can edit the shared field list in settings, but adding name fields is a known footgun: a duplicate row is just visible noise, but a wrong merge silently destroys data.<\/p><\/dd>\n<dt id=\"can%20i%20sync%20historical%20elementor%20submissions%3F\"><h3>Can I sync historical Elementor submissions?<\/h3><\/dt>\n<dd><p>Yes, if Elementor's Submissions storage is enabled (visible at Elementor \u2192 Submissions in WP admin). Use the <strong>Backfill Historical Submissions<\/strong> section in plugin settings. Backfill is idempotent \u2014 re-runs skip already-synced submissions.<\/p><\/dd>\n<dt id=\"is%20my%20notion%20integration%20token%20safe%3F\"><h3>Is my Notion integration token safe?<\/h3><\/dt>\n<dd><p>The token is stored encrypted at rest using AES-256-GCM. The encryption key is derived from your WordPress <code>AUTH_KEY<\/code> (defined in <code>wp-config.php<\/code>) via SHA-256. This defends against database-only leaks (e.g. SQL injection in another plugin, leaked DB backups). It does not defend against full server compromise \u2014 if an attacker has both the database and <code>wp-config.php<\/code>, the token can be decrypted.<\/p><\/dd>\n<dt id=\"what%20if%20my%20notion%20database%20fills%20up%3F\"><h3>What if my Notion database fills up?<\/h3><\/dt>\n<dd><p>Notion databases cap at ~100 properties. Most sites stay well under this. If you have many forms with mostly-unique fields, the connection banner shows the property count so you can monitor it. The fix is either to share more field labels across forms (so they collapse into single columns) or to use multi-database routing to split forms across multiple Notion databases.<\/p><\/dd>\n<dt id=\"what%20if%20notion%20is%20down%3F\"><h3>What if Notion is down?<\/h3><\/dt>\n<dd><p>The plugin retries once immediately, after a one-second pause \u2014 deliberately not the longer wait Notion's <code>Retry-After<\/code> header asks for, because this runs while your visitor waits for the form to submit. If that retry also fails, the write is handed to a background queue with exponential backoff (1 min \u2192 5 min \u2192 30 min \u2192 2 hr \u2192 12 hr), where waiting properly costs nobody anything. After 5 attempts the entry is dead-lettered; dead-lettered writes are visible on the Tools tab with a \"Clear\" control.<\/p>\n\n<p>A failure that retrying cannot fix \u2014 no token, a revoked token, a deleted database \u2014 is reported rather than queued. Retrying those just fills the queue with the same error.<\/p><\/dd>\n<dt id=\"can%20i%20send%20the%20same%20form%20to%20multiple%20notion%20databases%3F\"><h3>Can I send the same form to multiple Notion databases?<\/h3><\/dt>\n<dd><p>Not in this release. Each form has at most one destination (its override, or the default). If you need fan-out, the simplest workaround is to query the destination Notion database via Notion's own automations to forward rows.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.52.0<\/h4>\n\n<ul>\n<li>Changed: the plugin's internal settings, background jobs and admin actions now use its full <code>gather_grove_notion_sync_<\/code> prefix. Your connection, settings and mappings carry over automatically on update.<\/li>\n<li>Changed: the wp-config constant for the incoming-webhook secret is now <code>GATHER_GROVE_NOTION_SYNC_WEBHOOK_SECRET<\/code>. The previous name keeps working.<\/li>\n<li>Removed: the old submission action name deprecated in 0.28.0. Use <code>gather_grove\/notion_sync\/submission<\/code>.<\/li>\n<li>Changed: updated the bundled Gather Grove core to 0.63.2.<\/li>\n<\/ul>\n\n<h4>0.51.4<\/h4>\n\n<ul>\n<li>Fixed: on a site with no other Gather Grove plugin, the settings page was missing from the admin menu. It is back under Settings.<\/li>\n<li>Fixed: opening a form on the Forms tab could stop with a fatal error instead of showing its field mapping.<\/li>\n<li>Hardening: column-rename names are sanitized before they are saved, and the Notion connect flow's return step carries a WordPress nonce.<\/li>\n<\/ul>\n\n<h4>0.51.3<\/h4>\n\n<ul>\n<li>Maintenance: admin actions and settings reads are written in the shapes WordPress.org's plugin review expects, and diagnostic messages go to the site's error log in a consistent format. Nothing changes in how the plugin works.<\/li>\n<\/ul>\n\n<h4>0.51.2<\/h4>\n\n<ul>\n<li>Maintenance: database queries and admin-screen markup are written in the shapes WordPress.org's plugin review expects, ahead of the plugin's listing there. Nothing changes in how the plugin works.<\/li>\n<\/ul>\n\n<h4>0.51.1<\/h4>\n\n<ul>\n<li>Changed: updated the bundled Gather Grove core to 0.55.0.<\/li>\n<\/ul>\n\n<h4>0.51.0<\/h4>\n\n<ul>\n<li>Added: if you use Gather Grove Pulse, each member's Notion row now stays up to date with their tags, pipeline stage and last activity \u2014 one row per member, updated in place rather than added again each time.<\/li>\n<\/ul>\n\n<h4>0.50.0<\/h4>\n\n<ul>\n<li>Added: other plugins can now keep a single Notion row up to date \u2014 matched on a column you choose, updating in place rather than adding a new row each time. Groundwork for syncing member and lifecycle data to Notion.<\/li>\n<\/ul>\n\n<h4>0.49.0<\/h4>\n\n<ul>\n<li>Added: Notion pages can now be mirrored into WordPress, so other Gather Grove plugins can display them \u2014 the groundwork for a Notion-backed wiki tab on Community Spaces. Content refreshes automatically, and a page that is deleted or unshared in Notion is flagged rather than disappearing silently.<\/li>\n<\/ul>\n\n<h4>0.48.0<\/h4>\n\n<ul>\n<li>Housekeeping: the settings code is reorganised so each tab owns its own logic. No change to what any screen does or looks like.<\/li>\n<\/ul>\n\n<h4>0.47.0<\/h4>\n\n<ul>\n<li>Fixed: submissions arriving from a webhook, the public API, or another plugin could be stored in Notion dated 31 December 1969 instead of when they were actually submitted. The timestamp is now read properly whether it arrives as a number or as a date.<\/li>\n<li>Fixed: rows already saved with that wrong date now correct themselves the next time the same person submits, and the correction is noted in the activity log. If you renamed a row in Notion, your name for it is kept.<\/li>\n<\/ul>\n\n<h4>0.46.0<\/h4>\n\n<ul>\n<li>Changed: the settings screens now use the shared Gather Grove design \u2014 the same cards, badges and banners as the other Gather Grove plugins. Colours follow your site's palette instead of being fixed green, so the plugin no longer clashes with your own brand.<\/li>\n<li>Changed: tables, notices and \"nothing here yet\" states have been rebuilt. Wide tables scroll on their own instead of pushing the page sideways, and every empty screen now explains what will appear there and how.<\/li>\n<li>Changed: notices are announced to screen readers, which WordPress's default notices are not.<\/li>\n<li>Fixed: some help text on the Tools tab showed raw HTML tags.<\/li>\n<li>Fixed: the Export CSV button sat on its own line instead of beside Clear log.<\/li>\n<\/ul>\n\n<p>Earlier releases: the complete version history is in CHANGELOG.md within the plugin.<\/p>","raw_excerpt":"Sync forms (Elementor, CF7, WPForms, Fluent), WooCommerce orders, and webhooks to a Notion database. Auto-extending columns, dedup, per-form routing.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/374795","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=374795"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/gturtle108"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=374795"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=374795"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=374795"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=374795"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=374795"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=374795"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}