Change Log

ContactIn Pro — Changelog

All notable changes to this project are documented below.

Contents


1.1.0

2026-04-01

Added

  • Global Require Phone / Require Subject settings — new global toggles to enforce phone and subject fields across all form profiles.
  • Profile name wizard — profile creation now prompts for a human-readable name and auto-generates an editable slug.
  • Inline profile editor in Gutenberg & Elementor — full profile create and edit workflow available directly inside the block inspector and Elementor widget panel without leaving the page editor.
  • Block profile picker with guided overrides — per-block field customisation, save-as-profile, and auto-save profile edits without a separate save button.
  • CinProfileCore shared module — centralised profile logic extracted into a shared JS module used by both the Gutenberg block and Elementor widget.
  • AI intent classification in onboarding — Get Started card now surfaces intent classification guidance.
  • Settings searchdata-search attributes and a min_name_words field added to the settings panel.
  • Global attachment ceiling — new site-wide cap on attachment storage independent of per-profile limits.

Fixed

  • Intent classifier: 10 bugs corrected across keyword matching, scoring, and profile dispatch.
  • Form profile validation and form_id propagation regressions.
  • Admin settings JS/CSS architecture conflicts.
  • Attachment disable confirmation button (“Yes”) was non-functional.
  • WP Pointer not enqueued on settings page.
  • Plugin Check warnings resolved ahead of release.

Refactored

  • Gutenberg block is now a pure profile selector; auto-override bug fixed.
  • Elementor widget is now a pure profile selector; Backbone model API and mount-div search corrected.
  • show_phone renamed to enable_phone for consistency.

1.0.8

2026-03-25

Changed

  • Documentation overhaul — updated plugin header description, readme tagline, features list, and FAQ to accurately reflect ML intent classification, queue deduplication engine, attachment sync guard, and premium cron self-healing added in recent releases.
  • Added per-version upgrade notices for 1.0.7 and 1.0.8 in readme.txt.
  • New FAQ entries covering CRM delete queue deduplication and the premium cron self-healing mechanism after license renewal.

1.0.7

2026-03-24

Fixed

  • Freemius instance protectionon_freemius_init() no longer overwrites the stored Freemius instance with a non-premium (free-slug) instance; prevents can_use_premium_features() returning false on sites where both free and pro slugs fire their init hooks.
  • Premature non-premium enforcement removed — removed enforce_non_premium_restrictions() call from on_freemius_init(); license state is not fully resolved at init time, causing crons to be incorrectly cleared on premium sites. Enforcement now happens only via on_license_change() and the hourly admin_init self-heal.
  • License state label on non-standard folder namesget_license_state() now shows “License expired” instead of “Free plan active” on pro-build installs where the plugin folder has a non-standard name; uses Freemius SDK is_premium() as a reliable fallback.
  • Subscription cancelled/resumed hook — added fs_after_license_change_contactin hook so events fired on the free slug are also handled correctly.
  • Stale transient always clearedmaybe_heal_premium_workloads() now unconditionally clears the stale contactin_non_premium_restrictions_applied transient when premium is confirmed active, not only when crons are missing.
  • Admin-init self-heal — if Freemius reports an active premium license but premium crons are missing (e.g. after a license renewal while an older version was active), they are automatically re-scheduled; throttled to once per hour via transient.

1.0.6

2026-03-23

Fixed

  • Replaced Config::TEXTDOMAIN constant with string literal 'contactin-pro' in AnalyticsDashboardAssets i18n calls (WordPress Plugin Check error).
  • Sanitize and wp_unslash() applied to $_SERVER['HTTP_HOST'] / $_SERVER['SERVER_NAME'] in is_live_environment() (WordPress Plugin Check warning).
  • FreemiusIntegration::initialize() was never called — all license-lifecycle hooks (fs_after_license_change, fs_after_premium_version_activation, fs_after_init) were silently not registered; fixed by calling it at the top of Plugin::init().
  • contactinbox_fs() in freemius-bootstrap.php was not guarded with function_exists, risking a PHP fatal error on double inclusion.

1.0.5

2026-03-23

Security

  • Replaced __() with esc_html__() in wp_die() calls across OAuthCallbackHandler, GDPRHandler, InboxExportImport, GDPR, Contacts, PluginDetails, and GDPRLog (18 occurrences).
  • Replaced bare json_encode() with wp_json_encode() in IntentClassifier checksum verification and reclassify() DB write.

1.0.4

2026-03-23

Fixed

  • CRON_RECLASSIFY_UNCLASSIFIED was silently re-scheduled for non-premium users by the cron health check — moved into the premium gate in CronJobs.
  • restore_premium_workloads() now reads stored interval options instead of using a hardcoded schedule name, and also clears the cron health throttle transient so recovery runs immediately.
  • is_live_environment() was hardcoded to false (sandbox mode) — now auto-detects localhost / .local / .test / .dev and IP-only hosts as non-live.
  • Added fs_after_premium_version_activation hook and on_premium_activation() handler as a safety net for fresh pro installs where fs_after_license_change does not fire.
  • Corrected contactinbox_fs() return type from \FS_Site|null to object|null.

1.0.3

2026-03-23

Fixed

  • Premium features and crons no longer remain disabled after a license is renewed or reactivated following expiry.
  • CRM, attachment, and CRM-delete queue items that were neutralised during the expiry period are now automatically reset to pending on license renewal so they are retried immediately.

1.0.2

2026-03-23

Security

  • Replaced json_encode() with wp_json_encode() for JS HTML injection in REST API modal.
  • Fixed esc_url_raw() used as output escaper — replaced with esc_url() in CSS/HTML output contexts.
  • Wrapped unescaped __() calls with esc_html__() in wp_die() and wp_send_json_error().

Fixed

  • i18n: replaced class constants as gettext text parameters with string literals (InboxAssets, SMTP, FormService, CRMStatus, templates).
  • i18n: rewrote CRMStatus::label() to use per-status string literals instead of __($variable).
  • Replaced hardcoded wp-admin/admin-ajax.php URL in CRM help modal with admin_url().
  • Added missing GDPR_SUCCESS_DEFAULT constant to Config.

Cleanup

  • Removed sensitive .bak and .backup files from distribution.

1.0.1

2026-03-14

Fixed

  • Server-Side Form Validation Enforcement — AJAX submissions now respect the form rules saved in plugin settings. Required fields, enabled subject validation, configured minimum word counts, and character limits are enforced on the server before a submission is accepted.
  • Queue Processor Improvement — CRM pending processor now syncs items immediately when Process CRM Pending Now is triggered, instead of just re-queuing them. Removed the condition that prevented legacy CRM items from processing when queue items existed.
  • Stuck Queue Items Recovery — Added automatic recovery for queue records stuck in processing state for more than 10 minutes. Clicking Process CRM/Email Pending Now resets stuck items back to pending so they are retried immediately.

Improved

  • Expired-License Renewal UX — Renewal actions are prioritised over upgrade or trial prompts, with clearer admin guidance, while Freemius account and pricing screens remain on native SDK behaviour.

1.0

2026-02-13

Highlights

  • Official rebrand from Secure ContactUS Hub to ContactIn Pro.
  • Strategic shift from basic form handling to intelligent inbox and CRM workflow.

Added

  • AI-powered intent classification for sales, support, feedback, complaints, and questions.
  • Unified admin inbox with search, filtering, notes, status tracking, and bulk operations.
  • Automatic contact capture and profile updates including phone normalisation, deduplication, and CSV/JSON export.
  • Multi-industry business-type classifier — 19 sector profiles (Generic, SaaS, E-commerce, Healthcare, Legal, Real Estate, and more).
  • Real-time analytics dashboard for submissions and engagement insights.
  • Salesforce CRM integration with queue-driven sync, field mapping, and reliability layer.
  • GDPR controls including consent, retention, export/delete, and deletion logs (Pro).
  • Multi-layer spam protection with reCAPTCHA v3, honeypot, rate limiting, and AI checks.
  • Email automation with SMTP, templating, queueing, retries, and delivery tracking. SPF/DKIM/DMARC mismatch warnings.
  • REST API and webhook-ready architecture for integrations.
  • Gutenberg block, Elementor support, and shortcode embedding.
  • Translation-ready internationalization support.

Changed

  • Restructured architecture for maintainability and scalability.
  • Updated product positioning, naming, and release presentation.
  • Improved admin UI hierarchy and workflow clarity.

Fixed

  • Freemius uninstall hook and integration reliability.
  • Plugin details modal handler behaviour on WordPress.org flow.
  • Diagnostic logging and error handling consistency.

0.1.0

2026-02-08

Added

  • Initial ContactIn Pro public release.
  • Core contact form system with inbox and analytics foundation.
  • Intent classification and anti-spam baseline.
  • CRM + email delivery integration groundwork.

Last updated: 2026-04-01 — v1.1.0

Capture Every Submission. Respond Faster. Grow with Confidence.

ContactIn Pro is a WordPress contact form entries plugin built for teams that need faster responses and fewer missed opportunities. Explore our Pricing, learn more About Us, review our Privacy Policy, or reach out through Contact Us.

Scroll to Top