Changelog
Release notes & version history for Freelance Studio
Version 9.9.0
4 changes
▼
- Fixed: services with no name were silently thrown away on save. Every save path skipped any service row that had no name typed into it, and the service name field carried only a placeholder rather than a required marker — so a row with pricing filled in but no name vanished without warning. Because the running total is calculated in the browser and stored separately as the project's fixed price, the project page still showed the money while listing no services, and the invoice wizard had nothing to pull across. A row with a rate, amount, or retainer figure is now always kept, an unnamed one is labelled "Service 1", "Service 2" and so on, and the name field is marked required so the browser asks for it first. This applies to projects, proposals, and contracts.
- Fixed: hourly and retainer services came into the invoice wizard with the wrong amount.
FS_Invoice::calculate_service_amount()read atypekey that nothing writes — the saver storespricing_type— so every service fell through to the flat-fee branch and returned the bare rate. An hourly service at $125 x 8 hours billed as $125, and a retainer billed as $0. The wizard now uses the amount stored on the project, which is the figure you agreed with the client, and reads the correct pricing type. - Fixed: activity and hour-cap settings were dropped when saving a project. The save handler that actually runs for the project form (
early_save_project) was a stale copy of the one in the projects controller and was missing theactivityfield and every hour-cap field, so those settings were discarded on every save while the controller's complete version sat unreachable behind an earlier redirect. - Changed: one service parser for projects, proposals, and contracts. All four save paths had their own copy of the same loop and they had drifted apart. They now call
FS_Project::parse_services_from_post(), which takes flags for the retainer and hour-cap fields that only projects use. Fixing service handling now means changing one method rather than four.
Version 9.8.2
5 changes
▼
- Fixed: archived projects were showing up as overdue everywhere. Archiving a project is recorded in the
archivedcolumn, not as astatusvalue, so every query that filtered on status alone let archived projects straight through. The Needs Attention block in the weekly digest was the loudest symptom — projects closed out months ago were reported as 178 to 210 days overdue — but the dashboard calendar, the calendar view, and the calendar AJAX endpoint had the same gap. All of them now exclude archived projects. - Fixed: work belonging to archived projects came along with it. Archiving cascades
status = 'archived'onto a project's tasks, but the digest only excluded completed and cancelled ones, so they still appeared. Tasks are now filtered both on their own archived status and on their parent project, which also catches any task created or reopened after the project was archived. Milestones get no cascade at all, so they are filtered through their parent project. Tasks with no project — standalone client tasks — are unaffected and still appear. - Fixed: un-archiving a project left its tasks stuck.
archive()saved each task's prior status toprevious_statusbefore setting it to archived, butunarchive()never read it back, so restoring a project brought back the project and none of its work. Un-archiving now restores each task's previous status and clears the column; tasks with nothing stored fall back to "To Do". - The rule now lives in one place as
FS_Project::sql_not_archived(),sql_parent_not_archived(), andsql_project_id_not_archived(), so raw queries that don't go throughFS_Project::get_all()can apply it consistently instead of each one reinventing the check. - Also scoped the calendar AJAX endpoint's invoice query to
doc_type = 'invoice', the same estimates leak fixed in the digest in 9.8.0.
Version 9.8.1
3 changes
▼
- Fixed: table link text was too light to read comfortably. Every list view in the plugin ran its links through
.fs-table a, which set them to--fs-secondary(#81A5DF). That measures 2.5:1 against white — well under the 4.5:1 WCAG AA minimum for body text — and it was most obvious on the client Tasks tab, where task titles run long. Table links now use--fs-gray-800(10.3:1), matching the treatment the Clients and Projects name columns already used, with secondary links such as the project name on a task row one step down at--fs-gray-700(7.6:1). Hover still goes teal with an underline, so the underline rather than colour alone signals the link. - Sortable column headers were being caught by the same
.fs-table arule and rendered in that light blue instead of their intended muted grey; their specificity is now raised so they render as designed. .fs-task-title-linkhad its own colour of--fs-primary-dark(teal, 2.95:1) which was overridden inside tables anyway; it now matches the table link colour so it is correct in every context it is used.
Version 9.8.0
6 changes
▼
- New: "Needs Attention" block in the Week Ahead digest. Every section of the weekly digest was scoped to the window from today to seven days out, which meant anything already past due was structurally invisible — an overdue invoice could sit unpaid while the email reported "All Clear". The digest now opens with a Needs Attention block listing overdue invoices (with balance and days overdue), plus overdue projects, milestones, and tasks. Each type is capped at five items with a "+N more on the dashboard" line so a long tail of past-due work can't turn the email into a wall of text.
- New: "Billing This Week" section. The digest now reads the recurring invoice schedules and lists any that will generate during the week, showing client, amount, date, and a badge for whether the schedule sends automatically or produces a draft. Schedules whose next run date has already passed are listed as "Pending" rather than dropped. Amounts follow the client's invoice currency.
- New: monthly invoicing reminder. When the 1st of a month falls inside the digest window, the Billing This Week section includes a "Monthly invoicing day" line naming the date — the cue to invoice monthly clients who aren't on an automated schedule.
- Fixed: estimates could appear under "Invoices Due". The digest's invoice query was written before estimates began sharing the
fs_invoicestable in 9.5.0 and never picked up thedoc_typescoping applied everywhere else, so an estimate with a due date in the week ahead was listed as an invoice. The query now filtersdoc_type = 'invoice'. - Fixed: digest invoice amounts ignored multi-currency. The Invoices Due section hardcoded a
$prefix, so a EUR or GBP invoice was shown with a dollar sign. It now formats throughFS_Currency::format()using each invoice's stored currency. - The "All Clear" state now accounts for the new sections, so it only appears when there is genuinely nothing outstanding. Overdue invoices are reconciled against the forward window so an item can never be listed twice in one email.
Version 9.6.0
1 change
▼
- New: Per-client invoice currencies, with USD reporting. You can now set an invoice currency on each client (Billing Defaults on the client form). Invoices and estimates for that client are created, displayed, emailed, and exported to PDF in the client's currency, while every business report continues to total in USD.
Version 9.5.6
2 changes
▼
- New: Notes for Your Tax Advisor. The Tax tab now has a notes section where you can jot down questions and reminders for your tax advisor throughout the year — things like whether an equipment purchase should be expensed or depreciated, or a deduction to double-check at filing time. Notes are saved per tax year (they follow the year selector at the top of the tab), and each note can be marked Resolved once it's been handled and Reopened later if needed; resolved notes stay in the list for history but are visually dimmed and sorted below open ones. Notes are stored in a new
fs_tax_notestable created automatically on update. - New: Notes are included in the Tax Deduction Summary PDF. When you export the tax PDF for the selected year, a "Notes for Your Tax Advisor" section is appended after the deductions table listing each note and whether it's open or resolved, so everything your advisor needs travels in one document. The CSV export is unchanged — it stays a clean numbers-only file. An Export Tax PDF button is also available right in the notes section for convenience.
Version 9.5.3
3 changes
▼
- New: Archive estimates. Estimates can now be archived from the estimate list row menu and the estimate view actions. Archived estimates are hidden from the default Estimates list and only appear when you select the new Archived option in the status filter; viewing an archived estimate offers an Unarchive action that restores its prior status (converted, declined, approved, sent, or draft) based on its recorded history.
- New: Delete declined or orphaned estimates. Previously a converted estimate could never be deleted. You can now delete an estimate when it is not converted, when it has been declined, or when it was converted but its resulting invoice has since been deleted (orphaned). This is enforced both in the UI and server-side in the delete handler.
- New: Estimate-specific "viewed" notification email. When a client first opens an estimate you now receive an estimate-worded notification ("Estimate Viewed", estimate total, and a Valid Until line when set) with a View Estimate button, instead of the invoice-worded email that previously showed a bogus due date.
Version 9.5.1
1 change
▼
- New: Estimates dashboard card. The dashboard now includes an Estimates card showing how many estimates are awaiting client approval and how many are open overall, with a link straight to the Estimates tab in Finances. It's available in the default dashboard layout and the customizer card list like any other card.
Version 9.5.0
6 changes
▼
- New: Estimates. You can now send clients an itemized price quote that they approve with a single click, then convert 1:1 into an invoice. Estimates live in a new Estimates tab in the Finances area, next to Invoices, with a count badge when any are awaiting approval. They share the invoice engine — line items, totals, tax, discounts, the PDF renderer, the public token link, and email sending — so there's no separate, drift-prone machinery to maintain. Under the hood, estimates are stored in the existing invoices table behind a new
doc_typecolumn (invoice|estimate); every financial query defaults todoc_type = 'invoice', so estimates never count as income, accounts receivable, or tax, and the dashboard, reporting, tax, client charts, and recurring logic stay correct automatically. Estimates use a separate numbering sequence (EST-prefix by default), have a Valid Until date instead of a due date, and auto-expire after that date via the existing daily cron. The full lifecycle is draft → sent → viewed → approved (or declined / expired) → converted. - New: Public click-to-approve. The client-facing estimate page shows Approve and Decline buttons (with an optional decline reason) instead of Pay Now, plus the validity date. Approval and decline are handled over AJAX, validated by the estimate's view token — no client login required. You're notified by email when a client approves or declines. There's no e-signature step (estimates are a quick quote, not a contract).
- New: Convert to invoice. An approved estimate converts into a fresh draft invoice in one click, copying the client, project, line items, expenses, tax, discount, and notes, and assigning a new invoice number. The original estimate is kept for history and linked to the invoice it produced. Auto-conversion on approval is available as a setting but is off by default so you can review before converting.
- New: "Send an estimate for this project?" at project creation. When creating a new project, a checkbox in the Billing section builds an estimate pre-filled from the project's services (description, quantity/hours, rate, amount), sets the validity date from your default, and drops you on the estimate edit screen to review before sending — choose draft or send-now.
- New: Estimate settings on the Invoices settings tab — estimate number prefix, next number, default validity period (days), default estimate terms, and the auto-convert-on-approval toggle.
- Note: Estimates are available on all plans and estimate sends are unlimited — they do not count toward the free plan's monthly invoice-send limit.
Version 9.2.0
2 changes
▼
- New: Active / Archived tabs on the project Tasks tab — The Tasks tab inside a project now has Active and Archived sub-tabs (matching the global Tasks list). Active is shown by default and excludes archived tasks; Archived lists archived tasks with a count badge. Previously every task, including archived ones, rendered together with no way to separate them.
- New: Client portal invoice filtering & pagination — The Invoices tab in the client portal now has a filter bar (Status: All / Paid / Unpaid, a Year dropdown, and a From/To date range) and paginates at 10 invoices per page with a result summary and page controls. Filtering and paging happen instantly in the browser; a "Clear" button resets all filters. Previously every invoice was listed in one long unpaginated table.
Version 8.8.0
3 changes
▼
- New: Project Documents Tab — Projects now have a "Documents" tab showing all linked proposals, contracts, and recurring invoices with status badges, amounts, and direct links. Includes quick-create buttons for new contracts, proposals, and recurring invoices that pre-fill the project and client. A tab indicator dot appears when documents are linked.
- New: Recurring Invoice Send-To Contacts — When "Auto-send invoice when generated" is checked on a recurring invoice, a new "Send invoices to" section appears showing checkboxes for each client contact. Selected contacts are saved and used when the cron auto-generates and sends invoices. Contacts reload via AJAX when the client changes.
- New: Set Up Recurring Invoice from Project — The project billing schedule section now shows a "Set Up Recurring Invoice" button when billing frequency is set to anything other than "once". If a recurring invoice already exists for the project, it shows the linked recurring invoice name with status badge instead.
Version 8.7.0
3 changes
▼
- New: Realized Deductions — Annual estimated deductions can now be marked as "Realized" when the actual expense has been logged. This prevents double-counting on the tax report. Each deduction in the Tax page now shows an Estimated or Realized status badge. Clicking "Realize" opens a modal where you can optionally link the deduction to a specific tracked expense for reference. Realized deductions appear dimmed with a strikethrough amount and can be undone at any time.
- New: Merged Tax Report — The Tax Deduction Summary export (PDF and CSV) now produces a single consolidated table of deductions grouped by category, merging tracked expenses and unrealized estimated deductions together. Realized deductions are excluded automatically. Each row shows whether the amount came from tracked expenses, estimates, or both. This gives your CPA one clean list of deductible categories instead of two separate sections that could overlap.
- New: Expense Search — Search expenses by name, category, notes, or project name. The search input appears in the expense filter bar and works alongside existing category and date filters. A "Clear" link appears when any filters are active.
Version 8.6.0
3 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: Test Email — Send a branded test email from both the setup wizard and the configured status view to confirm end-to-end delivery.
Version 8.4.0
1 change
▼
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).
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 7.10.0
1 change
▼
- 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.
Version 7.9.0
4 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.
Version 7.8.0
3 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.
Version 7.7.0
3 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.
Version 7.5.0
4 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
Version 6.7.0
6 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.
Version 6.4.0
1 change
▼
- Improvement: Dashboard task widget status pills are now inline editable dropdowns — change task status directly from the dashboard without navigating away
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
1 change
▼
- New Feature: Task Archiving — archive completed tasks to declutter your Kanban board and task list while preserving them for reference
Version 5.8.0
2 changes
▼
- New Feature: Weekly/biweekly recurring tasks now support day-of-week selection
- 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.3.0
6 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
Version 3.10
2 changes
▼
- 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.
Version 3.9.0
1 change
▼
- Retainer Service Pricing: Added "Monthly Retainer" as a pricing type option for services
Version 3.8.0
5 changes
▼
- 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
Version 3.7.0
1 change
▼
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
Version 3.4.0
5 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
Version 3.0.0
2 changes
▼
Added
- Invoice Project Modal - New modal interface when creating invoices from projects
Changed
- Invoice Creation from Projects - Completely redesigned workflow
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
