# Billing Source: https://docs.francis.app/features/admin/billing Manage your Francis subscription, billing cycle, and special pricing programs. Billing is under **Settings > Workspace > Billing**. Owners and Admins can: * View and change your plan * Update payment details * Update the billing email * View billing history and past invoices ## Plans All Francis plans include unlimited seats. See [francis.app/pricing](https://www.francis.app/pricing) for current plan details and pricing. ## Billing cycles You can subscribe on a monthly or annual cycle: * **Monthly**: billed in advance each month. * **Annual**: billed in advance each year at a 20% discount. ## Upgrades, downgrades, and cancellations Upgrading your plan or billing cycle takes effect immediately. Francis pro-rates the difference. Examples: 1. Upgrading from monthly Core (\$149/month) to monthly Advanced (\$399/month) halfway through the cycle: the unused Core portion (\$75) is credited and the prorated Advanced amount (\$199) is charged for the remainder of the month. 2. Upgrading from monthly Core (\$149/month) to annual Core (\$1,609/year) mid-cycle: the unused monthly portion (\$75) is credited, the billing cycle resets, and the full annual amount (\$1,609) is charged for the new period. Downgrading to a cheaper plan or shorter billing cycle takes effect at the start of the next billing cycle. Pre-paid subscriptions are non-refundable. Examples: 1. Downgrading from monthly Advanced (\$399/month) to monthly Core (\$149/month) mid-cycle: the Advanced plan stays active until the end of the current cycle, then switches to Core. 2. Downgrading from annual Core (\$1,609/year) to monthly Core (\$149/month) halfway through the year: the annual plan runs to the end of the year, then converts to monthly. Go to **Settings > Workspace > Plans** and cancel your subscription. Cancellations take effect at the end of the current billing cycle. Mid-cycle cancellations are not refunded. If you're uncertain about committing to a full year, start with a monthly plan and switch to annual later. ## VAT number To add a VAT number during checkout, select **I'm purchasing as a business**. For an existing subscription, go to **Settings > Billing > Billing Details > Edit details**, select **Update information**, and enter your VAT number. ## Special pricing programs ### Partner program The Partner Program is for users managing multiple client workspaces in Francis, such as fractional CFOs or finance consultants. You can manage client subscriptions under your own account or let clients handle billing directly. Transferring workspace ownership to a client reverts that workspace to standard pricing. See the [Partner program](/features/admin/partner-program) for details, or contact [hi@francis.app](mailto:hi@francis.app) with questions. ### Startup program The Startup Program offers a 50% discount on the Core plan for up to 12 months. To qualify: * New Francis customer * Fewer than 50 employees * Less than \$1M raised * Under three years old Apply at [francis.app/startups](https://www.francis.app/startups#startup-application). ## FAQ No. All plans include unlimited seats. # Members and roles Source: https://docs.francis.app/features/admin/members-and-roles Invite and manage team members, and control what each role can access in Francis. The Members page is under **Settings > Workspace > Members**. It shows all current and invited members, their roles, and any pending invitations. Owners and Admins can invite new members and manage existing ones. ## Invite members 1. Go to **Settings > Workspace > Members** 2. Click **Invite member** 3. Enter the invitee's email address 4. Select their role 5. Click **Invite** The invitee receives an email with steps to join your workspace. ## Remove members 1. Go to **Settings > Workspace > Members** 2. Click the gear icon next to the member's name 3. Select **Remove from workspace** The member loses access immediately. Any work they contributed stays in place. Re-invite them if they need access again. ## Roles Francis has five roles: Owner, Admin, Editor, Viewer, and Limited Viewer. Change a member's role at any time by clicking the gear icon next to their name on the Members page. | Permission | Owner | Admin | Editor | Viewer | | :--------------------------------------------- | :---: | :---: | :----: | :----: | | Transfer ownership | X | | | | | Delete workspace | X | | | | | Invite and manage Owners | X | | | | | Invite and manage Admins, Editors, and Viewers | X | X | | | | Rename workspace | X | X | | | | Manage and update subscription | X | X | | | | Manage and update billing details | X | X | | | | View billing history and invoices | X | X | | | | Connect and configure data sources | X | X | X | | | Update account mappings | X | X | X | | | Create and edit models | X | X | X | | | Create and edit charts and dashboards | X | X | X | | | Set status indicators and row descriptions | X | X | X | | | Configure breakdowns | X | X | X | | | Update forecast start and last close | X | X | X | | | Sync connected data sources | X | X | X | (X) | | View models and reports | X | X | X | X | | Download reports and export to Excel | X | X | X | X | | View saved versions | X | X | X | X | | View journal entry drill-down | X | X | X | X | | Comment and resolve threads | X | X | X | X | **(X)** Viewers can sync data sources when an Owner or Admin enables **Allow viewers to refresh data sources** in workspace settings. ### Owner The member who creates the workspace is assigned Owner and holds the highest level of access. Owners can invite, remove, promote, or demote any member and are the only role that can delete the workspace. Francis supports multiple Owners. ### Admin Admins share nearly all Owner permissions but cannot delete the workspace or modify the Owner's role. They can invite, remove, promote, or demote any member except the Owner. ### Editor Editors have full access to all models and can collaborate on modeling, account mapping, forecasting, and consolidation. They cannot manage members or delete the workspace. ### Viewer Viewers can see all models, download reports, and view journal entry details. They cannot make changes to models or manage members. ### Limited Viewer Limited Viewers have the same permissions as Viewers but restricted to specific sheets and dashboards. Use this role for department heads or budget owners who need access to their own slice of the model without seeing the full financials. Limited Viewers are available on all plans as an add-on. ## FAQ Go to **Settings > Workspace > Members**, click the gear icon next to the new Owner's name, and promote them to Owner. Then change your own role to Admin, Editor, or Viewer as appropriate. Francis supports multiple Owners, so you don't need to remove yourself first. Yes. Francis supports multiple Owners in the same workspace. # Preferences Source: https://docs.francis.app/features/admin/preferences Adjust your interface theme, number formatting, and zero display in Francis. Preferences are under **Settings > Account > Preferences**. They control your interface theme, how numbers display, and how zeros appear in your model. These settings apply only to your account and don't affect how other members see their data. ## Interface theme Choose how Francis appears on your screen: **Light**, **Dark**, or **System**. System follows your device's display settings. ## Number format Choose between US and EU number formats. The format affects both how numbers display and how you write functions in Francis. US is the default. | | US | EU | | :------------ | :--------------------------------------------------------- | :--------------------------------------------------------- | | **Numbers** | Comma as thousands separator, period as decimal (1,234.56) | Period as thousands separator, comma as decimal (1.234,56) | | **Functions** | Commas separate function parameters | Semicolons separate function parameters | ## Zeros Choose how zero values appear in your model: **Dash (-)**, **Blank**, or **Zero (0)**. # Profile Source: https://docs.francis.app/features/admin/profile Your name, email, and avatar as other members see them in Francis. Your profile is under **Settings > Account > Profile**. It shows your name, email address, and avatar as other members see them. Profile details can't be edited directly. Contact [support@francis.app](mailto:support@francis.app) to make any changes. ## Profile picture By default, your avatar shows the first and last initials of your name. If you signed up with a Google account that has a public profile picture, Francis uses that image automatically. ## Email address Your email is your single Francis identity. You have one account, tied to your email, and use it across every workspace you create or join. Whether you start a new workspace or accept an invite to an existing one, you reach both from the same login and switch between them in the top-left menu. If your company is changing domains and you want to update all emails in your workspace, contact [support@francis.app](mailto:support@francis.app) from the existing domain and include the new domain in your message. ## Name Your full name appears to other members whenever they interact with your account. To update it, contact [support@francis.app](mailto:support@francis.app). ## Leave your workspace Go to **Settings > Workspace > Members**, select the gear icon next to your name, and choose **Remove from workspace**. You lose access immediately. An Owner or Admin would need to re-invite you to restore access. If you're the only remaining member in a workspace, you can't leave it. To close it, go to **Settings > Workspace > General** and select **Delete this workspace**. This is permanent and cannot be undone. # Workspace management Source: https://docs.francis.app/features/admin/workspace-management Configure your workspace name, branding, and access settings in Francis. Workspace settings are under **Settings > Workspace > General**. Only Owners can access and edit these settings. ## Workspace name Update the display name of your workspace. This is what members see when switching between workspaces. ## Brand color Set your company's brand color for custom-branded PDF reports. The color you choose is applied to report headers and accents. ## Francis branding Toggle the "Powered by Francis" label in PDF reports on or off. It is enabled by default. ## Allow viewers to refresh data sources When enabled, viewers can pull the latest data from connected data sources directly. When disabled, only Editors and above can trigger a data refresh. ## Delete your workspace Go to **Settings > Workspace > General** and select **Delete this workspace** in the Danger Zone. Deleting a workspace permanently removes all content and user data within it. This cannot be undone. ## Multiple workspaces You can run multiple workspaces under a single Francis account. This is common for fractional CFOs managing several clients from one login. To create an additional workspace: 1. Click your workspace name in the top left 2. Hover over **Switch workspace** 3. Select **Create or join workspace** 4. Enter the name of the new workspace The person who creates a workspace is assigned as Owner. To transfer ownership, go to **Settings > Workspace > Members**, open the role menu next to a member's name, and select **Make owner**. A workspace can have multiple owners, so you can demote yourself afterwards if you want. # Features Source: https://docs.francis.app/features/overview Reference for everything you build with in Francis. Connect your accounting system and get actuals flowing. The five building blocks of every model. How the monthly timeline and date settings work. Map data sources to pull in actuals automatically. Reference rows, periods, and sheets in your model. Build live reporting on top of your model. # Breakdowns Source: https://docs.francis.app/features/using-francis/breakdowns Split your financial model across entities or dimensions like departments or projects. Breakdowns split your model so you can plan and review data per sub-unit. You can apply a breakdown to an entire sheet or to a single row. ## Sheet breakdown vs. line item breakdown A breakdown applies at one of two levels. **Sheet breakdown** splits the entire sheet. The sheet becomes the parent sheet, its structure deployed across subsheets. Use this when you want a consistent structure across entities, departments, or similar. An example is a P\&L per entity or department. **Line item breakdown** splits a single row. Use this when only one line needs to be split. Examples include splitting a revenue line by product or splitting CAPEX by project. ## Sheet breakdown Sheet breakdowns come in two types: entity and dimension. Entity comes first and is always the foundation. Dimension breakdowns, by department, channel, or project, sit under entity subsheets. ### How it works When you apply a sheet breakdown, the sheet becomes the parent sheet. Structure flows top-down: sections, groups, rows, and calculations you define on the parent sheet sync automatically to all subsheets. Formulas in calculations run locally on each subsheet against that subsheet's data. You build the structure once and every subsheet inherits it. You cannot change structure locally on a subsheet. Data flows bottom-up: actuals, budget and forecast data in rows live on the subsheets and roll up to the parent sheet automatically. You cannot edit row values directly on the parent sheet. Actuals filter automatically to each subsheet based on your account mappings. Set up the mappings on the parent sheet and the breakdown routes each entity's and dimension's actuals to the correct subsheet. Formulas on subsheets can reference other sheets in your model using standard Francis formula syntax. Veloton ApS and Veloton Inc are created by an entity breakdown. Sales, Marketing, and Finance are created by a dimension breakdown on each entity. Applying a breakdown removes any forecasts and manual entries on the sheet. Apply breakdowns before you start forecasting, not after. ### Apply an entity breakdown Hover over the consolidated sheet, open the action menu (...), choose **Breakdown**, and select **Entity**. Francis creates one subsheet for each of the first 20 entities. If you have more than 20, the remainder roll up into an **Unallocated** subsheet. Use **Adjust breakdown** to add individual subsheets for entities 21, 22, and so on. ### Apply a dimension breakdown Dimensions come straight from your accounting system. When you connect it, Francis detects every dimension and dimension value tagged on your journal entries, so the dimensions available to break down by, department, project, channel, or whatever your system carries, need no setup on your side. Hover over the entity subsheet you want to break down, open the action menu (...), choose **Breakdown**, and select your dimension. Francis creates one subsheet for each of the first 20 dimension values. If you have more than 20, the remainder roll up into an **Unallocated** subsheet. Use **Adjust breakdown** to add individual subsheets for additional values. Journal entries with no value for that dimension also fall into **Unallocated**, so every actual is accounted for even when it isn't tagged. On a multi-entity model, apply the entity breakdown before the dimension breakdown. Francis treats dimension values locally, per accounting-system connection: even with a shared dimension like "department" across a group, each entity's values are evaluated separately and are not matched across entities. Applying a dimension breakdown first therefore only affects the dimension from a single entity and won't give you unified dimensions across the group. Each breakdown layer multiplies the total number of subsheets you maintain. Two entities broken down by three dimension values gives six subsheets. Break each of those down by three further values and you have eighteen. Plan your breakdown structure before you start. Adding layers later means more subsheets to update, and changing the breakdown midway drops any forecasts entered on the subsheets that get broken down further or removed. Entity breakdown: Veloton ApS and Veloton Inc. Dimension breakdown (department): Sales, Marketing, Finance. Dimension breakdown (project): Project Apollo, Project Bison, Project Candy. Each additional layer multiplies the number of subsheets to maintain. ### Additional settings Once a breakdown is applied, three additional options appear in the action menu (...) on the parent sheet. **Add sheet** creates a subsheet that is not tied to an entity or dimension value. Name it anything. Use this for consolidation adjustments that should only affect the consolidated view: eliminations, intercompany corrections, or top-level adjustments that must not flow back to individual entity or department P\&Ls. It also makes it easy to add new entities or departments over time. Build out the subsheet manually and map the accounting system or department later. Eliminations is just another subsheet added manually, following the same structure as the other sheets. **Add roll-up** creates a consolidated view of a subset of subsheets. Open the action menu on the parent sheet, choose **Add roll-up**, and drag the relevant subsheets into it. The roll-up shows a combined view of those subsheets without affecting the individual subsheets themselves. Use this when you want a subconsolidation sitting below the full consolidated view. The Sales & Marketing roll-up shows a combined view of those two subsheets. Finance, Operations, and HR remain independent. The roll-up does not affect any of the individual subsheets. **Adjust breakdown** lets you rename subsheet values and group multiple values together. Use this to combine departments or dimension values that you want to report as one (for example, grouping Sales and Marketing into a single subsheet). Values you don't need can be grouped into an unallocated bucket to keep the model clean while ensuring completeness. When a new entity or dimension value appears in your data, Francis shows a notification on the relevant subsheet. To add it to your breakdown: click the notification or open **Adjust breakdown**, then drag the unassigned value onto a subsheet. Sales and Marketing have been grouped into a single subsheet using Adjust breakdown. The underlying data from both dimension values is preserved and rolls up into the combined sheet. ## Line item breakdown A line item breakdown splits a single row rather than the whole sheet. Hover over the row, open the action menu (...), choose **Breakdown**, and select the dimension to split by. Francis creates one subrow per dimension value directly below the parent row. The parent row becomes a read-only roll-up of all subrows. The same 20-value limit applies: if the dimension has more than 20 values, the remainder roll up into an **Unallocated** subrow. Use **Adjust breakdown** to add subrows for additional values. ## Common use cases ### Revenue by product Apply a line item breakdown to the revenue row using product as the dimension. Each product gets its own subrow. If you also apply the same breakdown to COGS, the gross profit row at the parent level reflects gross profit per product automatically, without a separate sheet or calculation. ### CAPEX by project Apply a line item breakdown to the CAPEX row using project as the dimension. Each project gets its own subrow for the investment amount. This keeps the balance sheet clean while giving you project-level visibility on where capital is being deployed. ### Channel reporting Break down each entity by channel (retail, wholesale, e-commerce) with a sheet breakdown. Use this when revenue mix and margin profile differ significantly by channel and you want channel-level forecasting alongside the entity view. ## See in action See breakdowns in practice in the [Consolidation](/masterclasses/consolidation/consolidation) and [Department P\&Ls](/masterclasses/consolidation/department-pnls) masterclasses. # Column chart Source: https://docs.francis.app/features/using-francis/charts/column Vertical bars over time, one bar per period per series, for period-over-period magnitude comparison. A column chart plots values over time as vertical bars, one bar per period per series, with periods on the x-axis. Use it when discrete periods matter more than a continuous trend, such as comparing the magnitude of revenue or headcount from one month to the next. ## Settings The span of data the chart shows. Choose a dynamic range (Last month, YTD, LTM, Full year, Last year, or Next year) or set a Custom range. Dynamic ranges resolve against the Last close date set for the model, so they roll forward automatically as you close each period. How periods group along the x-axis: monthly, quarterly, calendar year, fiscal year, or all. The color palette applied to the series. Options are Ocean blue, Olive green, Sun burst, Death star, Pastel, Nature, Temperature, Dawn, Blue, Green, Orange, Red, Pink, Purple, and Gray. Override the palette on an individual series from the series settings. The gridlines behind the chart: No grid, Horizontal only, Vertical only, or Both. The series shown in the chart, each drawn from a row, group, or calculation in your model. For each series you can include multiple sources, such as actuals, budget, or forecast. Series order sets the legend order: the top series shows first, then the next, and so on. Click a series to reveal its own settings. When a series has a single source, click the series directly. When it has multiple sources, click the specific source to open its settings: * **Title**: the series name. Defaults to the name of the row, group, or calculation the series is drawn from; override it to rename the series. * **Color**: override the palette color assigned to this series. * **Data labels**: show or hide the value labels on the series. * **Absolute values**: plot the absolute value of each point, ignoring sign. Toggle the chart title on or off. When on: * **Chart title**: defaults to the name of the row, group, or calculation the chart is drawn from; override it with free text. * **Align**: position the title to the left, center, or right. Toggle the legend on or off. When on, the legend sits at the top of the chart. Control how the x-axis displays. * **X-axis line**: show or hide the x-axis line. * **X-axis slant**: rotate the x-axis labels by 0, 15, 30, 45, 60, 75, or 90 degrees. Control how the y-axis displays. * **Y-axis title**: set the y-axis title as free text. * **Y-axis line**: show or hide the y-axis line. * **Y-axis unit**: Auto inherits the unit from the series in the model, or override it with number, percentage, or a currency (DKK, EUR, USD, or GBP). * **Y-axis limits**: by default the axis fits the bounds of the series. Set a fixed minimum and maximum to lock the scale. Toggle a target line on or off. When on: * **Label**: name the target. * **Value**: set the value the line sits at. * **Color**: set the color of the line. ## See in action See charts in practice in the [Management report](/masterclasses/reporting/management-report) masterclass. # Combo chart Source: https://docs.francis.app/features/using-francis/charts/combo Mixes columns and a line over time to compare measures of different scale or unit on one chart. A combo chart plots values over time using more than one representation, typically columns for one measure and a line for another. Use it when you want to compare measures of different scale or unit on a single chart, such as revenue as columns against gross margin percentage as a line. ## Settings The span of data the chart shows. Choose a dynamic range (Last month, YTD, LTM, Full year, Last year, or Next year) or set a Custom range. Dynamic ranges resolve against the Last close date set for the model, so they roll forward automatically as you close each period. How periods group along the x-axis: monthly, quarterly, calendar year, fiscal year, or all. The color palette applied to the series. Options are Ocean blue, Olive green, Sun burst, Death star, Pastel, Nature, Temperature, Dawn, Blue, Green, Orange, Red, Pink, Purple, and Gray. Override the palette on an individual series from the series settings. The gridlines behind the chart: No grid, Horizontal only, Vertical only, or Both. The series shown in the chart, each drawn from a row, group, or calculation in your model. For each series you can include multiple sources, such as actuals, budget, or forecast. Series order sets the legend order: the top series shows first, then the next, and so on. Click a series to reveal its own settings. When a series has a single source, click the series directly. When it has multiple sources, click the specific source to open its settings: * **Title**: the series name. Defaults to the name of the row, group, or calculation the series is drawn from; override it to rename the series. * **Color**: override the palette color assigned to this series. * **Data labels**: show or hide the value labels on the series. * **Absolute values**: plot the absolute value of each point, ignoring sign. Toggle the chart title on or off. When on: * **Chart title**: defaults to the name of the row, group, or calculation the chart is drawn from; override it with free text. * **Align**: position the title to the left, center, or right. Toggle the legend on or off. When on, the legend sits at the top of the chart. Control how the x-axis displays. * **X-axis line**: show or hide the x-axis line. * **X-axis slant**: rotate the x-axis labels by 0, 15, 30, 45, 60, 75, or 90 degrees. Control how the y-axis displays. * **Y-axis title**: set the y-axis title as free text. * **Y-axis line**: show or hide the y-axis line. * **Y-axis unit**: Auto inherits the unit from the series in the model, or override it with number, percentage, or a currency (DKK, EUR, USD, or GBP). * **Y-axis limits**: by default the axis fits the bounds of the series. Set a fixed minimum and maximum to lock the scale. Toggle a target line on or off. When on: * **Label**: name the target. * **Value**: set the value the line sits at. * **Color**: set the color of the line. ## See in action See charts in practice in the [Management report](/masterclasses/reporting/management-report) masterclass. # Line chart Source: https://docs.francis.app/features/using-francis/charts/line Plot one or more series over time as connected lines, for trends and comparing trajectories across sources. A line chart plots values over time as connected lines, with periods on the x-axis. It's the default choice for showing a trend and for comparing trajectories across sources, such as actuals against budget and forecast. Lines can be smooth or straight, and each series can show point markers. ## Settings The span of data the chart shows. Choose a dynamic range (Last month, YTD, LTM, Full year, Last year, or Next year) or set a Custom range. Dynamic ranges resolve against the Last close date set for the model, so they roll forward automatically as you close each period. How periods group along the x-axis: monthly, quarterly, calendar year, fiscal year, or all. The color palette applied to the series. Options are Ocean blue, Olive green, Sun burst, Death star, Pastel, Nature, Temperature, Dawn, Blue, Green, Orange, Red, Pink, Purple, and Gray. Override the palette on an individual series from the series settings. The gridlines behind the chart: No grid, Horizontal only, Vertical only, or Both. Whether lines are Smooth or Straight. The series shown in the chart, each drawn from a row, group, or calculation in your model. For each series you can include multiple sources, such as actuals, budget, or forecast. Series order sets the legend order: the top series shows first, then the next, and so on. Click a series to reveal its own settings. When a series has a single source, click the series directly. When it has multiple sources, click the specific source to open its settings: * **Title**: the series name. Defaults to the name of the row, group, or calculation the series is drawn from; override it to rename the series. * **Color**: override the palette color assigned to this series. * **Markers**: show or hide point markers. * **Data labels**: show or hide the value labels on the series. * **Absolute values**: plot the absolute value of each point, ignoring sign. Toggle the chart title on or off. When on: * **Chart title**: defaults to the name of the row, group, or calculation the chart is drawn from; override it with free text. * **Align**: position the title to the left, center, or right. Toggle the legend on or off. When on: * **Legend position**: top or right. Right places the legend beside the series on the right of the chart. Control how the x-axis displays. * **X-axis line**: show or hide the x-axis line. * **X-axis slant**: rotate the x-axis labels by 0, 15, 30, 45, 60, 75, or 90 degrees. Control how the y-axis displays. * **Y-axis title**: set the y-axis title as free text. * **Y-axis line**: show or hide the y-axis line. * **Y-axis unit**: Auto inherits the unit from the series in the model, or override it with number, percentage, or a currency (DKK, EUR, USD, or GBP). * **Y-axis limits**: by default the axis fits the bounds of the series. Set a fixed minimum and maximum to lock the scale. Toggle a target line on or off. When on: * **Label**: name the target. * **Value**: set the value the line sits at. * **Color**: set the color of the line. ## See in action See charts in practice in the [Management report](/masterclasses/reporting/management-report) masterclass. # Charts Source: https://docs.francis.app/features/using-francis/charts/overview Visualize model data for analysis while modeling and for presentation in dashboards and reports. Charts visualize data from your model. Use them two ways: as a reference while you build, and as finished visuals in dashboards and reports. A chart is generated from the rows, groups, or calculations you point it at, and updates as the underlying model changes. ## Where to use charts There are two places to work with charts, each for a different intent. **While modeling.** Open **Charts** from the top-right corner of the model view to open a side drawer. Charts here stay in view as you build, so you can watch a trend or sanity-check a driver without leaving the model. Use them for analysis and reference, kept in close proximity to the numbers you're editing. **In dashboards.** Add charts to a dashboard to present them, on their own or as part of a report. This is the path for anything you share with banks, investors, or the board. ## Chart types Francis supports six chart types, split by what sits on the x-axis. The type you pick determines which settings apply. In every chart you visualize rows, groups, or calculations from your model. In time-series charts these inputs are called series; in categorical charts they're called columns. Time-series charts plot values over time, with periods on the x-axis: * [Line](/features/using-francis/charts/line): connected lines for trends and comparing trajectories across sources. * [Column](/features/using-francis/charts/column): vertical bars per period for period-over-period magnitude. * [Stacked column](/features/using-francis/charts/stacked-column): segmented columns showing composition and total per period. * [Stacked area](/features/using-francis/charts/stacked-area): filled areas showing how composition flows over time. * [Combo](/features/using-francis/charts/combo): mixes columns and a line to compare measures of different scale. Categorical charts use a fixed date range and compare values across units rather than over time: * [Waterfall](/features/using-francis/charts/waterfall): sequential movements bridging a start value to an end value. ## See in action See charts in practice in the [Management report](/masterclasses/reporting/management-report) masterclass. # Stacked area chart Source: https://docs.francis.app/features/using-francis/charts/stacked-area Filled areas stacked over time, emphasizing how composition flows and accumulates across periods. A stacked area chart plots values over time as filled areas stacked on top of one another. Like a stacked column, it shows composition and total per period, but the filled areas emphasize the continuous flow of that composition over time. Lines bounding the areas can be smooth or straight. ## Settings The span of data the chart shows. Choose a dynamic range (Last month, YTD, LTM, Full year, Last year, or Next year) or set a Custom range. Dynamic ranges resolve against the Last close date set for the model, so they roll forward automatically as you close each period. How periods group along the x-axis: monthly, quarterly, calendar year, fiscal year, or all. The color palette applied to the series. Options are Ocean blue, Olive green, Sun burst, Death star, Pastel, Nature, Temperature, Dawn, Blue, Green, Orange, Red, Pink, Purple, and Gray. Override the palette on an individual series from the series settings. The gridlines behind the chart: No grid, Horizontal only, Vertical only, or Both. Whether the lines bounding the areas are Smooth or Straight. The series shown in the chart, each drawn from a row, group, or calculation in your model. For each series you can include multiple sources, such as actuals, budget, or forecast. Series order sets the legend order: the top series shows first, then the next, and so on. Click a series to reveal its own settings. When a series has a single source, click the series directly. When it has multiple sources, click the specific source to open its settings: * **Title**: the series name. Defaults to the name of the row, group, or calculation the series is drawn from; override it to rename the series. * **Color**: override the palette color assigned to this series. * **Data labels**: show or hide the value labels on the series. * **Absolute values**: plot the absolute value of each point, ignoring sign. Toggle the chart title on or off. When on: * **Chart title**: defaults to the name of the row, group, or calculation the chart is drawn from; override it with free text. * **Align**: position the title to the left, center, or right. Toggle the legend on or off. When on, the legend sits at the top of the chart. Control how the x-axis displays. * **X-axis line**: show or hide the x-axis line. * **X-axis slant**: rotate the x-axis labels by 0, 15, 30, 45, 60, 75, or 90 degrees. Control how the y-axis displays. * **Y-axis title**: set the y-axis title as free text. * **Y-axis line**: show or hide the y-axis line. * **Y-axis unit**: Auto inherits the unit from the series in the model, or override it with number, percentage, or a currency (DKK, EUR, USD, or GBP). * **Y-axis limits**: by default the axis fits the bounds of the series. Set a fixed minimum and maximum to lock the scale. Toggle a target line on or off. When on: * **Label**: name the target. * **Value**: set the value the line sits at. * **Color**: set the color of the line. ## See in action See charts in practice in the [Management report](/masterclasses/reporting/management-report) masterclass. # Stacked column chart Source: https://docs.francis.app/features/using-francis/charts/stacked-column Columns segmented by series and stacked to show composition and total per period over time. A stacked column chart plots values over time as columns segmented by series, stacked so each column shows both the composition and the total for that period. Use it to show how parts contribute to a whole over time, such as revenue split by channel or cost split by department. ## Settings The span of data the chart shows. Choose a dynamic range (Last month, YTD, LTM, Full year, Last year, or Next year) or set a Custom range. Dynamic ranges resolve against the Last close date set for the model, so they roll forward automatically as you close each period. How periods group along the x-axis: monthly, quarterly, calendar year, fiscal year, or all. The color palette applied to the series. Options are Ocean blue, Olive green, Sun burst, Death star, Pastel, Nature, Temperature, Dawn, Blue, Green, Orange, Red, Pink, Purple, and Gray. Override the palette on an individual series from the series settings. The gridlines behind the chart: No grid, Horizontal only, Vertical only, or Both. The series shown in the chart, each drawn from a row, group, or calculation in your model. For each series you can include multiple sources, such as actuals, budget, or forecast. Series order sets the legend order: the top series shows first, then the next, and so on. Series stack as segments within each column. Additional sources of a series render as separate columns side by side for comparison, not as extra segments in the same column. Stack rows, groups, or calculations; use sources to compare them column to column. Click a series to reveal its own settings. When a series has a single source, click the series directly. When it has multiple sources, click the specific source to open its settings: * **Title**: the series name. Defaults to the name of the row, group, or calculation the series is drawn from; override it to rename the series. * **Color**: override the palette color assigned to this series. * **Data labels**: show or hide the value labels on the series. * **Absolute values**: plot the absolute value of each point, ignoring sign. Toggle the chart title on or off. When on: * **Chart title**: defaults to the name of the row, group, or calculation the chart is drawn from; override it with free text. * **Align**: position the title to the left, center, or right. Toggle the legend on or off. When on, the legend sits at the top of the chart. Control how the x-axis displays. * **X-axis line**: show or hide the x-axis line. * **X-axis slant**: rotate the x-axis labels by 0, 15, 30, 45, 60, 75, or 90 degrees. Control how the y-axis displays. * **Y-axis title**: set the y-axis title as free text. * **Y-axis line**: show or hide the y-axis line. * **Y-axis unit**: Auto inherits the unit from the series in the model, or override it with number, percentage, or a currency (DKK, EUR, USD, or GBP). * **Y-axis limits**: by default the axis fits the bounds of the series. Set a fixed minimum and maximum to lock the scale. Toggle a target line on or off. When on: * **Label**: name the target. * **Value**: set the value the line sits at. * **Color**: set the color of the line. ## See in action See charts in practice in the [Management report](/masterclasses/reporting/management-report) masterclass. # Waterfall chart Source: https://docs.francis.app/features/using-francis/charts/waterfall Sequential positive and negative movements bridging a start value to an end value, for bridges and variance. A waterfall chart shows how sequential positive and negative movements build from a start value to an end value at a fixed date range. Use it for bridges, such as opening cash to closing cash or budget to actual variance. Because the x-axis is categorical, the Group by setting doesn't apply. ## Settings The span of data the chart shows. Choose a dynamic range (Last month, YTD, LTM, Full year, Last year, or Next year) or set a Custom range. Dynamic ranges resolve against the Last close date set for the model, so they roll forward automatically as you close each period. The color palette applied to the columns. Options are Ocean blue, Olive green, Sun burst, Death star, Pastel, Nature, Temperature, Dawn, Blue, Green, Orange, Red, Pink, Purple, and Gray. Override the palette on an individual column from the column settings. The gridlines behind the chart: No grid, Horizontal only, Vertical only, or Both. What the waterfall bridges between. This choice determines whether the intermediate steps are model values or source differences, and what you enter under Columns. * **Rows**: bridge two rows, such as revenue to net profit. The intermediate steps are values from the model, like COGS, OPEX, depreciation, and financial items. Choose a single source up front, then enter the start, end, and intermediate steps under Columns. * **Sources**: bridge two sources of the same line, such as budget revenue to actual revenue. The intermediate steps are the differences between the two sources, for example the gap between budget and actual revenue for bicycle hardware. Choose the two sources to bridge, **From** and **To**, up front, then enter the start, end, and intermediate steps under Columns. The columns shown in the chart. Column order sets the left-to-right order: the top column shows first, then the next, and so on. How you fill them in depends on the Bridge setting. * **Rows bridge**: the first two columns you enter are the start and end, for example revenue and net profit. Enter rows, groups, or calculations between them as the intermediate steps that bridge start to end, for example COGS, OPEX, depreciation, and financial items. You set both the start and end yourself. * **Sources bridge**: you enter a single column, which automatically becomes both the start and end, so you compare like with like across the two sources. For example, a group showing consolidated revenue forms the start (its **From** source) and the end (its **To** source). Add columns between them as the intermediate steps. Each shows the source difference for one component, such as the rows inside that group (hardware, projects, and licenses) or the Revenue sub-sheets from each entity (Veloton ApS and Veloton Ltd). The chart automatically adds a **residual** so the waterfall always bridges from start to end. Use it as a check: a large residual means your intermediate steps don't fully account for the movement between start and end. Click a column to reveal its own settings: * **Title**: the column name. Defaults to the name of the row, group, or calculation the column is drawn from; override it to rename the column. * **Color**: override the palette color assigned to this column. Toggle the chart title on or off. When on: * **Chart title**: defaults to the name of the row, group, or calculation the chart is drawn from; override it with free text. * **Align**: position the title to the left, center, or right. Toggle the legend on or off. When on, the legend sits at the top of the chart. Control how the x-axis displays. * **X-axis line**: show or hide the x-axis line. * **X-axis slant**: rotate the x-axis labels by 0, 15, 30, 45, 60, 75, or 90 degrees. Control how the y-axis displays. * **Y-axis title**: set the y-axis title as free text. * **Y-axis line**: show or hide the y-axis line. * **Y-axis unit**: Auto inherits the unit from the columns in the model, or override it with number, percentage, or a currency (DKK, EUR, USD, or GBP). * **Y-axis limits**: by default the axis fits the bounds of the columns. Set a fixed minimum and maximum to lock the scale. Toggle a target line on or off. When on: * **Label**: name the target. * **Value**: set the value the line sits at. * **Color**: set the color of the line. ## See in action See charts in practice in the [Management report](/masterclasses/reporting/management-report) masterclass. # Comments Source: https://docs.francis.app/features/using-francis/comments Create comments, tag colleagues, manage discussions and write to-do's directly in Francis. Comments let you and your team discuss directly inside your model. Threads keep conversations organized, and mentions notify teammates by email. ## Add a comment 1. Right-click any cell in your model 2. Select **Comment** from the menu 3. Type your comment and press `Enter` to post Comments attach to the selected cell. Drag the comment indicator to move it to another cell if needed. ## Edit a comment Hover over the comment, click the three-dot menu (⋯), and select **Edit**. Update your text and press `Enter` to save. Edited comments are marked with "(edited)" so teammates can see the original context changed. ## Mentions Type `@` followed by a teammate's name to mention them. They receive an email notification immediately. ## Manage threads ### Resolve When a discussion is concluded, open the thread and click **Resolve**. The thread is archived and removed from the active view. To revisit it, select **Show resolved** in the comments overview. ### Mark as unread Open the thread, click the three-dot menu (⋯), and select **Mark as unread**. The thread closes and its notification badge reappears in the comments overview. Useful for flagging threads you want to return to. ### Delete Open the thread, select the action menu, and choose **Delete thread**. Confirm when prompted. Deleting a thread is permanent. Resolve instead of deleting to preserve context for future reference. ## Comments overview The comments overview shows all active threads across your model. By default it displays unresolved threads from all sheets you have access to, including those from teammates. Filter options: * **Hide comments**: hides comment indicators in the model to improve readability * **Show resolved**: reveals archived threads for historical review * **Only current sheet**: limits the view to threads on the sheet you're on * **Only your threads**: limits the view to threads you started ## See in action See comments in practice in the [Department budget input](/masterclasses/business-partnering/gathering-budget-input) masterclass. # Components Source: https://docs.francis.app/features/using-francis/components The five building blocks of every Francis model: sheets, sections, groups, rows, and calculations. Components are the five building blocks of every Francis model: sheets, sections, groups, rows, and calculations. Knowing which to use, and where, is the main lever on how quickly you can build and how easy the model is to maintain. The five types nest in a fixed hierarchy. Sheets contain sections, sections contain groups, rows, and calculations, and groups can contain rows, calculations, and other groups. That hierarchy drives how settings inherit, covered at the end of this page. ## Sheets Sheets behave like tabs in Excel or Google Sheets and are a way to organize your model. Reference components across sheets using Francis formula syntax. ## Sections Sections define the layout within a sheet and don't affect numbers or calculations. A section contains groups, rows, and calculations. Sheets and sections are both organizing primitives, so the choice between them is about granularity, not behavior. A sheet is a top-level tab you switch between; a section is a labeled block inside a sheet. A sheet can hold one section or several related ones. ## Groups Groups are containers for rows, calculations, and other groups. By default, a group sums everything inside it. ## Rows Rows are your primary forecast lines. Each period cell holds its own formula or value, so a row's logic can change from one period to the next. Map a row to your GL accounts through data mappings to pull actuals in automatically; the forecast periods stay driven by your formulas. ## Calculations Calculations are time-consistent: one formula applies identically across every period, in both the actuals and forecast layers. Use a calculation when the same logic should hold everywhere a value is derived from other components. Reach for a row instead when values must vary: a different formula or value per period, different values between actuals and forecast, or forecast values with no corresponding actuals to display. See [Choosing between rows and calculations](#choosing-between-rows-and-calculations) for the full decision. ## Common use cases | Component | Common use cases | Common denominator | | ----------- | ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | | Sheet | Financial statements (P\&L, balance sheet, cash flow) or supporting schedules (revenue forecast, headcount plan, loan table) | The top-level tabs you navigate between; can hold one section or several related ones | | Section | Profit and loss, balance sheet, cash flow statement, revenue breakdown, assumptions and drivers, headcount | A labeled division within a single sheet | | Group | Revenue, OPEX, asset, liability, and equity buckets | A container that holds line items or other groups | | Row | P\&L line items, balance sheet line items, assumptions and drivers | Formulas may differ from period to period, including between actuals and forecast periods, and you may map data to bring in actuals | | Calculation | Subtotals, margins, cash flow statement line items, KPIs | The logic is identical across every period and across actuals and forecast | ## Choosing between rows and calculations This is the most common modeling decision. As a general rule, rows give the most flexibility, since every cell value can vary, while calculations are more convenient but apply in only a few cases. A line is a row if it needs either of these: * A formula that varies by period, including having different logics across the forecast and actuals layer. * Actuals mapped from your GL. If neither applies and a single formula holds everywhere, it's a calculation. That would be subtotals, margins, cash flow statement line items and KPIs. A single metric can play two roles. Take revenue growth %: * **As a driver, it's a row:** the actuals formula computes growth from the P\&L revenue lines, while the forecast formula extrapolates that growth and drives forecasted revenue, so the two layers run different logic. * **As a KPI, it's a calculation:** one formula reports growth for both actuals and forecast, reading revenue rather than driving it. If you want both, it's fine to keep a row and a calculation, both labeled "revenue growth". ### Rows vs calculations in breakdowns The base rule still applies in a [breakdown](/features/using-francis/breakdowns): a row when the line is mapped to actuals or needs its own formula, a calculation when one formula holds everywhere. Breakdowns add one caveat. A breakdown makes the sheet a template, and each calculation runs locally on every sub-sheet. For example, gross profit is calculated locally across all subsheets. Same-sheet references resolve per sub-sheet, which is what you want. But a reference to another sheet points every sub-sheet at the same cell and double-counts on roll-up. So when a line references out of the sheet, make it a row even when it would otherwise be a calculation. For example, your model keeps the P\&L on one sheet and the balance sheet and cash flow on another, broken down by entity. Most cash flow lines reference the balance sheet on the same sheet and break down cleanly. But lines drawn from the P\&L, like net income and the depreciation add-back, would pull the same consolidated figure into every entity. Make those rows. Converting a calculation to a row drops the auto-fill, so do two things by hand: start the formula way back, often years back, and use the blue arrow to extend the formula across every period and copy it into the forecast layer, since a row keeps actuals and forecast separate. ## Adding components How you add a component depends on its type: * **Sheets**: in the left sidebar, use **+ Add sheet** at the bottom of the sheet list, or the **+** next to the Sheets title. * **Sections**: use the add button below each section. On a sheet with no sections yet, the button appears at the top of the sheet. * **Groups, rows, and calculations**: open the action menu of an existing component and choose **Add row**, **Add calculation**, or **Add group**; use keyboard shortcuts; or use the add buttons below each section. The new component appears beneath the one you acted on. You can also create a row while mapping GL accounts: drag a GL account onto the row-name area and drop it. Francis creates a row named after the GL account, with that account already mapped. ## Moving and reorganizing components Drag and drop components to reorganize your model, for example moving a row into a different group or a section onto another sheet. Francis's formula syntax keeps references intact when a component changes position, so moving things doesn't break your model. You can also move a component from its action menu with **Move to sheet**. Moving a section, you choose the destination sheet. Moving a group, row, or calculation, you choose both the destination sheet and the destination section. ## Component settings Open the action menu on any component to reach its settings. Not every setting applies to every component; see [Setting availability](#setting-availability) below. ### Actions Renames the component. Copies the component and places the copy directly beneath it. Removes the component. Inserts a new component of that type directly beneath the current one. Moves the component to another sheet, choosing the destination section as well for groups, rows, and calculations. Breaks the component down by entity or dimension. See [breakdowns](/features/using-francis/breakdowns). Sets a progress status (To-do, In progress, or Done) on the row or calculation to track work and flag items that need attention. Records the intent behind a row, group, or calculation. When the component is part of a breakdown, set the description on the parent sheet, not on an individual unit. Sets how a component's values aggregate across spans longer than a month, such as YTD, quarterly, or full year. This affects both the displayed figure and the value used in calculations over those spans. Options are SUM, AVG, W. AVG (weighted average), MIN, MAX, START, END, DELTA, and NONE. SUM suits P\&L and cash flow, END suits balance sheet values, and W. AVG suits margins. W. AVG is only available on calculations that express a fraction, since that's the only case where Francis can compute a weighted average. On by default, so the group sums everything inside it. Turn it off and the group shows zero, leaving it as a container for organizing only, with no calculation. Available on groups. ### Display settings Display settings only affect presentation, never the underlying value. Every cell keeps the full-precision number for calculations, which you can see in the formula bar when you select the cell. The unit on the component: number, percentage, or a currency (DKK, EUR, USD, or GBP). The scale factor: Default, no scaling, thousands, millions, or billions. Default inherits the model-wide scale set in model settings, reached from the three-dot menu next to the model name in the top-left corner. Auto, or a fixed precision from 0 to 6 decimal places (0, 0.1, 0.12, 0.123, 0.1234, 0.12345, 0.123456). Auto shows no decimals for values above 100, and otherwise targets three significant digits, so 99.532 displays as 99.5 and 4.514 as 4.51. For consistent decimals across a block, set this at the section level. Visual emphasis: none, bold, or italic. Bold suits subtotals, italic suits margins. ### Setting availability
Setting Sheet Section Group Row Calculation
RenameXXXXX
DuplicateXXXXX
DeleteXXXXX
BreakdownXX
Add rowXXXX
Add calculationXXXX
Add groupXXXX
Move to sheetXXXX
TypeXXXX
DecimalsXXXX
ScaleXXX
FormatXXX
Aggregate byXXX
AutosumX
StatusXX
DescriptionXXX
### Inherited and propagated settings Display settings inherit down the hierarchy. Set a setting on a parent and every component beneath it inherits it: set the type on a section and it applies to all groups, rows, and calculations within it; set the decimals on a group and every row and calculation under it inherits that value. To override an inherited setting, declare it on the component itself. The rule is simple: a component's own setting always wins, otherwise it falls back to the parent. Statuses propagate the other way, up to groups. If any row within a group has a status set, the most critical status across those rows shows at the group level when the group is collapsed. To-do is treated as the most critical status, so a group containing a mix of To-do, In progress, and Done rows displays To-do. This keeps parts of your model that still need attention visible, even when rows are collapsed inside nested groups. See components in practice in the [Forecasting approaches](/masterclasses/budgeting-forecasting/forecasting-approaches) masterclass. # Dashboards Source: https://docs.francis.app/features/using-francis/dashboards Build live reporting on top of your model with charts, tables, metric boxes, text, and images that update automatically. In Francis, you build dashboards on top of your financial model. Every table, chart, and metric box pulls live data from the model and updates automatically, so once the model holds clean data, your reporting follows without a separate rebuild. This keeps reporting downstream of the model. Fix a number once, in the model, and every dashboard that references it updates. ## Dashboard primitives A dashboard is built from primitives. You can add: * **Heading**: titles in your dashboard, as H1, H2, or H3. * **Text**: commentary, with standard formatting including bold, italic, numbered lists, and bullets. * **Table**: summaries, variance analysis, or side-by-side comparisons. See [tables](/features/using-francis/tables/overview). * **Chart**: a visual highlight of key metrics. See [charts](/features/using-francis/charts/overview). * **Metric**: a box highlighting a single metric, compared against another version or period. * **Image**: logos, brand imagery, or screenshots of analysis you can't build in the dashboard. Use it to bring any external analysis into one place alongside your live data. * **Spacer**: white space. Useful for a less dense layout, or to fill space before a page break. Right-click a primitive to duplicate, copy, or delete it. You can also delete one by selecting it and pressing **Backspace**. ## Auto layout Drag and drop any primitive to position it wherever you want in the dashboard. Dashboards use auto layout, so moving or adding one can push others around to keep everything aligned. This sometimes shifts a primitive onto the next page in pursuit of a clean layout. You control the vertical length of charts, images, and spacers. Headings, text boxes, and tables size themselves to their content, so their length isn't adjustable. Every primitive fills the full horizontal width by default, and you can't set a width directly. To place primitives side by side, drag one next to another. Once two or more sit on the same row, you can adjust their relative widths so one takes more space than the others. ## Date settings and the Last Close month Set the **Last Close** month in the top bar. This setting syncs with your model. Several date ranges used in tables, metric boxes and charts (Last month, YTD, LTM, Full year, Last year, and Next year) update dynamically from it, and actuals in charts and tables display through the Last Close month. For a fixed range instead, choose **Custom dates**. To update the dashboard to a new month's close, update the Last Close month and all tables, charts and metric boxes that reference dynamic ranges update automatically. ## Sharing and exporting dashboards You can share a dashboard three ways: 1. **Workspace access**: owners, admins, editors, and viewers reach dashboards the same way they reach sheets in the model. 2. **Limited Viewer access**: invite specific people into a specific dashboard as Limited Viewers. 3. **PDF export**: download the dashboard as a PDF. Inviting people into a dashboard means no space restrictions. Tables can be as wide and as long as you need. A PDF is fixed and opens easily across devices, but it introduces space restrictions on primitive width and length. Before exporting, make sure no primitive breaks across a page or runs too wide. Where one does, add a spacer to push it onto the next page. ### Canvas and Print Preview Dashboards have two view modes to guide this work: * **Canvas**: one continuous canvas with no page breaks. Use it for dashboards you invite people into. * **Print Preview**: shows page breaks and flags any space-restriction violations with red lines. Use it when you plan to export to PDF. ## See in action Use dashboards to build a [management report](/masterclasses/reporting/management-report). # Data mappings Source: https://docs.francis.app/features/using-francis/data-mappings Map your data sources to your Francis model to pull in data automatically. Data mappings connect your data sources to rows in your model. Most often that's GL accounts from your accounting system, but it also covers other sources like FX rates and Google Sheets. Once mapped, the data flows in automatically every time Francis syncs. ## How mappings work Open the **Mappings** view to see all GL accounts from your connected accounting systems, along with accounts from any other data sources. Drag an account onto an existing row to map it. To create a new row, drag the account all the way to the row name area and release it. You can bundle multiple accounts on a single row. This serves two purposes: 1. **Keeping the model clean.** There are two approaches in Francis: mirror your chart of accounts 1:1, or bundle GL accounts into rows. Bundle by default. It keeps the model readable and lean. Charts of accounts are designed for accounting workflows, and that structure rarely needs to carry into the FP\&A model. You can always inspect a row to see where the numbers come from. 2. **Matching GL accounts across entities.** When you consolidate multiple entities, map equivalent GL accounts from each entity to the same row in Francis. Rows and groups with at least one mapped account show a green connection indicator. No mapping shows gray. ## Active and unused accounts GL accounts in the Mappings view are split into two groups: * **Active:** GL accounts with at least one journal entry to them. Francis notifies you to map them for completeness. * **Unused:** GL accounts with no journal entries. No action required. If an entry is later booked to an unused account, it moves to the active group automatically. The **Mappings** button shows a notification count for unmapped active accounts. Treat it as your to-do list. The Mappings view also shows the last entry date for each account, which for some accounts can be far in the past. Map all active accounts to keep your historicals complete. For old or retired accounts, map them to an "Other" row to preserve historical accuracy without cluttering the model. You can also ignore an account, which clears the notification until a new entry is posted to it. Prefer mapping to an "Other" row over ignoring, since it keeps your historicals complete. Only ignore an account when you don't want to map it and you're sure it won't be used again. For balance sheet accounts, which accumulate over time, only ignore ones with a zero balance. When new GL accounts are created, or unused accounts start receiving entries, they appear in the Active section and trigger a notification. This way, your model stays complete even as your accounting system changes, since new activity always surfaces for mapping rather than slipping in unmapped. Accounts from non-accounting data sources do not generate notifications, since they aren't treated as a completeness checklist the way GL accounts are. ## Map to top-level for breakdowns When you break down a sheet, you map GL accounts to the template sheet at the top, and the data automatically flows to your sub-sheets based on your breakdown configuration. You cannot map to sub-sheets directly. ## See in action See mappings in practice in the [Consolidation](/masterclasses/consolidation/consolidation) masterclass. # Excel export Source: https://docs.francis.app/features/using-francis/excel-export Export your financial model to Excel with formulas and formatting. Export your financial model to Excel (.xlsx) directly from Francis. The export preserves formulas, cell references, and formatting. Use it to share with banks, investors, or board members who work in Excel. ## Export your model Click the download icon in the top-right corner and select **Download as Excel**. The file saves to your default downloads folder. ## What's preserved Row formatting carries over: bold, italic, and the component type. The expand and collapse state does not. Every group exports collapsed, regardless of how it's set in Francis, so expand the ones you want open in the downloaded file. Unlike PDF reports, nested groups in Excel remain accessible. You can expand and collapse them in the downloaded file. ## Number formatting The exported numbers follow the [decimal settings](/features/using-francis/components#display-settings) in your Francis model, so format the model the way you want the Excel file to read. One thing to watch: on **Auto**, the number of decimals varies by value, so an exported row that mixes large and small numbers reads inconsistently. For a uniform export, set a fixed number of decimals on the section or row. On whole numbers, a trailing decimal separator can still appear (for example `7.824.500,` in EU format) even when no decimals follow. It's a display artifact in the export and safe to clean up manually in Excel. # Formulas Source: https://docs.francis.app/features/using-francis/formulas Francis formula syntax: how to reference rows, periods, and sheets in your model. When you edit a cell, you write a formula. In Francis, a hardcoded value is also considered a formula - just a simple one. Francis formulas reference rows by name and period rather than by cell position. The benefit is that you can rename a row, move a section, or reorganize an entire sheet without any formulas breaking. This is the main practical difference from Excel, and it matters most when your model evolves mid-cycle. ## Syntax Francis formulas follow the pattern `"ROW_NAME"[RELATIVE_PERIOD]`. The period offset is always relative to the current cell: * `[0]`: current period * `[-1]`: previous period * `[-12]`: 12 months ago A prior-period reference: ``` ="Revenue"[-1] ``` A driver-based cost: ``` ="Headcount"[0] * "Average salary"[0] ``` A balance sheet movement (last period + addition - detraction): ``` ="Inventory"[-1] + "Inventory purchases"[0] - "COGS"[0] ``` Because all references are relative, rolling forecasts work without any maintenance. As time moves forward, every formula automatically references the right period. A group sums its contents, so reference the group rather than the individual rows inside it. When you add a new row to the group, any formula pointing at the group picks it up automatically, with no manual updates as the model grows. ## Sign conventions Income and balance sheet items are entered as positive values. Expenses are entered as negative values. This is how Francis presents actuals from your accounting system, so follow this convention to compare apples to apples. The practical effect: subtotals add rather than subtract. Gross profit looks like this: ``` ="Revenue"[0] + "Direct costs"[0] ``` Not this: ``` ="Revenue"[0] - "Direct costs"[0] ``` Direct costs are already negative, so adding them reduces the total correctly. The same logic applies down the P\&L: every subtotal is a sum, and the signs in the source rows do the work. ## Fill right Write the formula logic once, then fill right to apply it to every future period. You don't need to repeat the formula cell by cell. The same formula carries forward, and because references are relative, each period resolves against its own neighbors. It's a small mechanic that most users come to rely on heavily once it's part of their workflow. Fill right applies to rows. A calculation already uses one formula across every period by definition, so there is nothing to fill right. Override individual cells whenever you need to. To make a step change at a point in time, write a new formula in that period and fill right again. Everything from that period forward picks up the new logic, and the periods before it keep the old. Fill right works within the layer you're in. Fill right in the actuals layer and the formula applies to all future periods of the actuals layer, so when you close a new month the formula is already in place. Fill right in the forecast layer and it applies to future forecast periods. To run the same formula across both layers, enter it in each layer and fill right in both. In the actuals layer, start from far enough back, because fill right only carries forward, as the name says. Begin at the earliest period you want the formula to cover, otherwise the periods to its left stay untouched. ## Formula paths A row name alone is enough when it is unique in the model. When the same row name appears in multiple sheets, groups, or breakdowns, Francis qualifies the reference with a formula path. The path keeps every cell reference unique even when row names repeat across entities, dimensions, or sections. Two separators can appear in the path: * **Sheet (`!`):** the sheet name sits before `!` when the row lives on a different sheet. * **Container (`.`):** a group or section name sits before `.` when the row lives inside a nested container. Example: ``` = "Cost VAT"[-1] + "VAT"!"VAT calculations"."Cost VAT addition"[0] ``` This formula references two rows: * `"Cost VAT"[-1]`: the `"Cost VAT"` row on the current sheet, previous period. * `"VAT"!"VAT calculations"."Cost VAT addition"[0]`: the `"Cost VAT addition"` row inside the `"VAT calculations"` group on the `"VAT"` sheet, current period. Francis builds the path automatically when you click a target cell in edit mode, so you rarely need to type one by hand. ## Comments Add `#` at the end of any formula to insert a comment. Everything after `#` is highlighted and ignored by the calculation. ``` =if("Revenue"[0] = 0, 0, "Gross profit"[0] / "Revenue"[0]) # Returns zero if revenue is zero to avoid dividing by zero ``` Use comments to document non-obvious logic: a sign flip, a hardcoded assumption, a workaround for a specific edge case. A reader opening your model six months later will thank you. ## Functions Francis supports a set of built-in functions (`avg()`, `sum()`, `if()`, and others) for more complex logic. Your number format setting in Francis determines whether to use commas (US) or semicolons (EU) to separate function parameters. All examples below use the US format with commas. Average of values across a period range. ``` avg("Revenue"[-3:0]) ``` Average from the start of the fiscal year to the current month. ``` avg_ytd("Revenue") ``` Average across all months in the previous fiscal year. ``` avg_last_year("Revenue") ``` Average over the last n months. ``` avg_last("Revenue", 6) ``` Median of values across a period range. ``` median("Revenue"[-3:0]) ``` Median from the start of the fiscal year to the current month. ``` median_ytd("Revenue") ``` Median across all months in the previous fiscal year. ``` median_last_year("Revenue") ``` Median over the last n months. ``` median_last("Revenue", 6) ``` Sum of values across a period range. ``` sum("Revenue"[-3:0]) ``` Sum from the start of the fiscal year to the current month. ``` sum_ytd("Revenue") ``` Sum across all months in the previous fiscal year. ``` sum_last_year("Revenue") ``` Sum over the last n months. ``` sum_last("Revenue", 6) ``` Accumulates revenue from prior months based on a payment days assumption. Assumes 30 days per month. The `payment_days` argument must be hardcoded and cannot reference a row. ``` receivables("Revenue", 30) ``` Returns zero instead of a `#DIV/0` error. Use for margin and percentage calculations where the denominator may occasionally be zero. ``` ignore_div_zero("Direct costs"[0] / "Revenue"[0]) ``` Returns num raised to the power of exponent. ``` power(10, 2) // returns 100 ``` Returns the smaller of two values. ``` min(5, 10) // returns 5 ``` Returns the larger of two values. ``` max(5, 10) // returns 10 ``` Returns the absolute value of a number. ``` abs(-10) // returns 10 ``` Rounds to the nearest integer. Optionally provide a number of decimal places. ``` round(10.4386) // returns 10 ``` Rounds down to the nearest integer. ``` round_down(10.6) // returns 10 ``` Rounds up to the nearest integer. ``` round_up(10.6) // returns 11 ``` Conditional calculation, similar to IF in Excel or Google Sheets. ``` if("Revenue"[0] = 0, 0, "Gross profit"[0] / "Revenue"[0]) ``` Returns `1` if the current period matches any of the specified month numbers, else `0`. * `if_month(1)` returns `1` in January * `if_month(1, 6)` returns `1` in January or June * `if_month(1, 6, 12)` returns `1` in January, June, or December Returns `1` if the current period is the nth month within its quarter. * `if_quarter_month(1)` returns `1` in January, April, July, October * `if_quarter_month(2)` returns `1` in February, May, August, November * `if_quarter_month(3)` returns `1` in March, June, September, December Returns the number of weekdays (Monday through Friday) in the current month. ``` weekdays() // January 2025 returns 23 ``` ## Errors Occurs when a formula attempts to divide by zero. Use `ignore_div_zero()` to return zero instead. Occurs when a row using weighted average (W\.AVG) aggregation contains a formula that is not a simple fraction (`a/b`). Indicates invalid syntax or an incomplete formula. For example, entering `5+` throws `#ERR` because the expression is incomplete. Triggered when a calculation references itself, creating an infinite loop. Calculations apply the same formula across all periods, so self-references are not supported. Caused by a circular dependency between cells, such as two rows that reference each other, or a chain of references that loops back to the start. Occurs when a formula references a future period. Francis only supports references to the current period or earlier. Any period index greater than `[0]` throws this error. `"Revenue"[1]` is invalid; `"Revenue"[0]` and `"Revenue"[-1]` are valid. Occurs when a formula references a row that no longer exists, typically because it was deleted. Occurs when an argument passed to a function does not match the expected type, such as passing a boolean where a number is expected. Occurs when an argument is of an incompatible type, such as passing a number where a range is expected. Returned when a formula references a cell that itself contains an error. Resolve the error in the source cell first. ## See in action See formulas in practice in the [Forecasting approaches](/masterclasses/budgeting-forecasting/forecasting-approaches) masterclass. # Getting started Source: https://docs.francis.app/features/using-francis/getting-started Create your first financial report in under an hour. Go from signup to first report in under an hour. Go to [francis.app](https://francis.app) and start a 14-day free trial. No credit card required. Francis syncs all historical journal entries, so your full history is available from day one. See [Integrations](/integrations) for setup guides by system. The template captures best practices from hundreds of set-ups, and you can customize the model however you see fit. See the [P\&L](/masterclasses/budgeting-forecasting/pnl-forecasting/pnl-fundamentals), [balance sheet](/masterclasses/budgeting-forecasting/bs-forecasting/bs-fundamentals), and [cash flow](/masterclasses/budgeting-forecasting/cf-forecasting/cf-fundamentals) fundamentals. If you run multiple legal entities or plan per department, split your model with a [breakdown](/features/using-francis/breakdowns). Apply the entity breakdown first, then departments. Skip this step if you run a single entity with no departmental split. Open the **Mappings** view and drag your GL accounts onto rows in your model. Actuals flow in automatically as soon as an account is mapped. See [data mappings](/features/using-francis/data-mappings) for more detail. The Francis template includes a [management report](/features/using-francis/dashboards) that fills automatically as you map your GL accounts. Import your budgets to plan against actuals. See [forecasting approaches](/masterclasses/budgeting-forecasting/forecasting-approaches) for how to build them out. Invite finance colleagues as editors and department heads as limited viewers. See [members and roles](/features/admin/members-and-roles) for what each role can do. # Inspect Source: https://docs.francis.app/features/using-francis/inspect See the journal entries behind every actual from your accounting system. Inspect shows the journal entries behind any actuals value in your model. Select a cell and open the Inspect panel to see every journal entry posted from the accounts mapped to that row for the selected month. ## Open Inspect Select the cell you want to investigate, then click **Inspect** in the top bar. A side drawer opens with a complete list of journal entries posted from the accounts mapped to that row in the selected month, sorted from highest amount to lowest. The list is limited to the top 100 entries. Each entry shows the date, description, and amount, so you can look up the journal entry in your accounting system. ## Balance sheet accounts Francis accumulates balance sheet values from your accounting integration month over month. Inspect shows monthly posted journal entries only, not opening balances. If a balance sheet account had no movement in a given month, no journal entries appear. ## Converted journal entries If you convert your actuals from a foreign currency to a reporting currency, Inspect shows the original amount, the converted amount, and the FX rate. This lets you trace any number back to its source. # Shortcuts Source: https://docs.francis.app/features/using-francis/shortcuts All keyboard shortcuts for editing and navigation in Francis All keyboard shortcuts for editing and navigating your model in Francis. ## Editing | Action | MacOS | Windows | | :--------------- | :-------- | :------------- | | Edit cell | Return ↩︎ | Enter ↩︎ | | Clear cell | ⌫ | ⌫ | | Cancel edit | Esc | Esc | | Extrapolate cell | ⇧ + Tab | ⇧ + Tab | | Rename row | F2 | F2 | | Delete row | ⌘ + ⌫ | Ctrl + ⌫ | | Add row | ⌘ + ⌥ + N | Ctrl + Alt + N | | Add calculation | ⌘ + ⌥ + L | Ctrl + Alt + L | | Add group | ⌘ + ⌥ + M | Ctrl + Alt + M | | Undo | ⌘ + Z | Ctrl + Z | | Redo | ⌘ + ⇧ + Z | Ctrl + ⇧ + Z | ## Navigation | Action | MacOS | Windows | | :------------------------ | :-------- | :-------- | | Expand and collapse group | Space | Space | | Scroll up | Page up | Page up | | Scroll down | Page down | Page down | | Go to first cell | ⌘ ← | Ctrl ← | | Go to last cell | ⌘ → | Ctrl → | | Go to first row | ⌘ ↑ | Ctrl ↑ | | Go to last row | ⌘ ↓ | Ctrl ↓ | # Tables Source: https://docs.francis.app/features/using-francis/tables/overview Present model data in dashboards and reports using periods, variance, and side-by-side column groups. Tables present model data in dashboards and reports. You build a table from column groups placed side by side, each showing the data a different way: over time, as a budget-to-actuals variance, or across units in parallel. Tables are created only in dashboards and reports, not in the model view. ## Table types A table is one or more column groups arranged left to right. Each group is one of three types, and you can mix types in a single table: * [Periods](/features/using-francis/tables/periods): a time series shown month over month, quarter over quarter, or year over year. * [Variance](/features/using-francis/tables/variance): a comparison between sources, such as budget vs. actuals, with diff columns. * [Side-by-side](/features/using-francis/tables/side-by-side): entities, departments, or other units compared in parallel columns. Place as many column groups as you need, of the same or different types, next to each other. For example: * Monthly columns for the current year, followed by a year-total column. Two periods groups. * Actuals month by month for the year to date, followed by actuals vs. budget for the year to date. A periods group, then a variance group. ## See in action See tables in practice in the [Management report](/masterclasses/reporting/management-report) masterclass. # Periods table Source: https://docs.francis.app/features/using-francis/tables/periods A time series column group shown month over month, quarter over quarter, or year over year. A periods column group shows a time series, such as monthly columns for the current year or a single year-total column. Use it to show values month over month, quarter over quarter, year to date, or year over year. ## Settings Section, title, number scaling, and decimals sit in the sidebar and apply to the whole table. A column group's own settings open when you click the group in the table. The section whose data the table displays. The table's title. Default, no scaling, thousands, millions, or billions. Default inherits the model-wide scale set in model settings, reached from the three-dot menu next to the model name in the top-left corner. Auto, or a fixed precision from 0 to 6 decimal places (0, 0.1, 0.12, 0.123, 0.1234, 0.12345, 0.123456). Auto shows no decimals for values above 100, and otherwise targets three significant digits, so 99.532 displays as 99.5 and 4.514 as 4.51. For consistent decimals across a block, set this at the section level. A table is one or more column groups placed side by side. Click a column group to open its settings: * **Title**: the column group heading. * **Date range**: the span of periods to show. Choose a dynamic range (Last month, YTD, LTM, Full year, Last year, or Next year) or a Custom range. Dynamic ranges resolve against the Last Close month set for the model, so they roll forward automatically as you close each period. * **Group by**: how periods group into columns: monthly, quarterly, calendar year, or fiscal year. * **Source**: the version or actuals variant the column displays. The list includes every saved version in your model (budgets and forecasts) plus the actuals variants; Actuals and Actuals (last year) are always available. When the date range extends beyond your last close, Actuals + X also becomes available: it shows actuals up to the last closed month, then the version you pick for the months after. In a periods group the columns are derived from these settings, so you can't edit individual columns. ## See in action See tables in practice in the [Management report](/masterclasses/reporting/management-report) masterclass. # Side-by-side table Source: https://docs.francis.app/features/using-francis/tables/side-by-side A column group comparing entities, departments, or other units in parallel columns. A side-by-side column group compares units in parallel columns, such as entities or departments shown next to each other for the same period. Use it to read one line item across every unit at a glance. ## Roll-up sections Side-by-side is only available when the table's section uses roll-up sections. Roll-ups tell Francis that all subsheets share the same template and can be compared in parallel columns. You can show either roll-ups or individual sheets. A roll-up functions as a total column, so use one whenever you want a total. ## Settings Section, title, number scaling, and decimals sit in the sidebar and apply to the whole table. A column group's own settings open when you click the group in the table. The section whose data the table displays. The table's title. Default, no scaling, thousands, millions, or billions. Default inherits the model-wide scale set in model settings, reached from the three-dot menu next to the model name in the top-left corner. Auto, or a fixed precision from 0 to 6 decimal places (0, 0.1, 0.12, 0.123, 0.1234, 0.12345, 0.123456). Auto shows no decimals for values above 100, and otherwise targets three significant digits, so 99.532 displays as 99.5 and 4.514 as 4.51. For consistent decimals across a block, set this at the section level. A table is one or more column groups placed side by side. Click a column group to open its settings: * **Title**: the column group heading. * **Date range**: the span of periods to show. Choose a dynamic range (Last month, YTD, LTM, Full year, Last year, or Next year) or a Custom range. Dynamic ranges resolve against the Last Close month set for the model, so they roll forward automatically as you close each period. * **Source**: the version or actuals variant the columns display. The list includes every saved version in your model (budgets and forecasts) plus the actuals variants; Actuals and Actuals (last year) are always available. When the date range extends beyond your last close, Actuals + X also becomes available: it shows actuals up to the last closed month, then the version you pick for the months after. Click an individual column within the group to set its **title**. Use **Add sheet** to add more subsheets as columns. ## See in action See tables in practice in the [Management report](/masterclasses/reporting/management-report) masterclass. # Variance table Source: https://docs.francis.app/features/using-francis/tables/variance A column group comparing sources, such as budget vs. actuals, with diff columns. A variance column group compares sources, such as budget vs. actuals, and shows the difference between them in diff columns. Use it to put a plan and an outcome next to each other with the gap called out explicitly. ## Settings Section, title, number scaling, and decimals sit in the sidebar and apply to the whole table. A column group's own settings open when you click the group in the table. The section whose data the table displays. The table's title. Default, no scaling, thousands, millions, or billions. Default inherits the model-wide scale set in model settings, reached from the three-dot menu next to the model name in the top-left corner. Auto, or a fixed precision from 0 to 6 decimal places (0, 0.1, 0.12, 0.123, 0.1234, 0.12345, 0.123456). Auto shows no decimals for values above 100, and otherwise targets three significant digits, so 99.532 displays as 99.5 and 4.514 as 4.51. For consistent decimals across a block, set this at the section level. A table is one or more column groups placed side by side. Click a column group to open its settings: * **Title**: the column group heading. * **Date range**: the span of periods to compare. Choose a dynamic range (Last month, YTD, LTM, Full year, Last year, or Next year) or a Custom range. Dynamic ranges resolve against the Last Close month set for the model, so they roll forward automatically as you close each period. Click an individual column within the group to set its **name** and **source**. Use **Add column** to add more. Columns come in two kinds: * **Value columns**: display values from a source. Settings are **Title** and **Source**. The first value column is the anchor, most often actuals. A source is the version or actuals variant the column displays; the list includes every saved version in your model (budgets and forecasts) plus the actuals variants, and Actuals + X becomes available when the date range runs past your last close. * **Diff columns**: show the difference between two value columns. Settings are **Type** (`#`, index, or `%`) and **Baseline** (the value column to measure against). A diff measures a specified baseline against the anchor, most often budget or actuals (last year). ## See in action See tables in practice in the [Management report](/masterclasses/reporting/management-report) masterclass. # Timeline and dates Source: https://docs.francis.app/features/using-francis/timeline-and-dates How Francis's continuous monthly timeline works, the actuals and forecast layers that sit on it, and the date settings that control them. Francis is built on a continuous monthly timeline. Every column is a month and every line item is a time series, which is what powers the automation behind importing actuals, forecasting, and reporting. ## The continuous timeline Every column in Francis is a month, and every line item is a time series that follows the timeline. This is one of the core differences from a traditional spreadsheet, and it is what enables much of the automation around actuals, forecasting, and reporting. Because the timeline is continuous, you are not boxed into fiscal years. You can plan across year boundaries freely. When you connect your accounting system, Francis pulls all historical data, back to the first entry recorded in that system. Planning always happens in monthly increments. Reports then summarize by month, quarter, YTD, full year, or LTM. ## The actuals and forecast layers The timeline has two layers: the actuals layer and the forecast layer. They cover the same months but hold different data. **Actuals layer.** Data sources mapped to the model, such as GL accounts, fill the actuals layer. You can also derive actuals with a formula (for example, a revenue growth % assumption computed from P\&L revenue), or enter them manually. **Forecast layer.** Build your budgets and forecasts here. You can also copy values in from an existing Excel model or another system, such as a CRM for pipeline forecasts. The forecast layer holds both budgets and forecasts, which are managed via [saved versions](/features/using-francis/version-control). Input values and give them an identity, like "Anchor budget" or "Q2 forecast", when saving the version. A budget is simply a forecast that happens to start at the beginning of the year. How the two layers interact depends on the component type. For rows, the layers are independent: a formula you write in one layer does not spill into the other unless you write the same formula in both. If you [fill right](/features/using-francis/formulas) in the actuals layer, it fills within the actuals layer only, never into the forecast layer. Calculations behave differently. A calculation's formula applies across both layers automatically, but each layer evaluates it against its own values. The same calculation therefore returns actuals in the actuals layer and a forecast in the forecast layer, with no extra work. The mental model is that the actuals layer progressively takes over the forecast layer as time passes. As each month closes, actuals absorb the forecast layer, either to show actuals for comparison or to produce a fresh forecast for the remaining months. Only the actuals layer can connect to data sources. To bring external data into the forecast layer, copy and paste it in. ## Date settings Three dates control how values are calculated and presented in the timeline, each color-coded in the date settings. ### Timeline view (green) The green **From** and **To** dates set which months are visible in the model. They are display only: changing them does not affect any formula or calculation. They simply define the date range you see at a given moment. ### Forecast start (violet) The **Forecast start** is the cut-off between the actuals and forecast layers, shown as a violet line through the model. Months before it are actuals, and months after it are your forecast. Every financial plan in Francis has a forecast start. Moving the forecast start does two things: 1. Months that were previously forecast are replaced by actuals. 2. Forecast formulas referencing prior periods recompute to include the newly introduced actuals. For example, a 2026 anchor budget has a forecast start of Jan 2026, while a Q2 2026 forecast has a forecast start of Apr 2026. ### Last close (orange) The **Last close** is the last closed month in your accounting system, color-coded orange in the date settings. It should always fall on or after the forecast start. It determines how many months of actuals are available since your forecast start, and updating it enables comparisons to actuals across all charts, tables, and reports. Moving it does not change your model values, but affects charts, tables, and reports. Under the hood, Francis imports every journal entry from your accounting system. The last close date defines which months count as valid to analyze in Francis. ## See in action See the timeline and date settings in practice in the [Forecasting approaches](/masterclasses/budgeting-forecasting/forecasting-approaches) masterclass. # Version control Source: https://docs.francis.app/features/using-francis/version-control Save snapshots of your model to lock in budgets and forecasts, then reference them in reports. Version control lets you save snapshots of your model when you want to lock budgets and forecasts. Once saved, versions are available for analysis in charts and reports. Use them to track budget vs. actuals or how your forecasts evolved over time. ## How versioning works You work in one master model continuously. That live, editable version is your **Latest forecast**, and it holds the most current view at all times. When you reach a milestone worth preserving, a finalized budget or a new forecast, you save a snapshot. The snapshot locks that state so you can reference it later, while you carry on working in the master model. There is one source of truth that keeps moving forward, and a trail of locked snapshots behind it that you can always compare against. ## Save a version The version selector sits in the top left sidebar, showing the active version (**Latest forecast** by default). Open the dropdown to see every saved version. Two versions always exist: * **Initial version**: a snapshot of the model at creation. * **Latest forecast**: the open, editable version. This is your master model. Every change you make lives here until you save a snapshot. To save a snapshot, press **+** next to the selector title. Name the version and confirm. It appears in the list immediately as a locked version. Name versions with both an identity and a time reference, like “2026 budget” or “3+9 Forecast”. Clear names keep the list easy to navigate as it grows. Saved versions are locked. They cannot be edited or deleted after saving. The one exception is actuals: if new entries are booked to mapped accounts for months prior to the forecast start date, those actuals update in saved versions automatically. Editing and archiving saved versions are on the Francis roadmap. ## Open a saved version Click any version in the list to open it and see its numbers. You'll be in view mode, since locked versions cannot be edited. To return to your master model, switch back to **Latest forecast** in the selector. ## Reference versions in charts and reports You can reference any saved version in charts and tables, for both analysis and reporting. Common uses are comparing budget vs. actuals in a table, or visualizing budgets and forecasts side by side in a chart. To add a version, open the **Sources** dropdown in any chart or table. Saved versions appear there alongside the built-in sources (latest forecast, actuals, prior year). ## Access All roles can view the version list and saved versions. It is not possible to restrict access to specific versions or share individual versions with specific users. ## See in action See versions in practice in the [Management report](/masterclasses/reporting/management-report) masterclass. # Microsoft Business Central Source: https://docs.francis.app/integrations/accounting/business-central Connect Business Central to feed actuals into your financial model. Connect your Business Central instance to import actuals into Francis. You can connect multiple instances if you operate across several companies. Once connected, your chart of accounts is available in the [Mappings](/features/using-francis/data-mappings) view, where you map Business Central accounts to line items in your model. ## Connect Business Central Business Central supports two connection methods. ### Method 1: Standard connection Go to **Settings > Integrations > Business Central > Connect**. A prompt will appear asking you to authorize Francis as an application in your Business Central account. This requires Admin rights. The connection is tied to the user who authorizes it and inherits their permissions. If that user is later deactivated (for example, when they leave the company), the connection breaks and must be reestablished via **Reconnect** in Francis. Use this method when possible. It's the simplest to set up. If your user permissions don't allow it, or you need a connection that isn't tied to an individual user, use Method 2. ### Method 2: App installation Register the Francis app directly in Business Central via Microsoft Entra. This requires Azure Admin rights. Unlike Method 1, the connection isn't tied to an individual user, so it won't break if someone leaves the company. The app gets access to all companies in the environment where it's added. 1. Log in to Business Central at [businesscentral.dynamics.com](https://businesscentral.dynamics.com) and select your company. 2. Click the **Search** icon and type "Entra". 3. Select **Microsoft Entra Applications**. 4. Click **+ New**. 5. Set **Client ID** to `7a116fc0-e506-453f-b354-5c5b48af13a3`. 6. Set **Description** to "Francis App". 7. Change **State** to "Enabled". 8. Accept the automatic creation of a new user. 9. Set the permission set to `D365 READ`. 10. Click **Grant Consent** and then **Accept** when prompted. 11. Go to the BC Admin Center, select your environment, and copy the **URL** property. 12. Send that URL to [support@francis.app](mailto:support@francis.app) to complete the setup. ## What Francis sources Francis pulls the following data from Business Central: * Journal entries: amount, date, and description * GL accounts * Dimension tags, available for [breakdowns](/features/using-francis/breakdowns) within Francis ## Adjustments Francis automatically adjusts imported data in three ways. All adjustments are based on account categories, so it's important that these are set correctly to ensure correct numbers. Francis flips the sign for income, expenses, liabilities, and equity accounts to follow the Francis sign convention: * **Positive (+):** Income (I), Asset (A), Liability (L), and Equity (EQ) * **Negative (-):** Expense (EX) Francis presents balance sheet values as accumulated amounts at a point in time, not as period movements. Imported data is adjusted on the way in to match this convention. For this reason, in Francis, summarize balance sheet items using `ENDING` instead of `SUM`. Throughout the fiscal year, Business Central holds net profit in a system-generated "Retained earnings current year" account that isn't exposed via the API. To capture this, Francis recreates it as a synthetic account named "Årets foreløbige resultat". When a fiscal year is closed, Business Central creates system journal entries that zero out the P\&L and post the result to the Retained Earnings account (marked as a system account). Francis already includes this via the synthetic account, so it excludes these system postings. This also maintains a continuous flow rather than an abrupt zeroing in the final month. ## Settings to enable adjustments ### Account categories Francis applies its adjustments based on account categories (Income, Cost of Goods Sold, Expense, Asset, Liability, or Equity), so every posting account in Business Central needs one assigned. This is usually a non-controversial, one-time update, and it takes around 10 minutes since Business Central lets you copy and paste the category down the column. To set account categories: 1. Navigate to **Chart of Accounts**. 2. Choose **Edit List**. 3. Update **Account Category** for all **Posting** accounts. **Account Subcategory** and **Total** accounts can be left blank. Setting account categories in the Business Central Chart of Accounts # Visma e-conomic Source: https://docs.francis.app/integrations/accounting/e-conomic Connect Visma e-conomic to feed actuals into your financial model. Connect your Visma e-conomic account to import actuals into Francis. You can connect multiple accounts if you operate across several companies. Once connected, your chart of accounts is available in the [Mappings](/features/using-francis/data-mappings) view, where you map e-conomic accounts to line items in your model. ## Connect Visma e-conomic Go to **Settings > Integrations > Visma e-conomic > Connect**. A prompt will appear asking you to authorize Francis as an application in your Visma e-conomic account. This requires Admin rights. Before you begin, open the e-conomic company you want to connect in a separate tab and make sure you're signed in to it. The connect flow uses whichever account is signed in, so having the right one open keeps it on track. Signing in or switching accounts during the flow can break it. To connect multiple companies, do them one at a time, switching to the right account in the separate tab before each. ## What Francis sources Francis pulls the following data from e-conomic: * Posted journal entries (bogførte posteringer): amount, date, and description * Optional: Draft entries (kassekladder): amount, date, and description * GL accounts * Dimension tags, available for [breakdowns](/features/using-francis/breakdowns) within Francis ## Adjustments Francis automatically adjusts imported data in three ways. All three rely on the asset range and retained earnings configuration, so it's important that these are set correctly to ensure correct numbers. Francis flips the sign for income, expenses, liabilities, and equity accounts to follow the Francis sign convention: * **Positive (+):** Income (I), Asset (A), Liability (L), and Equity (EQ) * **Negative (-):** Expense (EX) Francis presents balance sheet values as accumulated amounts at a point in time, not as period movements. Imported data is adjusted on the way in to match this convention. For this reason, in Francis, summarize balance sheet items using `ENDING` instead of `SUM`. Throughout the fiscal year, e-conomic holds net profit in a system-generated "Retained earnings current year" account that isn't exposed via the API. To capture this, Francis recreates it as a synthetic account named "Periodens resultat efter skat". When you close a fiscal year, e-conomic moves retained earnings from the "Retained earnings current year" account to a "Retained earnings from previous years" account. Francis mirrors this movement and offsets it from the synthetic account. ## Settings to enable adjustments Francis relies on two user-set settings to make the adjustments. ### Asset range You must specify your asset range in Francis. Set `asset_range_start` and `asset_range_end`. If your chart of accounts matches the default e-conomic template, Francis picks up the values automatically. The default asset range for Visma e-conomic is 5000 to 5990. Francis may prompt you to confirm even if your chart follows this default. ### Retained earnings You must also set your retained earnings from previous years. If your chart of accounts matches the default e-conomic template, Francis picks up the value automatically. In most cases this is account 6130 "Retained earnings last year". To verify in e-conomic, go to **Regnskab > Systemkonti > Årsafslutning**. # Oracle NetSuite Source: https://docs.francis.app/integrations/accounting/netsuite Connect Oracle NetSuite to feed actuals into your financial model. Connect your NetSuite account to import actuals into Francis. You can connect multiple accounts if you operate across several companies. Once connected, your chart of accounts is available in the [Mappings](/features/using-francis/data-mappings) view, where you map NetSuite accounts to line items in your model. ## Connect NetSuite Go to **Settings > Integrations > NetSuite > Connect**. A prompt will appear asking you to authorize Francis as an application in your NetSuite account. This requires Admin rights. ## What Francis sources Francis pulls the following data from NetSuite: * Journal entries: amount, date, and description * GL accounts Dimensions ("Classifications") are not currently supported for NetSuite, but are on the roadmap. ## Adjustments Francis automatically adjusts imported data in two ways. Francis flips the sign for income, expenses, liabilities, and equity accounts to follow the Francis sign convention: * **Positive (+):** Income (I), Asset (A), Liability (L), and Equity (EQ) * **Negative (-):** Expense (EX) Francis presents balance sheet values as accumulated amounts at a point in time, not as period movements. Imported data is adjusted on the way in to match this convention. For this reason, in Francis, summarize balance sheet items using `ENDING` instead of `SUM`. ### Retained earnings NetSuite does not expose its retained earnings account via the API. Francis automatically adjusts for this on other accounting systems, but it is not yet supported for NetSuite. For now, calculate retained earnings manually by adding net profit to equity: ```typescript theme={null} = "Retained earnings"[-1] + "Net profit"[0] ``` Reach out to [support@francis.app](mailto:support@francis.app) if you have questions. ## Settings to enable adjustments ### Account types Francis applies its adjustments based on account types (Income, Expense, Asset, Liability, or Equity), so every account in NetSuite needs one assigned. To update an account type: 1. Navigate to **Lists > Accounting > Accounts**. 2. Click **Edit** next to the account. 3. Update the **Type**. 4. Click **Save**. # Non-supported ERP Source: https://docs.francis.app/integrations/accounting/other-erp Import actuals from accounting systems not natively supported by Francis via Google Sheets. Use Google Sheets as a bridge to import actuals from accounting systems Francis does not natively support. Francis creates a synced sheet in your Google Drive, you paste your data into it, and your chart of accounts becomes available in the [Mappings](/features/using-francis/data-mappings) view, where you map accounts to line items in your model. ## Connect Google Sheets Go to **Settings > Integrations > Google Sheets > Connect**. A prompt asks you to choose a template: * **Monthly totals:** upload monthly trial balances (high-level). * **Detailed entries:** upload journal entries (detailed). Francis creates a sheet in your Google Drive that's live-synced to Francis on every refresh. Francis must create the sheet for it to be live-synced. You cannot create your own sheet and then connect it. Enter your data into the sheet Francis creates. Francis can only view, edit, create, and delete the specific Google Drive files it creates. It does not access any of your other Google Drive files. To share the sheet with team members, update permissions under **Share** in Google Sheets, or move the sheet to a shared drive. ## What Francis sources Francis pulls data from **Sheet 1**, which must follow the template format. You are free to use Sheet 2, Sheet 3, and so on for your own working data. What Francis pulls depends on the template you chose. * Monthly value * GL accounts * Journal entries: amount, date, and description * GL accounts * Dimension tags (optional), available for [breakdowns](/features/using-francis/breakdowns) within Francis. To add dimension tags, enter a dimension title in cell **E1** and populate dimension tags in column **E**. ## Required data format Francis flips signs on import, so upload values using the debit/credit sign convention: * **Income** accounts: negative (-) values * **Expense** accounts: positive (+) values * **Asset** accounts: positive (+) values * **Liability** accounts: negative (-) values * **Equity** accounts: negative (-) values Francis accumulates balance sheet accounts automatically on import. Provide **delta values**, not cumulative totals. ## Adjustments Francis automatically adjusts imported data in two ways. Francis flips the sign for income, expenses, liabilities, and equity accounts to follow the Francis sign convention: * **Positive (+):** Income (I), Asset (A), Liability (L), and Equity (EQ) * **Negative (-):** Expense (EX) Francis presents balance sheet values as accumulated amounts at a point in time, not as period movements. Imported data is adjusted on the way in to match this convention. For this reason, in Francis, summarize balance sheet items using `ENDING` instead of `SUM`. To enable these adjustments, turn on **Treat as entity** under the Google Sheets settings. This tells Francis the data represents accounting information and triggers the adjustments. Connecting Google Sheets as an entity counts toward your plan's limit on active data sources. ## Settings to enable adjustments ### Account categories Francis applies its adjustments based on account categories (Income, Expense, Asset, Liability, or Equity). Francis detects unique GL account names from the import, and you assign a category to each. To set account categories: 1. Navigate to **Settings > Integrations > Google Sheets > Chart of accounts**. 2. Set a category for each line item. 3. Click **Save** at the bottom. If Francis detects new accounts later, it prompts you to categorize them. ## Status checks Francis runs tests on each sync to flag formatting issues before they distort your numbers. The checks depend on the template you chose. Month headers must begin at cell **B1** and follow the `YYYY-MM` format. This check fails when the headers start in the wrong cell or use a different format. Reformat the affected headers and sync again. Every account name must be unique. This check fails when the same account name appears more than once. Merge the duplicate rows into one before syncing. Every row must have an account name. This check fails when an account name is left blank. Fill in the account name for each row before syncing. Amounts must be in numeric format. This check fails when a value contains text, currency symbols, or other non-numeric characters. Remove the formatting so each amount is a plain number. Row 1 must have the column headers **Date**, **Account**, **Amount**, and **Description**. This check fails when a header is missing or renamed. Restore the exact header names in row 1 of Sheet 1. Every row must have an account name. This check fails when an account name is left blank. Fill in the account name for each row before syncing. Amounts must be in numeric format. This check fails when a value contains text, currency symbols, or other non-numeric characters. Remove the formatting so each amount is a plain number. Dates must follow the `YYYY-MM-DD` format. This check fails when a date uses a different format. Reformat the affected dates and sync again. ## Microsoft users If you use Microsoft 365, create a Google account with your Microsoft email address to connect Google Sheets to Francis. Excel Online support is coming soon. Reach out at [support@francis.app](mailto:support@francis.app) with questions. # QuickBooks Online Source: https://docs.francis.app/integrations/accounting/quickbooks Connect QuickBooks Online to feed actuals into your financial model. Connect your QuickBooks Online account to import actuals into Francis. You can connect multiple accounts if you operate across several companies. Once connected, your chart of accounts is available in the [Mappings](/features/using-francis/data-mappings) view, where you map QuickBooks accounts to line items in your model. ## Connect QuickBooks Go to **Settings > Integrations > QuickBooks > Connect**. A prompt will appear asking you to authorize Francis as an application in your QuickBooks account. This requires Admin rights. ## What Francis sources Francis pulls the following data from QuickBooks Online: * Journal entries: amount, date, and description * GL accounts Dimensions ("tracking categories") are not currently supported for QuickBooks Online, but are on the roadmap. ## Adjustments Francis automatically adjusts imported data in two ways. Francis flips the sign for income, expenses, liabilities, and equity accounts to follow the Francis sign convention: * **Positive (+):** Income (I), Asset (A), Liability (L), and Equity (EQ) * **Negative (-):** Expense (EX) Francis presents balance sheet values as accumulated amounts at a point in time, not as period movements. Imported data is adjusted on the way in to match this convention. For this reason, in Francis, summarize balance sheet items using `ENDING` instead of `SUM`. ### Retained earnings QuickBooks Online does not expose its retained earnings account via the API. Francis automatically adjusts for this on other accounting systems, but it is not yet supported for QuickBooks Online. For now, calculate retained earnings manually by adding net profit to equity: ```typescript theme={null} = "Retained earnings"[-1] + "Net profit"[0] ``` Reach out to [support@francis.app](mailto:support@francis.app) if you have questions. ## Settings to enable adjustments ### Account types Francis applies its adjustments based on account types (Income, Expense, Asset, Liability, or Equity), so every account in QuickBooks needs one assigned. To update an account type: 1. Navigate to **Accounting > Chart of Accounts**. 2. Find the account and select **Edit** from the dropdown. 3. Update the **Account Type**. 4. Click **Save and Close**. # Xero Source: https://docs.francis.app/integrations/accounting/xero Connect Xero to feed actuals into your financial model. Connect your Xero account to import actuals into Francis. You can connect multiple accounts if you operate across several companies. Once connected, your chart of accounts is available in the [Mappings](/features/using-francis/data-mappings) view, where you map Xero accounts to line items in your model. ## Connect Xero Go to **Settings > Integrations > Xero > Connect**. A prompt will appear asking you to authorize Francis as an application in your Xero account. This requires Admin rights. ## What Francis sources Francis pulls the following data from Xero: * Journal entries: amount, date, and description * GL accounts Dimensions ("tracking categories") are not currently supported for Xero, but are on the roadmap. ## Adjustments Francis automatically adjusts imported data in two ways. Francis flips the sign for income, expenses, liabilities, and equity accounts to follow the Francis sign convention: * **Positive (+):** Income (I), Asset (A), Liability (L), and Equity (EQ) * **Negative (-):** Expense (EX) Francis presents balance sheet values as accumulated amounts at a point in time, not as period movements. Imported data is adjusted on the way in to match this convention. For this reason, in Francis, summarize balance sheet items using `ENDING` instead of `SUM`. ### Retained earnings Xero does not expose its retained earnings account via the API. Francis automatically adjusts for this on other accounting systems, but it is not yet supported for Xero. For now, calculate retained earnings manually by adding net profit to equity: ```typescript theme={null} = "Retained earnings"[-1] + "Net profit"[0] ``` Reach out to [support@francis.app](mailto:support@francis.app) if you have questions. ## Settings to enable adjustments ### Account types Francis applies its adjustments based on account types (Income, Expense, Asset, Liability, or Equity), so every account in Xero needs one assigned. To update an account type: 1. Navigate to **Accounting > Chart of Accounts**. 2. Click the account name. 3. Update the **Account Type**. 4. Click **Save**. # Currency Source: https://docs.francis.app/integrations/other/currency Convert actuals using market rates from the European Central Bank or custom rates. Francis converts actuals from your accounting system's base currency into a target reporting currency. Use market rates from the European Central Bank (ECB) or enter your own. Both average and closing rates are supported. ## Set up currency Go to **Settings > Integrations** and add a currency data source. You configure rates monthly. Francis sources market rates automatically from the European Central Bank. * **Monthly closing rates:** the rate the ECB published on the last business day of the month. This is the last trading day the ECB has data for, not necessarily the last calendar day. * **Monthly average rates:** the simple average of all daily rates the ECB published that month, calculated as the sum of the daily rates divided by the number of days with data. Enter custom rates manually if your group applies standardized exchange rates. * Define the currency cross (for example, EUR/USD) and enter monthly rates. * Francis extrapolates the first rate you enter backward across all prior months. * Francis does not extrapolate forward. Enter a rate for every month up to your most recent closed month. Where a rate is missing, Francis uses zero for that period. * You can supply both average and closing rates. Once you have added a rate source, open the configuration settings for the relevant accounting integration. Francis detects the base currency automatically. Set the exchange rate source and select your target currency. If you import from Google Sheets, set the base currency manually. ## Conversion method Francis applies a standard conversion approach: * **P\&L (income and expenses):** translated at the monthly average rate, which approximates transaction-date rates. * **Balance sheet (assets, liabilities, and equity):** translated at the monthly closing rate, which reflects the financial position at period end. This approach has two effects. ### Current and historical rates Francis translates opening balance sheet amounts at the current month's closing rate. So balance sheet values can move on exchange rate shifts alone, even with no new journal entries.
Base currency Jan 25 Feb 25 Mar 25
Long-term loan, starting value 0 5,000 5,500
Long-term loan, delta 5,000 500 200
Long-term loan, ending value 5,000 5,500 5,700
Target currency Jan 25 Feb 25 Mar 25
Long-term loan, starting value 0 5,250 6,235
Exchange rate adjustment, starting value 0 500 1,925
Long-term loan, delta 5,250 575 300
Long-term loan, ending value 5,250 6,235 8,550
FX closing rate 1.05 1.15 1.50
``` // Calculating exchange rate adjustment, starting value 5000 * (1.15 - 1.05) = 500 ```
### Average and closing rates Francis translates P\&L items at average monthly rates, while the matching balance sheet entries use closing rates. So the P\&L and balance sheet can apply slightly different rates to the same underlying journal entries.
Profit and loss Base currency Rate Target currency
Revenue 10,000 10,500
Costs -5,000 -5,250
Net income 5,000 × 1.05 5,250
Balance sheet Base currency Rate Target currency
Retained earnings, starting value 0 0
Retained earnings, delta 5,000 × 1.10 5,500
Retained earnings, ending value 5,000 5,500
FX average rate 1.05
FX closing rate 1.10
``` // Exchange rate effect, average to closing rates 5000 * (1.10 - 1.05) = 250 ``` The **5,500** difference in retained earnings breaks down into **5,250** (retained earnings at average rates) and **250** (the adjustment from average to closing rate).
# Google Sheets Source: https://docs.francis.app/integrations/other/google-sheets Import data from any business tool into Francis using Google Sheets. Use Google Sheets to import data from business tools not natively supported by Francis. By pairing Google Sheets with third-party integrations, you can connect CRMs, data warehouses, or any tool that can export to a spreadsheet. ## Common use cases | Data type | How Google Sheets is used | | -------------- | ------------------------------------------------------------ | | **CRM** | Import pipeline and customers, like deals, contracts, etc. | | **Headcount** | Import detailed employee salary data from payroll/HRIS tools | | **Operations** | Import production data used in forecasting and/or reporting | ## Connect Google Sheets Go to **Settings > Integrations > Google Sheets > Connect**. A prompt asks you to choose a template: * **Monthly totals:** upload monthly values (high-level). * **Detailed entries:** upload journal entries (detailed). Monthly totals is often the right choice for business data. Detailed entries is used mainly for ERP data where you want to import journal entries, but it can also capture granular transactions for other kinds of business data. Francis creates a sheet in your Google Drive that's live-synced to Francis on every refresh. Francis must create the sheet for it to be live-synced. You cannot create your own sheet and then connect it. Enter your data into the sheet Francis creates. To share the sheet with team members, update permissions under **Share** in Google Sheets, or move the sheet to a shared drive. Francis can only view, edit, create, and delete the specific Google Drive files it creates. It does not access any of your other Google Drive files. ## Microsoft users If you use Microsoft 365, create a Google account with your Microsoft email address to connect Google Sheets to Francis. Excel Online support is coming soon. Reach out at [support@francis.app](mailto:support@francis.app) with questions. ## Status checks Francis runs tests on each sync to flag formatting issues before they distort your numbers. The checks depend on the template you chose. Month headers must begin at cell **B1** and follow the `YYYY-MM` format. This check fails when the headers start in the wrong cell or use a different format. Reformat the affected headers and sync again. Every account name must be unique. This check fails when the same account name appears more than once. Merge the duplicate rows into one before syncing. Every row must have an account name. This check fails when an account name is left blank. Fill in the account name for each row before syncing. Amounts must be in numeric format. This check fails when a value contains text, currency symbols, or other non-numeric characters. Remove the formatting so each amount is a plain number. Row 1 must have the column headers **Date**, **Account**, **Amount**, and **Description**. This check fails when a header is missing or renamed. Restore the exact header names in row 1 of Sheet 1. Every row must have an account name. This check fails when an account name is left blank. Fill in the account name for each row before syncing. Amounts must be in numeric format. This check fails when a value contains text, currency symbols, or other non-numeric characters. Remove the formatting so each amount is a plain number. Dates must follow the `YYYY-MM-DD` format. This check fails when a date uses a different format. Reformat the affected dates and sync again. # Integrations Source: https://docs.francis.app/integrations/overview The data sources Francis connects to, and how syncing works across all of them. Francis connects to your accounting system to import actuals, plus other sources for data that doesn't live in the ledger. Set up each integration on its own page. Syncing then works the same way across all of them. ## Available integrations Accounting systems: Other sources: ## How syncing works ### On-demand syncing Syncing is on-demand. Francis does not auto-sync or run scheduled syncs, but you can sync as often as you want. This applies to every data source you connect, accounting systems, Google Sheets, and currency rates alike. Trigger a sync from either of two places: * **Integrations page**: sync each data source individually. * **Left sidebar**: use the **Data source** card at the bottom to sync all data sources at once. The Data source card also shows the last sync date. It turns yellow, then red, as that date ages, so a stale data source is easy to spot from the model. ### Global vs delta sync The first sync is always a global sync: Francis pulls the full history from the connected source, back to its earliest data. This one can take a while. A delta sync pulls only what's new since the last run, which is much faster. It is currently available for Visma e-conomic and Microsoft Business Central. For those integrations, Francis runs a delta sync after the initial global sync, and falls back to a global sync if it detects system changes to historical data. You don't have to choose between the two. Francis always routes to the right one. All other sources run a global sync every time you sync. ## FAQ Dimensions are available on Advanced and Mastery plans. Francis automatically detects dimensions in your accounting system, making them available for [breakdowns](/features/using-francis/breakdowns) in your model. Yes. You can connect multiple data sources from the same or different accounting systems. Use [Mappings](/features/using-francis/data-mappings) to unify GL accounts across entities. Yes. To add data sources, upgrade your plan: Core includes 1 and Advanced includes 3, and you can upgrade yourself in Francis. If you're on Advanced or Mastery and need more data sources than your plan includes, contact [support@francis.app](mailto:support@francis.app). No. Francis reads data only. During peak hours, syncs are queued when many workspaces sync at once. The progress bar stays at 0% while queued. If your sync has been stuck for more than 30 minutes, reach out at [support@francis.app](mailto:support@francis.app). # Balance sheet fundamentals Source: https://docs.francis.app/masterclasses/budgeting-forecasting/bs-forecasting/bs-fundamentals How to work with the balance sheet in Francis: structuring the template, mapping GL accounts, and forecasting balances forward. The balance sheet shows what the business owns, what it owes, and what remains for equity holders. Actuals map from your GL; the forecast carries each balance forward and adjusts when movements occur. ## The Francis balance sheet template The template includes the classic balance sheet categories you'll find in most charts of accounts: assets (non-current and current), liabilities (long-term and short-term), and equity (share capital, dividends, and retained earnings). That structure makes it easy to map your general ledger accounts onto the template. Redesign the balance sheet with components however suits your business. Add specific rows for the items you track, like receivables, inventory, prepayments, and VAT under current assets, or bank debt and shareholder loans under long-term liabilities. Rename, regroup, or remove sections as you see fit. The level of detail depends on what you need to report and forecast. ## Map your GL accounts to the balance sheet Map all your balance sheet GL accounts to the BS. There are two schools of thought in Francis. Some prefer a clean balance sheet, where GL accounts are grouped into reader-friendly lines. Others prefer an accounting-oriented layout, with one line per GL account for a direct link to the chart of accounts. We recommend fewer, cleaner line items. It keeps the model manageable, and you rarely need full chart-of-accounts granularity in a budget. GL accounts are often created with a different purpose in mind than planning and reporting. ## The validation row A **Validation** row sits at the bottom. It checks that assets equal liabilities plus equity. If it shows a non-zero value, something in the model is out of balance. See [BS validation](/masterclasses/budgeting-forecasting/bs-forecasting/bs-validation) for how to diagnose and fix it. ## Sign conventions When you budget and forecast, follow the sign convention: assets, liabilities, and equity are all entered as positive figures. This matches how balances arrive from your accounting system. ## Aggregation Aggregate balance sheet lines by END. Balance sheet values accumulate, so the total column on the right should show the closing balance, not a sum across periods. Aggregate the validation row by SUM. Each period's check should be zero, so the total stays at zero only if every period balances. Any period that's out of balance then surfaces in the total. ## How balance sheet forecasting works Balance sheet forecasting always follows the same pattern: last period's value, plus additions, minus detractions. | Item | Formula | | :---------- | :------------------------------------------------------------------- | | Receivables | `"Receivables"[-1] + "Invoices issued"[0] - "Payments received"[0]` | | VAT | `"VAT payable"[-1] + "Sales VAT"[0] - "Cost VAT"[0] - "VAT paid"[0]` | | CAPEX | `"Fixed assets"[-1] + "New investments"[0] - "Depreciation"[0]` | | Loans | `"Loan balance"[-1] + "New draws"[0] - "Repayments"[0]` | Last period's value is included because balance sheet items accumulate. For example, a receivables balance doesn't reset to zero each month. It carries forward from the previous period and changes only when new invoices are issued or payments come in. The net movement (additions minus detractions) is what flows through to the cash flow statement. The subsequent pages cover how they're modeled in practice. ## A simplified balance sheet budget For a first pass, you can budget the balance sheet on the assumption that nothing moves: no additions, no detractions, every line item held flat. You do this by referencing the last known period and dropping the movement terms. | Item | Formula | | :---------- | :------------------- | | Receivables | `"Receivables"[-1]` | | VAT | `"VAT payable"[-1]` | | CAPEX | `"Fixed assets"[-1]` | | Loans | `"Loan balance"[-1]` | This has two benefits: 1. It removes noise from the cash flow statement. With no balance sheet movement, the cash flow is driven entirely by your P\&L forecast. 2. It still lets you analyze real movements once actuals arrive. You can also reforecast on a rolling basis, rebasing the balance sheet to the latest numbers, so the forecast never drifts far from reality. When taking this approach, reference the last known period rather than hardcoding the value. A hardcoded value won't rebase when a forecast with new actuals is created; a reference to `[-1]` will. This is a simplified approach, but a pragmatic and effective one. It gets you to a working budget quickly, and you can replace it with a proper forecast line by line as specific items become material. ## Connected across statements In forecast periods, the formulas for **Cash**, **Retained earnings**, and **accumulated depreciation** must be linked to the other statements in order for the balance sheet to match. Cash pulls from the cash flow statement, retained earnings from the net profit on the P\&L, and depreciation from the depreciation expense on the P\&L. In actuals periods, these rows populate from your GL mapping like any other balance sheet row. For the cash flow statement to work, split non-current assets into gross CAPEX and accumulated depreciation on separate line items. Only the CAPEX movement is a cash outflow. Accumulated depreciation is a non-cash contra-asset, so it must not flow into the cash flow statement. Keeping them on separate lines lets you route new investments to the cash flow while depreciation stays a non-cash entry that ties back to the P\&L. # Fix a failing BS validation Source: https://docs.francis.app/masterclasses/budgeting-forecasting/bs-forecasting/bs-validation How Francis validates your balance sheet and how to troubleshoot a failing check for actuals and forecast months. The Francis template includes a **Validation** row that checks assets equal liabilities plus equity. If you're building from scratch, add the same check as a formula row: ``` round("Assets"[0] - "Liabilities"[0] - "Equity"[0]) # Should return 0 ``` ## Check fails for actuals months Have all balance sheet accounts been mapped? If not, map the missing accounts to the relevant rows in Francis. Have you incorrectly mapped P\&L accounts to the balance sheet, or vice versa? Check the account category label (I, EX, A, or L) in the mapping interface. Any account showing I or EX on a balance sheet row is in the wrong place. Move it to the correct section. Have you mapped asset accounts to the liability side, or vice versa? Francis flips the sign of liability accounts, so a wrong-side mapping causes a mismatch. Remap to the correct side. Are there manual overrides in the balance sheet? Look for cells with a yellow corner indicator. Remove the override or update the value to match your GL. Does the balance sheet contain rows with values not sourced from your GL? Review each row. Any row driven by a hardcoded value or formula not tied to your GL mapping will cause a mismatch. Remove it or map it to a GL account. If you use QuickBooks Online, Xero, or NetSuite, have you manually adjusted retained earnings? If not, apply the adjustment. See your [integration setup guide](/integrations) for the steps. ## Check fails for forecast months Is the check passing for actuals months? If not, resolve that first before troubleshooting forecasts. Have you forecasted the asset line item Cash as ending cash from the cash flow statement? If not, set the Cash row formula to `= "Cash end period"[0]`. Is the cash flow check passing for actuals months? If not, resolve the cash flow check before continuing. Have all non-cash line items been forecasted correctly? These don't flow through the cash flow statement but still affect the balance sheet. Common causes: * **Retained earnings** should equal last period's value plus this period's net profit. * **Accumulated depreciation** should equal last period plus this period's depreciation expense. * **Investments in subsidiaries** (equity method) should equal last period plus this period's income from subsidiaries. All cash-related P\&L and balance sheet line items flow through the cash flow statement and affect the cash asset line. Errors there won't cause the balance sheet to go out of balance, but they may distort the cash value itself. # Forecast CAPEX Source: https://docs.francis.app/masterclasses/budgeting-forecasting/bs-forecasting/capex How to model fixed asset balances in Francis, including new investments and depreciation. CAPEX is spending on fixed assets expected to generate value over multiple periods. Common examples include machinery, equipment, leasehold improvements, and software licences. Unlike operating expenses, CAPEX is capitalised on the balance sheet and depreciated over the asset's useful life. Balance sheet forecasting is always a function of last period's value, additions, and detractions. See [BS fundamentals](/masterclasses/budgeting-forecasting/bs-forecasting/bs-fundamentals). For CAPEX, this means fixed asset value last period + new investments in period − selloffs in period − depreciation in period. ## What approach to use Driver-based is the right default. Build an asset register on a supporting sheet, hardcode each acquisition in the month it occurs, and let the depreciation formula run automatically from those additions. Statistical rarely fits. Investment is lumpy and project-driven, making historical averages an unreliable guide. Use hardcoded when you already have a known investment plan and depreciation schedule, for example from an existing Excel budget or an accountant's estimate. ## Where to forecast CAPEX * **Supporting sheet:** right for most cases. Build one section per asset class, each with its own asset register, gross cost roll-forward, and accumulated depreciation roll-forward. The balance sheet references the net book value totals. * **Directly on the balance sheet:** right for simple setups with a single asset class. ## Forecasting approaches **Set up the supporting sheet** Create one section per asset class: Furniture, Vehicles, Machinery, Intangible assets. Group by depreciation cadence, not just asset type. Two machinery items with different useful lives need separate groups, since the formula offset and divisor must match the useful life of every asset in the group. Within each group, add one row per asset and hardcode the acquisition cost in the month the asset is acquired. This is your asset register. Cost additions are the only rows with a cash effect. They flow to investing activities on the cash flow statement. If an asset is disposed of in the period, enter the detraction as a negative value in the same section. The depreciation formula will reduce automatically from that month onwards. **Depreciation** Add a **Depreciation** row below the asset register. The formula takes the rolling sum of all cost additions within the useful life and divides by the number of months. For a 5-year asset class: ```typescript theme={null} = sum("Cost addition" [-59:0]) / 60 ``` When a new asset is added to the register, the depreciation row picks it up in the current period and runs for the full 60 months. Adjust the offset and divisor to match each asset class. Depreciation flows to the **Depreciation expense** line on the P\&L as a non-cash charge, and to the accumulated depreciation balance on the balance sheet. This formula only handles depreciation on new CAPEX acquired in the forecast period. Existing assets already carry a depreciation waterfall from before the forecast starts, and that schedule is hard to reproduce in Francis. Don't try to derive it. Instead, split depreciation expense into two parts: base the depreciation from existing CAPEX on a statistical approach or on the waterfall exported from your accounting system, and forecast depreciation from new CAPEX directly in Francis with the formula above. **Net book value** Net book value is gross cost minus accumulated depreciation. The balance sheet row references both: ```typescript theme={null} = "Gross cost"[0] - "Accumulated depreciation"[0] ``` New investments are a cash outflow in investing activities. Depreciation is a non-cash expense and appears as an add-back in operating activities. Both must be modelled explicitly for the cash flow statement to balance. Statistical rarely fits CAPEX. Investment is project-driven and lumpy; historical averages smooth out the timing in ways that do not reflect how the business actually invests. If you need a placeholder, reference last year's total with a growth rate. Migrate to driver-based once you have visibility on the investment plan. Enter management estimates directly on the balance sheet for each period: the expected addition, any detractions, and the depreciation charge. This works when you already have a known investment plan and depreciation schedule, for example from an existing Excel budget or an accountant's estimate. Document the basis in a formula note. Hardcoded values require a manual update each planning cycle as the investment plan changes. ## FAQ Yes. Since accumulated depreciation is a non-cash item, it shouldn't be included in the cash flow statement. Separating the two lets you capture only CAPEX in the cash flow statement. Model a disposal as a cost detraction in the period the asset is removed, and a depreciation detraction for the accumulated depreciation on that asset. If the disposal generates proceeds, those flow through investing activities on the cash flow statement. # Forecast inventory Source: https://docs.francis.app/masterclasses/budgeting-forecasting/bs-forecasting/inventory How to model the inventory balance in Francis, including purchases, stock movements, and category tracking. Inventory represents goods held for sale or use in production. Common examples include raw materials, work in progress, and finished goods. Balance sheet forecasting is always a function of last period's value, additions, and detractions. See [BS fundamentals](/masterclasses/budgeting-forecasting/bs-forecasting/bs-fundamentals). For inventory, this means inventory last period + new purchases in period − cost of goods sold in period. ## What approach to use Driver-based is the right default. Either express the closing balance as a percentage of revenue for a simple setup, or build a category-level supporting sheet that tracks purchases and sales by category. The category approach lets inventory movements feed into the cost of sales line on the P\&L. Use statistical when inventory levels are stable and seasonal patterns are consistent. A rolling average or prior-year reference is often accurate enough without rebuilding the purchase and sales link. Hardcoded is acceptable when you have a known purchase plan or a specific target balance in mind. Enter the expected closing balance directly. ## Where to forecast inventory * **Supporting sheet:** right when inventory is split by category. Track purchases and sales separately within each category. The sales rows can feed the cost of sales line on the P\&L, keeping inventory and cost of sales in sync. * **Directly on the balance sheet:** right for simple single-category setups or when using the % of revenue approach. ## Forecasting approaches **% of revenue** The simplest approach. Add an **Inventory %** assumption and apply it to monthly revenue: ```typescript theme={null} = "Revenue"[0] * "Inventory %"[0] ``` Set the percentage to reflect your typical inventory-to-revenue ratio. This works well for businesses with stable turnover rates and a single product category. **Supporting sheet by category** For businesses with multiple inventory categories, build a supporting sheet. Create one section per category. Categories can follow a process-oriented structure (Raw materials, Work in progress, Finished goods) or a SKU-oriented structure (individual product lines or families). Choose based on how your business tracks inventory and what level of P\&L detail you need. Within each section, add four rows. *Opening balance:* hardcode the first period, then reference the prior period's closing balance: ```typescript theme={null} = "Closing balance"[-1] ``` *Purchases:* hardcode the expected purchase amount in the month it arrives. This is the addition to inventory and flows to cash flow as an operating outflow. *COGS:* the cost of inventory sold in the period, entered as a negative value. The direction can go either way: forecast COGS here and reference the total on the P\&L, or take COGS from an existing P\&L forecast and reference it here to drive the closing inventory balance. *Closing balance:* the roll-forward: ```typescript theme={null} = "Opening balance"[0] + "Purchases"[0] + "COGS"[0] ``` The balance sheet references the closing balance total across all categories. The P\&L references the COGS total. Linking inventory and COGS through the supporting sheet keeps both in sync automatically. If COGS is forecast here, changes flow to the P\&L. If COGS comes from the P\&L, changes flow to the inventory balance. Either way, the two statements move together. This is the main advantage of the category approach over % of revenue. When setting up the supporting sheet, pull the opening inventory balance with a formula, so the starting value sits in the actuals layer and feeds the forecast automatically. As you move the Forecast Start date forward, periods that were forecast become actuals, and the formula keeps sourcing each opening balance from the actuals layer with no manual update. A rolling average works when the inventory balance is steady with no significant spikes: ```typescript theme={null} = avg_last("Inventory", 3) ``` If the balance follows a seasonal pattern, reference the same month last year and apply an expected growth rate: ```typescript theme={null} = "Inventory"[-12] * (1 + 5%) ``` Replace 5% with the growth rate that reflects your volume expectations. Statistical breaks down when purchasing patterns are changing, when new product lines are being added, or when the business is growing quickly enough that last year's balance is no longer a reliable reference. Enter management estimates directly on the balance sheet for each period: the expected closing balance based on known purchase plans or a target inventory level. Document the basis in a formula note. Hardcoded values require a manual update each planning cycle as purchase plans and sales volumes change. ## FAQ Use the supporting sheet approach. The COGS row within each inventory category feeds directly to the corresponding P\&L line. Reference the COGS total from the supporting sheet into the cost of goods sold row on the P\&L. Any change to inventory assumptions flows through automatically. Model a write-down as a detraction in the period it occurs. Add a separate write-down row in the relevant category section and enter the amount as a negative value. The write-down flows to the P\&L as a cost and reduces the closing inventory balance. # Forecast loans Source: https://docs.francis.app/masterclasses/budgeting-forecasting/bs-forecasting/loans How to model the loan balance in Francis, including opening balance, interest, principal repayments, and new draws. Loans sit on the liability side of the balance sheet and represent outstanding principal owed to lenders. Common examples include term loans, mortgage facilities, and revolving credit facilities. Balance sheet forecasting is always a function of last period's value, additions, and detractions. See [BS fundamentals](/masterclasses/budgeting-forecasting/bs-forecasting/bs-fundamentals). For loans, this means loan balance last period + new draws in period − principal repayments in period. Where interest is not paid in the period, it accrues to the balance as an additional addition. ## What approach to use Driver-based is the right default. Build the amortisation schedule from the total payment and interest rate, and let the interest charge and principal split calculate automatically. When rate assumptions change, the balance updates throughout the forecast. Statistical is not applicable to loans. Balances are contractual, not pattern-driven. Use hardcoded when you have a complete repayment schedule from your lender with exact draws, repayments, and interest charges per period already calculated. ## Where to forecast loans * **Supporting sheet:** right for most cases. One section per loan facility, with opening balance, total payment, monthly rate, interest, and principal. The balance sheet references the ending balance from each section. * **Directly on the balance sheet:** right for a single simple loan with no interest calculation needed. ## Forecasting approaches **Set up the supporting sheet** Create one section per loan facility with seven rows: Annual interest rate %, Monthly interest rate %, Starting value, Total payment, Interest, Principal repayment, and Ending value. **Annual interest rate %** Hardcode the annual rate. This is a fixed assumption for the facility. **Monthly interest rate %** ```typescript theme={null} = "Annual interest rate %"[0] / 12 ``` **Starting value** Hardcode the loan balance in the first forecast period. From the second period onwards: ```typescript theme={null} = "Ending value"[-1] ``` When setting up the supporting sheet, pull the opening loan balance with a formula, so the starting value sits in the actuals layer and feeds the forecast automatically. As you move the Forecast Start date forward, periods that were forecast become actuals, and the formula keeps sourcing each opening balance from the actuals layer with no manual update. **Total payment** Hardcode the monthly payment from the loan agreement. This stays constant for a fixed-rate amortising loan. **Interest** ```typescript theme={null} = "Starting value"[0] * "Monthly interest rate %"[0] ``` Interest flows to the P\&L as a finance cost. It does not reduce the loan balance. **Principal repayment** ```typescript theme={null} = "Total payment"[0] - "Interest"[0] ``` **Ending value** ```typescript theme={null} = "Starting value"[0] - "Principal repayment"[0] ``` The balance sheet row references this ending value. Total payment flows to financing activities. Interest flows to operating activities. Keep these separate. Mixing principal and interest in the loan balance is one of the most common errors in three-statement models. Statistical is not applicable to loans. Repayments are contractual; historical patterns do not predict future loan activity. Enter management estimates directly on the balance sheet for each period: the expected draw, repayment, and closing balance. This works when you have a known schedule and do not need the interest and principal calculation built into the model. Document the facility name, original principal, maturity date, and interest rate in a formula note. Hardcoded values require a manual update if terms are renegotiated. ## FAQ Most loans require monthly interest payments, which flow to the P\&L as a finance cost and do not accumulate on the balance sheet. For loans where interest is deferred or capitalised (PIK interest), the unpaid interest accrues to the loan balance each period. Add an **Accrued interest** row to the supporting sheet and include it in the ending value formula: ```typescript theme={null} = "Starting value"[0] - "Principal repayment"[0] + "Accrued interest"[0] ``` The accrued interest row uses the same formula as the regular interest charge. The difference is that it is not paid out in the period, so it stays on the balance sheet rather than flowing to cash. When the interest is eventually settled, model it as a negative entry on the accrued interest row in the period it is paid. A bullet loan has no principal repayments during the term. The full balance is repaid at maturity. Set repayments to zero for all periods except the final month, where you enter the full outstanding balance as a repayment. Use a supporting sheet that lists the repayment amount for each period, then reference it into the balance sheet row. This keeps the schedule easy to update if terms change. # Forecast prepayments Source: https://docs.francis.app/masterclasses/budgeting-forecasting/bs-forecasting/prepayments How to forecast the prepaid asset balance in Francis: driver-based, statistical, and hardcoded approaches. A prepayment is cash paid in advance for goods or services not yet received. Common examples include insurance premiums, SaaS subscriptions, rent deposits, and annual maintenance contracts. Balance sheet forecasting is always a function of last period's value, additions, and detractions. See [BS fundamentals](/masterclasses/budgeting-forecasting/bs-forecasting/bs-fundamentals). For prepayments, this means prepaid asset last period + cash paid in period − amortisation recognised in period. ## What approach to use Driver-based is the right primary approach. Build a supporting sheet listing each contract with its payment amount, due month, and coverage period. The sheet flows into both the P\&L and the balance sheet, so when assumptions change, both update automatically. Use statistical when the same contracts renew at roughly the same time each year with a small price increase. It is not flexible enough for a changing contract mix. Hardcoded is acceptable for specific contracts with known amounts and timing. Use it selectively. The BS roll-forward must still hold regardless of approach: Opening + Cash Paid − Amortisation = Closing. ## Where to forecast prepayments * **Supporting sheet:** right for most cases. List each contract with its payment amount, due month, and coverage period. The balance sheet row references the monthly total. This keeps renewals easy to update and gives a clear view of upcoming cash payments. * **Directly on the balance sheet:** right for simple single-contract setups. ## Forecasting approaches **Set up the supporting sheet** Build the prepayments model on a supporting sheet. Group contracts by coverage period: one group for annual contracts, one for quarterly. Name the groups accordingly: **Prepayments** for annual, **Quarterly prepayments** for quarterly. Each group gets its own amortisation formula below it. Within each group, add one row per contract and hardcode the cash payment in the month it falls due. **P\&L recognized** Add a **P\&L recognized** row below each group. The formula takes the rolling sum of the last 12 months of annual payments and divides by 12: ```typescript theme={null} = -sum("Prepayments" [-11:0]) / 12 ``` For quarterly contracts, use the last 3 months divided by 3: ```typescript theme={null} = -sum("Quarterly prepayments" [-2:0]) / 3 ``` The formula is negative because it is an expense. When a new contract is added, the row picks it up in the current period and amortises it going forward. A 120k annual contract added in February produces a 10k monthly expense from that month onwards. **Balance sheet roll-forward** The balance sheet row references the P\&L recognized row and the group directly: ```typescript theme={null} = "Amount on BS"[-1] + "P&L recognized"[0] + "Prepayments"[0] ``` The group addition is positive (cash paid in); P\&L recognized is negative (expense flowing out). Driver-based gives you scenario flexibility, auditability (every balance traces back to a cash payment and a coverage period), and automatic P\&L and cash flow linkage. Statistical works when the same contracts renew at roughly the same time each year with a small price increase. Rather than re-entering every contract, reference the prior year's balance and apply an expected growth rate: ```typescript theme={null} = "Prepayments"[-12] * (1 + 5%) ``` Replace 5% with the expected price increase across your contract base. This approach breaks down as soon as the contract mix changes. A new contract, a cancellation, or a shift in renewal timing makes the prior year balance an unreliable starting point. If you are adding suppliers or renegotiating terms, rebuild with driver-based instead. Hardcoded is acceptable for specific contracts where the amount and timing are fixed in advance. Enter the cash payment in the month it falls due and the monthly amortisation for the contract period. The BS roll-forward must still hold: ```typescript theme={null} = "Prepayments"[-1] + "Cash paid"[0] - "Amortisation"[0] ``` The main risks with hardcoded values are no scenario flexibility (a change in assumptions requires manual updates across every affected period) and an audit trail that relies entirely on formula notes. Document the contract name, total value, and coverage period in a note on each row. ## FAQ Add the renewal payment as a new cash paid addition in the month it falls due. Model the renewal as a fresh prepayment with its own total and coverage period rather than extending the existing amortisation schedule. # Forecast trade receivables Source: https://docs.francis.app/masterclasses/budgeting-forecasting/bs-forecasting/receivables How to forecast trade receivables in Francis: driver-based, statistical, and hardcoded approaches. Trade receivables represent amounts owed by customers for goods or services already delivered. The balance builds with new invoices and reduces as customers pay. Balance sheet forecasting is always a function of last period's value, additions, and detractions. See [BS fundamentals](/masterclasses/budgeting-forecasting/bs-forecasting/bs-fundamentals). For trade receivables, this means trade receivables last period + new invoices issued in period − customer payments received in period. ## What approach to use Driver-based is the right default when revenue is the primary driver. Express the closing balance as a function of revenue and/or payment days. When revenue assumptions change, the receivables balance updates automatically. Use statistical when payment patterns are stable and you want a quick, reliable estimate without rebuilding the revenue link. Use hardcoded when you have a management target, such as a deliberate reduction in payment days or a collection drive. The limitation is that hardcoded values don't adapt when operations change. Revenue growth, new customers, or revised payment terms all require a manual update. ## Where to forecast trade receivables * **Directly on the balance sheet:** right for most cases. * **Supporting sheet:** worth considering when receivables are segmented by customer, channel, or payment terms and each segment has different payment days. ## Forecasting approaches **Payment days** Use the built-in `receivables()` function. It accumulates revenue from previous months based on a payment days assumption, treating each month as 30 days: ```typescript theme={null} = receivables("Revenue", 30) ``` 30 days means customers pay within the same month, so the balance equals one full month of revenue. 45 days means half of last month's revenue is still outstanding on top of the current month's full balance. The payment days argument must be hardcoded. You cannot reference a row or cell for it. To change the assumption, update the number directly in the formula. This approach applies one uniform payment days assumption to all revenue. If your actuals reflect different payment terms across customers or revenue streams, switching to a single driver at the forecast start can create a step change in the balance. Check that the opening forecast balance is consistent with the closing actual balance. **% of revenue** A simpler alternative when the day-count framing isn't useful. Add a **Trade receivables %** assumption and apply it to monthly revenue: ```typescript theme={null} = "Revenue"[0] * "Trade receivables %"[0] ``` **Cash flow** The change in trade receivables flows automatically to the working capital section of the cash flow statement. An increase in the balance is a cash outflow; a decrease is a cash inflow. See [cash flow fundamentals](/masterclasses/budgeting-forecasting/cf-forecasting/cf-fundamentals) for how working capital movements feed the cash flow statement. A rolling average works when the receivables balance is steady with no significant spikes or seasonal swings: ```typescript theme={null} = avg_last("Trade receivables", 3) ``` If the balance follows a seasonal pattern, reference the same month last year and apply an expected growth rate: ```typescript theme={null} = "Trade receivables"[-12] * (1 + 5%) ``` Replace 5% with the growth rate that reflects your revenue expectations. Statistical is not a good fit when the historical balance does not accurately represent how the business will behave going forward. Common cases: payment terms are changing, new revenue streams have different collection profiles, or a large spike or one-off in the actuals distorts the average. Enter the target closing balance directly for each month. Use this when working toward a management target, such as a reduction in payment days or a one-off collection drive. Enter the balance you're aiming for rather than trying to back-solve a driver. The limitation is that hardcoded values don't adapt when operations change. Revenue growth, new customers, or revised payment terms all require a manual update each cycle. Document the basis in a formula note so the assumption is clear when you revisit it. # Forecast tax Source: https://docs.francis.app/masterclasses/budgeting-forecasting/bs-forecasting/tax How to forecast corporate tax payable in Francis: monthly accrual, year-end recognition, aconto payments, and final settlement. Corporate tax accrues against profit and settles at known points in the year. The balance sheet balance accumulates tax expense, reduces with aconto payments during the year, and clears with the final settlement in November of the following year. Balance sheet forecasting is always a function of last period's value, additions, and detractions. See [BS fundamentals](/masterclasses/budgeting-forecasting/bs-forecasting/bs-fundamentals). For tax, this means tax payable last period + tax expense recognized in period − aconto payments made in period − final settlement. ## What approach to use Driver-based is the right default. Apply the effective tax rate to profit before tax, either monthly or as a single year-end entry. The choice of recognition approach is separate from the BS mechanics. Aconto payments and the final settlement work the same way either way. Use monthly recognition when profitability varies significantly through the year and you want the P\&L and BS to reflect the tax liability in real time. Use year-end recognition for a simpler setup. A single tax expense entry in December based on full-year profit is enough for most businesses and matches how most companies actually book the entry. Statistical is rarely a good fit. Tax is determined by profitability and applicable rates, not historical patterns. Hardcoded works as a placeholder when working from an accountant's estimate. Enter the accrual in the relevant month and model the settlement separately. ## Where to forecast tax * **Directly on the balance sheet:** right for most cases. The accrual and settlement logic live on the tax payable row itself. * **Supporting sheet:** worth considering for driver-based setups or when you have a complex tax structure with multiple entities, rates, or payment schedules. The sheet handles the detail; the balance sheet row references the total. ## Forecasting approaches **P\&L: tax expense** Add a tax expense row on the P\&L. Two approaches for when to recognize the charge: *Monthly recognition* applies the effective rate to each month's profit: ```typescript theme={null} = "Profit before tax"[0] * "Effective tax rate"[0] ``` *Year-end recognition* fires only in December, summing the full year's profit before tax: ```typescript theme={null} = if(if_month(12) = 1, sum("Profit before tax" [-11:0]) * "Effective tax rate"[0], 0) ``` Add the effective tax rate to an assumptions sheet. The BS mechanics are the same regardless of which recognition approach you use. **Balance sheet: tax payable** The tax payable balance accumulates tax expense, decreases with aconto payments, and clears in November of the following year when the final settlement fires: ```typescript theme={null} = "Tax payable"[-1] + "Tax expense"[0] - "Aconto"[0] - if(if_month(11) = 1, "Tax payable"[-1] + "Tax expense"[0], 0) ``` In every month except November, the settlement term is zero and the balance rolls forward normally. In November, the `if_month(11)` term equals the full accumulated balance, clearing it to zero. The settlement always clears the prior year's liability. Aconto payments during the income year are estimates; the November settlement is the final reconciliation once the year has closed and the actual tax liability is known. The balance accumulates through the current year while the prior year is being settled. Adjust the month number if your jurisdiction settles on a different schedule. **Aconto payments** Aconto payments are hardcoded values entered in the months they fall due. In Denmark, the standard schedule has three instalments: March and November of the income year, and an optional February payment the following year. The February instalment is available if you want to top up the aconto to avoid a large final settlement in November. The simplest approach is to enter the aconto amounts directly into the tax payable row for those months, without adding a new row. If you want the cash flow statement to show aconto payments as a separate line, add a dedicated **Aconto** row and reference it in the roll-forward formula above. Either way, the cash flow picks up the movement automatically. Statistical forecasting is rarely a good fit for corporate tax. The liability is determined by profitability and applicable tax rules, not historical patterns. A year with a different profit level or a change in deductions makes historical averages unreliable. If you need a quick placeholder, reference last year's total and apply a growth rate. Migrate to driver-based once you have a clearer picture of the year ahead. Enter the tax expense directly in the month it falls due, typically as a single year-end entry based on your accountant's estimate. Add the expected aconto payment amounts in March and November, and the final settlement amount in November of the following year. Document the basis in a formula note. Tax is an obligation that changes with profitability and tax rules, so hardcoded values require a manual review each planning cycle. # Forecast VAT Source: https://docs.francis.app/masterclasses/budgeting-forecasting/bs-forecasting/vat Forecast the VAT balance by capturing sales and cost VAT each month and modelling settlements with the tax authority. Forecast VAT by modelling two movements: VAT captured during the month, and settlements with the tax authority (either payments or refunds depending on your VAT position). Balance sheet forecasting is always a function of last period's value, additions, and detractions. See [BS fundamentals](/masterclasses/budgeting-forecasting/bs-forecasting/bs-fundamentals). For VAT, this means VAT balance last period + sales VAT in period − cost VAT in period − settlements with authorities. ## What approach to use Driver-based is the right default. Link sales and cost VAT dynamically to the P\&L lines that generate them. When revenue and cost assumptions change, the VAT balance updates automatically. Use statistical when VAT exposure is stable month to month. A rolling average of recent actuals is accurate enough for most businesses and avoids rebuilding the dynamic link from scratch. Hardcoded is rarely the right fit for VAT. The most common case is copying an existing Excel budget directly into Francis. Use it as a starting point and migrate to driver-based once the model is set up. ## Where to forecast VAT * **Supporting sheet:** right for most cases. Put the Income incl. VAT and Costs incl. VAT subtotals in a separate sheet as intermediate calculations. It keeps the VAT logic out of the P\&L and makes the dependency explicit. The VAT rows on the balance sheet reference those subtotals directly. * **Directly on the balance sheet:** possible for simpler setups or when using statistical. Tracing which income and expense lines feed the VAT balance becomes harder to follow as the model grows. ## Forecasting approaches **Set up the supporting sheet** 1. Create a dedicated sheet and add a section called **VAT forecast**. 2. Add a **VAT %** row and enter the applicable rate (25% in Denmark). 3. Create a group called **Costs incl. VAT**. Add a calculation row for each cost line subject to VAT at the granularity your model needs: one per GL account, or one per cost category. Each calculation pulls in that cost value from the P\&L, so the group subtotal gives total costs incl. VAT. 4. Create a group called **Income incl. VAT** and do the same for income lines. 5. Add a **Captured cost VAT** row below the groups: ```typescript theme={null} = "Costs incl. VAT"[0] * "VAT %"[0] ``` 6. Add a **Captured income VAT** row: ```typescript theme={null} = "Income incl. VAT"[0] * "VAT %"[0] ``` On the balance sheet, use three rows. **Cost VAT** takes last month's balance and adds this month's newly captured cost VAT: ```typescript theme={null} = "Cost VAT"[-1] + "Captured cost VAT"[0] ``` **Sales VAT** does the same for income: ```typescript theme={null} = "Sales VAT"[-1] + "Captured income VAT"[0] ``` Sales VAT and Cost VAT individually grow in perpetuity. Each month adds to the prior balance without any settlement logic on those rows. The Settlement row provides the offset. What matters is the sum of all three rows, which represents the net VAT position on the balance sheet. The **Settlement** row formula depends on your settlement frequency. **Monthly settlement** Settlement clears the prior month's accumulated balance every month: ```typescript theme={null} = "Settlement"[-1] - "Sales VAT"[-1] - "Cost VAT"[-1] ``` After settlement fires, the sum of all three rows reflects only the VAT captured in the current month. All prior accumulated balances have been cleared by the settlement row. **Quarterly settlement** Settlement fires in the third month of each quarter and clears the prior quarter's net by taking the difference between two consecutive quarter-end balances: ```typescript theme={null} = "Settlement"[-1] + if_quarter_month(3) * ("Sales VAT"[-3] + "Cost VAT"[-3] - "Sales VAT"[-6] - "Cost VAT"[-6]) ``` This settles Q1 in June, Q2 in September, Q3 in December, and Q4 in March, aligned with the standard Danish quarterly VAT schedule. Adjust the month offset if your jurisdiction settles on a different cycle. Between settlements, the NET VAT balance accumulates and represents the outstanding obligation for the current quarter to date. The cash flow picks up the change in the Settlement row each period automatically. When cost VAT consistently exceeds sales VAT (common in export-led, investment-heavy, or B2B businesses with limited domestic sales), the balance carries a receivable and the settlement becomes a cash inflow. The sign of the balance tells Francis whether a payment goes out or a refund comes in. When setting up the supporting sheet, pull the opening VAT balance with a formula, so the starting value sits in the actuals layer and feeds the forecast automatically. As you move the Forecast Start date forward, periods that were forecast become actuals, and the formula keeps sourcing each opening balance from the actuals layer with no manual update. Use a rolling average of recent actuals when VAT exposure is stable month to month: ```typescript theme={null} = avg_last("VAT balance movement", 3) ``` If costs are growing, apply a modest growth rate to the monthly accumulation figure rather than rebuilding the dynamic link: ```typescript theme={null} = "VAT balance movement"[-12] * (1 + 5%) ``` Statistical becomes unreliable when the business is growing quickly, when the product or cost mix is shifting, or when VAT rates change. The most common case is copying an existing Excel budget directly into Francis. Select the full year of monthly VAT values in Excel, copy, and paste onto the VAT rows on the balance sheet. Use it as a starting point and migrate to driver-based once the model is set up. Document the basis in a formula note. VAT is an obligation that changes with business activity, so hardcoded values require a manual review each planning cycle. # Cash flow fundamentals Source: https://docs.francis.app/masterclasses/budgeting-forecasting/cf-forecasting/cf-fundamentals How the Francis cash flow template is structured and how operating, investing, and financing activities connect to your P&L and balance sheet automatically. The cash flow statement in Francis is fully derived. It pulls net profit from the P\&L and movements from the balance sheet. You don't enter a single cash flow figure manually. ## The Francis cash flow template Operating, investing, and financing activities are organised into clearly separated sections. The closing cash balance is a pre-built calculation derived from opening cash plus the net movement across all three sections. Map your GL accounts to the relevant rows before you start. Balances won't populate until the mapping is in place. ## Direct vs. indirect forecasting There are two ways to forecast cash flow, and they answer different questions. The **direct method** forecasts actual cash transactions as they hit the bank: opening cash plus invoices minus payments equals closing cash. It's precise in the short term, because most invoices and payments already sit in your AR and AP ledgers. It reconciles straight to the bank and connects easily to operational detail like overdue debtors and upcoming supplier runs. This is best suited for short-term forecasting such as 13-week forecasts. The **indirect method** derives cash flow from the P\&L and balance sheet. It starts from profit, adjusts for non-cash items such as depreciation, then applies working capital movements. The indirect method ties directly to your financial statements, which makes it easy to anchor to targets and track performance. Cash is driven by strategic assumptions rather than specific invoices, because forecasting individual invoices many months out becomes meaningless. This is better suited for 12-month horizons. Francis uses the indirect method because it's built for the strategic planning horizon: a P\&L, balance sheet, and cash flow that move together over 12 months and beyond. For short-term liquidity management, run a direct 13-week forecast alongside it. ## How cash flow forecasting works Francis uses the indirect method. The statement starts from net profit, adjusts for non-cash items such as depreciation and amortisation, then applies working capital movements from the balance sheet. Investing and financing flows follow from there. Because of the indirect method, a cash flow forecast assumes a complete P\&L and balance sheet forecast. The cash flow has nothing to derive from until both are in place, so forecast them first. Each movement is derived from the corresponding balance sheet line. You don't enter cash flow figures directly. | Line item | Formula | | :------------------- | :--------------------------------------------- | | Net profit | Net profit from P\&L | | Depreciation | Depreciation from P\&L (positive add-back) | | Receivables movement | Receivables opening − receivables closing | | Payables movement | Payables closing − payables opening | | CAPEX | New fixed asset investments (negative outflow) | | Loan movements | Loans closing − loans opening | ## Connected across sheets The cash flow, P\&L, and balance sheet live in the same Francis model, even if they sit on separate sheets. Once the manual connections are in place, the statements stay in sync automatically. When a balance sheet line moves, the cash flow updates. When a receivable clears, the operating section picks it up. When a loan is drawn, the financing section reflects it. No manual reconciliation needed. # Fix a failing CF validation Source: https://docs.francis.app/masterclasses/budgeting-forecasting/cf-forecasting/cf-validation How Francis validates your cash flow statement and how to troubleshoot a failing check for actuals and forecast months. Francis validates your cash flow statement by comparing the ending cash balance on the statement to the cash asset account from your accounting system. A passing check for actuals gives strong confidence that the cash flow statement is set up correctly, and that the forecast is built on solid foundations. ## How the check works Francis subtracts the ending balance on the cash asset line item (mapped to your GL) from the ending cash on the cash flow statement: ``` round("Balance sheet"."Assets"."Current assets"."Cash"[0] - "Cash end period"[0]) # Should return zero ``` A non-zero result means either the cash flow statement is structured incorrectly, or there is an issue in your bookkeeping data. ## Check fails for actuals months Work through these steps in order. The earlier steps catch structural errors; the later steps catch journal-entry-level issues. ### P\&L and balance sheet prerequisites Have all P\&L and balance sheet accounts been mapped? The cash flow statement depends on these mappings. Are there manual overrides in the P\&L or balance sheet that cause calculated values to diverge from your accounting system? Are the P\&L subtotals set up correctly, producing an accurate net profit line? This line feeds directly into the cash flow statement. Is the balance sheet check passing? [Resolve that first.](/masterclasses/budgeting-forecasting/bs-forecasting/bs-validation) Does the P\&L or balance sheet contain line items with values not sourced from your accounting system? ### Cash flow statement line items Are all line items that represent cash movements included in the cash flow statement? Are all non-cash line items excluded? Common items incorrectly included: * Depreciation (P\&L) and accumulated depreciation (contra-asset) * Income from subsidiaries (P\&L) and investment in subsidiaries (asset) If you use multiple currencies, have you made the relevant adjustments? [See the Currency integration.](/integrations/other/currency) ### Cash flow statement formulas Are any formulas missing? Check for cells that are blank where a formula should be. Are the signs correct? Asset formulas need a minus sign; liability and equity formulas need a plus sign. An increase in liabilities or equity means you've gained or kept liquidity. An increase in assets means you've tied up liquidity. Are balance sheet movement deltas set up correctly (this period minus previous period)? ### Journal entries Have any cash journal entries been posted to non-cash line items, causing them to be excluded from the cash flow statement? Look for journal entry descriptions that suggest cash activity: *invoice allocation*, *expense*. Have any non-cash journal entries been posted to cash line items, causing them to be incorrectly included? Look for descriptions that indicate non-cash activity: *depreciation*, *subsidiary*, *adjustment entry*. If the check is off in only one or a few months rather than consistently, the issue is likely a specific journal entry rather than a structural error. ## Check fails for forecast months Forecast the cash asset line item by referencing ending cash on the cash flow statement. This links the two statements together, a method called using cash as a plug. [See this guide.](/masterclasses/budgeting-forecasting/cf-forecasting/cf-fundamentals) When the cash asset value equals ending cash on the cash flow statement, the check is always zero. # Pick the right forecasting approach Source: https://docs.francis.app/masterclasses/budgeting-forecasting/forecasting-approaches How to pick between the three forecasting approaches: driver-based, statistical, and hardcoded. Decide your forecasting approach on a line-item-by-line-item basis. Different line items call for different approaches depending on their size, how predictable they are, and whether their movements are best explained by underlying drivers, historical patterns, or known one-off events. There are three approaches, and most models combine all three. ## Driver-based Forecast as a function of underlying assumptions, called drivers, rather than projecting from history. Drivers map to things people in the business actually understand and control: headcount plans, sales metrics, payment terms. When an assumption changes, everything connected to it updates. It reflects how finance teams think about causality, not just historical patterns. That transparency is also what makes driver-based models useful for scenario planning. It also requires you to define your assumptions and have good data on them. ## Statistical Forecast as a function of historical patterns. The simplest forms are last year's average plus a YoY growth rate, a rolling average, or a flat value. More sophisticated forms account for trend, seasonality, and effects from another line item. ## Hardcoded Hardcode the estimates. No formula, no driver, just a value. Sometimes called "dead numbers" because nothing flows through when assumptions elsewhere change. The right use case is a known one-off event at a specific time: a big accountant bill in August, a one-time consulting engagement, an annual audit fee. The number doesn't repeat or scale, so there's nothing for a driver or trend to learn from. Hardcoded values are fast to set up but become a maintenance and explainability problem. If you hardcode, use formula notes to document the reasoning. ## Choosing between the three Driver-based fits best when you want to model causality between drivers and the line item. As a general pattern, the biggest items on the P\&L, balance sheet, and cash flow warrant driver-based forecasting. These are typically items such as revenue, headcount, receivables, and VAT. Driver-based also matters more when the business is changing in ways history doesn't capture: startups or new business areas. Statistical fits better when a line item is pattern-based or when your data isn't granular enough for a clean driver. Smaller items like many OPEX categories, or static items like many balance sheet items, are fine on statistical. It does not fit contractual items like loans, where future movements are set by agreement rather than by trend. Hardcoded is the right choice for known one-off events at specific times, the fallback when there's no signal worth modeling, or a starting point when migrating an old Excel model to Francis during onboarding. The trade-off is effort and data. A driver model is more to build, and only as good as the drivers you pick and the data you have to estimate them. ## Hardcoded inputs are often statistical in disguise A common pattern: a department head submits hardcoded values, but estimated them as "last year's average plus 5%." That isn't really a hardcoded value. It's statistical forecasting written down without the logic. When this comes up, model it as an explicit function instead. The logic becomes transparent, scenarios become possible, and the next forecast cycle doesn't require a manual update. ## Starting hardcoded, migrating over time Finance teams onboarding to Francis often want to copy-paste their Excel budget straight in. That's fine. Hardcoded values get reporting running quickly, which is usually the fastest path to value. Once reporting is in place, migrate the larger line items to driver-based or statistical. The first cycle after migration is where the work pays off. # Forecast COGS Source: https://docs.francis.app/masterclasses/budgeting-forecasting/pnl-forecasting/cogs How to forecast cost of goods sold in Francis: driver-based, statistical, and hardcoded approaches, and when to use a supporting sheet. COGS moves with revenue more closely than any other P\&L line. The right forecasting method depends on how variable your cost structure is and how much granularity the model needs. ## What approach to use Driver-based is the right default for most COGS lines. If you can express cost as a function of revenue or volume, model it that way. Use statistical when you don't have the granular data for a clean driver, or when costs are stable enough that historical patterns are a reliable guide. Hardcoded is for exceptions: a fixed contract, a one-off cost, or a fallback when there's no signal worth modeling. ## Where to forecast COGS * **Directly on the P\&L:** right for most cases. A percentage-of-revenue formula or statistical projection lives on the COGS row itself. Simple to set up, easy to maintain. * **Supporting sheet:** right when COGS is driven by multiple inputs (unit economics, inventory levels, multiple product lines with different margin profiles). The sheet handles the complexity; the P\&L row references the result. If you're unsure, start directly on the P\&L. A supporting sheet is straightforward to add later once the model's complexity justifies it. ## Forecasting approaches The default for variable direct costs. Add a formula to the COGS row that references your revenue group and applies a cost percentage. When revenue assumptions change, COGS updates automatically. ```typescript theme={null} = "Revenue"[0] * "COGS % of Revenue"[0] ``` Add your COGS % of Revenue assumption to a separate assumptions sheet. The formula references it directly. For unit-based forecasting, the same driver logic applies with volume × unit cost as inputs instead of a revenue percentage. If unit costs vary by product line or are tied to inventory movements, build a supporting sheet and reference the total into the COGS row. Driver-based breaks down when the cost-to-revenue relationship is unstable: a business going through a significant change in cost structure, or where purchasing is lumpy and doesn't track revenue closely. Use this approach when costs are stable and the near future is expected to mirror recent history. The simplest setup is a YoY reference with a growth adjustment: ```typescript theme={null} = "COGS"[-12] * (1 + 5%) ``` If month-to-month actuals are volatile, a rolling average smooths the baseline: ```typescript theme={null} = avg_last("COGS", 3) * (1 + 5%) ``` For lines where trend and seasonality interact, `predict()` handles both automatically. Statistical becomes unreliable when costs have shifted structurally: a new supplier, a change in product mix, or a step-change in volume. Enter a value directly on the COGS row. No formula needed. Use hardcoded values for fixed costs that don't scale with revenue or volume: a fixed-price supply contract, a one-off bulk purchase, or a licensing fee with a fixed annual amount. Outside these cases, hardcoded COGS becomes a maintenance problem as volumes change. # Plan headcount Source: https://docs.francis.app/masterclasses/budgeting-forecasting/pnl-forecasting/headcount How to set up a dedicated headcount sheet in Francis, forecast salaries, and keep the P&L in sync. Salary forecasting involves enough moving parts (hire dates, increase cycles, pension rates, employer costs) that it needs its own sheet. A dedicated headcount sheet keeps the complexity contained and the P\&L clean. ## What approach to use Driver-based is the right default for headcount. Salary costs are determined by known inputs you control directly: hire dates, salary levels, increase cycles, pension rates. Model them explicitly rather than projecting from history. Use statistical when headcount is stable and salary increases follow a predictable annual pattern. It doesn't account for changes in the trend. Hardcoded is for discrete, known costs that don't follow a formula: bonuses, one-off contractor fees, signing bonuses. Not the right fit for recurring salary costs. ## Where to forecast headcount * **Dedicated sheet:** right for most cases. Salary data is sensitive, individual costs have multiple components, and a dedicated sheet gives you a single place to model and update across the team. The P\&L row references the total. * **Directly on the P\&L:** right for simpler cases: a stable team on statistical, or a one-off cost like a bonus hardcoded to a specific month. ## Forecasting approaches **Set up the sheet structure** Create a dedicated sheet with two sections: **Assumptions** at the top and salary totals below. In the **Assumptions** section, add rows for variables that apply across all employees: salary increase percentage, pension percentage, or any other shared inputs. These become the single inputs that drive calculations across the sheet. A common approach adds a group per employee or role with rows for base salary, pension, and other employer costs. Consider grouping employees into groups for departments. If you use dimensions, you can break down actuals by department without splitting GL accounts into separate rows. The headcount sheet is primarily a forecasting tool: build your plan at the employee or role level, then reference the totals on the P\&L where they sit alongside actuals at the department level. **Enter starting salaries** For each current employee, enter their monthly salary directly on the **Salary** row. This is the baseline the forecast builds from. **Forecast ongoing salaries** On each salary row, reference the prior month and apply the salary increase assumption: ```typescript theme={null} = "Salary"[-1] + ("Salary"[-1] * "Salary increase"[0]) ``` In months where the salary increase assumption is zero, the salary carries forward unchanged. When the assumption fires, the increase is applied automatically. **Model salary increases** The `if_month()` logic lives on the **Salary increase** row in the Assumptions section, not on the salary row itself: ```typescript theme={null} = if_month(6) * 3% ``` This sets the increase to 3% in month 6 and zero in all other months. Adjust the month number and percentage to match your review cycle. Because every salary row references the same assumption, updating it in one place updates every employee automatically. **Add pension and employer costs** Reference the salary row and apply the pension percentage from the Assumptions section: ```typescript theme={null} = "Salary"[0] * "Pension %"[0] ``` Add a row for other salary-related costs using the same pattern with the relevant percentage. **Model new hires** For a new hire joining mid-year, leave the **Salary** row empty for months before their start date. Enter their salary directly in the month they join, then apply the ongoing salary formula from the following month forward. As you move the Forecast Start date forward, periods that were forecast become actuals. Enter actual salary values for those periods on the headcount sheet. Formulas referencing prior months will break if the preceding actuals period is empty. If you don't have actuals, put the budget numbers into the actuals layer to avoid formulas breaking. The right fit for a stable workforce with predictable annual salary increases. If headcount is steady and increases follow a known pattern, a YoY reference with a growth rate captures the forecast accurately: ```typescript theme={null} = "Total salary cost"[-12] * (1 + 5%) ``` Statistical loses individual visibility: you can't see specific salaries or model hires and departures. It breaks down when headcount is changing. New teams, rapid hiring, or significant restructuring all make the historical pattern an unreliable base. The right fit for discrete, known costs that don't follow a formula: bonuses paid at a specific time, a one-off contractor engagement, or a signing fee. Enter the value directly on the relevant row in the month it applies. For recurring salary costs, hardcoded values become a maintenance problem quickly: any hire, departure, or salary change requires a manual update across every future month. Use driver-based for those. # Forecast OPEX Source: https://docs.francis.app/masterclasses/budgeting-forecasting/pnl-forecasting/opex How to forecast operating expenses in Francis: driver-based, statistical, and hardcoded approaches across different cost lines. OPEX covers a wide range of cost lines (software, marketing, facilities, professional services), each with different predictability and drivers. Salaries and payroll are covered on the [Headcount](/masterclasses/budgeting-forecasting/pnl-forecasting/headcount) page; this page covers the rest. ## What approach to use Statistical is the right default for most OPEX lines. Recurring costs without a clear driver are well-served by a rolling average or a YoY reference. Use driver-based only when a meaningful, reliable driver exists for the cost line. Equipment and rent are good examples: where cost scales with headcount, model it as # FTEs × cost per FTE. For most OPEX items, statistical is simpler and often more accurate. Avoid forcing a driver where the relationship is weak. Use hardcoded for committed costs where the amount and timing are already fixed: a signed contract, an annual software renewal, a booked consulting engagement. A signed contract isn't a forecast. Enter the number. ## Where to forecast OPEX * **Directly on the P\&L:** right for most cases. A rolling average or hardcoded value lives on the cost row itself. Simple to set up, easy to maintain. * **Supporting sheet:** right when a cost area has multiple inputs or needs granular breakdown (software split by vendors, marketing split by channel). The sheet handles the detail; the P\&L row references the total. ## Forecasting approaches Use driver-based when a meaningful, reliable driver exists for the cost line. Add a formula that links the cost to its driver and add the assumption to a separate assumptions sheet. Equipment and rent are good examples where cost scales with headcount: ```typescript theme={null} = "Headcount"[0] * "Cost per FTE"[0] ``` Marketing spend as a percentage of revenue is another common pattern: ```typescript theme={null} = "Revenue"[0] * "Marketing %"[0] ``` Avoid forcing a driver where the relationship is weak. A loose correlation produces a less accurate forecast than a rolling average, with more complexity to maintain. The right fit for most OPEX lines. When costs are stable and historical patterns are a reliable guide, a rolling average smooths short-term volatility: ```typescript theme={null} = avg_last("Software subscriptions", 3) ``` Where seasonal patterns matter, reference the same month last year with a growth adjustment instead: ```typescript theme={null} = "Marketing"[-12] * (1 + 10%) ``` For lines where trend and seasonality interact, `predict()` handles both automatically. Statistical becomes unreliable when a cost line has changed structurally: a renegotiated contract, a shift in spend policy, or a significant scale change. Use hardcoded values for committed costs where the amount and timing are already known: a signed office lease, an annual software contract, a booked consulting engagement. There's no forecasting uncertainty to model; enter the value directly. For recurring costs without a fixed amount, hardcoded values require a manual update every cycle and become a maintenance problem over time. # P&L fundamentals Source: https://docs.francis.app/masterclasses/budgeting-forecasting/pnl-forecasting/pnl-fundamentals How to work with the P&L in Francis: structuring the template, mapping GL accounts, and setting margins and sign conventions. The P\&L is often where you start in Francis. It's where you forecast and report income and expenses, and it sets the structure the rest of the model builds on. ## The Francis P\&L template The template includes the classic P\&L categories you'll find in most charts of accounts: revenue, COGS, OPEX, financial items, depreciation, and taxes. OPEX is split further into sales and marketing, admin, rent, and professional services. That structure makes it easy to map your general ledger accounts onto the template. It also includes margins such as gross margin and profit margin. Redesign the P\&L with components however suits your business. Some teams split gross profit into Gross profit I, II, and III. Others report contribution margin instead of gross profit. Add, rename, and regroup lines as you see fit. ## Map your GL accounts to the P\&L Map all your P\&L GL accounts to the P\&L. There are two schools of thought in Francis. Some prefer a clean P\&L, where GL accounts are grouped into reader-friendly lines. Others prefer an accounting-oriented layout, with one line per GL account for a direct link to the chart of accounts. We recommend fewer, cleaner line items. It keeps the model manageable, and you rarely need full chart-of-accounts granularity in a budget. GL accounts are often created with a different purpose in mind than planning and reporting. ## Sign conventions When you budget and forecast, follow the sign convention: income positive, expenses negative. This matches how actuals arrive from your accounting system, so every subtotal down the P\&L is a sum rather than a subtraction. ## Margins For margin rows, wrap the formula in `ignore_div_zero()` so it returns zero in periods where revenue is zero, rather than a `#DIV/0` error. ## Aggregation Aggregate P\&L lines by SUM, since the P\&L reflects performance over a period. Aggregate margins by weighted average, so the total column on the right shows a correct blended margin instead of a sum of percentages. # Gather budget input from departments Source: https://docs.francis.app/masterclasses/business-partnering/gathering-budget-input How to collect budget input from department heads and translate it into Francis. Gathering budget input is a coordination problem as much as a modeling problem. Department heads know their numbers; finance owns the model. ## Structure the model first Collecting input only works if the model is structured for it. Break the P\&L down by department using [breakdowns](/features/using-francis/breakdowns), or create a purpose-built sheet for the department head, so each head sees only their own numbers. Grant each head Limited Viewer access to their sheet(s) so they can review and comment on their numbers without touching the rest of the model. ## Collect input As Limited Viewers, department heads can view and comment on their numbers, but the finance team makes every change. There are three ways to collect input: 1. **Comments in Francis.** The department head leaves a comment on the relevant row, such as "add two FTEs in Q2" or "change to 40K", and finance updates the value. Reply in the thread to clarify or discuss before you make the change. 2. **A live working session.** Finance sits down with the department head, walks through the numbers together, and enters the figures during the conversation. 3. **An Excel template.** Download the model to Excel, remove the sheets that don't belong to the department head, and share the file as a template for them to fill out. When it comes back, copy the numbers into Francis or replicate their formulas. Once you have the input, translate it into the model. How you update a row depends on how it was set up. If a row is hardcoded, copy-paste the new figure directly. If it is formula, build the formula in Francis. Limited Viewers currently have view access only, so no unintended changes reach the model. Letting department heads propose suggestions or make direct edits is on the roadmap. ## Track progress Use [status indicators](/features/using-francis/components) to manage the round. At the start of the round, mark rows **To-do**. Move them to **In progress** when input is received but not yet entered, and **Done** when the model reflects the agreed figures. # Run monthly performance reviews Source: https://docs.francis.app/masterclasses/business-partnering/performance-reviews Set up a monthly performance review cadence with department heads using Limited Viewer access to dashboards and sheets. A monthly performance review keeps department heads accountable to their numbers. Invite them as Limited Viewers into the dashboards and sheets that cover their area, and the review becomes a recurring conversation grounded in the live model. A Limited Viewer sees only the sheets and dashboards you explicitly grant them access to. They can view data, download reports, drill into journal entries, and comment, but they cannot change the model. That makes it safe to share widely and build a fixed monthly cadence around. ## Set the review cadence Open the dashboard or sheet you want to share and click **Share**. Enter the department head's email and invite them; Francis assigns the Limited Viewer role automatically and restricts their access to what you shared. Repeat for each person, granting each head only their own area. With access in place, the review runs on a fixed schedule. Each month, the department head reviews their performance against budget in the same place, and you meet to discuss variances and revise assumptions for the months ahead. ## Design a dashboard per review Build a [dashboard](/features/using-francis/dashboards) for each performance review rather than pointing the department head at the full P\&L. Non-finance colleagues are often overwhelmed by a wall of numbers, and the conversation stalls while everyone hunts for the line that matters. A focused dashboard with the few KPIs and charts relevant to that department frames the discussion instead. Show budget versus actuals, the variances worth explaining, and the trends that drive the next forecast. The department head can check it whenever they want, or you can export it to PDF each month and send it round ahead of the meeting. ## Give sheet access for drill-down Some department heads want to understand the numbers in more detail than a dashboard shows. Grant them access to the underlying sheet as well. From there they can drill down through the model, all the way to the individual journal entries behind a figure, without any ability to change what they see. # Consolidate multi-entity financials Source: https://docs.francis.app/masterclasses/consolidation/consolidation Set up entity breakdowns, sub-consolidations, and eliminations to reflect your group structure in Francis. Build your consolidation with an [entity breakdown](/features/using-francis/breakdowns). Apply the breakdown and every entity follows one shared template, so the group consolidates automatically as actuals and forecasts roll up. This guide covers reflecting your group structure in Francis: mapping entities to sheets, eliminating intercompany transactions, building sub-consolidations, and layering in adjustments like IFRS or transfer pricing. It's for finance teams running multi-entity groups who want the consolidation to stay correct without manual rework. ## Each entity gets a sheet When you apply a breakdown, each entity gets its own sub-sheet. In the breakdown settings, reached from the three-dot menu next to the breakdown then **Adjust breakdown**, you assign each accounting system connection to the entity sub-sheet it feeds. This links a data source to a sheet. It's separate from mapping GL accounts to line items, which you do once on the shared template, covered below. You can create new sheets for new entities at any time. When a new accounting system is connected, Francis notifies you to map it to a sheet so the consolidation stays complete. Add sheets from the three-dot menu, **Add sheet**. Because every entity follows the same P\&L and balance sheet template, the group always consolidates cleanly. Map all GL accounts to that shared structure. Where entities use the same accounts for a line item, point them all at the same line: one line carries every account and filters the actuals per sub-sheet automatically. Entities' charts of accounts won't always match. Some drift apart over time, and some entities genuinely run different operations. Either way, add all the accounts to the structure. A line item with no mapping for a given entity simply shows zero, and those zeros are the price of a consolidation that always ties out. When the differences come from genuinely different operations, put those lines in their own group in the P\&L or balance sheet, then collapse the group in the entities where it doesn't apply. In practice, some revenue and COGS accounts often vary per legal entity, while everything below gross profit (salaries, rent, sales and marketing, admin) fits standard buckets. ## Eliminations are included via separate sheets Put eliminations on their own sheet. The entity sub-sheets keep their correct standalone numbers, and the eliminations only apply at the consolidated level. In practice, write formulas on the elimination sheet that pull each IC value from the entity, with a leading minus to offset it. The one prerequisite is separate line items for IC, so there's a clean value to reference. Structure your IC data in your accounting system on separate GL accounts or dimension values. That makes it easy to isolate IC on its own line items in Francis. If you have subgroups, add multiple elimination sheets to capture eliminations at the subgroup level rather than only the top group. Decide where in the group structure each elimination sheet sits, then input the elimination formulas in the right place so the subtotals come out right. This works only if you can split eliminations by counterparty. In a sub-consolidation, you want to eliminate only the IC between the entities in that subgroup. If that IC is mixed together with IC against entities in other subgroups, you can't isolate it on the local sub-consolidation, and you must eliminate it at the top level instead. These are the eliminations a group typically needs. One entity bills another. The seller books IC revenue, the buyer books the matching IC cost. Offset both sides so they cancel at group level. The balance sheet side of IC trading. The unpaid portion sits as a receivable on the seller and a payable on the buyer. Eliminate the receivable against the payable. A parent charges its subsidiaries a fee: income to the parent, a cost to each subsidiary. Eliminate both sides. If the fee is a fixed amount, the elimination can reference a hardcoded value rather than a GL row. A loan is a financial asset for the lender and a liability for the borrower. Eliminate both. The interest on the loan needs eliminating too, from the P\&L and the balance sheet. Eliminate the parent's investment in each subsidiary against the subsidiary's equity and retained earnings, so the group doesn't double-count the net assets it already consolidates line by line. ### IC reconciliation If you have many eliminations, add a separate IC reconciliation sheet. For each IC pair, write a formula that takes the difference between the two sides as a test of whether they net to zero. Build one test per pair, and any non-zero result points you straight at the mismatch. Reconciliation becomes stronger the more granular data you have. For example, recording IC in dedicated GL accounts per entity pair. When your group has more than two entities, create separate IC accounts for each pair, for example DK-UK, UK-US, and DK-US. If all IC sits in shared accounts, you can't tell whether eliminations are accurate or which entity relationships are mismatched or incomplete. It matters most for cross-currency IC, where small differences between the two sides are expected from exchange rate movements. Without separated pairs, those differences are hard to investigate. ### Eliminations across currencies Each entity records the same IC transaction in its own base currency, and Francis converts each side separately to the reporting currency. The converted amounts often differ slightly, because the exchange rates Francis uses differ from the ones used in your accounting system. Add an FX fluctuation row to the P\&L or balance sheet structure with a formula that takes the residual between the two eliminated amounts, so the two sides net to zero at group level. The residual method can also absorb accounting mispostings. If you rely on Francis to reconcile eliminations, sanity-check that the FX differences sit within reasonable bounds and aren't hiding mispostings. ## Create sub-consolidations via roll-ups Build sub-consolidations with roll-ups. Open the three-dot menu, choose **Add roll-up**, and drag the relevant entity sub-sheets into it. A roll-up gives a clean consolidated view for any slice of the group, a legal holding layer, a region, or any other grouping, without duplicating the model structure. ## Other adjustments such as IFRS and transfer pricing Handle other consolidation adjustments the same way as eliminations: on separate sheets that apply only at the consolidated level. IFRS adjustments, transfer pricing, and similar group-level entries each go on their own sheet, leaving the entity sub-sheets correct for standalone reporting. Make the actual adjustments by writing formulas on the adjustment sheet, referencing the relevant entity values and applying the correction. Those adjustments then flow into the consolidated total without touching the underlying entity numbers. ## Common use cases ### Standard consolidation The common case is three entities and an elimination sheet. Give each entity its own sub-sheet and add one sheet for eliminations. The top-level sheet consolidates all three entities net of eliminations. ### Consolidation with subgroups For a group with subgroups, the holding entity sits at the top and each subgroup gets its own roll-up. Take a holding company over two subgroups, each with three operating companies. Build a roll-up per subgroup, drag its three operating-entity sub-sheets in, and the top level rolls the two subgroups and the holding into the group view. Place an elimination sheet inside each subgroup for the IC transactions within it, and one at the top for cross-subgroup eliminations. That way every subtotal, subgroup and group, comes out right. ### Regional splits Group entities by geography with roll-ups. Add a roll-up per region, for example EMEA and Americas, and drag each region's entity sub-sheets in. The top-level sheet rolls up all regions, giving you a regional P\&L alongside the group view in one model. ### Single entity with department breakdown If you run as a single legal entity, skip the entity breakdown and build a [P\&L per department](/masterclasses/consolidation/department-pnls) instead. You get the same per-department forecasting without a consolidation layer. # Build a P&L per department Source: https://docs.francis.app/masterclasses/consolidation/department-pnls Deploy one P&L template across every department using a dimension breakdown, with actuals flowing in automatically. As a company grows, finance usually wants to plan and hold each department accountable for its own numbers. If your accounting system tags entries with a department dimension, you can deploy a single P\&L template across every department in Francis, with actuals flowing into each one automatically. ## Split the P\&L by department Most companies already carry a department dimension in their accounting system, with a value for each department on the relevant journal entries. Francis reads those values directly, so the departments are available to break down by without any setup. Break the P\&L down by department with a [breakdown](/features/using-francis/breakdowns). The sheet becomes a template: you build the P\&L structure once on the parent sheet, every department inherits it, and each department's actuals filter into its own sub-sheet. Department heads plan their own numbers, the entity rolls them up, and the consolidated sheet rolls up all entities. On a multi-entity model, split by entity first and then by department, as covered in the [breakdowns](/features/using-francis/breakdowns) walkthrough. A dimension breakdown always sits under an entity, never on the consolidated sheet. ## Keep the balance sheet and cash flow at entity level Split the P\&L by department, but keep the balance sheet and cash flow in a separate sheet broken down by entity only. Companies rarely tag balance sheet values with a department, so a full balance sheet per department is just noise, with the **Unallocated** sub-sheet carrying nearly every value. Keep the model clean instead: the P\&L splits by entity and department, and the balance sheet and cash flow split by entity alone. The cash flow then pulls its P\&L inputs (net profit, the depreciation add-back) at entity level, giving you cash flow per entity without a departmental split it doesn't need. ## Departments that are only cost centres Sometimes departments are pure cost centres, so you only want to plan their OPEX rather than a full P\&L. Even then, deploy the full P\&L template for simplicity and just leave the lines that don't apply (revenue, direct costs, financial items, depreciation) at zero on those sub-sheets. The zero rows roll up correctly and don't affect totals. Each department sub-sheet becomes an OPEX planning view by default, which is usually exactly what the department head needs, while the entity and consolidated sheets still show the full P\&L. This keeps the number of sub-sheets to a minimum and everything rolls up cleanly. # Masterclasses Source: https://docs.francis.app/masterclasses/overview Playbooks for the core finance workflows in Francis. Consolidate your group and split by dimensions. Create budgets and forecasts that automatically roll forward every month. Build monthly management reports that automatically update. Make department heads own their numbers. # Build a management report Source: https://docs.francis.app/masterclasses/reporting/management-report A page-by-page walkthrough of a Francis management report template, with the primitives that produce each page. The primary report created by Francis customers is the monthly management report. You can create such a report with Francis dashboards. The template below shows a 19-page management report built in Francis, for inspiration. Each page shows what it looks like and the primitives that build it. Cover **Primitives** * Title: [heading](/features/using-francis/dashboards) (H1) * Company logo: [image](/features/using-francis/dashboards) * White space: [spacer](/features/using-francis/dashboards) Agenda **Primitives** * Title: [heading](/features/using-francis/dashboards) (H1) * Agenda list: [text](/features/using-francis/dashboards) * Bicycle photo: [image](/features/using-francis/dashboards) Executive summary **Primitives** * Title: [heading](/features/using-francis/dashboards) (H1) * KPI highlights: [metric boxes](/features/using-francis/dashboards) * LTM revenue and margin: [combo chart](/features/using-francis/charts/combo) * Commentary: [text](/features/using-francis/dashboards) Consolidated P&L performance **Primitives** * Title: [heading](/features/using-francis/dashboards) (H1) * P\&L statement: [table](/features/using-francis/tables/overview) * Commentary: [text](/features/using-francis/dashboards) Consolidated BS performance **Primitives** * Title: [heading](/features/using-francis/dashboards) (H1) * Balance sheet: [table](/features/using-francis/tables/overview) * Commentary: [text](/features/using-francis/dashboards) Consolidated CF performance **Primitives** * Title: [heading](/features/using-francis/dashboards) (H1) * Cash flow statement: [table](/features/using-francis/tables/overview) * Commentary: [text](/features/using-francis/dashboards) * White space: [spacer](/features/using-francis/dashboards) KPI performance **Primitives** * Title: [heading](/features/using-francis/dashboards) (H1) * KPI matrix: [table](/features/using-francis/tables/overview) * White space: [spacer](/features/using-francis/dashboards) Net working capital breakdown **Primitives** * Title: [heading](/features/using-francis/dashboards) (H1) * NWC composition: [waterfall chart](/features/using-francis/charts/waterfall) * Commentary: [text](/features/using-francis/dashboards) Status: CPH studio **Primitives** * Title: [heading](/features/using-francis/dashboards) (H1) * Status commentary: [text](/features/using-francis/dashboards) * Non-current assets: [table](/features/using-francis/tables/overview) * Studio photo: [image](/features/using-francis/dashboards) Appendix I: monthly revenue review **Primitives** * Title: [heading](/features/using-francis/dashboards) (H1) * White space: [spacer](/features/using-francis/dashboards) Revenue performance per channel **Primitives** * Title: [heading](/features/using-francis/dashboards) (H1) * Revenue bridge by channel: [waterfall chart](/features/using-francis/charts/waterfall) Revenue performance per entity **Primitives** * Title: [heading](/features/using-francis/dashboards) (H1) * Revenue bridge by entity: [waterfall chart](/features/using-francis/charts/waterfall) Appendix II: YTD review **Primitives** * Title: [heading](/features/using-francis/dashboards) (H1) * White space: [spacer](/features/using-francis/dashboards) P&L breakdown **Primitives** * Title: [heading](/features/using-francis/dashboards) (H1) * Revenue to EBITDA bridge: [waterfall chart](/features/using-francis/charts/waterfall) * Commentary: [text](/features/using-francis/dashboards) Cash flow performance **Primitives** * Title: [heading](/features/using-francis/dashboards) (H1) * Cash bridge: [waterfall chart](/features/using-francis/charts/waterfall) * Commentary: [text](/features/using-francis/dashboards) Appendix III: misc. **Primitives** * Title: [heading](/features/using-francis/dashboards) (H1) * White space: [spacer](/features/using-francis/dashboards) Working capital: LTM trends **Primitives** * Title: [heading](/features/using-francis/dashboards) (H1) * Six trend charts: [line charts](/features/using-francis/charts/line) * Commentary: [text](/features/using-francis/dashboards) P&L breakdown by department **Primitives** * Title: [heading](/features/using-francis/dashboards) (H1) * Departmental P\&L: [table](/features/using-francis/tables/overview) * Commentary: [text](/features/using-francis/dashboards) BS breakdown by entity **Primitives** * Title: [heading](/features/using-francis/dashboards) (H1) * Balance sheet by entity: [table](/features/using-francis/tables/overview)