Changelog
Release history and product development cadence.
Release cadence & support commitment
Fix-forward releases are cut within 48 hours of a confirmed report from any buyer. Security hardening ships continuously — no need to wait for a numbered version. Every release is one-click upgradeable from Admin → Updates (no SSH, no artisan commands required), with a full audit trail of who applied what and when. Migrations are additive-only across minor versions; a stray column is never dropped from a buyer's database.
1.2.1 3 September 2026
Polish + fills for 1.2. Activates the add-on economy end-to-end, ships the 4th Lead Suite collector, and adds landing-page A/B testing. One-click upgrade from Admin → Updates.
Added
- Customer add-ons marketplace at
/addons. Browse every active add-on with a bonus summary, one-click purchase, cancel your own subscriptions. Admin approval auto-creates the active subscription with the right end-date from the billing interval; idempotent so re-approval never duplicates. - Add-on bonuses actually apply now.
Customer::quota()folds every active add-on'sbonus_<key>payload — numeric bonuses stack on the plan quota, boolean flags OR onto the plan flag. Cached per model instance for the send pipeline's hot path. - Google Places lead collector — the fourth Lead Suite collector. Enter a Places query, your Google Maps API key (BYO), and the scraper collects businesses + emails into the leads table. Gated by
allow_google_places. - Landing-page A/B testing. Every landing page now supports a second hero variant (headline, subhead, CTA, hero image). Sticky 50/50 split per visitor via cookie; conversions attribute to the variant seen. Per-variant view + conversion counters render live in the editor. Preview either side directly with
?ab=a|b.
Improvements
- Admin → Add-ons form now shows a top-of-form validation banner with per-field messages when submit fails; the first errored field scrolls into view smoothly.
- Add-on payload textarea hint switched to real quota keys (
{"bonus_max_subscribers": 5000}) instead of the speculative placeholder.
1.2.0 29 August 2026
Major release — the Lead Generation Suite. Brings prospect collection, email verification, AI-driven ICP scoring, and one-click activation directly into the sender's workflow. Plus fixes for the admin dashboard, branding runtime, and translation automation.
What's new — Lead Generation Suite
- Prospect table + tenant-scoped storage — every lead lives in a customer-scoped
leadstable with dedup on(customer_id, email). Firmographic fields (company, domain, title, employee band, revenue band, country, LinkedIn) plus flexible JSON for custom attributes. - Four collectors — CSV bulk import with auto-detected header aliases, hosted lead form on a public
/p/lead-form/<token>URL (honeypot + rate limit built in), URL scrape via HTTP + regex/mailto extraction with noise filter, plus a Google Places scaffold for v1.2.1. - Email verification pipeline — layered checks: syntax → disposable-domain block → role-account detection → MX lookup → SMTP handshake with catch-all probe. Runs sync on demand or batched via queue. Blocked-port fallback downgrades to risky rather than invalid, so shared-host installs don't false-negative real leads.
- AI-driven ICP scoring — buyer describes their ideal customer in plain English on a LeadScoreRule; the platform AI provider scores each prospect 0-100 with a written reasoning paragraph. Scores bucket into A/B/C/D tiers for filter dropdowns. Runs against any configured provider (OpenAI, Anthropic, Groq, DeepSeek).
- Push-to-list activation — bulk-select prospects on the Leads index and push them into any EmailList as subscribers. Idempotent (already-subscribed emails are skipped), verification-aware (skip invalid on by default, skip risky opt-in), and stamps consent + source metadata on every subscriber row. Lead status flips to opted_in.
- 4 new Copilot tools —
find_leads,verify_lead,score_prospect,push_leads_to_list(the last one marked destructive so Copilot asks confirmation). Buyers can now say "find A-tier valid prospects at Acme" or "push verified A-tier leads into my newsletter list" and Copilot routes to the right action. - Growth sidebar group — new Leads, Lead sources, and ICP profiles entries under a dedicated Growth section.
- Plan-tier quotas seeded —
max_leads_stored,max_lead_enrichments_per_month,max_lead_scoring_calls_per_month,max_lead_sources_per_month,max_hosted_forms, plusallow_url_scrape/allow_google_places/allow_hosted_formflags on Free / Starter / Pro / Enterprise.
Improvements
- Admin dashboard — every tile navigates — Revenue, MRR, Sends, New subscribers, Campaigns, Lists, and Bounces tiles now link to their target page. Previously only 4 of 11 tiles were clickable.
- Branding at runtime — browser tab title and SMTP outbound test email now honor the admin-set Branding → Site name at runtime. Rebranded installs no longer need a JavaScript rebuild for the tab title to update; the SMTP test email uses the site name in its subject, body, and footer.
- Translation automation —
translations:scan --all-localesmirrors new English keys into every enabled locale in one command, with optional--translateto auto-translate placeholders via the configured AI provider. Runs automatically after every one-click Update, so admins never touch a JSON file to ship new-key translations. - Lead-suite create modals — inline validation errors under each field, explicit
<form onSubmit>wrappers so Enter-to-submit works, and explicittype="button"/type="submit"on every action button so nothing silent-fails. - System setup queue badge — installs on
QUEUE_CONNECTION=sync(shared hosting, cPanel, Plesk) now show a green "Not required" badge on the queue-worker tile instead of an alarming red "Down". Sync mode runs jobs inline; no worker is expected.
Fixed
- Admin → Settings → Deliverability policy → Save returned 404. The save route's
{group}regex was missingsending. All eight groups the controller defines (branding, ui, ai, billing, sending, uploads, storage, system) now resolve. Therequire_byodflag it saves is read on every campaign send byEmailIdentityResolver— the feature was live all along, just unroutable. - Admin → Pages → New / Edit → Save threw
SQLSTATE[23000]: Column 'body_markdown' cannot be nullon legacy installs that shipped body columns as NOT NULL. Controller now defaults the absent editor column to an empty string before insert/update. Also fixed stale "Title / Slug required" red text staying visible after typing —clearErrorsnow runs on input change. - Admin → Add-ons → Create silent-failed with
Uncaught TypeError: Cannot read properties of undefined (reading 'post'). Root cause was a chaineduseForm.transform().post()call;transform()returns void in the shipped Inertia version, so the chain threw before any request left the browser. Split into two calls. Payload textarea hint refreshed to real quota keys.
Security
- Hosted lead form ships with a hidden honeypot field and a per-IP-per-source rate limit (10 submissions per hour). Bots that populate the honeypot get a fake success screen and are silently dropped.
Under the hood
- Four new tables —
lead_sources,leads,lead_enrichments,lead_score_rules— with foreign keys tocustomersand cascade-delete on tenant removal. - Every collector auto-creates a
LeadSourcerow for provenance; enrichment history logged inlead_enrichmentsfor quota + billing visibility. - New
Lead::scopeVisibleTo(?Customer $viewer)enforces the tenant boundary; every controller lists via the scope, never a rawWHERE customer_id. - Blade layout now stamps
<meta name="app-name">from the DB-storedbranding.site_name;resources/js/app.jsxreads it at boot so the tab-title suffix follows admin rebrands without a rebuild.
1.1.2 July 2026
Reliability drop — four buyer-reported issues from field feedback, resolved within 48 hours of confirmation.
Reliability
- Campaign preview — draft campaigns without content, malformed merge tags, or renderer failures now show a branded placeholder page instead of a blank frame. Every render path is wrapped in a safe fallback with a "preview unavailable" hint for the recipient.
- Campaign type preserved through edit — a plain-text ("direct message") draft no longer flips to a branded campaign when reopened. Wizard now reads the saved
typefrom the campaign payload and picks the right step set + content widget. - Postal-address auto-fix — the pre-flight Add postal address button now injects a compliant footer block that pulls
company_name+company_addressfrom the list at send time, instead of throwing "unknown fixer". Refuses cleanly with a friendly hint when both list fields are empty. - Pause responsiveness — the dispatcher now re-reads
campaigns.statusevery 20 recipients inside the synchronous batch and stops within seconds of a Pause click. Queued deliveries already respected pause; the sync path now behaves the same.
Under the hood
- Every
MergeTagRenderercaller wraps in a try/catch — a broken template can no longer crash a public web-view. - New
PAUSE_CHECK_EVERY = 20constant on the dispatcher; balances query cost against interrupt latency. CampaignController::serializeForFormgains thetypefield. All prior campaigns are backwards-compatible — nulls resolve toregular.
1.1.1 July 2026
Buyer-requested feature drops + reliability polish. One-click upgradeable from Admin → Updates.
What's new
- Shared System Relay pool — mark a platform-tier delivery server as available to any buyers on selected plan tiers. Their campaigns and transactional sends route through the platform's SMTP without ever seeing your credentials. Ideal for SaaS operators who want to charge for sending without every customer hooking up their own Amazon SES / Mailgun / SendGrid.
- Per-SMTP tracking domain — each delivery server can bind to its own verified tracking domain. Sends routed through that server automatically use its tracking host for opens, clicks, unsubscribes, and the web-view URL. Unblocks agencies running multiple SMTPs with independent branded tracking.
- Copilot memory window — extended to the last 20 conversation turns of structured recall, capped so long-running chats stay quick and inexpensive without losing recent context.
Improvements
- Large subscriber exports — key-set pagination + streaming flush + UTF-8 BOM on the download. 100k+ row lists export without memory pressure, arrive Excel-ready, and stream progressively so the browser starts receiving bytes immediately.
- Reports timezone — daily open / click series now bucket in the customer's own timezone (falls back to the app default), so a 21:00 evening open in Los Angeles lands on the right day.
- Merge tag rendering — hardened placeholder resolver preserves dot notation (
subscriber.first_name,campaign.web_view_url,list.company_name, and everysubscriber.<custom_field>). No more silent-drop of nested keys on some templates. - Postmark bounce handling — bounce webhooks classify accurately from Postmark's JSON payload (HardBounce, Transient, SpamComplaint, Blocked, DnsError, and more) instead of falling back to unknown. Feeds cleaner data into the suppression list.
- Post-Apply version stamp — Admin → Updates re-reads the shipped version from disk after clearing caches, so the settings stamp always reflects the freshly uploaded build.
Under the hood
- New
delivery_servers.assignable_plan_idsanddelivery_servers.tracking_domain_idcolumns; additive migration, existing rows untouched. - Sending pipeline (dispatch + transactional) now threads the chosen delivery server through the URL resolver, so tracking / unsubscribe / web-view links stay consistent within a single send.
- Streaming exports set
X-Accel-Buffering: noto disable nginx buffering, flush the PHP output buffer after each chunk, and bump the memory / time limit for the duration of the export only.
1.1.0 July 2026
Feature additions and reliability polish based on the first release cycle's field feedback.
What's new
- One-click Apply update under Admin → Updates — runs pending migrations, refreshes caches, syncs any new environment defaults, and stamps the running version. Shared-hosting buyers no longer need SSH.
- Dedicated Customer Asset Library with per-plan storage quotas, drag-drop upload, gallery picker, and quota progress bar.
- Admin asset sharing — flag individual platform assets as shared so every customer workspace's picker sees them. Bulk toggle available.
- Large subscriber imports up to 200 MB — Excel and LibreOffice CSV variants accepted. Import surface shows your server's effective upload cap so oversized files fail politely instead of at the boundary.
- Session keeper — long-idle admin tabs auto-refresh their CSRF token instead of landing on the framework's 419 "Page Expired" screen. A branded fallback page auto-reloads in three seconds when the keeper misses.
- Update manifest checker — daily background poll of the release manifest so new versions surface with one glance at Admin → Updates. Graceful when the manifest host is unreachable (fresh installs, firewalled networks).
Security & privacy
- Cross-tenant workspace isolation — customer workspaces are strictly scoped: uploads, lists, campaigns, and settings never leak between customers. Admin can opt-in to platform-wide assets on a per-asset basis.
- Public-demo guardrails — instances running in demo mode protect sensitive admin surfaces (licence, updates, two-factor) from visitor writes while keeping the customer workspace fully explorable.
- Release archive hygiene — every shipped ZIP starts from a clean baseline: no dev artefacts, no per-install state carried over, no stale cache files.
Improvements
- Unified link hosting on sends —
List-Unsubscribeheader,{{ unsubscribe_url }}merge tag, and{{ campaign.web_view_url }}all resolve through the customer's default tracking domain, matching click and open tracking. Every link in a sent email shares one host. - Custom SMTP ports preserved — non-standard ports (e.g. 6868 for private relays) are no longer overwritten when the encryption select changes. Stock ports still auto-fill on empty fields.
- Tracking-domain setup instructions read the configured host at request time instead of a static placeholder.
- Visual Editor image URL field wired to the shared gallery picker — browse or upload directly instead of pasting a URL.
- Admin Asset Library defaults to platform-uploaded content, with a per-customer filter dropdown for drilling into visitor uploads.
- Marketing Workspace bootstrap — installer seeds the required system customer row; the controller lazy-creates it as a defence-in-depth fallback on older installs.
- Installer wizard resolves translation keys in-page and pipes the i18n catalog to the pre-DB render path.
- Setup Health badges restore per-status labels (Alive / Lagging / Down / Disabled).
- Marketing landing preview ships a CodeCanyon-only buyer notice banner, item hero thumbnail, and premium preview stack for the item page.
Reliability
- Payment Methods editor — hardened credentials hook to prevent an intermittent render halt.
- Visual Editor / Templates — initialise translation context in nested renderers so the editor opens under all render paths.
- Test-send uses isolated recipient stubs, avoiding duplicate-key collisions on shared lists.
- Campaign Audience step (edit mode) — recipient groups are serialised for the wizard so the Continue button reflects the true form state, including legacy campaigns pre-dating multi-group support.
- Customer asset uploads route through the correct customer-scoped endpoints, closing a 404 on subdirectory installs.
- Storage symlink — cross-platform helper falls back through native symlink → Windows junction → recursive copy so
/storage/*always resolves, regardless of host OS or admin privileges. - APP_URL is stamped from the current request during install so absolute URLs, unsubscribe headers, and tracking-domain fallbacks resolve out of the box.
- Audit-log detail drawer initialisation hardened against a translator-context edge case.
- Multiple form pages regained full translation coverage (SEO, publishing hints, plan cadence, throttle limits, promo-code metadata, and more).
1.0.0 Initial release
June 2026 — CodeCanyon launch.
- Multi-tenant admin + customer panels with separate auth guards, 2FA, Google OAuth.
- Web installer: requirements check, database setup, branding, admin user, license, live progress.
- 9 delivery drivers (SMTP, SES, SendGrid, Mailgun, Postmark, Brevo, Mailjet, Resend, SparkPost), DKIM auto-keygen, bounce + complaint handling, throttle policies, IP warmup.
- Lists with custom fields, single + double opt-in, segment builder, CSV import, hosted forms, landing pages, surveys.
- Drag-drop email template builder, system + customer templates, per-tier access control.
- Campaigns with scheduling, Undo Send window, A/B testing up to 5 variants, pre-flight audit, visual automation canvas.
- AI Copilot (Cmd+K) with subject drafts, segment compiler, report summaries, draft creation, authorised tool execution.
- Admin landing + auth page editors with live iframe preview, multi-locale content.
- Multi-gateway billing: Stripe + manual offline, multi-currency, promo codes, plan swap with proration, add-ons, financial report.
- 32 transactional notification events with admin-editable templates, per-event mailer routing, retry + log.
- REST API v1 with token scopes, outbound webhooks with retry, native Shopify / WooCommerce / Stripe integrations.
- Admin tools: customer impersonation, quota matrix editor, asset library, audit log, setup-health dashboard.
- CAN-SPAM + GDPR + Gmail/Yahoo 2024 sender ready: token-secured opt-in, consent metadata capture, data export + erase endpoints, send blocked without unsubscribe + postal address.
- 11 shipped locales, admin-editable translations, theme palette system.