{"id":374568,"date":"2026-10-05T08:21:49","date_gmt":"2026-10-05T08:21:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/calendar-and-crm-by-j6\/"},"modified":"2026-10-05T08:21:21","modified_gmt":"2026-10-05T08:21:21","slug":"j6-calendar-and-crm","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/j6-calendar-and-crm\/","author":23564692,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.1.29","stable_tag":"2.1.29","tested":"7.1.2","requires":"6.2","requires_php":"8.0","requires_plugins":null,"header_name":"Calendar and CRM by J6","header_author":"J6 Venture","header_description":"Meeting booking on your own domain with a built-in CRM. Booking pages, Google and Outlook sync, reminders, contacts, pipeline stages and WhatsApp follow-ups, all inside WordPress.","assets_banners_color":"2d2d2c","last_updated":"2026-10-05 08:21:21","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/j6venture.com\/calendar-by-J6V","header_author_uri":"https:\/\/j6venture.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":37,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.1.29":{"tag":"2.1.29","author":"get2jhavikas","date":"2026-10-05 08:21:21","revision":3728384}},"upgrade_notice":{"2.1.12":"<p>CSV import adds a stage-matching step so your file&#039;s stage values map onto your existing pipeline instead of duplicating it. No action needed.<\/p>","2.1.11":"<p>Contact name in the record uses IBM Plex Sans. No action needed.<\/p>","2.1.10":"<p>Adds a quick-actions + summary panel to the contact record (Call\/WhatsApp\/Email + at-a-glance details). No action needed.<\/p>","2.1.9":"<p>Design-system polish for the contact record (serif name, lime active\/Save states, honest bookings count) and a one-line Insights toolbar. No action needed.<\/p>","2.1.8":"<p>Full-page contact record that opens on Profile with edit-in-place on every field, notes that auto-save, and Delete moved to the top-right. No action needed.<\/p>","2.1.7":"<p>Contact view rebuilt as full-width Profile \/ Activity \/ WhatsApp \/ Email \/ Notes tabs with a real inbox-style composer (Enter to send, attachments) and a full-screen edit form. No action needed.<\/p>","2.1.6":"<p>Contact view redesigned around an activity timeline with WhatsApp\/Email\/Note tabs; person fields are now an avatar dropdown; detail values wrap. No action needed.<\/p>","2.1.5":"<p>All admin screens now use the full window width for a consistent layout with no shifting between pages. No action needed.<\/p>","2.1.4":"<p>Contacts table gets a top scrollbar and draggable columns; import date\/stage matching is more precise. No action needed.<\/p>","2.1.3":"<p>Better CSV import \u2014 keeps your stages, reads human date formats, adds a Person field type, and handles large files more reliably. No action needed.<\/p>","2.1.2":"<p>The contact card opens large for easy reading, and the name is no longer clipped. No action needed.<\/p>","2.1.1":"<p>UI fixes \u2014 full-width Contacts with a scrollable table, dialogs that keep their scroll position, and a cleaner import step. No action needed.<\/p>","2.1.0":"<p>Adds CSV contact import \u2014 a guided Upload \u2192 Map \u2192 Review wizard with duplicate handling and an auto-downloaded rejects file. No action needed for existing data.<\/p>","2.0.6":"<p>Visual polish only \u2014 even spacing and a roomier automation dialog. No action needed.<\/p>","2.0.5":"<p>Adds a &quot;custom field value changes&quot; automation trigger and a cleaner automation editor. Existing automations keep working unchanged.<\/p>","2.0.4":"<p>Small Contacts polish \u2014 a clearer, single &quot;Add contact&quot; button on the empty list. No action needed.<\/p>","2.0.3":"<p>Automations can now be narrowed by a contact custom field or a booking&#039;s multiple-choice answer. No action needed; existing automations keep running unchanged.<\/p>","2.0.2":"<p>The optional &quot;Powered by J6 Venture&quot; credit is now off by default. If you had it showing, re-enable it in Settings \u2192 Page appearance.<\/p>","2.0.1":"<p>One-click Connect now runs on connect.j6venture.com. No action needed.<\/p>","2.0.0":"<p>New name and WordPress.org release. The &quot;Powered by&quot; credit is a setting you can turn off in Settings \u2192 Page appearance.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3728378,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3728378,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3728378,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3728378,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"j6cal\/booking":{"name":"j6cal\/booking","title":"Booking calendar"}},"tagged_versions":["2.1.29"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"The public booking page, adapting to your brand colours, light or dark.","2":"Contacts: the built-in CRM with stages, owners and tags.","3":"A contact card with booking history and the WhatsApp conversation.","4":"CRM automations: send a message when a contact changes stage.","5":"Reminders by email or WhatsApp: before, on the day or after a meeting.","6":"Team &amp; Calendars: each host connects their own Google or Outlook calendar.","7":"Insights: bookings, cancellations, hosts and invitee time zones."}},"plugin_section":[],"plugin_tags":[8132,269,1150,268,3160],"plugin_category":[40,58],"plugin_contributors":[284426],"plugin_business_model":[],"class_list":["post-374568","plugin","type-plugin","status-publish","hentry","plugin_tags-appointments","plugin_tags-booking","plugin_tags-crm","plugin_tags-scheduling","plugin_tags-whatsapp","plugin_category-calendar-and-events","plugin_category-user-management","plugin_contributors-get2jhavikas","plugin_committers-get2jhavikas"],"banners":{"banner":"https:\/\/ps.w.org\/j6-calendar-and-crm\/assets\/banner-772x250.png?rev=3728378","banner_2x":"https:\/\/ps.w.org\/j6-calendar-and-crm\/assets\/banner-1544x500.png?rev=3728378","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/j6-calendar-and-crm\/assets\/icon-128x128.png?rev=3728378","icon_2x":"https:\/\/ps.w.org\/j6-calendar-and-crm\/assets\/icon-256x256.png?rev=3728378","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Calendar and CRM by J6 turns your WordPress site into a booking desk and a lightweight CRM in one. Visitors book meetings on your own domain. Everyone who books becomes a contact you can move through a pipeline, tag, message and follow up with, without copying data between tools.<\/p>\n\n<p>Your bookings, contacts, availability and calendar tokens live in your own WordPress database.<\/p>\n\n<h4>Booking<\/h4>\n\n<ul>\n<li>A booking page on your own domain (default <code>yoursite.com\/calendar<\/code>, you can rename it) that adapts to light and dark, in English, Hindi, Spanish, French and German.<\/li>\n<li>Multiple hosts, each with a personal booking link, and deep links straight to one meeting type.<\/li>\n<li>Google Calendar or Outlook sync for every host: busy times block automatically, and new bookings create calendar events with a Google Meet or Teams link.<\/li>\n<li>Weekly hours, date overrides, buffers, minimum notice, daily and weekly caps, and a rolling booking window.<\/li>\n<li>Round-robin, collective and group (multi-seat) meetings, with a waitlist when a session is full.<\/li>\n<li>Custom booking questions, including file uploads (PDF, JPG, PNG).<\/li>\n<li>Self-serve reschedule and cancel links for invitees.<\/li>\n<li>Take payment for a booking with your own payment link (for example Stripe or Razorpay) and mark bookings as paid when the payment webhook arrives.<\/li>\n<li>Embed anywhere: a block, a shortcode, a popup button or a floating launcher.<\/li>\n<\/ul>\n\n<h4>CRM<\/h4>\n\n<ul>\n<li>Every booker is saved as a contact automatically, deduplicated by email or phone.<\/li>\n<li>Pipeline stages, tags, custom fields, a lead owner, search and filters, and CSV import and export.<\/li>\n<li>A contact card with the full booking and message history, and the contact's WhatsApp conversation when Periskope is connected.<\/li>\n<li>Automations: when a contact changes stage or gets a tag, send a WhatsApp message or an email, or post to Slack.<\/li>\n<\/ul>\n\n<h4>Messages and reminders<\/h4>\n\n<ul>\n<li>Confirmation, reschedule and cancellation emails you can rewrite with <code>{placeholders}<\/code>.<\/li>\n<li>Reminders before the meeting, at a set time on the day, or after it (for thank-yous and follow-ups), by email or WhatsApp.<\/li>\n<li>WhatsApp through Periskope or the official WhatsApp Business Cloud API, with opt-out (STOP) handling.<\/li>\n<li>Send email through your own SMTP server or a provider API (Resend, SendGrid, Mailchimp Transactional), or leave it on WordPress's default mail.<\/li>\n<\/ul>\n\n<h4>Two ways to connect calendars<\/h4>\n\n<p>On first setup you choose how hosts link Google or Outlook. You can switch at any time without losing data.<\/p>\n\n<ul>\n<li><strong>Bring your own app (free).<\/strong> Use your own Google Cloud or Microsoft Azure credentials. A step-by-step wizard walks you through creating them. Calendar sign-in never goes through J6 Venture in this mode.<\/li>\n<li><strong>One-click Connect (optional paid service).<\/strong> Hosts sign in with Google or Microsoft through J6 Venture's verified app, with no cloud setup. This is an external service provided by J6 Venture and needs a J6 Connect key (one-time purchase, 7-day money-back: https:\/\/j6venture.com\/refund-policy\/). The plugin's own features are the same in both modes.<\/li>\n<\/ul>\n\n<p>Every feature in this plugin is free and fully functional without any purchase. Calendar sync, booking, CRM, reminders, messaging and all other features work using the free \"Bring your own app\" mode. The optional J6 Connect key does not unlock any plugin feature \u2014 it only pays for access to J6 Venture's external one-click sign-in service (which brokers OAuth on J6's own servers so you don't have to create your own Google Cloud or Azure app). You never need it to use the plugin.<\/p>\n\n<h4>Privacy<\/h4>\n\n<ul>\n<li>Integrates with the WordPress personal-data export and erase tools.<\/li>\n<li>Honeypot, rate limiting and optional email verification on the public booking form.<\/li>\n<li>An optional \"Powered by J6 Venture\" credit is available for the booking page and emails. It is OFF by default and appears only if you turn it on in Settings \u2192 Page appearance.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to the third-party services below. Each one is used only when you turn on or configure the feature that needs it. No usage data or tracking is sent to J6 Venture.<\/p>\n\n<h4>J6 Connect broker (J6 Venture)<\/h4>\n\n<p>The J6 Connect broker (at connect.j6venture.com) is used only if you choose \"One-click Connect\" for calendars, or click \"Connect Slack\" in one step. It is never contacted in \"Bring your own app\" mode unless you use one-click Slack.\n* When a host connects or reconnects a calendar, the plugin sends your site address, the host's display name, a one-way hash identifying the host connection, a random verification code, and your J6 Connect key if you entered one. The broker completes the Google or Microsoft sign-in and hands the tokens back to your site. It does not store calendar tokens.\n* When an access token expires, the plugin sends the host's refresh token to the broker to get a new access token. The refresh token is not stored by the broker.\n* When you view the Team &amp; Calendars screen, the plugin checks the broker's status and your key's seat count (cached for 5 minutes). When a host is disconnected or removed, it tells the broker to free that seat.\nTerms: https:\/\/j6venture.com\/terms \u2014 Privacy: https:\/\/j6venture.com\/calendar-by-j6venture\/privacy-policy \u2014 Refunds: https:\/\/j6venture.com\/refund-policy\/<\/p>\n\n<h4>Google Calendar and Google sign-in (Google)<\/h4>\n\n<p>Used when a host connects a Google account. The plugin exchanges sign-in codes and refreshes tokens (oauth2.googleapis.com), reads the host's name, email and photo (openidconnect.googleapis.com), checks free\/busy times, and creates, updates and deletes calendar events with a Google Meet link (www.googleapis.com). Invitee name, email, meeting time and any notes are included in the calendar event.\nTerms: https:\/\/policies.google.com\/terms \u2014 Privacy: https:\/\/policies.google.com\/privacy<\/p>\n\n<h4>Microsoft Outlook calendar and sign-in (Microsoft)<\/h4>\n\n<p>Used when a host connects a Microsoft account. The plugin signs in and refreshes tokens (login.microsoftonline.com), reads the host's profile and free\/busy times, and creates, updates and deletes calendar events with an optional Teams link (graph.microsoft.com). Invitee name, email, meeting time and notes are included in the event.\nTerms: https:\/\/www.microsoft.com\/servicesagreement \u2014 Privacy: https:\/\/privacy.microsoft.com\/privacystatement<\/p>\n\n<h4>Periskope (WhatsApp)<\/h4>\n\n<p>Used only if you connect Periskope under Messages. The plugin sends the recipient's phone number and message text (and any attachment link) to send WhatsApp messages, and reads a contact's recent WhatsApp conversation by phone number to show it on the contact card (api.periskope.app).\nTerms: https:\/\/periskope.app\/terms \u2014 Privacy: https:\/\/periskope.app\/privacy<\/p>\n\n<h4>WhatsApp Business Cloud API (Meta)<\/h4>\n\n<p>Used only if you connect the official WhatsApp API under Messages. The plugin sends the recipient's phone number and message or template content to graph.facebook.com.\nTerms: https:\/\/www.whatsapp.com\/legal\/business-terms \u2014 Privacy: https:\/\/www.whatsapp.com\/legal\/privacy-policy<\/p>\n\n<h4>Email providers (Resend, SendGrid, Mailchimp Transactional, Amazon SES, or your SMTP server)<\/h4>\n\n<p>Used only if you choose one under Settings \u2192 How email is sent. Each booking, reminder or CRM email (recipient, subject and message) is sent through the provider you pick: api.resend.com, api.sendgrid.com, mandrillapp.com, an Amazon SES SMTP endpoint (for example email-smtp.us-east-1.amazonaws.com), or the SMTP host you enter.\nResend \u2014 Terms: https:\/\/resend.com\/legal\/terms-of-service \u2014 Privacy: https:\/\/resend.com\/legal\/privacy-policy\nSendGrid \u2014 Terms: https:\/\/www.twilio.com\/en-us\/legal\/tos \u2014 Privacy: https:\/\/www.twilio.com\/en-us\/legal\/privacy\nMailchimp Transactional \u2014 Terms: https:\/\/mailchimp.com\/legal\/terms\/ \u2014 Privacy: https:\/\/www.intuit.com\/privacy\/statement\/\nAmazon SES \u2014 Terms: https:\/\/aws.amazon.com\/service-terms\/ \u2014 Privacy: https:\/\/aws.amazon.com\/privacy\/<\/p>\n\n<h4>Slack and Microsoft Teams<\/h4>\n\n<p>Used only if you add a Slack or Teams channel under Integrations or in a CRM automation. The plugin posts a short booking or contact notification (name, email, meeting time) to the incoming-webhook address you provide (hooks.slack.com, or your Teams\/Power Automate webhook).\nSlack \u2014 Terms: https:\/\/slack.com\/terms-of-service \u2014 Privacy: https:\/\/slack.com\/trust\/privacy\/privacy-policy\nMicrosoft \u2014 Terms: https:\/\/www.microsoft.com\/servicesagreement \u2014 Privacy: https:\/\/privacy.microsoft.com\/privacystatement<\/p>\n\n<h4>Webhooks you add (for example Zapier or Make)<\/h4>\n\n<p>Used only if you add a webhook endpoint. Booking and contact event data (such as name, email, phone, meeting time and answers) is sent to the address you enter. The terms and privacy policy of the service you choose apply.<\/p>\n\n<h4>Google Tag Manager, Google Ads and Meta Pixel<\/h4>\n\n<p>Used only if you enter a Tag Manager ID, Google Ads ID or Meta Pixel ID under Settings \u2192 Conversions &amp; tracking. The matching script is then loaded on the public booking page, and a conversion event is sent when a booking completes (www.googletagmanager.com, connect.facebook.net, and www.facebook.com for the Pixel's no-JavaScript fallback).\nGoogle \u2014 Terms: https:\/\/policies.google.com\/terms \u2014 Privacy: https:\/\/policies.google.com\/privacy\nMeta \u2014 Terms: https:\/\/www.facebook.com\/legal\/terms \u2014 Privacy: https:\/\/www.facebook.com\/privacy\/policy\/<\/p>\n\n<h4>Host profile photos<\/h4>\n\n<p>When building a link-preview image for a host's booking page, the plugin downloads that host's profile photo from the address their Google or Microsoft account provided (for example lh3.googleusercontent.com). Nothing about the visitor is sent.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install from Plugins \u2192 Add New, or upload the ZIP, then activate it.<\/li>\n<li>Go to <strong>Calendar &amp; CRM \u2192 Team &amp; Calendars<\/strong> and choose how hosts connect their calendars: bring your own app (free, guided wizard) or one-click Connect.<\/li>\n<li>Connect each host's Google or Outlook calendar.<\/li>\n<li>Set hours under <strong>Availability<\/strong>, create meetings under <strong>Meeting Types<\/strong>, and share your booking page (<code>yoursite.com\/calendar<\/code> by default).<\/li>\n<\/ol>\n\n<p>If you bring your own Google app, publish its OAuth consent screen to <strong>Production<\/strong>. In Testing mode Google expires the connection every 7 days.<\/p>\n\n<h4>Moving from \"Calendar by J6 Venture\"<\/h4>\n\n<p>Calendar and CRM by J6 is the new name for Calendar by J6 Venture and uses the same data. Deactivate the old plugin, then activate this one. Your bookings, contacts and settings carry over. Do not delete the old plugin while its \"Remove all data on uninstall\" setting is on.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20the%20plugin%20free%3F\"><h3>Is the plugin free?<\/h3><\/dt>\n<dd><p>Yes. Every feature in the plugin works for free with \"Bring your own app\". The optional one-click Connect service, which saves you creating your own Google or Microsoft app, is a paid service run by J6 Venture.<\/p><\/dd>\n<dt id=\"does%20my%20data%20go%20through%20j6%20venture%27s%20servers%3F\"><h3>Does my data go through J6 Venture's servers?<\/h3><\/dt>\n<dd><p>Bookings, contacts, availability and calendar tokens are stored in your own database. With \"Bring your own app\" nothing is sent to J6 Venture. With one-click Connect, only the sign-in and token-refresh steps pass through J6's broker, which does not store tokens. See \"External services\" for details.<\/p><\/dd>\n<dt id=\"where%20can%20i%20get%20help%3F\"><h3>Where can I get help?<\/h3><\/dt>\n<dd><p>Guides and answers are in the Help &amp; Knowledge Base at https:\/\/j6venture.com\/calendar-by-j6venture\/help\/. For questions, use this plugin's support forum on WordPress.org, or https:\/\/j6venture.com\/calendar-by-j6venture\/support\/.<\/p><\/dd>\n<dt id=\"which%20google%20permissions%20does%20it%20request%3F\"><h3>Which Google permissions does it request?<\/h3><\/dt>\n<dd><p>Calendar events and free\/busy, plus basic profile (name, email, photo). It never asks for Gmail or other scopes.<\/p><\/dd>\n<dt id=\"do%20i%20need%20whatsapp%20to%20use%20it%3F\"><h3>Do I need WhatsApp to use it?<\/h3><\/dt>\n<dd><p>No. WhatsApp is optional. Booking, email reminders and the CRM work without it.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20a%20host%20isn%27t%20connected%20to%20a%20calendar%3F\"><h3>What happens if a host isn't connected to a calendar?<\/h3><\/dt>\n<dd><p>The booking is still saved and the invitee is emailed. The calendar event is created once that host connects.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.1.29<\/h4>\n\n<ul>\n<li>The sign-in window now stays open a few seconds longer when a connection can\u2019t be completed, so the reason is easy to read before it closes.<\/li>\n<\/ul>\n\n<h4>2.1.28<\/h4>\n\n<ul>\n<li>Fixed the sign-in window sometimes showing the connection message with \u201c+\u201d signs where spaces should be (e.g. \u201cOne-click+Connect+is+a+paid\u2026\u201d). The reason now reads as normal text.<\/li>\n<\/ul>\n\n<h4>2.1.27<\/h4>\n\n<ul>\n<li>Clearer one-click Connect errors: if a connection can\u2019t be completed \u2014 for example when a J6 Connect key is needed \u2014 the reason is now shown in plain language on the Team &amp; Calendars screen (and in the sign-in window), instead of a generic \u201ccouldn\u2019t finish connecting\u201d. The screen points you straight to activating a key or switching to the free \u201cbring your own app\u201d method.<\/li>\n<\/ul>\n\n<h4>2.1.26<\/h4>\n\n<ul>\n<li>Plugin review fixes: removed the Google Tag Manager container option (the booking page now supports only specific first-party conversion tags \u2014 a Google Ads conversion and a Meta Pixel \u2014 each firing a fixed set of events defined in the plugin, with no tag-manager container or user-supplied script). Aligned the text domain to the plugin slug. Hardened input handling on the client-IP read used for rate limiting. No changes to your existing bookings, contacts or settings.<\/li>\n<\/ul>\n\n<h4>2.1.25<\/h4>\n\n<ul>\n<li>Messaging Automation now has a bulk CSV import: create many WhatsApp, SMS and email-reminder messages in one upload. Every row is checked before anything is saved \u2014 an invalid channel, an unrecognised \u201cwhen\u201d, a bad reminder time, or a mistyped {variable} is flagged with a plain-language fix (e.g. \u201c{customer_name} isn\u2019t a valid variable \u2014 did you mean {invitee_name}?\u201d), and messages that already exist are skipped so re-uploading is safe. Includes a downloadable CSV template and a ready-made ChatGPT \/ Claude prompt that writes the file for you from a plain-English description.<\/li>\n<\/ul>\n\n<h4>2.1.24<\/h4>\n\n<ul>\n<li>Security hardening from a full penetration-style audit: the email-verification step no longer lets an unauthenticated visitor probe whether a given email is an existing customer (the anti-abuse rate limit now applies before that check), and the host magic-link login now correctly enforces its hourly rate limit so a known host address can't be flooded with login emails. No functional change for normal use.<\/li>\n<\/ul>\n\n<h4>2.1.23<\/h4>\n\n<ul>\n<li>Security: saved third-party keys and secrets (SMTP password, payment webhook secrets, WhatsApp\/Periskope tokens, Google\/Microsoft client secrets) are now encrypted at rest in the database, with the encryption key derived from your site's own WordPress security salts. Existing saved secrets keep working and are re-encrypted the next time you save that field. No configuration needed.<\/li>\n<\/ul>\n\n<h4>2.1.22<\/h4>\n\n<ul>\n<li>Faster loads and a fix for stale screens: the contacts list now loads its records and its settings in parallel (with the settings cached for a few minutes), so the CRM paints almost instantly on repeat visits, and page changes\/sorts fetch only the rows they need. Admin assets are now cache-busted automatically on every change, so new versions show up without a hard refresh. Added database indexes behind the contacts list for faster sorting and filtering on larger lists, and hardened outbound webhook\/integration URLs against internal-network requests.<\/li>\n<\/ul>\n\n<h4>2.1.21<\/h4>\n\n<ul>\n<li>Smoother WhatsApp conversations: a background refresh now updates just the message thread in place instead of rebuilding the whole record, and opening a contact \/ switching tabs \/ saving a field no longer re-renders the contacts table hidden behind the open record. Long threads and quick tab-switching feel noticeably snappier.<\/li>\n<\/ul>\n\n<h4>2.1.20<\/h4>\n\n<ul>\n<li>Faster contact record: it now opens instantly from data already on screen (no loading spinner), and editing a field, saving a note, or deleting a contact no longer re-downloads the whole list \u2014 the change is applied in place. Sending several WhatsApp messages quickly no longer stacks up background refreshes.<\/li>\n<li>Faster server: contact list, CSV export and the bookings API no longer make a separate database lookup per row for owner\/host names (they're cached per request), and settings are merged once per request instead of repeatedly.<\/li>\n<li>Cleaner Profile: the edit (pencil) icon now appears only when you hover a card, instead of sitting on every card \u2014 the whole card is still click-to-edit.<\/li>\n<\/ul>\n\n<h4>2.1.19<\/h4>\n\n<ul>\n<li>The Send button on a WhatsApp\/email message now stays disabled through the whole send (until the server replies) and is greyed whenever the box is empty. After a message sends, the composer clears and Send greys out \u2014 so a quick second click can't fire a duplicate. It re-enables as soon as you type again.<\/li>\n<\/ul>\n\n<h4>2.1.18<\/h4>\n\n<ul>\n<li>Opening a contact no longer \"jumps\" \u2014 the full-page record now fades in cleanly instead of sliding\/scaling.<\/li>\n<li>Fields &amp; stages now warns you if you close it with unsaved changes, so adding owners, stages or fields and then clicking Cancel\/\u00d7 (or outside the box) can't silently lose your edits.<\/li>\n<\/ul>\n\n<h4>2.1.17<\/h4>\n\n<ul>\n<li>You can now add lead Owners who don't need a calendar or booking page \u2014 closers, setters, back-office team. Add them under Fields &amp; stages \u2192 Owners (name, optional email), and they appear everywhere you assign a lead owner: the contact record, the add-contact form, the owner filter, and CSV import (owners in your file match these people by name or email too). Your booking hosts are still owners automatically.<\/li>\n<\/ul>\n\n<h4>2.1.16<\/h4>\n\n<ul>\n<li>Deleting a pipeline stage that still has contacts now asks where those contacts should go \u2014 move them to another stage, or clear their stage \u2014 instead of silently stranding them on a stage that no longer exists. (Renaming a stage already moves its contacts automatically.)<\/li>\n<\/ul>\n\n<h4>2.1.15<\/h4>\n\n<ul>\n<li>Contact record: no more \"jump\". Opening, switching tabs, saving a field, or a background WhatsApp refresh no longer replays the modal's entrance animation \u2014 only the pane content crossfades, and only when you actually change tabs. Each tab (Profile, Activity, WhatsApp, Email, the summary rail) keeps its scroll position across saves and refreshes.<\/li>\n<li>The WhatsApp conversation now opens at the newest message (bottom) and stays there as it refreshes, and the WhatsApp tab is disabled (greyed) when WhatsApp isn't connected.<\/li>\n<li>Sending an email or WhatsApp message now shows a spinner and disables the send button until it finishes, so a slow send can't be clicked several times.<\/li>\n<li>Restored the full Contacts pager \u2014 First \u00ab \u2039 1 2 3 \u2026 \u203a \u00bb Last, with \"Viewing X\u2013Y of Z\" \u2014 always visible with the total count.<\/li>\n<\/ul>\n\n<h4>2.1.14<\/h4>\n\n<ul>\n<li>CSV import stage matching now recognises common sales synonyms \u2014 \"Closed Won\"\/\"Deal Won\" suggests your existing \"Won\" stage, \"Closed Lost\"\/\"Dead\" suggests \"Lost\", \"New Lead\"\/\"Fresh\"\/\"Open\" suggests \"New\" \u2014 so imports stop creating near-duplicate stages. Suggested matches are clearly labelled and you can still change or add any of them.<\/li>\n<\/ul>\n\n<h4>2.1.13<\/h4>\n\n<ul>\n<li>CSV import is smarter and safer: a live preview on the review step shows how many contacts will be added, updated or left out before you commit; you can now map an Owner column (matched to your team by name or email) or assign all imported contacts to one team member; and stage matching now covers every stage column, collapses spacing\/case variants, and no longer drops very long stage names.<\/li>\n<li>CSV import now imports a row on whichever of email\/phone is valid instead of rejecting the whole row over one bad cell; accepts .tsv and tab-separated .txt files; lists which columns won't be imported; shows several sample values per column; and defaults to the safest \"merge\" behaviour for existing contacts.<\/li>\n<li>Import wizard polish: the Stages step is now a real step in the progress bar, tighter copy throughout, and smoother spacing, motion and dark-mode styling.<\/li>\n<\/ul>\n\n<h4>2.1.12<\/h4>\n\n<ul>\n<li>CSV import now has a Stages step: when your file's stage values differ from your pipeline (e.g. \"Closed Won\" vs your \"Won\"), match each one to an existing stage, add it as new, or leave it empty \u2014 so importing never creates duplicate stages.<\/li>\n<\/ul>\n\n<h4>2.1.11<\/h4>\n\n<ul>\n<li>The contact name in the record header now uses the standard interface typeface (IBM Plex Sans).<\/li>\n<\/ul>\n\n<h4>2.1.10<\/h4>\n\n<ul>\n<li>The contact record now has a right-hand panel: quick actions (Call, WhatsApp, Email) and an at-a-glance summary (stage, owner, last touch, bookings, when added) that stays with you on the Profile and Activity tabs. WhatsApp and Email stay full-width for messaging.<\/li>\n<\/ul>\n\n<h4>2.1.9<\/h4>\n\n<ul>\n<li>Polished the contact record to the J6 design system: the name is now set in the brand serif, the active tab and the primary Save carry the lime accent, and editing a field shows a lime highlight. Buttons are pill-shaped and the edit affordance is clearer.<\/li>\n<li>Bookings now shows active vs cancelled honestly (e.g. \"None active \u00b7 1 cancelled\") instead of counting cancelled meetings. Clearer wording throughout, and the contact modal now animates in with a subtle save confirmation.<\/li>\n<li>Insights toolbar (date range, meeting-type filter, Export CSV) now sits on one line with the filters and Export on the right.<\/li>\n<\/ul>\n\n<h4>2.1.8<\/h4>\n\n<ul>\n<li>The contact record is now a full-page view that opens on Profile, and every field edits in place \u2014 click a value (or its pencil) to change it. Dropdowns, dates and yes\/no fields save the moment you choose; text fields have a Save button; tags and the assignee edit inline too.<\/li>\n<li>No more separate \"Edit contact\" step or \u22ef menu. Delete now sits in the top-right, set apart from Close and confirmed before anything is removed.<\/li>\n<li>Internal notes save automatically \u2014 no Save button. The Activity timeline is left-aligned for easier scanning.<\/li>\n<\/ul>\n\n<h4>2.1.7<\/h4>\n\n<ul>\n<li>Rebuilt the contact view as full-width tabs \u2014 Profile, Activity, WhatsApp, Email and Notes \u2014 so each does one job. Profile shows the whole record cleanly; contact Edit\/Delete live there.<\/li>\n<li>WhatsApp and Email now work like a real inbox: a full-height conversation and a compact compose bar with Send inside it (press Enter to send), a growing box, emoji, templates, insert-field and file attachments that send as real media.<\/li>\n<li>Editing is now a full-screen form instead of a narrow pop-up \u2014 or edit a field in place: click any value on the Profile tab (or its pencil) to change it and save without leaving the record.<\/li>\n<\/ul>\n\n<h4>2.1.6<\/h4>\n\n<ul>\n<li>Redesigned the contact detail view: it now opens on an Activity timeline (created, stage, emails, bookings) instead of a large empty WhatsApp panel. WhatsApp, Email and Note are tabs \u2014 WhatsApp looks like WhatsApp and each channel has its own composer with templates and formatting.<\/li>\n<li>Person custom fields are now a searchable dropdown with initials avatars, so you pick a team member instead of retyping a name.<\/li>\n<li>Contact detail values wrap fully instead of being cut off.<\/li>\n<li>All admin screens use the full window width consistently; forms and data-dense cards keep a comfortable reading width on large monitors.<\/li>\n<\/ul>\n\n<h4>2.1.5<\/h4>\n\n<ul>\n<li>Every admin screen now uses the full window width, like Contacts \u2014 so moving between screens no longer shifts the layout. Forms keep a comfortable reading width so fields don't stretch on wide monitors.<\/li>\n<\/ul>\n\n<h4>2.1.4<\/h4>\n\n<ul>\n<li>Contacts table: a horizontal scrollbar now sits on top of the table (so you don't have to scroll to the bottom to find it), and you can drag column edges to resize them \u2014 your widths are remembered.<\/li>\n<li>Import is more precise: impossible dates (like Feb 31) are skipped instead of stored, and a stage in your file matches an existing one regardless of capitalisation or extra spaces.<\/li>\n<li>Adding a field or stage now scrolls to and focuses the new row.<\/li>\n<\/ul>\n\n<h4>2.1.3<\/h4>\n\n<ul>\n<li>Import now creates any pipeline stages your file uses (so a \"Stage\" column like Lost \/ Won \/ Fresh is kept, not dropped).<\/li>\n<li>Import reads human date formats \u2014 \"Monday, August 17, 2026\", 17\/08\/2026, Aug 17 2026 \u2014 into date fields correctly.<\/li>\n<li>New custom field type: Person (for an assignee, owner or closer), with your team's names suggested as you type.<\/li>\n<li>Large imports are more reliable: smaller batches, an automatic retry, and if one batch still fails the rest keep going (the failed rows are listed in the rejects file to re-import).<\/li>\n<\/ul>\n\n<h4>2.1.2<\/h4>\n\n<ul>\n<li>The contact card now opens large, so the details and the WhatsApp conversation are easy to read.<\/li>\n<li>Fixed the contact's name being slightly clipped at the top of the card.<\/li>\n<\/ul>\n\n<h4>2.1.1<\/h4>\n\n<ul>\n<li>Contacts now uses the full screen width, and the table scrolls sideways when you have many columns instead of squeezing them together.<\/li>\n<li>Fixed dialogs jumping back to the top when you add a field or stage, or change an option \u2014 they now keep your scroll position.<\/li>\n<li>Import: removed a stray horizontal scrollbar on the \"Map columns\" step.<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>New: import contacts from a CSV. A guided wizard walks you through Upload \u2192 Map columns \u2192 Review: it auto-matches your columns to Name, Email, Phone, Stage, Tags, Notes and any custom fields, and you can adjust every mapping.<\/li>\n<li>You choose how existing contacts are handled \u2014 Update (overwrite the mapped fields), Merge (only fill in blanks), or Skip.<\/li>\n<li>Rows with no email or phone, or an invalid email\/phone, are skipped and downloaded as a CSV with a reason for each, so you can fix and re-import. Empty optional fields import fine. Automations never fire on import.<\/li>\n<\/ul>\n\n<h4>2.0.6<\/h4>\n\n<ul>\n<li>Automation dialog: the trigger options are now equal height and the dialog is wider, so it's easier to read and set up.<\/li>\n<li>Spacing pass across every dialog \u2014 the optional condition, reminder channels, session roster and other blocks now sit at even, uncramped gaps.<\/li>\n<\/ul>\n\n<h4>2.0.5<\/h4>\n\n<ul>\n<li>CRM automations: new trigger \u2014 run an automation when a contact's custom field value changes to a value you choose (for example, when \"Plan\" becomes \"Premium\").<\/li>\n<li>CRM automation editor redesigned with clear Trigger and Action tabs, and only the selected trigger's inputs are shown \u2014 easier to set up.<\/li>\n<li>Spacing polish across the admin dialogs: clearer gaps between options, tighter confirm dialogs, and better alignment on small screens.<\/li>\n<\/ul>\n\n<h4>2.0.4<\/h4>\n\n<ul>\n<li>Contacts: the empty-state \"Add contact\" button is now the primary (green) button with its icon and label on one line, and the duplicate header button is hidden while it shows \u2014 one clear call to action on a fresh, empty list.<\/li>\n<\/ul>\n\n<h4>2.0.3<\/h4>\n\n<ul>\n<li>CRM automations can now run only when a chosen contact custom field holds a chosen value (for example, only when \"Plan\" is \"Premium\"). Dropdown and date custom fields are supported.<\/li>\n<li>Booking message automations can now send only when a booking answered a specific multiple-choice question a certain way (for example, only when \"What plan?\" is \"Premium\"). Applies to confirmation, reminder, cancellation and reschedule messages, and can be scoped to one event type.<\/li>\n<li>Contacts: the \"Columns\" menu no longer gets clipped on short lists and scrolls when you have many custom-field columns.<\/li>\n<\/ul>\n\n<h4>2.0.2<\/h4>\n\n<ul>\n<li>The optional \"Powered by J6 Venture\" credit is now off by default; enable it in Settings \u2192 Page appearance if you want it.<\/li>\n<li>Documentation: clarified that every feature is free and fully functional in \"Bring your own app\" mode, and that the optional J6 Connect key only pays for J6 Venture's external one-click sign-in service. Expanded the external-services list and corrected outdated links.<\/li>\n<\/ul>\n\n<h4>2.0.1<\/h4>\n\n<ul>\n<li>One-click Connect now runs on the branded J6 domain connect.j6venture.com instead of the temporary worker address.<\/li>\n<li>The \"Powered by J6 Venture\" credit remains a setting you can turn off in Settings \u2192 Page appearance.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Renamed to <strong>Calendar and CRM by J6<\/strong>, now published on WordPress.org.<\/li>\n<li>The \"Powered by J6 Venture\" credit on the booking page, emails and calendar events is a setting you can turn off in Settings \u2192 Page appearance. Turn it off and emails show your own logo or site name at the top instead.<\/li>\n<li>The team and host screens are always available. One-click Connect remains an optional paid service, and the service itself decides whether a connection is allowed.<\/li>\n<li>Fonts are now bundled with the plugin instead of loaded from Google Fonts, so the booking page no longer contacts a font CDN.<\/li>\n<li>Booking-page scripts and styles, including optional tracking tags, are loaded through the standard WordPress script and style functions.<\/li>\n<li>Database queries use prepared identifiers throughout, and file handling uses the WordPress upload and filesystem APIs.<\/li>\n<\/ul>\n\n<h4>1.90.0<\/h4>\n\n<ul>\n<li>Booking page: an on-brand language switcher, and selected dates and times follow your button colour.<\/li>\n<\/ul>\n\n<h4>1.84.0 \u2013 1.89.0<\/h4>\n\n<ul>\n<li>New built-in CRM: contacts, pipeline stages, custom fields, lead owner, saved columns, a two-pane contact card with the WhatsApp conversation, one-time sends, and CRM automations.<\/li>\n<\/ul>\n\n<h4>1.0.0 \u2013 1.83.0<\/h4>\n\n<ul>\n<li>Booking pages, multi-host Google and Outlook sync, reminders, WhatsApp messaging, insights, embeds, payment links, recurring and group events, and five languages.<\/li>\n<\/ul>","raw_excerpt":"Meeting booking on your own domain, with a built-in CRM: contacts, pipeline stages, automations and WhatsApp follow-ups, all inside WordPress.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/374568","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=374568"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/get2jhavikas"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=374568"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=374568"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=374568"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=374568"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=374568"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=374568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}