Resultify logo Fortnox app for HubSpot

Get started with Fortnox to HubSpot sync app

This describes the process of how to set up and install the app.

Setup in HubSpot

Note that you also need to buy the Fortnox app on HubSpot marketplace to have the full integration working.

  • Search for the Fortnox app in HubSpot Marketplace or click here
  • Click on the installation button.
  • Select the account you want to use for installing the Fortnox app and click on Choose account.

Choose HubSpot account

  • Click on Connect app to give the app permission to install the Fortnox app in your account.

Connect HubSpot app

  • You will then be redirected to the authentication window for Fortnox.

Setup in Fortnox

  • Enter the username for the Fortnox account to use.

Enter the username for Fortnox

  • Enter the password for the Fortnox account to use.

Enter the password for Fortnox

  • Click on Godkänn behörighet to give the app permission to install the Fortnox app in your account.

Connect Fortnox app

Finish setup

  • You have now installed the Fortnox app in your HubSpot account and added it to your Fortnox account.
  • A sync will be made within the next 2 hours for the Customer registry from Fortnox into HubSpot Company entities. If it is activated in the App settings

Companies in HubSpot

Syncing

Here are the information that are synced for the different entities.

Fortnox to HubSpot

Syncing companies

  • Once every second (2) hour a sync is being made for Companies from Fortnox to HubSpot. It includes both creating and updating Companies.
  • The check-up for if a Customer exists is the following order name, fortnox_id and then last domain
  • To reduce the risk of duplicated companies, make sure your customers are properly named in HubSpot.
Field HubSpot Direction Field Fortnox Description
Company: fortnox_id <- CustomerNumber Field created by the Fortnox app to keep track of which customer it is related to
Company: organization_number_from_fortnox <- OrganisationNumber Field created by the Fortnox app. Swedish organisation number, or for international companies: DUNS number or EU VAT number
Company: name <- Name
Company: address <- Address1
Company: address2 <- Address2
Company: city <- City
Company: zip <- ZipCode
Company: phone <- Phone
Company: billing_email <- EmailInvoice (fallback to Email) Custom field created by the app for storing a single billing email address. Synced from Fortnox customer's EmailInvoice field (or Email field if EmailInvoice is not available). Used when creating invoices in Fortnox from HubSpot deals.
Company: fortnox_cost_center <- CostCenter Cost center code. Synced from Fortnox. Used when creating customers and invoices in Fortnox. Input is normalized to uppercase.

Syncing products

  • Once every 30 minutes a sync is being made for Products from Fortnox to HubSpot. It includes both creating and updating Products.
  • The check-up for if a Products exists is the by checking the SKU (hs_sku)
Field HubSpot Direction Field Fortnox
Product: SKU (hs_sku) <- ArticleNumber
Product: name <- Description
Product: description <- Description
Product: price <- SalesPrice (fallback); Fortnox price list for the HubSpot company currency when mapped — details
Product: Cost of goods sold (hs_cost_of_goods_sold) <- PurchasePrice
Product: tax <- VAT
Product: Status (hs_status) <- Active, Expired

Product Status: The HubSpot Status property (hs_status) uses internal values "active" and "inactive". It is derived from Fortnox article flags: when Active is true and Expired is false, the product is set to active. Otherwise it is set to inactive.

Product pricing (multi-currency)

Besides the article Sales price in Fortnox, the integration can use Fortnox price lists so HubSpot products get correct amounts in your portal company currency and, when applicable, extra HubSpot multi-currency price fields (hs_price_sek, hs_price_eur, etc.).

If your Fortnox lists use short codes (e.g. A, B) without the currency in the name, your integration team maps each list code to an ISO currency (for example SEK, EUR). Only mapped lists are used; the main HubSpot Price for your company currency uses the matching list when configured, otherwise it falls back to Fortnox Sales price.

Release notes — Fortnox price lists & multi-currency product prices

Syncing invoices to deals

This feature lets you import invoices from Fortnox and to deals in HubSpot.

First time setup:

If you enable this feature, a new sales pipeline named "Fortnox Invoices" will be created in HubSpot specifically for these invoices.

This pipeline will have four stages: Unpaid, Paid in Full, Unpaid Overdue, and Credited.

While import to deals is enabled in the app, each import run checks that this pipeline still exists. If the pipeline is missing, the app can create it again (same as turning the setting on) so imports can continue, without a separate step.

Important:
Invoices can only be imported if these conditions are met:
  • The "Fortnox Invoices" pipeline and its stages must exist in HubSpot and match the app’s stored configuration. If the pipeline was deleted, the next import (with import still enabled) can recreate the default pipeline—see Release notes (Fortnox pipelines on sync).
  • The currency used on the invoice must be part of the current effective currency codes for the HubSpot portal.
  • The company listed on the invoice must already be imported as a company in HubSpot.
Mappings:
Field HubSpot Direction Field Fortnox
Deal: invoice_number_in_fortnox <- DocumentNumber
Deal: final_pay_date_in_fortnox <- FinalPayDate
Deal: amount <- Calculation: TotalToPay - (TotalVAT + RoundOff)
Deal: deal_currency_code <- Currency
Deal: closedate <- DueDate
Deal: createdate <- InvoiceDate
Deal: name <- InvoiceType DocumentNumber - CustomerName
Deal: description <- Comments
Deal: order_number <- YourOrderNumber
Line items: hs_sku <- InvoiceRow ArticleNumber
Line items: name <- InvoiceRow Description
Line items: quantity <- InvoiceRow DeliveredQuantity
Invoice PDF attached to the deal

When a Fortnox invoice is synced into a HubSpot deal, the invoice PDF is also attached to the deal as a Note (visible in the deal's activity timeline).

  • When: on first import, and again whenever the deal stage changes (e.g. UnpaidPaid in Full, UnpaidCredited, UnpaidOverdue). If a re-sync doesn't change the stage, no new PDF is uploaded.
  • Direction: Fortnox → HubSpot only. PDFs are not uploaded back to Fortnox when a deal triggers a HubSpot → Fortnox flow.
  • File location: HubSpot Files under /fortnox-invoices/<portalId>/, access set to Private (only authenticated CRM users can view).
  • Failure handling: if download or upload fails, the deal sync still succeeds and the error is logged.

Syncing Fortnox Orders to HubSpot Orders

When Fortnox orders to HubSpot orders is enabled in App settings, the app can create or update HubSpot Order records from Fortnox orders discovered via the scheduled fetch job (optional env REPEATABLE_JOB_ORDERS_TO_HUBSPOT_PATTERN). Orders that are makulerade in Fortnox (Cancelled) are still synced with hs_external_canceled_date set (which drives Is Canceled in HubSpot); the sync does not add deal, quote, or company associations for those orders. If the Fortnox order Remarks contain HUBSPOT_DEAL_ID:<dealId> (this marker is added when a Fortnox offer is created from a HubSpot Quote, and may carry over when the offer becomes an order in Fortnox), the app also links the HubSpot Order to that Deal and adds the same Contact, Company, and Line item associations as the Deal (so the Order mirrors the Deal’s CRM relationships). If Fortnox OfferReference is set (the offer’s document number when the order was created from an offert), the app finds the HubSpot Quote whose fortnox_offer_document_number matches; that quote is associated to the Order. If the deal was not already taken from Remarks, the app uses that quote’s single associated deal for the same contact/company/line item associations. If no deal is resolved that way, the HubSpot Order is still created or updated from Fortnox (name, currency, total, external id). If the order has a CustomerNumber and a HubSpot Company exists with fortnox_id equal to that customer number (same linking as for invoices), the Order is associated to that company; otherwise it may stay unlinked from deals and companies.

Fortnox order pipeline (optional)

As with the Fortnox invoice deal pipeline, you can optionally enable a separate HubSpot Order pipeline named Fortnox order with stages Open, Processed, Shipped, Delivered, and Cancelled. On sync, the app sets hs_pipeline and hs_pipeline_stage from Fortnox: Cancelled → Cancelled; not Sent → Open; Sent and not NotCompleted → Delivered; Sent, NotCompleted, and WarehouseReady → Shipped; otherwise (still NotCompleted) → Processed. While the order pipeline is enabled in the app, each order sync can recreate the default pipeline in HubSpot if it is missing. If you turn off the order-pipeline feature in the app but old pipeline/stage IDs are still stored, the app does not auto-recreate until you re-enable the feature or clear that state. Do not delete the pipeline or its stages in HubSpot on purpose, or the stored configuration may no longer match.

Mappings:
Field HubSpot (Order) Direction Field Fortnox Notes
Order: hs_order_name <- DocumentNumber Format: Fortnox order {DocumentNumber}
Order: hs_currency_code <- Currency Defaults to SEK if missing
Order: hs_external_order_id <- DocumentNumber Used to find or upsert the HubSpot order
Order: hs_total_price <- Total Set when Total is present on the Fortnox order
Order: hs_external_canceled_date <- Cancelled Yesterday’s date (UTC YYYY-MM-DD) when makulerad; cleared when not cancelled — HubSpot sets Is Canceled from this field
Association: Order ↔ Deal <- Remarks When present: deal id parsed from HUBSPOT_DEAL_ID:<id> in Remarks (takes precedence)
Association: Order ↔ Quote <- OfferReference Search Quote by fortnox_offer_document_number = OfferReference; associate Order ↔ that Quote when found
Association: Order ↔ Deal <- OfferReference If no deal from Remarks: use that quote’s single quote_to_deal association
Associations: Order ↔ Contacts, Companies, Line items <- (via Deal) Same records associated to the Deal are associated to the Order
Association: Order ↔ Company <- CustomerNumber When no deal is linked: company search by fortnox_id = CustomerNumber
Order: fortnox_labels <- Labels[].Description Multi-select; only values internal, external, warranty, order are stored
Order: fortnox_terms_of_payment <- TermsOfPayment Betalningsvillkor (e.g. 30, 10, Z)
Order: fortnox_your_order_number <- YourOrderNumber Customer purchase order number (PO Number)
Order: fortnox_invoice_email <- EmailInformation.EmailAddressTo Invoice email
Order: fortnox_delivery_date <- DeliveryDate Leveransdatum (YYYY-MM-DD)
Order: fortnox_way_of_delivery <- WayOfDelivery Leveranssätt (Fortnox code, e.g. POST, BUDBIL)
Order: fortnox_terms_of_delivery <- TermsOfDelivery Leveransvillkor (Fortnox code, e.g. FRITT, EXW)
Order: fortnox_your_reference <- YourReference Er referens
Order: fortnox_billing_address_street / city / postal_code / country <- Address1 / City / ZipCode / Country Faktureringsadress (custom HubSpot order properties; HubSpot has no native billing address on Order)
Order: hs_shipping_address_street / city / postal_code / country <- DeliveryAddress1 / DeliveryCity / DeliveryZipCode / DeliveryCountry Leveransadress (HubSpot Order standard shipping address fields)

HubSpot to Fortnox

Create an Invoice

When an Invoice is created in Fortnox based on a HubSpot Deal, following fields are mapped. Only a few Fortnox fields are populated to use Fortnox default handling of invoices.

Field HubSpot Direction Field Fortnox
Deal: deal_currency_code -> Currency
Company: fortnox_id -> CustomerNumber
Contact: firstname lastname -> YourReference
Deal: hubspot_owner_id (firstname lastname) -> OurReference
Deal: agreement_start_date, agreement_end_date -> Remarks (appended before description, localized based on currency)
Deal: description -> Remarks (appended after agreement dates if they exist)
Line item: hs_sku -> ArticleNumber
Line item: name -> Description
Line item: quantity -> DeliveredQuantity
Line item: price -> Price
Line item: discount or hs_discount_percentage -> Discount
Line item: calculated (hs_total_discount or hs_discount_percentage) -> DiscountType ('AMOUNT' or 'PERCENT')
Line item: tax -> VAT
Company: billing_email -> EmailInformation.EmailAddressTo
Company: fortnox_cost_center -> CostCenter
Deal: order_number -> YourOrderNumber
Deal: fortnox_print_template -> PrintTemplate (only when set to delivery note)
Deal: fortnox_invoice_type -> InvoiceType (only when set to CASHINVOICE)
Deal: fortnox_payment_way -> PaymentWay (CASH, CARD, AUTOGIRO; default: omitted)
Deal: fortnox_way_of_delivery -> Before invoice: for PRINT / EMAIL / PRINTSERVICE, PUT customer DefaultDeliveryTypes.Invoice (+ EmailInvoice when EMAIL). After POST /3/invoices: GET …/print, …/email, …/eprint, or …/einvoice (before optional bookkeep). E-INVOICE only runs the send step.
Deal: amounts_include_vat -> VATIncluded (only when Yes: true; default: omitted)
Deal: fortnox_bookkeep_after_create -> After successful new invoice (and after optional send from fortnox_way_of_delivery): PUT …/bookkeep (optional; default: no booking)
Deal: fortnox_kreditfaktura + fortnox_credit_invoice_reference -> When kreditfaktura is JA: PUT …/credit on the debit document number in fortnox_credit_invoice_reference (no line-item POST for this path)

Create a Company

The Fortnox to HubSpot sync app allows you to create a company in Fortnox based on a HubSpot company. This feature can be enabled or disabled from the app settings in HubSpot.

Field HubSpot Direction Field Fortnox Description
Company: address -> Address1
Company: address2 -> Address2
Company: city -> City
Company: fortnox_id -> CustomerNumber Field created by the Fortnox app to keep track of which customer it is related to
Company: name -> Name
Company: organization_number_from_fortnox -> OrganisationNumber Field created by the Fortnox app for getting the Organization Number for easier identification
Company: phone -> Phone1
Company: zip -> ZipCode
Company: fortnox_cost_center -> CostCenter Cost center code. Normalized to uppercase. Created in Fortnox if it does not exist. Requires costcenter scope.

Create a Fortnox Offer from a Quote

When a Fortnox offer (offert) is created from a HubSpot Quote, the app maps Quote line items and related deal/company data to Fortnox (same line-row logic as Create an Invoice from a deal). Enable HubSpot quote to Fortnox offer in App settings, and use the Quote properties Create offer in Fortnox (create_offer_in_fortnox) and Fortnox offer document number (fortnox_offer_document_number) after a successful create.

Triggering is done via a CRM subscription to POST /hubspot_event_subscriptions when create_offer_in_fortnox becomes Yes (see CRM subscriptions & webhooks). HubSpot may send subscriptionType: "object.propertyChange" with objectTypeId 0-14 for Quotes — the app supports that format as well as legacy quote.propertyChange.

Field mappings (HubSpot → Fortnox Offer)
Field HubSpot Direction Field Fortnox Notes
Company: fortnox_id -> Offer.CustomerNumber Primary company on the associated Deal
Quote: hs_currency -> Offer.Currency
Quote: hs_expiration_date -> Offer.OfferDate YYYY-MM-DD; if missing or invalid, today’s date is used
Deal: amounts_include_vat -> Offer.VATIncluded Sent as true only when set to Yes/true; otherwise omitted
(Deal id) -> Offer.Remarks Prefix HUBSPOT_DEAL_ID:<dealId> (traceability for Fortnox order → HubSpot Order sync)
Quote or Deal: description -> Offer.Remarks Appended after the deal-id line when present (Quote description preferred)
Contact (from Deal) -> Offer.YourReference First associated contact name when available
Deal owner -> Offer.OurReference From hubspot_owner_id
Company: fortnox_cost_center -> Offer.CostCenter Uppercased; requires costcenter Fortnox scope
Line item: hs_sku -> OfferRow.ArticleNumber When set; article must exist in Fortnox when SKU is used
Line item: name -> OfferRow.Description Product name only (same as invoice rows)
Line item: quantity -> OfferRow.Quantity
Line item: price, discount, hs_discount_percentage, hs_total_discount -> OfferRow.Price, Discount, DiscountType Same rules as invoice rows (amount vs percent discount)
Line item: tax -> OfferRow.VAT VAT percentage; may be enriched from Fortnox article when missing
Quote: fortnox_offer_document_number <- Offer.DocumentNumber Written on the Quote after Fortnox returns the created offer
Typical requirements

Create a Fortnox Order from a HubSpot Order

When a Fortnox order is created from a HubSpot Order, the app maps Order line items and the associated company to Fortnox using the same row logic as the deal → invoice and quote → offer flows. Enable HubSpot order to Fortnox order in App settings, and use the Order properties Create order in Fortnox (create_order_in_fortnox) and Order number in Fortnox (order_number_in_fortnox) — the latter is written after a successful create and is used to make the create idempotent.

Triggering is done via a CRM subscription to POST /hubspot_event_subscriptions when create_order_in_fortnox becomes Yes (see CRM subscriptions & webhooks). HubSpot may send subscriptionType: "object.propertyChange" with the order objectTypeId — the app supports that format alongside legacy order.propertyChange.

Typical requirements
  • App setting: HubSpot order to Fortnox order is enabled.
  • Order: Has line items or is associated to exactly one Deal that has line items; currencies consistent; no recurring billing on line items.
  • Company: Order's associated company (or, via the deal-fallback, the Deal's company) has Fortnox ID (fortnox_id) set.
  • Idempotency: If order_number_in_fortnox is already set on the Order, the create is skipped.
Mappings:
Field HubSpot Direction Field Fortnox Notes
Order: hs_currency_code -> Currency Must exist in Fortnox
Company: fortnox_id -> CustomerNumber From the Order's associated primary company (or the fallback Deal's company)
Order: description -> Remarks Optional
Contact: firstname lastname -> YourReference Default; first associated contact. Overridden by Order: fortnox_your_reference when set.
Order: hubspot_owner_id (firstname lastname) -> OurReference
Company: fortnox_cost_center -> CostCenter Stripped when the Fortnox token lacks the costcenter scope
Order: fortnox_invoice_email (else Company: billing_email) -> EmailInformation.EmailAddressTo Subject defaults to Order {no} bifogas. Skipped if neither is set or value is not a valid email.
Order: fortnox_terms_of_payment -> TermsOfPayment Optional (Betalningsvillkor)
Order: fortnox_your_order_number -> YourOrderNumber Optional (PO Number)
Order: fortnox_way_of_delivery -> WayOfDelivery Optional (Leveranssätt)
Order: fortnox_terms_of_delivery -> TermsOfDelivery Optional (Leveransvillkor)
Order: fortnox_delivery_date -> DeliveryDate Optional (Leveransdatum, YYYY-MM-DD)
Order: fortnox_billing_address_street / city / postal_code / country (else Company: address / city / zip / country) -> Address1 / City / ZipCode / Country Faktureringsadress. Empty fields are omitted so Fortnox copies from the customer record.
Order: hs_shipping_address_street / city / postal_code / country -> DeliveryAddress1 / DeliveryCity / DeliveryZipCode / DeliveryCountry Leveransadress. Empty fields are omitted.
Line item: hs_sku -> OrderRows[].ArticleNumber
Line item: name -> OrderRows[].Description
Line item: quantity -> OrderRows[].DeliveredQuantity
Line item: price -> OrderRows[].Price
Line item: discount or hs_discount_percentage -> OrderRows[].Discount + DiscountType
Line item: tax -> OrderRows[].VAT Falls back to the Fortnox article's VAT when missing on the line item
Order: order_number_in_fortnox <- Order.DocumentNumber Written on the HubSpot Order after Fortnox returns the created order

App settings

Within HubSpot there is a few options related to the App.

App settings in HubSpot

Sync Companies
Toggle if the sync of companies should be active. This is synced every second (2) hour.
Sync Products
Toggle if the sync of products should be active. This is synced every 30 minutes.
Fortnox invoice to Deal pipeline
Toggle if the scheduled import of Fortnox invoices to HubSpot deals should be active.
HubSpot deal to Fortnox invoice
Toggle to allow/disallow Fortnox invoices to be created based on HubSpot deal.
HubSpot company to Fortnox customer
Toggle to allow/disallow Fortnox customers to be created based on HubSpot company.
HubSpot quote to Fortnox offer
Toggle to allow Fortnox offers (offert) to be created from HubSpot quotes when quote property Create offer in Fortnox is set to Yes. Requires a CRM subscription to /hubspot_event_subscriptions; see Create a Fortnox Offer from a Quote.
HubSpot order to Fortnox order
Toggle to allow Fortnox orders to be created from HubSpot Orders when order property Create order in Fortnox is set to Yes. Requires a CRM subscription to /hubspot_event_subscriptions; see Create a Fortnox Order from a HubSpot Order. If the Order has no line items but is associated with exactly one Deal, the Deal's line items are used as a fallback.
Fortnox orders to HubSpot orders
Toggle to sync Fortnox orders into HubSpot Order records (associate to deals from Remarks, or from Fortnox OfferReference via the HubSpot quote’s fortnox_offer_document_number). See Syncing Fortnox Orders to HubSpot Orders. Optional scheduled polling uses REPEATABLE_JOB_ORDERS_TO_HUBSPOT_PATTERN; see Release notes (April 22, 2026 — overview) and Release notes (March 20, 2026 — webhooks).
Fortnox order pipeline (HubSpot Orders)
Separate toggle (same pattern as Fortnox invoice to Deal pipeline): creates the Fortnox order pipeline and stages in HubSpot, then sets each synced order’s pipeline stage from Fortnox. See Fortnox order pipeline under Syncing Fortnox Orders to HubSpot Orders. App endpoints: /fetch-import-fortnox-orders-to-pipeline-setting and /update-import-fortnox-orders-to-pipeline-setting.
Re-authenticate HubSpot and Fortnox
Option to re-authenticate HubSpot and Fortnox option if e.g. scopes have changed. Opens a popup with a button that opens the authentication process in a new window. The status view lists custom properties for companies, deals, and quotes. Once finished the popup can be closed.

Toogle syncs

CRM subscriptions & webhooks

Property-based automations use HubSpot CRM subscriptions with a single target URL on this app:

POST https://<your-app-domain>/hubspot_event_subscriptions

Subscribe to property changes for:

  • Companycreate_customer_in_fortnox
  • Dealcreate_invoice_in_fortnox
  • Quotecreate_offer_in_fortnox

HubSpot’s payload may use "subscriptionType": "object.propertyChange" and "objectTypeId" (e.g. 0-14 for quotes) instead of older types like quote.propertyChange. The integration accepts both. Responses: 204 when a job was queued, 200 with { "message": "No event was triggered." } when nothing matched (e.g. wrong property or value not Yes).

Release notes (March 20, 2026) describe this in detail.

Customer and invoice actions use HubSpot app cards (the current sidebar extension type). On companies, add the Fortnox customer card from the Apps section when customizing the record view. On deals, add Fortnox invoice the same way.

If your portal still has an older “classic” Fortnox CRM card on the layout, remove it after adding the new card so users are not confused by duplicates. Admins may see in-app messaging from HubSpot prompting them to update cards during a migration.

See Release notes (May 11, 2026) for rollout notes and links to HubSpot’s feature-flag documentation for marketplace apps.

In the right sidebar of company records, the Fortnox customer card shows the "Organization number from Fortnox" and "Fortnox ID" for the connected Fortnox customer.

App settings in HubSpot

If the company isn't linked to a Fortnox customer, you can create one by clicking the "Create as customer in Fortnox" button, provided following conditions are met.

1. App Setting
2. Company Information
  • The "Organization number from Fortnox" field for the HubSpot company is known.
  • The "Fortnox ID" field for the HubSpot company must be unknown.
  • There should be no existing customer in Fortnox with the same organization number.

On the right sidebar of deal records, the Fortnox invoice card shows the "Invoice number in Fortnox" for the connected Fortnox invoice.

App settings in HubSpot

If the deal isn't linked to a Fortnox invoice, you can create one by clicking the "Create as invoice in Fortnox" button, provided following conditions are met.

For a kreditfaktura, set Fortnox kreditfaktura to JA and Fortnox document to credit (invoice number) to the Fortnox document number of the debit invoice to credit. The same “no invoice number yet” rule applies to Invoice number in Fortnox before the run. Fortnox bookkeep after invoice create applies only when creating a new invoice from line items (not the credit path).

1. App Setting
2. Deal Information
  • The "Invoice number in Fortnox" field for the HubSpot deal must be unknown.
  • The deal's currency must exist in Fortnox.
  • The deal must be associated with a company.
3. Company Information
  • The associated company's "Organization number from Fortnox" is known.
4. Line Items
  • The deal must have at least one line item.
  • All line items must use the same currency.
  • None of the line items can have recurring billing frequency.
  • Line items with SKUs must correspond to articles existing in Fortnox.
  • Allowed characters for SKUs include letters, underscores, hyphens, and slashes.
  • If line items have VAT (tax property), the VAT percentage must match a configured VAT rate in Fortnox (see VAT Configuration Requirement below).