A conversational form builder plugin for Craft CMS that transforms traditional forms into engaging, chat-like experiences.
💰 Pricing: $39 USD one-time purchase + $19/year optional renewals for continued updates and support
- Chat-like Interface: Transform boring forms into engaging conversations
- One Question at a Time: Keep users focused with a progressive disclosure pattern
- Real-time Validation: Instant feedback as users type
- Multiple Field Types: Support for text, email, phone, textarea, multiple choice buttons, and date fields
- Optional Questions: Allow users to skip non-required questions with customizable skip button text
- Mobile-First Design: Responsive and touch-friendly interface
- Avatar Styles: Choose between solid color, gradient, or custom image avatars
- Brand Colors: Customize primary and secondary colors to match your brand
- Custom Initials: Set custom initials for the chat avatar
- Automatic Text Contrast: Smart text color selection based on background brightness
- CSS Custom Properties: Full theming control via CSS variables
- Multiple Email Recipients: Send notifications to multiple email addresses (comma or newline separated)
- Slack Integration: Send submission notifications to Slack channels via webhooks
- Microsoft Teams Integration: Post submissions to Teams channels
- Custom Webhooks: Integrate with any service via custom webhook URLs (Zapier, Make, etc.)
- Form-Level Settings: Configure notifications per form with fallback to global plugin settings
- Rich Email Templates: Beautiful HTML email notifications with all submission data
- Multi-Site Ready: Full support for Craft CMS multi-site installations
- Site-Specific Content: Translate question text, placeholders, skip text, and multiple choice options per site
- Easy Site Switching: Switch between sites directly from the form editor with a convenient dropdown
- Fallback Logic: Automatically falls back to primary site content when translations are missing
- Built-in Translations: Control panel available in English (en), Dutch (nl), German (de), French (fr), and Spanish (es)
- Honeypot Fields: Hidden fields that bots fill but humans cannot see
- Time-Based Validation: Reject submissions that are too fast (bots) or too slow (expired)
- JavaScript Validation: Ensures JavaScript is enabled with token generation
- Rate Limiting: Prevent spam floods with configurable per-IP limits
- Zero Dependencies: No external services required - works out of the box
- Fully Configurable: Enable/disable and adjust all thresholds from settings
- Simple Template Tag: Render forms with a single Twig tag
- Headless API: Submit forms via AJAX for custom integrations
- Webhook Payload: Structured JSON data for easy integration
- Extensible: Clean architecture for custom modifications
- Craft CMS 5.0.0 or later
- PHP 8.2 or later
composer require totalwebcreations/chatflowThen install the plugin via the Craft Control Panel or command line:
php craft plugin/install chatflow- Download the latest release
- Extract to
plugins/chatflow/ - Install via Control Panel or command line
- Navigate to ChatFlow → Forms in the Control Panel
- Click New Form
- Configure the form:
- General Tab: Set form name, handle, and success message
- Questions Tab: Add and configure questions
- Notifications Tab: Set up email, Slack, Teams, or webhook notifications
If you have multiple sites configured in Craft CMS, ChatFlow automatically supports site-specific content:
- Site Selector: When editing a form, use the site dropdown in the breadcrumb navigation (top-left) to switch between sites
- Translatable Content: The following fields can be customized per site:
- Question text
- Placeholder text
- Skip button text
- Multiple choice options
- Shared Structure: Form structure (field types, field names, required status) is shared across all sites
- Automatic Detection: Forms automatically display content based on the current site when rendered on the frontend
- Fallback: If content hasn't been translated for a site, it falls back to the primary site's content
Example: Create a contact form in English, then switch to your Dutch site and translate all question text, placeholders, and button labels while keeping the same form structure.
Each question supports:
- Question Text: The question shown to users
- Field Type: text, email, tel, textarea, buttons (multiple choice), or date
- Field Name: Technical name for the field (used in submissions and templates)
- Placeholder: Optional placeholder text
- Required: Toggle to make the question mandatory
- Skip Button Text: Custom text for the skip button (optional questions only)
- Options: Multiple choice options (for button field type, one per line)
First, create your trigger button with a unique ID:
<button id="contactButton" class="my-custom-button">
Get in Touch
</button>Then, render the ChatFlow modal and connect it to your button:
{{ craft.chatflow.modal('contactForm', 'contactButton') }}Replace contactForm with your form's handle and contactButton with your button's ID.
Complete Example:
<a id="ctaButton" class="btn btn-primary">
Start Chat
</a>
{{ craft.chatflow.modal('contactForm', 'ctaButton') }}The modal will automatically open when the user clicks the element with the specified ID.
Submit forms programmatically:
const formData = {
formHandle: 'contactForm',
data: {
name: 'John Doe',
email: 'john@example.com',
message: 'Hello!'
}
};
const response = await fetch('/actions/chatflow/submit/submit', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-Token': window.csrfTokenValue
},
body: JSON.stringify(formData)
});
const result = await response.json();Navigate to Settings → Plugins → ChatFlow to configure:
- Avatar Type: Solid color, gradient, or custom image
- Primary Color: Main brand color
- Secondary Color: Secondary brand color (used in gradients)
- Initials: Avatar initials (2 characters)
- Avatar Image: Upload a custom avatar image
- Default Notification Emails: Comma or newline separated email addresses
- Enable Email Notifications: Toggle email notifications on/off
- Slack Webhook URL: Default Slack webhook for all forms
- Teams Webhook URL: Default Microsoft Teams webhook
- Custom Webhook URL: Default custom webhook endpoint
- Enable Spam Protection: Toggle spam protection on/off (enabled by default)
- Minimum Submission Time: Reject submissions faster than this (default: 2 seconds)
- Maximum Submission Time: Reject submissions slower than this (default: 1800 seconds / 30 minutes)
- Max Submissions: Maximum submissions per IP within time window (default: 3)
- Rate Limit Time Window: Time window for rate limiting (default: 600 seconds / 10 minutes)
How it works:
- Honeypot: Hidden field (
_chatflow_website) that legitimate users won't see, but bots will fill - Time Validation: Too fast = bot, too slow = expired session
- JavaScript Token: Ensures JavaScript is enabled (ChatFlow requires JS anyway)
- Rate Limiting: Prevents spam floods from the same IP using Craft's cache system
All spam protection runs automatically when enabled. Failed spam checks are logged to storage/logs/web.log for monitoring.
Each form can override global notification settings:
- Go to the form's Notifications tab
- Configure notifications specific to this form:
- Email addresses (leave empty to use plugin default)
- Slack webhook URL (leave empty to use plugin default)
- Teams webhook URL (leave empty to use plugin default)
- Custom webhook URL (leave empty to use plugin default)
Email notifications include:
- Form name and submission date
- All answered questions with responses
- Submission ID and IP address
- Beautiful HTML template with ChatFlow branding
Multiple Recipients: Enter multiple email addresses separated by commas or newlines:
team@example.com
manager@example.com
support@example.com
- Create a Slack App at https://api.slack.com/apps
- Enable Incoming Webhooks
- Add a webhook to your workspace
- Copy the webhook URL (looks like
https://hooks.slack.com/services/...) - Paste into ChatFlow settings or form notification settings
Slack messages include:
- ChatFlow branding and color
- Form name
- All submission data as fields
- Timestamp
- In Teams, go to your channel
- Click ••• → Connectors → Incoming Webhook
- Configure and create the webhook
- Copy the webhook URL
- Paste into ChatFlow settings
Teams messages use MessageCard format with:
- Form name
- Submission timestamp
- All answers as facts
Send submission data to any webhook endpoint (Zapier, Make, custom APIs):
Payload Structure:
{
"form": {
"id": 1,
"name": "Contact Form",
"handle": "contact"
},
"submission": {
"id": 123,
"data": {
"name": "John Doe",
"email": "john@example.com",
"message": "Hello!"
},
"dateCreated": "2026-02-01T14:25:56-08:00",
"ipAddress": "127.0.0.1",
"userAgent": "Mozilla/5.0..."
}
}Testing Webhooks Locally:
ChatFlow includes a built-in webhook tester:
- Use this URL in your webhook settings:
https://yoursite.test/actions/chatflow/webhook-test/receive - Submit a form
- View the logs at:
https://yoursite.test/actions/chatflow/webhook-test/logs - Or check the log file:
storage/logs/chatflow-webhook-test.log
- Navigate to ChatFlow → Submissions
- View all submissions across all forms
- Filter by form
- See submission date, form name, and submission data
Click on a submission to view:
- All answered questions
- Submission metadata (IP address, user agent, date)
ChatFlow uses CSS custom properties for easy theming:
:root {
--chatflow-primary: #0891b2;
--chatflow-gradient: linear-gradient(to bottom right, #0891b2, #06b6d4);
--chatflow-user-message-bg: #0891b2;
--chatflow-focus-shadow: 0 0 0 3px rgba(8, 145, 178, 0.1);
--chatflow-hover-bg: rgba(8, 145, 178, 0.05);
--chatflow-text-color: #ffffff;
}Override ChatFlow styles in your own CSS:
/* Customize the chat bubble */
.chatflow-modal {
border-radius: 20px;
}
/* Customize the trigger button */
.chatflow-trigger {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
/* Customize messages */
.chatflow-message.user {
background: #your-color;
}To add a new language:
- Copy
src/translations/en/chatflow.php - Create a new folder for your language (e.g.,
itfor Italian) - Translate all strings
- Submit a pull request!
- Check that the form handle is correct
- Verify the form has at least one question
- Check browser console for JavaScript errors
- Clear Craft's caches
- Check Craft's email settings (Settings → Email)
- Verify webhook URLs are correct
- Check
storage/logs/web.logfor errors - For Slack/Teams: verify the webhook is active in the service
- Check for CSS conflicts with other plugins/themes
- Use browser DevTools to inspect elements
- Verify ChatFlow assets are loaded (check Network tab)
chatflow/
├── src/
│ ├── assets/ # Frontend JavaScript and CSS
│ ├── controllers/ # Control Panel and API controllers
│ ├── migrations/ # Database migrations
│ ├── models/ # Form, Question, Submission models
│ ├── records/ # ActiveRecord database models
│ ├── services/ # Business logic services
│ ├── templates/ # Twig templates for CP
│ └── translations/ # i18n language files
├── composer.json
└── README.md
Frontend assets are located in src/assets/:
js/chatflow.js- Main conversational form logiccss/chatflow.css- Styles for the chat interface
chatflow_forms
- Form metadata (name, handle, success message)
- Notification settings (email, Slack, Teams, webhook)
chatflow_questions
- Question configuration
- Field types and validation
- Sort order for display
chatflow_submissions
- Submission data (JSON)
- User metadata (IP, user agent)
- Timestamps
- Documentation: https://github.com/TotalWebCreations/chatflow
- Issues: https://github.com/TotalWebCreations/chatflow/issues
- Email: support@totalwebcreations.nl
This plugin is licensed under the MIT License. See LICENSE.md for details.
Developed by TotalWebCreations
Enjoying ChatFlow? Please star the repo and share with others! ⭐