Darstellung
Feature matrix (implemented)
Marketing defaults as shipped in FeatureRegistry. Enforcement is always the signed entitlement list from api.andredingfelder.com; nothing in this file is authoritative at runtime.
Plan assignments that the original specification left ambiguous were resolved in Phase 5. The reasoning is in docs/FEATURE_MATRIX_REVIEW.md. There are no remaining REQUIRES_PLAN_REVIEW cells.
Legend
| Symbol | Meaning |
|---|---|
x | Included in this plan |
- | Not included |
Status — does code exist in the audited tree?
| Value | Meaning |
|---|---|
built | Implemented today, gate must be retrofitted |
partial | Placeholder or fragment exists |
planned | Not implemented; the key is reserved so the feature is born gated |
Backend gate — where the server refuses the feature.
| Value | Anchor |
|---|---|
save | FormEntitlementValidator via FormService::assert_definition() |
rest | REST controller, 403 feature_not_entitled |
runtime | ActionRunner::run() / submit pipeline |
module | Module, integration or gateway registration |
registry | FieldRegistry / ActionRegistry catalogue filtering |
admin | Admin screen capability plus entitlement check |
core | Ungated core, always available |
UI gate — where the lock is shown.
palette, inspector, builder, admin, block, elementor, n/a.
Form builder
| Feature | Key | Category | Free | Pro | Pro+ | Business | Backend Gate | UI Gate | Status |
|---|---|---|---|---|---|---|---|---|---|
| Drag & drop builder | forms.builder | forms | x | x | x | x | core | n/a | built |
| Autosave | forms.autosave | forms | x | x | x | x | core | n/a | built |
| Undo / redo | forms.undo_redo | forms | x | x | x | x | core | n/a | built |
| Duplicate form | forms.duplicate | forms | x | x | x | x | rest | admin | built |
| Form templates | forms.templates | forms | - | x | x | x | rest, save | builder | planned |
| Import / export definition | forms.import_export | forms | - | x | x | x | rest | admin | planned |
| Multi-step forms | forms.multistep | forms | - | x | x | x | save | inspector | built |
| Conditional logic | forms.conditional_logic | forms | - | x | x | x | save | inspector | built |
| Calculations and formulas | forms.calculations | forms | - | x | x | x | save, registry | palette, inspector | built |
| Repeater | forms.repeater | forms | - | - | x | x | save, registry | palette | planned |
| Conversational forms | forms.conversational | forms | - | - | x | x | save | inspector | planned |
| Form restrictions | forms.restrictions | forms | - | x | x | x | save, runtime | inspector | planned |
Schedule window (starts_at/ends_at) | forms.schedule | forms | x | x | x | x | save | inspector | built |
| Shortcode output | forms.shortcode | forms | x | x | x | x | core | n/a | built |
Fields
| Feature | Key | Category | Free | Pro | Pro+ | Business | Backend Gate | UI Gate | Status |
|---|---|---|---|---|---|---|---|---|---|
| Standard fields | fields.standard | fields | x | x | x | x | core | n/a | partial (8 of 25) |
| Advanced fields | fields.advanced | fields | - | x | x | x | registry, save | palette | planned |
| Address field | fields.address | fields | - | x | x | x | registry, save | palette | planned |
| File upload field | fields.file_upload | fields | - | x | x | x | registry, save, runtime | palette | planned |
| Signature field | fields.signature | fields | - | x | x | x | registry, save | palette | planned |
| GDPR consent field | fields.gdpr | fields | - | x | x | x | registry, save | palette | planned |
| Product field | fields.product | fields | - | - | x | x | registry, save | palette | planned |
| Order field | fields.order | fields | - | - | x | x | registry, save | palette | planned |
Layout
| Feature | Key | Category | Free | Pro | Pro+ | Business | Backend Gate | UI Gate | Status |
|---|---|---|---|---|---|---|---|---|---|
| Columns | layout.columns | layout | x | x | x | x | core | n/a | partial (persisted, not rendered) |
| Sections | layout.sections | layout | x | x | x | x | core | n/a | partial |
| Responsive widths | layout.responsive | layout | x | x | x | x | core | n/a | partial |
| Containers | layout.containers | layout | - | x | x | x | save | inspector | planned |
| Field groups | layout.field_groups | layout | - | x | x | x | save | inspector | planned |
| Section backgrounds | layout.section_backgrounds | layout | - | x | x | x | save | inspector | planned |
Page builders and blocks
| Feature | Key | Category | Free | Pro | Pro+ | Business | Backend Gate | UI Gate | Status |
|---|---|---|---|---|---|---|---|---|---|
| Elementor widget | elementor | integration | - | x | x | x | module | elementor | built |
| Elementor full style panel | elementor.full_style_panel | integration | - | x | x | x | module | elementor | planned |
| Gutenberg block | gutenberg | integration | x | x | x | x | module | block | built |
Styling
| Feature | Key | Category | Free | Pro | Pro+ | Business | Backend Gate | UI Gate | Status |
|---|---|---|---|---|---|---|---|---|---|
| Global styles | styling.global | styling | - | x | x | x | rest, save | admin | planned |
| Custom CSS | styling.custom_css | styling | - | x | x | x | rest, save | inspector | planned |
Validation
| Feature | Key | Category | Free | Pro | Pro+ | Business | Backend Gate | UI Gate | Status |
|---|---|---|---|---|---|---|---|---|---|
| Required and format validation | validation.basic | validation | x | x | x | x | core | n/a | built |
| Live validation | validation.live | validation | x | x | x | x | core | n/a | partial |
Notifications
| Feature | Key | Category | Free | Pro | Pro+ | Business | Backend Gate | UI Gate | Status |
|---|---|---|---|---|---|---|---|---|---|
| Email notification | notifications.email | notifications | x | x | x | x | save, runtime | inspector | built |
| Advanced email (multiple, HTML, attachments) | notifications.advanced | notifications | - | x | x | x | save, runtime | inspector | partial |
| Conditional email sending | notifications.conditional | notifications | - | x | x | x | save, runtime | inspector | built |
Actions
| Feature | Key | Category | Free | Pro | Pro+ | Business | Backend Gate | UI Gate | Status |
|---|---|---|---|---|---|---|---|---|---|
| Redirect after submit | actions.redirect | actions | x | x | x | x | save, runtime | inspector | built |
| Webhook action | actions.webhook | actions | - | - | - | x | save, runtime | inspector | planned |
| Create WP user | actions.wp_user | actions | - | - | x | x | save, runtime | inspector | planned |
| Create WP post | actions.wp_post | actions | - | - | x | x | save, runtime | inspector | planned |
Surveys and quiz
| Feature | Key | Category | Free | Pro | Pro+ | Business | Backend Gate | UI Gate | Status |
|---|---|---|---|---|---|---|---|---|---|
| Surveys | surveys | surveys | - | x | x | x | save, rest | builder | planned |
| Quiz, scoring, result ranges | quiz | surveys | - | - | x | x | save, rest | builder | planned |
Analytics
| Feature | Key | Category | Free | Pro | Pro+ | Business | Backend Gate | UI Gate | Status |
|---|---|---|---|---|---|---|---|---|---|
| Basic analytics | analytics.basic | analytics | - | x | x | x | rest, admin | admin | partial (counts only) |
| Advanced analytics | analytics.advanced | analytics | - | - | x | x | rest, admin | admin | planned |
Payments (System B — the customer's own gateways)
Every payment key gates the customer's own money flow. None of them has any relationship to AD Form licence billing (System A).
| Feature | Key | Category | Free | Pro | Pro+ | Business | Backend Gate | UI Gate | Status |
|---|---|---|---|---|---|---|---|---|---|
| Payments module | payments | payments | - | - | x | x | module, save, runtime | inspector | planned |
| Stripe | payments.stripe | payments | - | - | x | x | module, save, runtime | inspector | planned |
| PayPal | payments.paypal | payments | - | - | x | x | module, save, runtime | inspector | planned |
| Mollie | payments.mollie | payments | - | - | x | x | module, save, runtime | inspector | planned |
| Subscriptions | payments.subscriptions | payments | - | - | x | x | save, runtime | inspector | planned |
| Donations | payments.donations | payments | - | - | x | x | save, runtime | inspector | planned |
| Products and variants | payments.products | payments | - | - | x | x | save, runtime | inspector | planned |
| Discounts | payments.discounts | payments | - | - | x | x | save, runtime | inspector | planned |
| Taxes | payments.taxes | payments | - | - | x | x | save, runtime | inspector | planned |
| Shipping | payments.shipping | payments | - | - | x | x | save, runtime | inspector | planned |
| Live price calculation | payments.live_calculation | payments | - | - | x | x | save, rest | inspector | planned |
PDF
| Feature | Key | Category | Free | Pro | Pro+ | Business | Backend Gate | UI Gate | Status |
|---|---|---|---|---|---|---|---|---|---|
| PDF module | pdf | - | - | x | x | module, save, runtime | inspector | planned | |
| Invoice | pdf.invoice | - | - | x | x | save, runtime | inspector | planned | |
| Quote | pdf.quote | - | - | x | x | save, runtime | inspector | planned | |
| Contract | pdf.contract | - | - | x | x | save, runtime | inspector | planned | |
| PDF via email | pdf.email | - | - | x | x | save, runtime | inspector | planned |
Integrations
Per-key so the dashboard can move individual integrations between plans without a plugin release. Plan columns are unresolved, see the review document.
| Feature | Key | Category | Free | Pro | Pro+ | Business | Backend Gate | UI Gate | Status |
|---|---|---|---|---|---|---|---|---|---|
| Integrations module | integrations | integrations | - | x | x | x | module | admin | planned |
| Mailchimp | integrations.mailchimp | integrations | - | x | x | x | module, runtime | inspector | planned |
| Google Sheets | integrations.google_sheets | integrations | - | x | x | x | module, runtime | inspector | planned |
| Slack | integrations.slack | integrations | - | x | x | x | module, runtime | inspector | planned |
| Zapier | integrations.zapier | integrations | - | x | x | x | module, runtime | inspector | planned |
| HubSpot | integrations.hubspot | integrations | - | - | x | x | module, runtime | inspector | planned |
| Salesforce | integrations.salesforce | integrations | - | - | x | x | module, runtime | inspector | planned |
| ActiveCampaign | integrations.activecampaign | integrations | - | x | x | x | module, runtime | inspector | planned |
Dynamic data and WordPress
| Feature | Key | Category | Free | Pro | Pro+ | Business | Backend Gate | UI Gate | Status |
|---|---|---|---|---|---|---|---|---|---|
| Dynamic prefill | dynamic.prefill | dynamic | - | - | x | x | save, runtime | inspector | planned |
| Frontend post submission | wordpress.frontend_post | wordpress | - | - | x | x | save, runtime | inspector | planned |
| WP user management | wordpress.user_management | wordpress | - | - | x | x | save, runtime | inspector | planned |
Submissions and export
| Feature | Key | Category | Free | Pro | Pro+ | Business | Backend Gate | UI Gate | Status |
|---|---|---|---|---|---|---|---|---|---|
| Entry management (list, detail, spam, trash, bulk) | submissions.management | submissions | x | x | x | x | core | n/a | built |
| Advanced export (Excel, filtered, template) | exports.advanced | exports | - | - | x | x | rest | admin | planned |
Internationalisation
| Feature | Key | Category | Free | Pro | Pro+ | Business | Backend Gate | UI Gate | Status |
|---|---|---|---|---|---|---|---|---|---|
| WPML, Polylang, RTL | i18n.advanced | i18n | - | - | x | x | module | admin | planned |
Security
| Feature | Key | Category | Free | Pro | Pro+ | Business | Backend Gate | UI Gate | Status |
|---|---|---|---|---|---|---|---|---|---|
| Honeypot | security.honeypot | security | x | x | x | x | core | n/a | built |
| Nonces | security.nonce | security | x | x | x | x | core | n/a | built |
| reCAPTCHA | security.recaptcha | security | - | x | x | x | save, runtime | inspector | planned |
| hCaptcha | security.hcaptcha | security | - | x | x | x | save, runtime | inspector | planned |
| Turnstile | security.turnstile | security | - | x | x | x | save, runtime | inspector | planned |
| Rate limiting | security.rate_limiting | security | - | x | x | x | runtime | admin | planned |
| Akismet | security.akismet | security | - | x | x | x | runtime | inspector | planned |
| Advanced bot detection | security.advanced_bot_detection | security | - | - | - | x | runtime | admin | planned |
Privacy
| Feature | Key | Category | Free | Pro | Pro+ | Business | Backend Gate | UI Gate | Status |
|---|---|---|---|---|---|---|---|---|---|
| IP and user-agent storage controls | privacy.storage | privacy | x | x | x | x | core | n/a | built |
| GDPR tooling (export, erasure, retention) | privacy.gdpr | privacy | - | x | x | x | rest, admin | admin | planned |
Platform, team and developer
| Feature | Key | Category | Free | Pro | Pro+ | Business | Backend Gate | UI Gate | Status |
|---|---|---|---|---|---|---|---|---|---|
| White label | white_label | platform | - | - | - | x | admin, rest | admin | planned |
| Team roles | team.roles | platform | - | - | - | x | admin, rest | admin | planned |
| Team permissions | team.permissions | platform | - | - | - | x | admin, rest | admin | planned |
| Basic logging | logging.basic | platform | x | x | x | x | core | n/a | built |
| Full logging | logging.full | platform | - | - | - | x | admin, rest | admin | partial |
| Developer REST API surface | developer.api | developer | - | - | - | x | rest | admin | planned |
| Add-on framework | developer.addons | developer | - | - | - | x | module | admin | planned |
Licence-independent core
These are never gated. The Free fallback must keep all of them working, and no entitlement lookup may be introduced on these paths.
| Concern | Reason |
|---|---|
| Form submission and entry storage | A stored entry is visitor data, never a paid feature |
| Reading existing forms and entries | Downgrade must never hide customer data |
| Server-side condition evaluation during submit | Security control, not a feature |
| Nonce verification, honeypot, sanitisation, escaping | Security controls |
| Database migrations | Must run regardless of licence state |
| The licence admin screen itself | Otherwise a revoked licence cannot be repaired |