Project Financial Sync

Project financial sync provides bi-directional synchronisation between project equipment, crew, and transport allocations and the line items on quotes and invoices. This keeps your financial documents aligned with project changes and eliminates the need to manually update line items when project scope changes.

What is project financial sync

When a project's equipment list, crew assignments, or transport bookings change, the associated quote or invoice may become out of date. Project financial sync solves this by letting you push changes from a financial document to the project or pull the latest project data into the document. Sync is available on both Quotes and Invoices.

Quote-to-project sync

The QuoteProjectSyncService handles synchronisation between quotes and their linked projects. Four operations are available:

  • previewSyncToProject(Quote) — Returns a diff showing what equipment would be added, updated, or removed from the project without applying any changes
  • syncToProject(Quote, options) — Pushes quote line items to the project's equipment allocations. Options include remove_missing (remove project equipment not in the quote), update_prices (apply quote prices as rate_override), and update_quantities (sync quantity values).
  • previewRefreshFromProject(Quote) — Returns a diff showing what project equipment would be added, updated, or removed from the quote, plus a list of custom items that will be preserved
  • refreshFromProject(Quote, options) — Pulls current project equipment into quote line items. Options include preserve_custom (keep non-equipment items), preserve_prices (retain existing quote prices), and preserve_quantities (retain existing quantities). Draft quotes can always be refreshed; sent, approved, or converted quotes require a force option.

Invoice-to-project sync

The InvoiceProjectSyncService provides the same four operations for invoices:

  • previewSyncToProject(Invoice) — Preview what invoice items would push to the project
  • syncToProject(Invoice, options) — Push invoice items to project equipment. Paid, sent, and partial invoices require a force option because they represent final billing.
  • previewRefreshFromProject(Invoice) — Preview what project data would pull into the invoice
  • refreshFromProject(Invoice, options) — Pull project equipment into invoice items. Only draft invoices can be refreshed without the force option. For sent or paid invoices, create a credit note instead of refreshing.

Sync direction indicators

The ProjectSyncDialog component on the quote and invoice detail pages displays two clearly labelled actions:

  • Push to Project — Sends document line items to the project's equipment allocations. Use this when the quote or invoice is the source of truth.
  • Pull from Project — Updates document line items from the current project state. Use this when the project has been updated independently.

A preview is always shown before sync executes. The preview displays items grouped into "to add", "to update", "to remove", and "unchanged" (for push) or "custom items preserved" (for pull). You must confirm the preview before changes are applied.

What gets synced

The sync process handles the following data for each item type:

  • Equipment — name, quantity, unit_price (mapped to rate_override on the project pivot), start_date, end_date, discount_percentage, and notes
  • Crew — name, job role, rate type, rate amount, and scheduled hours
  • Transport — vehicle, route, and rates
  • Additional costs — name and amount for any custom or miscellaneous charges

Only items with item_type set to "equipment" and a valid item_id (or equipment_id for invoices) are synced to the project's equipment pivot table. Custom items (those without an item_id) remain on the financial document only and are preserved during a pull from project.

Sub-project grouping

When an invoice covers multiple sub-projects, line items can be grouped by sub-project for clear presentation:

  • InvoiceItem.sub_project_id — Links the line item to a specific sub-project
  • InvoiceItem.group_label — A text label used as the section header for the sub-project group (e.g., "Main Stage" or "VIP Area")
  • InvoiceItem.group_subtotal — The subtotal for all items within the sub-project group
  • isSectionHeader() — Returns true if the item_type is "section_header" or the group_label is set. Section header rows are used for display grouping and do not represent billable items.

Multi-sub-project invoices display each sub-project as a labelled section with its own subtotal, making it easy for clients to see the cost breakdown per sub-project.

Quote item to invoice item tracking

When a quote is converted to an invoice, each invoice line item records its origin via the InvoiceItem.quote_item_id field. This maintains full lineage from the original quote through to the final invoice, allowing you to trace which quote item became which invoice item.

Project Financial tab

The project detail page includes a Financial tab that displays an aggregated financial summary calculated by the ProjectFinancialService:

  • Equipment total — Sum of all equipment allocations (quantity multiplied by rate_override or default rate)
  • Crew total — Sum of all crew assignment costs
  • Transport total — Sum of all transport booking costs
  • Additional costs — Any miscellaneous charges
  • Subtotal — Combined total of all cost categories
  • Discount — Applied discount (percentage or fixed amount)
  • Tax — Calculated tax amount based on the project's tax_rate
  • Grand total — Final total including tax

If the project has a price_override (Set Price), the ProjectFinancialService calculates an adjustment_amount representing the difference between the raw_subtotal and the agreed price. This adjustment appears as an automatic line item when syncing to a quote.

Tips

  • Always preview before syncing — The preview shows exactly what will change. Review the "to add", "to update", and "to remove" lists carefully before confirming.
  • Use pull from project for draft documents — When the project scope changes, pull the latest data into your draft quote or invoice to keep it current.
  • Avoid syncing sent or paid invoices — These represent agreed-upon or completed billing. If changes are needed, create a credit note and a new invoice rather than forcing a sync.
  • Check custom items after pull — Custom line items (delivery charges, setup fees) are preserved during a pull from project, but verify they are still accurate after equipment changes.
  • Use sub-project grouping for multi-stage events — Setting sub_project_id and group_label on invoice items creates a professional, segmented invoice that clients can easily review per stage.
  • Track lineage via quote_item_id — When investigating billing discrepancies, use the quote_item_id on invoice items to trace back to the original quoted price and quantity.

Was this article helpful?