[{"data":1,"prerenderedAt":243},["ShallowReactive",2],{"\u002Fblog\u002Fe-invoicing-for-software-companies-subscription-and-saas-billing":3},{"id":4,"title":5,"body":6,"description":234,"extension":235,"lastUpdatedAt":236,"meta":237,"navigation":238,"path":239,"publishedAt":236,"seo":240,"stem":241,"__hash__":242},"blog\u002Fblog\u002F0013.e-invoicing-for-software-companies-subscription-and-saas-billing.md","E-invoicing for software companies: subscription and SaaS billing",{"type":7,"value":8,"toc":225},"minimark",[9,13,16,19,24,27,35,68,75,81,106,109,113,116,119,125,131,137,141,144,150,162,168,174,178,181,192,198,204,207,211,214],[10,11,12],"p",{},"Software companies billing Swiss B2B customers face a particular challenge with structured e-invoicing: the way SaaS products are priced and billed does not map neatly onto the invoice model that formats like PEPPOL BIS Billing 3.0 and ZUGFeRD were designed around.",[10,14,15],{},"A standard e-invoice assumes a seller delivered something specific — a quantity of goods or a clearly bounded service — and is requesting payment. A SaaS invoice for a subscription might cover 47 active seats at CHF 29 per seat for a partial month, plus overage charges for API calls above the included tier, minus a discount from an annual contract signed two years ago. That is not impossible to represent in structured XML, but it requires deliberate decisions about how to model your billing data.",[10,17,18],{},"This post covers those decisions: how subscription, seat-based, and usage billing models map to e-invoice line items, what to watch for with recurring VAT treatment, and how to handle the operational side of generating structured invoices at scale from a billing system.",[20,21,23],"h2",{"id":22},"how-subscription-billing-maps-to-e-invoice-line-items","How subscription billing maps to e-invoice line items",[10,25,26],{},"The core unit of a PEPPOL or ZUGFeRD invoice is the line item: a description, a quantity, a unit price, and a line total. Subscription billing fits this model reasonably well — you just need to be deliberate about what each field represents.",[10,28,29,30,34],{},"For a ",[31,32,33],"strong",{},"flat monthly subscription",", the natural representation is a single line item:",[36,37,38,51,54,62,65],"ul",{},[39,40,41,42,46,47,50],"li",{},"Description: \"Monthly subscription — ",[43,44,45],"span",{},"Plan name"," — ",[43,48,49],{},"period, e.g. June 2026","\"",[39,52,53],{},"Quantity: 1",[39,55,56,57,61],{},"Unit: month (use the UNECE unit code ",[58,59,60],"code",{},"MON",")",[39,63,64],{},"Unit price: your monthly fee",[39,66,67],{},"VAT rate: applicable rate per customer location and service type",[10,69,70,71,74],{},"The billing period should appear somewhere on the invoice — either in the line item description or in the ",[58,72,73],{},"InvoicePeriod"," field at document level, which PEPPOL BIS supports explicitly. Include both a start and end date. Swiss corporate clients often need the period for cost allocation, and auditors will ask for it.",[10,76,29,77,80],{},[31,78,79],{},"per-seat subscription",", the model is almost identical but with quantity representing the number of seats:",[36,82,83,93,96,103],{},[39,84,85,86,46,89,92],{},"Description: \"Professional Plan — ",[43,87,88],{},"period",[43,90,91],{},"N"," seats\"",[39,94,95],{},"Quantity: number of active seats",[39,97,98,99,102],{},"Unit: ",[58,100,101],{},"EA"," (each) or a custom description",[39,104,105],{},"Unit price: per-seat monthly rate",[10,107,108],{},"If your contract allows seat count to vary mid-period — users added or removed during the month — you have two options. Either bill at the peak seat count for the month, or prorate additions and removals and show them as separate line items. The prorated approach is more transparent but generates more complex invoices. Whatever you choose, make it consistent and document it in your contract terms, because customers will ask.",[20,110,112],{"id":111},"usage-based-and-metered-billing","Usage-based and metered billing",[10,114,115],{},"Usage billing — charging by API calls, data processed, emails sent, or any other consumption metric — is harder to represent cleanly in a standard e-invoice line item. The challenge is that the \"quantity\" could be a very large number (millions of API calls) at a very small unit price (fractions of a centime), which some invoicing systems handle poorly due to decimal precision limits.",[10,117,118],{},"The practical approaches:",[10,120,121,124],{},[31,122,123],{},"Aggregate to a meaningful unit."," Instead of billing at the individual API call level, aggregate to a meaningful unit — \"1,000 API calls\" with a unit price of CHF 0.50 rather than 1,000,000 calls at CHF 0.0005. This keeps the numbers in a range that standard invoice fields handle correctly and is easier for clients to read.",[10,126,127,130],{},[31,128,129],{},"Separate included and overage on different lines."," If your pricing model includes a base quantity (e.g. 100,000 API calls included in the subscription) with charges only on usage above that, represent this as two line items: a zero-price line for the included amount (quantity consumed, unit price zero) and a charged line for the overage. This makes the billing logic transparent and gives clients the information they need to verify the charges.",[10,132,133,136],{},[31,134,135],{},"Add a usage summary attachment."," For complex usage billing, consider attaching a CSV or PDF usage report to the invoice. PEPPOL BIS and ZUGFeRD both support document-level attachments. The invoice itself carries the financial totals; the attachment gives the detail. Clients with meticulous AP teams will appreciate having both in a single document.",[20,138,140],{"id":139},"vat-for-swiss-saas-companies-billing-b2b-customers","VAT for Swiss SaaS companies billing B2B customers",[10,142,143],{},"The VAT treatment of digital services sold to Swiss and foreign businesses has some nuances worth getting right in your invoice template.",[10,145,146,149],{},[31,147,148],{},"Billing Swiss companies."," Standard Swiss VAT rules apply. If you are VAT-registered, charge 8.1% on software subscriptions (standard rate). Show the VAT amount as a separate line and include your UID on every invoice.",[10,151,152,155,156,161],{},[31,153,154],{},"Billing EU companies (B2B)."," Under Swiss VAT law, services provided to businesses outside Switzerland are generally not subject to Swiss VAT — they are zero-rated as exports. Your invoice should show CHF 0 VAT with the applicable exemption note. However, your EU customer may have reverse charge obligations in their own jurisdiction — that is their concern, not yours, but it is common for EU AP teams to ask about it. The ",[157,158,160],"a",{"href":159},"\u002Fblog\u002Fvat-reverse-charge-on-e-invoices-rules-and-xml-mapping","VAT reverse charge mapping guide"," explains how the reverse charge field appears in structured invoice XML.",[10,163,164,167],{},[31,165,166],{},"Billing Swiss consumers (B2C) above the CHF 100,000 threshold."," If your total revenues from digital services to Swiss consumers exceed CHF 100,000 annually, you must register for Swiss VAT and charge it. This threshold is relatively easy for a growing SaaS company to hit if you have a meaningful consumer segment in Switzerland alongside your B2B base.",[10,169,170,173],{},[31,171,172],{},"Multi-currency invoicing."," Swiss SaaS companies frequently bill in EUR or USD to international customers. PEPPOL BIS supports a single invoice currency, so if you invoice a Swiss subsidiary of a multinational in EUR, the entire invoice should be in EUR — do not mix currencies across line items. If you need to show the equivalent CHF amount for the customer's reference, put it in a note field or in the invoice PDF, not in the structured XML fields.",[20,175,177],{"id":176},"generating-structured-invoices-at-scale-from-a-billing-system","Generating structured invoices at scale from a billing system",[10,179,180],{},"Most SaaS billing platforms — Stripe, Chargebee, Recurly, and similar — do not natively generate PEPPOL BIS XML or ZUGFeRD invoices. They generate PDFs, and sometimes CSV exports. If you need to send structured e-invoices to Swiss B2B clients or to the federal government, you have a few options:",[10,182,183,186,187,191],{},[31,184,185],{},"Middleware conversion."," Export invoice data from your billing platform (via API or webhooks) and run it through a conversion layer that generates valid PEPPOL XML or ZUGFeRD. Several open-source libraries exist for this — the ",[157,188,190],{"href":189},"\u002Fblog\u002Fhow-to-create-a-zugferd-invoice-with-open-source-tools","ZUGFeRD generation guide"," covers the options. This approach requires development effort but keeps your billing platform central.",[10,193,194,197],{},[31,195,196],{},"ERP integration."," If you run an ERP alongside your billing platform (common once you are past early-stage), configure the ERP to receive subscription billing data and generate compliant invoices from there. ERP systems like Abacus, SAP, or even Sage have better e-invoice export capabilities than purpose-built billing platforms.",[10,199,200,203],{},[31,201,202],{},"E-invoicing service provider."," Some service providers accept invoice data in various formats — including flat CSV or JSON — and handle the conversion to PEPPOL XML and transmission. For lower volumes or as an interim solution while a proper integration is built, this can be the quickest path to compliance.",[10,205,206],{},"Whatever approach you use, build validation into the pipeline from the start. A subscription billing system generating thousands of invoices per month against a broken template will produce thousands of invalid documents. Catching a misconfigured VAT field or a missing UID in your test environment costs nothing. Finding it after three months of rejected invoices is a much larger problem to clean up.",[20,208,210],{"id":209},"contract-references-and-purchase-orders","Contract references and purchase orders",[10,212,213],{},"One friction point for SaaS companies invoicing larger Swiss corporations is the purchase order requirement. Many corporate procurement policies require a PO number on every invoice. For a SaaS product with a master subscription agreement, there may be no purchase order in the traditional sense — the contract covers a period of service, not a specific delivery.",[10,215,216,217,220,221,224],{},"The practical resolution is to work with your client's procurement team before the first invoice goes out. Either they issue a blanket PO covering the subscription period (common), or they confirm in writing that a contract reference is acceptable in lieu of a PO number. Then make sure that reference is in the ",[58,218,219],{},"ContractDocumentReference"," or ",[58,222,223],{},"OrderReference"," field of every invoice — whichever the client's AP system is configured to match against. An invoice that arrives without the expected reference will sit in an exceptions queue regardless of how well the rest of the invoice is structured.",{"title":226,"searchDepth":227,"depth":227,"links":228},"",2,[229,230,231,232,233],{"id":22,"depth":227,"text":23},{"id":111,"depth":227,"text":112},{"id":139,"depth":227,"text":140},{"id":176,"depth":227,"text":177},{"id":209,"depth":227,"text":210},"How recurring revenue models, seat-based pricing, and usage billing map onto structured e-invoice formats.","md","2026-06-04",{},true,"\u002Fblog\u002Fe-invoicing-for-software-companies-subscription-and-saas-billing",{"title":5,"description":234},"blog\u002F0013.e-invoicing-for-software-companies-subscription-and-saas-billing","QePQpsXOesiSvUSz2ToXa2KRUT84-rmw8_42VQpr49Q",1785401517914]