What ISO 20022 Message Sends an Invoice to a Customer?

The Question

“What kind of ISO 20022 message sends an invoice to a customer? Can you identify the message type, create a sample, and show me the C# implementation?”

That’s it. One question. No spec-reading. No searching through hundreds of message definitions. Watch what happens next.


Step 1 — The MCP Server Finds the Answer

The AI queries the Beneficial Strategies ISO 20022 MCP Server live. It searches the full ISO 20022 repository for every message that implements the Invoice business concept, across all business areas.

The server returns this:

Business Area Message Role
TSIN InvoiceAssignmentNotificationV01 Notifies a trade partner of a payment obligation
TSIN InvoiceAssignmentRequestV01 Requests assignment of invoice to a financier
REDA RequestToPayCreditorEnrolmentRequestV01 Enrolls a creditor for request-to-pay invoicing

The right answer is tsin.008.001.01InvoiceAssignmentNotificationV01.

Why this one and not the others? The ISO spec says it explicitly:

“This message can also be used outside a factoring context directly between a payer and a payee — for example as a reminder about a payment obligation or to make an adjustment.”

That’s the canonical ISO 20022 message for sending an invoice to a customer.


Step 2 — A Quick Clarifying Question

Before generating any code, the AI asks:

“Should the sample invoice include a tax breakdown (taxable amount + tax = total), or just a single grand total amount?”

Answer: Include the tax breakdown.

That one decision shapes both the XML structure and the C# model. The MCP server already fetched the full InvoiceTotals1 component definition, so it knows exactly which fields to populate.


Step 3 — Everything Is Generated Automatically

Message Structure

classDiagram
    direction LR
    class InvoiceAssignmentNotificationV01{
        NotificationCount IsoMax15NumericText
        ItemCount IsoMax15NumericText
        ControlSum IsoDecimalNumber
    }
    InvoiceAssignmentNotificationV01 *-- "1..1" BusinessLetter1 : Header
    InvoiceAssignmentNotificationV01 *-- "1..1" FinancingItemList1 : NotificationList
    InvoiceAssignmentNotificationV01 *-- "0..1" EncapsulatedBusinessMessage1 : AttachedMessage
  

Sample XML

A complete, valid invoice for professional services — $4,750.00 USD with tax breakdown — generated directly from the live spec:

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:tsin.008.001.01">
  <InvcAssgnmtNtfctn>

    <Hdr>
      <Id>NOTIF-2026-00042</Id>
      <IsseDt>2026-03-17</IsseDt>
      <CreDtTm>2026-03-17T09:00:00</CreDtTm>
      <Sndr>
        <Pty>
          <Nm>Beneficial Strategies LLC</Nm>
          <Id><OrgId><AnyBIC>BSTRUSXX</AnyBIC></OrgId></Id>
        </Pty>
      </Sndr>
      <Rcvr>
        <Pty>
          <Nm>Acme Corp</Nm>
          <Id><OrgId><AnyBIC>ACMEUSNY</AnyBIC></OrgId></Id>
        </Pty>
      </Rcvr>
    </Hdr>

    <NtfctnList>
      <Idr>LIST-2026-001</Idr>
      <IsseDt>2026-03-17</IsseDt>
      <Assgne><Pty><Nm>Acme Corp</Nm></Pty></Assgne>
      <Assgnr><Pty><Nm>Beneficial Strategies LLC</Nm></Pty></Assgnr>
      <ItmCnt>1</ItmCnt>
      <CtrlSum>4750.00</CtrlSum>
      <TtlReqAmt Ccy="USD">4750.00</TtlReqAmt>

      <FinItm>
        <ItmCntxt><CdtDbtInd>CRDT</CdtDbtInd></ItmCntxt>
        <CdtDbtInd>CRDT</CdtDbtInd>
        <TtlAmt>
          <TtlTaxblAmt Ccy="USD">4250.00</TtlTaxblAmt>
          <TaxAmt Ccy="USD">500.00</TaxAmt>
          <TtlAmt Ccy="USD">4750.00</TtlAmt>
        </TtlAmt>
        <DueAmt Ccy="USD">4750.00</DueAmt>
        <AddtlInf>Professional consulting services – March 2026</AddtlInf>
      </FinItm>
    </NtfctnList>

    <NtfctnCnt>1</NtfctnCnt>
    <ItmCnt>1</ItmCnt>
    <CtrlSum>4750.00</CtrlSum>

  </InvcAssgnmtNtfctn>
</Document>

C# Data Container

Every class name, property name, and XML tag is sourced directly from the ISO specification via the MCP server. Nothing is guessed.

using System;
using System.Collections.Generic;
using System.Xml.Serialization;

namespace Iso20022.Tsin.V01
{
    [XmlRoot("Document", Namespace = "urn:iso:std:iso:20022:tech:xsd:tsin.008.001.01")]
    public class Document
    {
        [XmlElement("InvcAssgnmtNtfctn")]
        public InvoiceAssignmentNotificationV01 InvoiceAssignmentNotification { get; set; }
    }

    public class InvoiceAssignmentNotificationV01
    {
        [XmlElement("Hdr")]
        public BusinessLetter1 Header { get; set; }

        [XmlElement("NtfctnList")]
        public List<FinancingItemList1> NotificationList { get; set; } = new();

        [XmlElement("NtfctnCnt")]
        public string NotificationCount { get; set; }

        [XmlElement("ItmCnt")]
        public string ItemCount { get; set; }

        [XmlElement("CtrlSum")]
        public decimal? ControlSum { get; set; }
    }

    public class BusinessLetter1
    {
        [XmlElement("Id")]
        public string Id { get; set; }

        [XmlElement("IsseDt")]
        public DateTime IssueDate { get; set; }

        [XmlElement("CreDtTm")]
        public DateTime? CreationDateTime { get; set; }

        [XmlElement("Sndr")]
        public QualifiedPartyIdentification1 Sender { get; set; }

        [XmlElement("Rcvr")]
        public QualifiedPartyIdentification1 Receiver { get; set; }
    }

    public class FinancingItemList1
    {
        [XmlElement("Idr")]
        public string Identifier { get; set; }

        [XmlElement("IsseDt")]
        public DateTime IssueDate { get; set; }

        [XmlElement("Assgne")]
        public QualifiedPartyIdentification1 Assignee { get; set; }

        [XmlElement("Assgnr")]
        public QualifiedPartyIdentification1 Assigner { get; set; }

        [XmlElement("FinItm")]
        public List<FinancialItem1> FinancialItems { get; set; } = new();

        [XmlElement("ItmCnt")]
        public string ItemCount { get; set; }

        [XmlElement("CtrlSum")]
        public decimal? ControlSum { get; set; }

        [XmlElement("TtlReqAmt")]
        public ActiveCurrencyAndAmount TotalRequestAmount { get; set; }
    }

    public class FinancialItem1
    {
        [XmlElement("ItmCntxt")]
        public FinancialItemParameters1 ItemContext { get; set; }

        [XmlElement("CdtDbtInd")]
        public CreditDebitCode CreditDebitIndicator { get; set; }

        [XmlElement("TtlAmt")]
        public InvoiceTotals1 TotalAmount { get; set; }

        [XmlElement("DueAmt")]
        public ActiveCurrencyAndAmount DueAmount { get; set; }

        [XmlElement("AddtlInf")]
        public string AdditionalInformation { get; set; }
    }

    public class InvoiceTotals1
    {
        [XmlElement("TtlTaxblAmt")]
        public ActiveCurrencyAndAmount TotalTaxableAmount { get; set; }

        [XmlElement("TaxAmt")]
        public ActiveCurrencyAndAmount TaxAmount { get; set; }

        [XmlElement("TtlAmt")]
        public ActiveCurrencyAndAmount TotalAmount { get; set; }
    }

    public class QualifiedPartyIdentification1
    {
        [XmlElement("Pty")]
        public PartyIdentification45 Party { get; set; }
    }

    public class PartyIdentification45
    {
        [XmlElement("Nm")]
        public string Name { get; set; }

        [XmlElement("Id")]
        public Party8Choice Id { get; set; }
    }

    public class Party8Choice
    {
        [XmlElement("OrgId")]
        public OrganisationIdentification8 OrganisationId { get; set; }
    }

    public class OrganisationIdentification8
    {
        [XmlElement("AnyBIC")]
        public string AnyBic { get; set; }
    }

    public class FinancialItemParameters1
    {
        [XmlElement("CdtDbtInd")]
        public CreditDebitCode CreditDebitIndicator { get; set; }
    }

    public class ActiveCurrencyAndAmount
    {
        [XmlAttribute("Ccy")]
        public string Currency { get; set; }

        [XmlText]
        public decimal Value { get; set; }
    }

    public enum CreditDebitCode
    {
        [XmlEnum("CRDT")] Credit,
        [XmlEnum("DBIT")] Debit
    }
}

Usage

var doc = new Document
{
    InvoiceAssignmentNotification = new InvoiceAssignmentNotificationV01
    {
        Header = new BusinessLetter1
        {
            Id = "NOTIF-2026-00042",
            IssueDate = new DateTime(2026, 3, 17),
            Sender   = new QualifiedPartyIdentification1 { Party = new PartyIdentification45 { Name = "Beneficial Strategies LLC" } },
            Receiver = new QualifiedPartyIdentification1 { Party = new PartyIdentification45 { Name = "Acme Corp" } }
        },
        NotificationList = new List<FinancingItemList1>
        {
            new()
            {
                Identifier = "LIST-2026-001",
                IssueDate  = new DateTime(2026, 3, 17),
                ItemCount  = "1",
                ControlSum = 4750.00m,
                TotalRequestAmount = new ActiveCurrencyAndAmount { Currency = "USD", Value = 4750.00m },
                FinancialItems = new List<FinancialItem1>
                {
                    new()
                    {
                        CreditDebitIndicator = CreditDebitCode.Credit,
                        TotalAmount = new InvoiceTotals1
                        {
                            TotalTaxableAmount = new ActiveCurrencyAndAmount { Currency = "USD", Value = 4250.00m },
                            TaxAmount          = new ActiveCurrencyAndAmount { Currency = "USD", Value = 500.00m },
                            TotalAmount        = new ActiveCurrencyAndAmount { Currency = "USD", Value = 4750.00m }
                        },
                        DueAmount = new ActiveCurrencyAndAmount { Currency = "USD", Value = 4750.00m },
                        AdditionalInformation = "Professional consulting services – March 2026"
                    }
                }
            }
        },
        NotificationCount = "1",
        ItemCount = "1",
        ControlSum = 4750.00m
    }
};

var serializer = new XmlSerializer(typeof(Document));
using var writer = new StringWriter();
serializer.Serialize(writer, doc);
Console.WriteLine(writer.ToString());

What Just Happened?

One question. No ISO spec PDFs opened. No message catalog browsed. No XML hand-crafted.

The Beneficial Strategies ISO 20022 MCP Server queried the live specification repository, identified the correct message from hundreds of candidates, retrieved the exact component hierarchy, and produced a spec-accurate XML sample and a fully-typed C# implementation — all automatically.

The only decision you made was whether to include a tax breakdown.

That’s what an AI subscription to the Beneficial Strategies MCP Server does for your team. Learn more about the subscription tiers.