Changelog
Release notes & version history for Freelance Studio
Version 8.6.0
6 changes
▼
- New: Email Delivery Settings — Built-in integration with Brevo and Postmark transactional email APIs. Ensures invoices, proposals, contracts, booking confirmations, and all other emails reliably reach clients' inboxes instead of landing in spam.
- New: Setup Wizard — Step-by-step wizard in Settings → Email Delivery walks users through choosing a provider, creating an account, entering their API key, verifying the connection, and sending a test email. Supports three paths: Brevo (free 300 emails/day), Postmark (fastest delivery), or "I already use an SMTP plugin."
- New: Email Delivery Service (
class-fs-email-delivery.php) — Hooks into WordPress'spre_wp_mailfilter to route all emails through the configured provider's API. Includes full header parsing (From, Reply-To, CC, Content-Type), automatic fallback to defaultwp_mail()if the API call fails, and error logging. - New: API Key Verification — Verify Connection button tests the API key against the provider's account endpoint before saving, preventing misconfiguration.
- New: Test Email — Send a branded test email from both the setup wizard and the configured status view to confirm end-to-end delivery.
- Improved: Email Templates settings tip now links to the new Email Delivery settings instead of generically suggesting an SMTP plugin.
Version 8.4.0
3 changes
▼
New Features
- Finances Hub: New unified "Finances" menu in the WordPress sidebar, consolidating all financial features into one location with sidebar navigation (same pattern as Bookings and Settings).
- Backward Compatibility: Old bookmarked URLs (
?page=fs-invoices,?page=fs-expenses,?page=fs-recurring-invoices,?page=fs-reporting) automatically redirect to the correct Finances sub-page with all query parameters preserved. - WordPress admin sidebar reduced from 14 items to 11 for a cleaner navigation experience.
Version 8.3.3
1 change
▼
- Added: Expense CSV Import — the Settings > Import tool now supports importing expenses in addition to invoices. A type selector at the top lets you choose between "Invoices" and "Expenses" before uploading. Expense import auto-maps columns for Date, Amount, Merchant, Category, Description/Purpose, Notes, and Sales Tax. Expense names are built from Merchant + Purpose (e.g., "Adobe Creative Cloud — Software"). Preview shows expense count, total amount, and a full preview table before committing. Batched processing with progress bar, same as invoice import.
Version 8.3.2
1 change
▼
- Added: Pagination on the Invoices list page. Defaults to 25 per page with options for 10, 25, 50, or 100. Shows "Showing X–Y of Z invoices" info, page number links with ellipsis for large page counts, and prev/next navigation. Filters (status, client) are preserved across pages. Per-page preference is carried in the URL.
Version 8.3.0
3 changes
▼
- Added: CSV Import Tool in Settings > Import. Upload a CSV file containing historical invoice data (from Wave, FreshBooks, QuickBooks, or any other tool) and import clients, projects, and invoices into Freelance Studio. Features include:
- Added: Client Merge — reassign all projects, invoices, proposals, contracts, expenses, tasks, bookings, and contacts from one client to another, then delete the source client. Available via "Merge Into..." in the client card/row action menus. Includes a preview step showing exactly how many records will be reassigned before confirming.
- Added: Client Archive — archive and restore clients from the card/row action menus. Archived clients move to the existing "Archived" tab and are excluded from active views and dropdowns.
Version 8.1
1 change
▼
- Changed: Weekly digest email header now uses the teal-to-lime gradient (
--fs-teal-lime) with dark text (--fs-gray-800) instead of teal-to-purple with white text. Applied to both the real email and the settings preview/test email.
Version 7.10.0
6 changes
▼
- New: Preset Service Templates are now available on Proposal and Contract forms (previously only on Projects). Select "Load Preset Service" to populate services from your saved templates.
- Fixed: Proposal and Contract email templates no longer show escaped backslash in apostrophes (e.g.,
don\'t→don't). Also fixed the template save method to prevent future occurrences by properly unslashing POST data. - Fixed: Proposal Viewed notification email now correctly shows the client name (uses
get_display_nameinstead of deprecatednamefield), the correct proposal total (total_amountfield), and the timestamp in the site's local timezone instead of UTC. Same fixes applied to Contract Viewed and Invoice Viewed notifications. - Fixed: Send email modal now truncates long client contact names so the email address is always visible, making it easier to identify the correct recipient.
- Fixed: Proposal revision requests from the client public view now work correctly. The form was missing an AJAX submission handler and had incorrect nonce/field names, so submissions would silently fail. Now properly sends the revision request, stores the notes, updates status to "Revision Requested," sends notification email to freelancer, and displays the revision notes on the admin Proposal view.
- Improved:
addPresetServiceJS function now handles both.fs-service-name-input(project form) and.fs-service-name(proposal/contract form) class names when filling in preset service data.
Version 7.9.0
6 changes
▼
- New: Capped Hours for Hourly Projects — When a service is set to "Hourly > From tracked time," you can now enable "Cap my hours" to set a time budget. This shows a retainer-style progress widget on the project view with Hours Budgeted / Used / Remaining and a visual progress bar.
- New: Configurable overage rate — When hours exceed the cap, overage time can be billed at a different rate (e.g., 1.5x). Defaults to the service's standard hourly rate if not set.
- New: Cap reached notifications — When tracked hours cross the cap threshold, the system emails the freelancer automatically. Optionally notify the client too (per-project toggle).
- New: Invoice auto-split — When generating an invoice from tracked time on a capped project, line items automatically split into standard hours (at regular rate) and overage hours (at overage rate) with clear labeling.
- Updated: Retainer widget partial refactored to support both retainer and capped hourly modes as a unified "time budget widget."
- Fixed: AJAX service sanitizer now properly saves retainer and hour cap fields when updating services inline.
Version 7.8.0
4 changes
▼
- New: Email sending for invoices, proposals, and contracts now sends a single email with the primary recipient in "To" and additional contacts in "CC", instead of separate emails to each contact. All recipients see the same email thread.
- New: Send modal redesigned with To/CC selection — users can choose which contact receives the email directly (To radio button) and which contacts get a copy (CC checkboxes). Primary client contact defaults to "To" with additional contacts defaulting to CC.
- New: Email personalization (e.g.,
{client_name}) now uses the selected "To" recipient's name, ensuring the greeting matches the primary recipient even when CC'd contacts have different names. - New: Added
resolve_contact_info()helper to email service for consistent contact name/email resolution across all document types.
Version 7.7.0
4 changes
▼
- New: Each time entry now shows both actual logged time and rounded billable time when time rounding is enabled. A subtle "→ 00:20:00" indicator appears below the actual duration (e.g., 00:17:03 → 00:20:00 for 5-minute rounding), making it clear how rounding affects each entry. Only displays when rounding actually changes the value and the entry is billable.
- New: Summary bar on time tracking page now shows total rounded billable hours alongside the raw billable time (e.g., "Billable: 33:37:41 / 35.52 hrs rounded (5-min)"), making it transparent where the uninvoiced dollar amount comes from.
- New: Project view timer tab also shows rounded hours in the billable stat and per-entry rounded durations.
- New: Summary SQL now returns
rounded_billable_hoursandrounded_uninvoiced_hoursfor display in summary bars.
Version 7.5.0
6 changes
▼
- Added: Recurring Tasks tab on Tasks list page — view, edit, and delete recurring task templates from a central location
- Added: Mobile card view for Recurring Invoices list — matching the Invoices mobile design with name, client, frequency, amount, and next invoice date
- Added: Mobile card view for Invoices list — two-column layout with client name, invoice number, status badge, amount, and due date
- Added: Overdue invoice auto-detection — invoices with status sent/viewed/partial that are past due automatically update to "overdue" status when viewing the invoices page
- Improved: Past-due invoice dates display in danger red on mobile, checking actual due date rather than just status field
- Improved: Invoice mobile dates use compact MM/DD/YY format
Version 7.4.0 – 7.4.3
7 changes
▼
- Added: Mobile card view for Projects list — cards with client logo, project name, status badge, and invoiced amount (matching Clients card design)
- Added: Mobile card view for Proposals list
- Added: Mobile card view for Contracts list
- Added: Active/Archived tabs for Clients list page (replaced All/Active/Inactive dropdown)
- Improved:
matchMediaused for mobile detection in tab dropdown JS (works with browser DevTools responsive mode) - Fixed: Card dropdown menus no longer clipped by cards below (z-index management)
- Fixed:
.fs-mobile-onlybreakpoint corrected from 600px to 782px
Version 7.2.0
2 changes
▼
- Improved: "Report a Bug" button collapses to just the bug icon on mobile screens, tucked against the left edge to save space
- Fixed: "Report a Bug" button repositioned to bottom-left to avoid overlapping with the floating timer indicator
Version 7.1.0
8 changes
▼
- Security: Removed TCPDF library (v6.7.5) which had multiple disclosed CVEs (LFI, ReDoS, XSS, hash comparison bypass)
- Changed: Replaced TCPDF with new built-in FS_PDF library for all PDF generation (invoices, proposals, contracts, income reports)
- Changed: PDF output is now clean PDF 1.4 with no /OpenAction, /JS, or /AcroForm directives — prevents Gmail virus scanner false positives
- Changed: Signature images in contract PDFs now rendered via temp file conversion instead of inline base64
- Changed: UTF-8 text (smart quotes, emoji, special characters) properly converted to WinAnsi for PDF compatibility
- Changed: Contract terms HTML rendered via lightweight HTML parser (supports headings, bold, italic, lists, paragraphs, horizontal rules)
- Improved: Plugin size reduced ~1.5MB by removing bundled TCPDF library and font files
- Improved: WordPress output buffer handling hardened — clears all nested buffer levels before PDF output to prevent corruption
Version 7.0.0
14 changes
▼
- Major: Freemius SDK integration for freemium distribution model.
- Architecture: Renamed all
FS_plugin constants toJEEB_FS_(FS_VERSION → JEEB_FS_VERSION, FS_PLUGIN_DIR → JEEB_FS_PLUGIN_DIR, etc.) to prevent namespace conflicts with Freemius SDK's ownFS_constants. - Architecture: Added
@fs_premium_onlyfile exclusion list to plugin header for automatic free version generation. Files for booking, Google Calendar, project templates, milestones, file uploads, recurring invoices, tax tools, email templates, and the premium helper directory will be stripped from the free version. - Architecture: Conditional file loading in
load_dependencies()— premium-only models, controllers, and services now usefile_exists()checks so the free version doesn't fatal error when stripped files are missing. - Feature: Freemius SDK initialization with
fs_studio()helper function, 14-day free trial support, and Pro plan configuration. - Feature: Complete premium gating helper system —
fs_studio_is_free_plan(),fs_studio_can_use_premium(),fs_studio_limit_reached(),fs_studio_get_usage_count(),fs_studio_increment_invoice_sends(),fs_studio_upgrade_notice(), andfs_studio_show_powered_badge(). - Feature: Free plan limit configuration — 3 clients, 1 active project per client, 3 invoice sends/month, 1 active proposal, 1 active contract.
- Feature: Upgrade notice rendering system with four display contexts (inline, banner, modal, tooltip) and centralized message registry for all gated features.
- UI: Complete upgrade notice CSS — PRO badges, inline notices, banner notices, locked button states, limit warning banners, and "Powered by Freelance Studio" badge styling.
- UI: High-contrast overrides for all upgrade notice components.
- Architecture: Created
/includes/premium/directory for future premium-only helper classes. - Architecture: Created
/vendor/freemius/with development stub SDK that grants full access during local development. Must be replaced with real Freemius SDK before deployment. - Architecture: Updated
uninstall.phpto integrate with Freemius after_uninstall hook for proper cleanup with user feedback collection. - Note: This version establishes the Freemius foundation. Phase 2 (hard gates on individual features) and Phase 3 (usage limit enforcement in controllers/views) are next.
Version 6.7.0
9 changes
▼
- Feature: Solid or gradient option for header color. Users can now choose between a solid color or a two-color gradient for document headers.
- Feature: Gradient direction picker with 8 directional presets (↑ ↗ → ↘ ↓ ↙ ← ↖) for controlling gradient angle.
- Feature: Live color swatch preview showing the current solid/gradient result.
- Feature: Solid/Gradient segmented toggle with animated active state, replacing the single color picker.
- Enhancement: Header preview in settings now reflects gradient in real-time as colors and direction change.
- Enhancement: Light logo thumbnail background also updates with gradient when in gradient mode.
- Architecture: New
--primary-bgCSS variable in document styles — backgrounds use gradient/solid, while text colors and borders remain solid via--primary-color. - Backend: Added
fs_invoice_primary_color_mode,fs_invoice_primary_color_2, andfs_invoice_gradient_directionoptions across activator, admin save handler, AJAX auto-save, settings export/import, and all controllers. - Applies to: Public invoice, proposal, and contract headers + admin preview headers. Portal, booking, email, and PDF accents remain solid color.
Version 6.6.0
3 changes
▼
- Improvement: Added
margin-top: 15pxto the button header area on the Project > Timer tab so the action buttons aren't flush against the timer/quickadd widgets above. - Feature: Custom activity types now display with color-coded badges on time entry lists, matching the styling of default activities (Development, Design, Meeting, etc.). Colors are assigned deterministically from the FS palette using a hash of the activity name, so they remain consistent. Applies to Time Tracking list, Project timer tab, and Client time entries tab. High-contrast mode is automatically covered by existing
.fs-activity-badgeoverride. - Feature: Time entries list (Timer View) is now paginated at 25 entries per page. Shows "Showing X–Y of Z entries" info, page number links, and prev/next navigation. All active filters are preserved across pagination. Added
count_all()method toFS_Time_Entrymodel.
Version 6.5.0
3 changes
▼
- Bug Fix: Fixed WordPress
wpdbNULL handling across all models —wpdb->update()andwpdb->insert()convert PHPnullto empty strings, which MySQL casts to0for bigint columns instead of SQLNULL. This affected nullable foreign key fields (project_id, contract_id, proposal_id, task_id, invoice_id, milestone_id, parent_task_id, client_id, etc.) across the entire plugin, preventing users from clearing/removing assignments. - New: Added
FS_DB_Helperutility class withfix_null_fields()method to properly handle NULL values after wpdb operations, used consistently across all models. - Models Fixed: Invoice, Contract, Project, Task, Expense, Recurring Invoice, Time Entry, Milestone, Retainer Period, Form, Form Response
Version 6.4.0
3 changes
▼
- Improvement: Dashboard task widget status pills are now inline editable dropdowns — change task status directly from the dashboard without navigating away
- Improvement: Dashboard status dropdowns match the original pill size and shape (11px, 3px/10px padding, 20px border-radius) so they look identical to the previous static badges
- Improvement: Selecting "Done" from the dashboard dropdown animates the task out, same as checking the completion checkbox
Version 6.3.0 — Brand Consistency Pass
10 changes
▼
- Improvement: Projects page — added "Projects" page title, moved "New project" button to top right
- Improvement: Proposals page — added "Proposals" page title, moved "New proposal" button to top right
- Improvement: Contracts page — added "Contracts" page title, moved "New contract" button to top right
- Improvement: Clients page — moved view toggle (grid/list) next to "Clients" title, "New client" button stays top right
- Improvement: Bookings page — removed icon from title, replaced horizontal WordPress nav tabs with vertical sidebar tabs matching Settings page layout (
fs-settings-layout/fs-settings-sidebar) - Improvement: Calendar page — removed icon from title, styled as
fs-page-title - Improvement: Forms page — restyled buttons from WordPress
.button/.button-primaryto FS.fs-btn-secondary/.fs-btn-primary, consistent with all other pages - Improvement: Reporting — Income Summary (PDF) button changed from primary to secondary
- Improvement: Expenses — Export for Tax Preparer button restyled from WordPress
.buttonto.fs-btn-secondary - Bug Fix: Removed 📅 emoji from Bookings upcoming widget, replaced with dashicon
Version 6.2.0
1 change
▼
- New Feature: High Contrast Mode — a toggle in Settings > Business > Accessibility that transforms the entire plugin UI to meet WCAG AAA contrast standards (7:1 ratio):
Version 6.1.0
3 changes
▼
- New Feature: Quick timer button on dashboard task list — each task now shows a clock icon on hover that opens a popup timer pre-populated with the task and project; only appears on tasks that have a project assigned
- New Feature: Timer task dropdown now filters by selected project — when a project is selected in the timer widget (on both the dashboard and time tracking page), the task dropdown automatically hides tasks from other projects, showing only relevant tasks; reverts to showing all tasks when no project is selected
- New Feature: Recurring invoices can now auto-populate with unbilled time entries — new "Billable Time" section on the recurring invoice form with options to:
Version 6.0.0
2 changes
▼
- New Feature: Task Archiving — archive completed tasks to declutter your Kanban board and task list while preserving them for reference
- Database: Added
previous_statuscolumn to tasks table with automatic migration
Version 5.9.0
4 changes
▼
- Bug Fix: Kanban columns now stretch to fill the full board height instead of sizing to their content — columns with fewer cards fill the same vertical space as columns with many
- Bug Fix: Individual column bodies scroll vertically when cards overflow, instead of the entire board scrolling — changed board from
align-items: flex-starttostretchand addedoverflow-y: hiddenon board - Bug Fix: Removed
max-heightfrom columns; height is now properly constrained by the flex container chain (wrap → board → column → body) - Bug Fix: Column headers no longer shrink when column body has many cards (
flex-shrink: 0)
Version 5.8.0
5 changes
▼
- New Feature: Weekly/biweekly recurring tasks now support day-of-week selection
- Added day picker UI (M/T/W/T/F/S/S chips) to the recurring task options — shown when frequency is Weekly or Every 2 Weeks
- Tasks recur on the next matching selected day rather than a fixed 7/14-day interval
- New
recurring_daysdatabase column (auto-migrated on activation) - Recurring days carried forward to all future recurring instances
Version 5.7.0
7 changes
▼
- New Feature: Popup timer for tasks — click the play button on any task row to launch a small desktop timer window
- Timer popup pre-fills task name, project, and activity; includes start/stop/pause/resume/discard controls
- Timer window title updates with elapsed time for easy tracking from the taskbar
- Auto-closes with confirmation after stopping and saving
- Warns if another timer is already running
- Added to all task views: Tasks list, Kanban board, Project tasks tab, and Client tasks tab
- Timer button only shows on incomplete tasks
Version 5.5.0
1 change
▼
Fixed
- Client Card View Delete: Fixed delete not working in card view. The card view was using a direct URL link (
action=delete) but the clients controller had nodeletecase — it fell through todefaultwhich just re-rendered the list. Changed to use the same AJAX-basedfs-delete-btnpattern that the list view uses, which calls the existingdelete_clientAJAX handler.
Version 5.4.0
2 changes
▼
Added
- Recurring Tasks: Tasks can now be set to automatically reappear on a schedule
- Database: Added
is_recurring,recurring_frequency,recurring_end_date, andparent_task_idcolumns to tasks table with automatic migration for existing installs
Version 5.3.0
9 changes
▼
Added
- Client Task Requests: Clients can now request tasks directly from the client portal — both from the project Tasks tab and a new Tasks section on the portal dashboard
- Portal Dashboard Tasks Section: New Tasks section on the portal dashboard displays all client-visible tasks across all active projects, with status labels, priority indicators, due dates, and a collapsible completed tasks section
- Task Request Modal: Clean modal interface for clients to submit task requests with title, description, priority, due date, and project selection
- "Requested" Task Status: New
requestedstatus for tasks submitted by clients — these appear in the Pending column on the admin kanban board with a distinctive pink "Request" badge - Accept Task Request Flow: Kanban cards with requested status show an Accept button (green checkmark) — clicking it changes the status to Pending and notifies the client
- Task Request Email Notifications: When a client submits a request, an email is sent to the freelancer with full task details and a link to the Tasks board; when the freelancer accepts, a confirmation email is sent to the client with a link to their portal
- Success Toast Notifications: Client portal now shows a brief success toast when a task request is submitted
Improved
- Kanban Board: Requested tasks are included in the kanban query and mapped into the Pending column for easy visibility
- Task Model: Added
get_client_visible_tasks()method for efficiently fetching all client-visible tasks across projects
Version 5.2.0
16 changes
▼
Bug Fixes
- Fixed issue where cancelled bookings kept reappearing on Google Calendar
- Root cause: When a booking was cancelled, the event was deleted from Google, but subsequent sync operations would recreate it
- Three-part fix implemented:
- Fixed critical bug where contractor signature was not displaying on proposals and contracts
- Root cause:
esc_url()was stripping base64 data URIs (thedata:protocol is not in WordPress's allowed protocols list) - Changed to
esc_attr()for signature image src attributes in all 4 views: - Fixed "wp.media is not a function" error when uploading business logo in Settings
- Added
wp_enqueue_media()call for the settings page to load WordPress media library scripts - Restructured JavaScript to use event delegation for signature-related buttons
- Tab switching, file upload, and remove button now work regardless of canvas state
- File upload handlers no longer require canvas to be present
- Added
contractor_signature,contractor_signer_name, andcontractor_signer_titleto frontend router'sget_business_settings()method - Signatures now properly display on client-facing views
Previous Fixes (5.1.14-5.1.18)
- PHP Warning fix for undefined
is_defaultproperty in contract sections - CSS color variable updates for document preview title
- Payment Reminders card relocated to invoice sidebar
Version 5.1.0
14 changes
▼
Improvements
- Dynamic File List: Uploaded files now appear instantly in the list without page refresh
- Longer Success Message: Success notification now stays visible for 8 seconds
- Highlight Animation: Newly uploaded files are highlighted with a subtle green animation
- HTML Formatting: Email notifications now match the plugin's styled HTML email template
- Brand Colors: Uses your configured brand color for consistency
- Direct Link: Includes a button to view the project files directly
- New Files Tab: Files section moved from sidebar to dedicated "Files" tab
- Card Grid Layout: Files displayed in a responsive grid of cards instead of a list
- Improved Upload Area: Larger, more prominent drag-and-drop zone
- Better Organization: Clear separation between shared files and upload section
- Improved Empty State: Contracts list now shows a friendly empty state with icon when no contracts exist, matching the proposals page design
- Improved Headers: Admin notification emails now use proper From headers for better deliverability with Gmail and other providers
Bug Fixes
- Fixed undefined property warnings in file enrichment when attachment is missing
- Fixed portal files not displaying all shared files (was filtering files without URLs)
Version 5.0.0
4 changes
▼
New Features
- Consolidated Tools Tab: All repair and diagnostic tools now live in one place under Settings → Tools
Improvements
- Moved "Repair URLs" button from Booking Settings to the centralized Tools tab
- Added fallback form submission for Repair URLs when JavaScript is disabled
- Updated booking settings to reference the new Tools tab location for URL repair
Version 3.10
9 changes
▼
New Features
- Client-Level Tasks: Tasks can now be created directly under a client without requiring a project. This is useful for ongoing client relationship tasks (follow-ups, check-ins, general consulting).
- Internal Tasks Dashboard Widget: When Internal Project Tracking is enabled, a new "Internal Tasks" widget appears on the dashboard showing pending tasks for your internal client.
- Enhanced Task Model: Tasks now support
client_idfield for direct client association independent of projects.
Improvements
- Task list view now shows client name below project name for better context
- Client tasks display with "Client Task" indicator to distinguish from project tasks
- Internal tasks display with "Internal" badge for quick identification
- Renamed "Generic" task labels to "Internal" throughout the UI for clearer terminology
- New
get_by_client()andget_internal_tasks()helper methods in Task model
Bug Fixes
- Fixed SQL ambiguity error in
count_by_client()method wherestatuscolumn was not prefixed with table alias
Version 3.9.0
11 changes
▼
Major Feature: Retainer as Service Pricing Type
Changes
- Retainer Service Pricing: Added "Monthly Retainer" as a pricing type option for services
- Removed Project-Level Retainer Section: The separate "This is a retainer project" checkbox in the Billing section has been removed
- Reusable Retainer Widget: Created
includes/views/partials/retainer-widget.php - Helper Methods: Added new methods to
FS_Projectmodel
UI/UX
- Retainer service fields appear inline with other pricing options
- Clean teal background with organized layout
- Responsive grid layout for retainer fields
- Checkbox for rollover setting directly visible
Backwards Compatibility
- Legacy
is_retainer,retainer_amount,retainer_hours, andretainer_rolloverfields are automatically populated from service data when saving - Existing retainer projects using old approach will continue to work
FS_Project::is_retainer_project()checks both new service-based and legacy approaches
Version 3.8.0
10 changes
▼
New Features
- 1099 Year-End Report: Generate a professional PDF summary of all clients paid $600 or more during the tax year
- Duplicate Project: One-click copy a project with all its tasks and milestones
- Batch Mark Invoices Paid: Select multiple invoices and mark them as paid at once
- Export to CSV: Export your data for use in spreadsheets or other software
- Retainer Tracking System: Comprehensive retainer/subscription management
UI Improvements
- Added "Export CSV" button to Invoices list page
- New "Export & Reports" section on Reporting page with quick-access buttons
- Batch actions bar for invoice list with count display
- Retainer summary widget with progress visualization
Database Changes
- New
fs_retainer_periodstable for tracking retainer usage and rollover
Version 3.7.0
12 changes
▼
New Features
- Invoice Wizard Button on Time Tracking Page: Added a prominent "Invoice Wizard" button to the Time Tracking page for quick access to create invoices from tracked time
- Interactive Reporting Charts:
Improvements
- Activity Name Capitalization: Activity names are now properly capitalized (first letter uppercase) throughout the Invoice Wizard preview and final invoices
- Updated Color Styling:
Bug Fixes
- Project Deletion Fixed: Projects can now be properly deleted after their invoices have been removed
- Dashboard Task Completion Fixed: Marking a task as complete from the dashboard now persists correctly
Technical Details
- Added Invoice Wizard modal include and button handler to Time Tracking list view
- Updated
groupTimeEntries()JavaScript function to capitalize activities - Updated
build_time_entry_items()PHP method to useucfirst()on activity names - Added Chart.js integration for reporting page visualizations
- Added
.fs-text-accentCSS utility class - Added chart container and interactive legend CSS styles
Version 3.6.0
8 changes
▼
Improvements
- Invoice Wizard Time Entry Grouping: When using "Individual Entry" grouping, invoice line items now show both the activity type AND the description (e.g., "01/05 - Development - Circle landing page" instead of just "01/05 - Circle landing page")
Bug Fixes
- Fixed: "Headers Already Sent" Error: Comprehensive fix for redirect issues that caused blank pages after saving settings, clients, projects, etc. Added early output buffering via
admin_inithook to capture PHP 8.1+ deprecation warnings before redirects - Fixed: PHP 8.1+ Deprecation Warnings: Added null checks to
str_replace()andstrpos()calls in email templates and email service to prevent deprecation warnings that were breaking redirects
Grouping Options Reference
- Activity Type: Groups all entries by activity, shows activity name with date range if enabled
- Task: Groups entries by task, shows task name with date range if enabled
- Individual Entry: Each time entry as a separate line item, shows activity type + description
- Project Total: Single line item summarizing all hours for the project
Contract View Updates
- Changed: "Create Invoice" button on Contract view now opens the Invoice Wizard modal instead of the old dropdown menu
Version 3.5.0
7 changes
▼
Breaking Changes
- Client Contact Architecture Overhaul: The client record no longer stores a built-in "primary contact". All contacts are now managed through the Contacts list.
Migration
- Automatic Data Migration: When upgrading to v3.5.0, the plugin automatically migrates existing primary contact data:
New Features
- Unified Contacts Management: All contacts (including the primary contact) are now managed in one place
- New Helper Methods: Added
FS_Client::get_display_name(),get_primary_contact(), andget_document_info()for consistent client info retrieval across the plugin
Improvements
- Client form reorganized with "Company Information" as the primary section
- Better visual distinction for contact type badges
- Improved contact form UX with radio buttons for primary selection
Version 3.4.0
19 changes
▼
New Features
- Invoice Wizard: New multi-step wizard for creating invoices from the Invoices list or Project view
- Multi-Project Invoices: Create a single invoice that includes items from multiple projects
- Time Entry Grouping Options:
- Service Selection: Choose exactly which services to bill - no longer forced to include all services
- Service Partial Billing: Bill a percentage or custom amount of each service individually for deposits or milestone payments
- Invoice Editing Rules:
Bug Fixes
- Orphaned Time Entries: Fixed issue where deleting an invoice left time entries marked as "invoiced", preventing them from being billed again. Invoice deletion now properly resets linked time entries to unbilled status.
- Automatic Data Repair: Plugin update automatically detects and repairs any existing orphaned time entries from previous invoice deletions
- Container ID Consistency: Fixed multiple HTML/JS container ID mismatches that prevented time entries and services from rendering in the wizard
Database Changes
- Added
invoice_sourcecolumn to invoices table to track creation method - Added
time_groupingcolumn to invoices table - Added
show_entry_datescolumn to invoices table - New
fs_invoice_itemstable for detailed line item storage - New
fs_invoice_projectsjunction table for multi-project invoices
UI Improvements
- Invoice Wizard button added to Invoices list page
- Project view Invoice button now opens the wizard
- Invoice form shows locked notice for paid invoices
- Invoice form shows resend warning for sent invoices that have been edited
- Improved wizard step 2 styling with clear section headers and checkbox lists
Version 3.2.0
14 changes
▼
New Features
- Invoice Wizard: New multi-step wizard for creating invoices from the Invoices list or Project view
- Multi-Project Invoices: Create a single invoice that includes items from multiple projects
- Time Entry Grouping Options:
- Service Partial Billing: Bill a percentage or custom amount of a service for deposits or milestone payments
- Invoice Editing Rules:
Database Changes
- Added
invoice_sourcecolumn to invoices table to track creation method - Added
time_groupingcolumn to invoices table - Added
show_entry_datescolumn to invoices table - New
fs_invoice_itemstable for detailed line item storage - New
fs_invoice_projectsjunction table for multi-project invoices
UI Improvements
- Invoice Wizard button added to Invoices list page
- Project view Invoice button now opens the wizard
- Invoice form shows locked notice for paid invoices
- Invoice form shows resend warning for sent invoices that have been edited
Version 3.1.0
24 changes
▼
New Features
- Added ability to set up recurring expenses for subscriptions (Adobe, hosting, etc.)
- Support for monthly, quarterly, and yearly recurring frequencies
- Option to specify the day of month for recurring charges
- Option to set an end date for recurring expenses
- Recurring expenses are displayed with a 🔄 badge in the expense list
- Monthly recurring total shown in expense summary
- Automatic generation of expense entries via daily cron job
- Added support for linking external calendars via public iCal/ICS URLs
- Compatible with Office 365, Outlook, Apple iCloud Calendar, and any iCal-compatible service
- Option to block availability for meeting booking based on external calendar events
- Automatic hourly sync of external calendars
- Manual sync option available in settings
- Setup instructions included for major calendar providers
- Added text labels to status indicators in time tracking list (Invoiced, Billable, Non-billable)
- Colored status badges for better visibility and intuitive understanding
- Improved accessibility over color-only indicators
Bug Fixes
- Fixed issue where tasks were not showing in the admin dashboard
- Changed query from invalid 'incomplete' status to valid ['pending', 'in_progress'] statuses
- Tasks now properly display in the dashboard Tasks widget
Technical Changes
- Added new database columns for recurring expenses (is_recurring, recurring_frequency, recurring_day, recurring_end_date, parent_expense_id)
- Added new database table for external calendars (fs_external_calendars)
- Added cron job for recurring expense generation (daily)
- Added cron job for external calendar sync (hourly)
- Database version updated to 3.1.0
Version 3.0.0
13 changes
▼
Added
- Invoice Project Modal - New modal interface when creating invoices from projects
- Project Name on Invoices - Project name now prominently displayed on all invoice views
- SEO Protection for All Public Pages - Added
noindex, nofollowmeta tags to all client-facing pages
Changed
- Simplified Hourly Rate Architecture - Removed redundant "Default Hourly Rate" field from projects
- Invoice Creation from Projects - Completely redesigned workflow
- Invoice Email Subject - Now includes project name: "Invoice #X for Project Name from Business"
Fixed
- Invoice line items not displaying on public invoice view (field name mismatch)
- Time tracking calculations now correctly use project service rates
- Quick Add form pre-fills correct hourly rate from project services
- Timer widget applies correct rate when starting timer on project
Security
- All public-facing pages now include
noindex, nofollowmeta tags - Token-based access verified for all client portal and document views
- Links are only accessible to those with the direct URL
Version 2.14.0
6 changes
▼
Changed
- Simplified Hourly Rate Management - Removed redundant "Default Hourly Rate" field from projects
Removed
- Project Default Hourly Rate Field - No longer needed as services define the rates
Fixed
- Time tracking stats (Billable Amount, Uninvoiced) now correctly use the project's service rate
- Quick Add form correctly pre-fills rate based on project's hourly service
- Timer widget correctly applies project service rate when starting timer
- Invoice creation from project uses correct hourly rate from services
Version 2.13.0
1 change
▼
Added
- Contract Sections Library - Reusable legal sections for contracts
Version 2.12.0
1 change
▼
Added
- Recurring Invoices - Automatically generate invoices on a schedule
Version 2.11.0
1 change
▼
Added
- Payment Reminders - Automated email reminders for unpaid invoices
Version 2.10.0
1 change
▼
Added
- Project Templates - Save and reuse project configurations
Version 2.9.0
1 change
▼
Added
- Time Tracking Reports - Detailed time analysis
Version 2.8.0
1 change
▼
Added
- Task Management - Track project tasks and to-dos
Version 2.7.0
1 change
▼
Added
- Milestones - Track project progress with milestones
Version 2.6.0
1 change
▼
Added
- Google Calendar Integration - Sync deadlines and events
Version 2.5.0
1 change
▼
Added
- Email Templates - Customizable email templates
Version 2.4.0
1 change
▼
Added
- Annual Tax Deductions - Track yearly deductible expenses
Version 2.3.0
1 change
▼
Added
- Client Portal - Secure area for clients to view their information
Version 2.2.0
1 change
▼
Added
- Proposals - Create and send professional proposals
Version 2.1.0
1 change
▼
Added
- Contracts - Digital contract management
Version 2.0.0
1 change
▼
Added
- Time Tracking - Track billable hours
Version 1.0.0
10 changes
▼
Added
- Initial release
- Client management with multiple contacts per client
- Project management with hourly, fixed-price, and retainer billing types
- Invoice generation with line items, discounts, and tax calculations
- Expense tracking with categories and receipt uploads
- Dashboard with YTD revenue, expenses, and tax summary
- Reporting with monthly income/expense breakdown and tax estimates
- Settings page for business info, branding, and tax configuration
- PDF invoice generation
- Tax calculator with federal and state tax rate support
