HomeGuidesRecipesAPI ExplorerForumSandboxSupport

Create and send invoices

Learn how to create an invoice to collect payment.

πŸ“˜

This page is about outgoing invoices sent by an entity to its clients. For the accounts payable invoices received by an entity from its vendors, see Payables.

An invoice is a document given to the buyer by the seller to collect payment. It includes the cost of the products purchased or services rendered to the buyer.

Invoices serve as legal records if they contain the names of the seller and client, the description and price of goods or services, and the payment terms.

:warning: Considerations

Invoice issuing is available only to entities that are registered in countries where Monite provides regulatory coverage.

Entities from other countries can create draft invoices, but will not be able to move them to the issued status and further statuses.

For more information, see Regulatory compliance.

Prerequisite: Specify the required entity information

To be able to create and issue invoices, an entity must have the following information specified.

Tax ID and/or VAT ID

An invoice must specify the tax ID and VAT ID of the entity that has issued this invoice. Depending on an entity's jurisdiction, it may have both tax ID and VAT ID, or only one of them.

If an entity was initially created without a tax ID and VAT IDs, make sure to update entity information to add these values:

  • Tax ID is specified by the tax_id field in the Entity object.
  • VAT IDs can be added by using POST /entities/{entity_id}/vat_ids. For details, see Manage entity VAT IDs. You will need to specify the relevant VAT ID in the entity_vat_id_id field when creating an invoice.

Bank account

An invoice must also specify the entity bank account to which the payment should be made. This bank account must be able to accept the currency reflected on the invoice.

To learn how to add entity bank accounts, see Manage bank accounts. You will need to provide the ID of the appropriate bank account in the entity_bank_account_id field when creating an invoice.

Create an invoice

To create an outgoing invoice, complete the following steps:

  1. Create a counterpart that represents the customer.
  2. Create one or more products to be listed in the invoice.
  3. Get the applicable VAT rates based on the entity's country and the counterpart's country, and choose the rates for the products that will be listed in the invoice.
  4. Create payment terms for the invoice.
  5. Configure payment reminders and overdue reminders for the invoice. (Optional)
  6. Create the invoice.

πŸ“˜

Create an invoice based on a quote

You can also create an invoice based on an issued quote. For more information, see Create an invoice based on a quote.

1. Create a counterpart

The counterpart represents the customer purchasing your product or service. It is required for creating an invoice.

Learn how to create counterparts.

2. Create a product

The products or services to be listed in the invoice also must be created in advance, as well as their respective measure units.

Learn how to create products and measure units.

πŸ“˜

Product currencies on invoices

Currencies of products added as line items on an invoice must always match the invoice's base currency. You can create products in multiple currencies to match the invoice's base currency. For more information, see Create a product.

3. Get VAT rates

An invoice must specify VAT rates for its line items, even if the VAT is 0%. You can call GET /vat_rates?counterpart_id={id} to get the possible VAT rates for sales to the given counterpart:

curl -X GET 'https://api.sandbox.monite.com/v1/vat_rates?counterpart_id=0414f...5435' \
     -H 'X-Monite-Version: 2023-06-04' \
     -H 'X-Monite-Entity-Id: ENTITY_ID' \
     -H 'Authorization: Bearer ACCESS_TOKEN'

The response includes the possible VAT rates (as a percentage multiplied by 100) and their IDs. Store the IDs somewhere as you will need them later.

{
  "data": [
    {
      "id": "a39a2ec3-765d-4f75-9a17-585a5d22509d",
      ...
      "value": 0,
      "country": "DE"
    },
    {
      "id": "51cefc6c-9f82-484e-ae6a-a3a89b507bea",
      ...
      "value": 700,
      "country": "DE"
    },
    ...
  ]
}

Learn more about VAT rates.

4. Create payment terms

Payment terms define when the invoice is due to be paid. A common payment term is Net 30, which means the full payment is expected within 30 days. Payment terms can also include early payment discounts to encourage customers to pay upfront.

Learn how to create payment terms.

5. Create the invoice

Once the required counterpart, products, and payment terms are created, you can create the invoice for a given counterpart by calling POST /receivables endpoint with the type field in the payload set to invoice:

curl -X POST 'https://api.sandbox.monite.com/v1/receivables' \
     -H 'X-Monite-Version: 2023-06-04' \
     -H 'X-Monite-Entity-Id: ENTITY_ID' \
     -H 'Authorization: Bearer ACCESS_TOKEN' \
     -H 'Content-Type: application/json' \
     -d '{
       "type": "invoice",
       "currency": "EUR",
       "counterpart_id": "0414f84c-b039-4203-b09b-e42b49245435",
       "line_items": [
         {
           "quantity": 1,
           "product_id": "8755c86a-d630-4920-b6fd-fd2917d87dfb",
           "vat_rate_id": "479155c3-0995-4689-a3cf-7482ea5132a9"
         }
       ],
       "payment_terms_id": "e2cbbb5f-15e6-4b22-a942-8f51b7a81118",
       "vat_exempt": false,
       "entity_vat_id_id": "cb6c1c38-fdae-48f8-8e51-2d50d116b882",
       "counterpart_vat_id_id": "782b6f0f-0177-475c-b1e4-98dc160a656f",
       "entity_bank_account_id": "5624cca65c3e-8f18-4021-bdd1-3f548c1b"
     }'

The request above is a minimal example. The request body can also include many other details about the invoice, such as a custom memo note, fulfillment_date (if different from the invoice date), discount, and other fields as necessary.

πŸ“˜

Notes

  • When UK entities create invoices that fall under the Northern Ireland Protocol, the entity_vat_id_id field must point to a VAT ID object with type="eu_vat". Learn how to configure VAT IDs for UK entities that operate under the NI Protocol.
  • If the entity has invoice payment reminders enabled (that is, entity setting reminder.enabled is true), the invoice payload MUST include payment_reminder_id.

The response contains the id assigned to the created invoice, along with the calculated total (total_amount), subtotal (subtotal), VAT (total_vat_amount), and other information. The invoice's due date is automatically calculated based on the creation date and payment terms, and is returned in the payment_terms.term_final.end_date property.

{
  "type": "invoice",
  "id": "411dcb25-ec2c-49fc-bb2d-a72adac289b3",
  "created_at": "2022-09-08T11:45:39.048015+00:00",
  "updated_at": "2022-09-08T11:45:39.066711+00:00",
  "document_id": null,
  "currency": "EUR",
  "subtotal": 5000,
  "line_items": [
    {
      "quantity": 5,
      "product": {
        ...
      },
      "total_before_vat": 5000
    }
  ],
  "total_amount": 5950,
  "total_vat_amount": 950,
  ...
  "memo": null,
  "issue_date": null,
  "total_vat_amounts": [
    {
      "id": "479155c3-0995-4689-a3cf-7482ea5132a9",
      "value": 1900,
      "amount": 950,
    }
  ],
  "total_amount_with_credit_notes": 5950,
  "amount_due": 5950,
  "amount_paid": 0,
  "payment_terms": {
    ...
  },
  "status": "draft",
  ...
}

πŸ“˜

For a complete list of request and response fields, refer to the description of the POST /receivables endpoint.

Auto-calculated amounts

Monite automatically calculates the subtotal, total, and VAT amounts for the entire invoice and individual line items. These amounts are included in responses from the /receivables* endpoints. You can display these amounts in your application and use them in your business logic.

  • line_items[i].total_before_vat - line item amount including the discount but excluding VAT.
  • subtotal - invoice subtotal as a sum of line item subtotals. VAT and invoice-level discount are not included, but line item discounts are included.
  • discounted_subtotal - invoice subtotal after invoice-level discount. VAT is not included.
  • total_vat_amount - total VAT amount for the entire invoice.
  • total_vat_amounts - a list of VAT rates used in the invoice, along with the calculated total VAT amounts for each rate.
  • total_amount - total invoice amount including VAT and all discounts (except payment term discounts). It's the sum of discounted_subtotal and total_vat_amount.
  • total_amount_with_credit_notes - this is total_amount minus the amounts of all credit notes issued for this invoice. The value is updated whenever a new credit note is issued for this invoice.
  • amount_due - the remaining amount to be paid for this invoice. Initially equals to total_amount_with_credit_notes. After the invoice is fully paid, amount_due becomes 0.
  • amount_paid - the total amount paid towards an invoice. The initial value starts at 0 and can be continually updated for partially paid invoices. For more information, see Mark an invoice as partially paid.
  • amount_to_pay - this is amount_due adjusted to reflect the currently effective discount (if any) defined by the payment terms. Payment terms discounts take effect once the invoice has been issued.

πŸ“˜

Notes

After creating invoices, you can download the invoice as a PDF or send it to the customer via email.

Download the invoice as PDF

Monite automatically generates the PDF version of invoices. The PDF file details β€”URL, file size, MD5 hash, and other informationβ€”are returned in the file object property in the invoice response:

{
  "type": "invoice",
  ...
  "file": {
    ...
    "md5": "31d1a2dd1ad3dfc39be849d70a68dac0",
    "url": "https://bucketname.s3.amazonaws.com/<random_UUID_1>/<random_UUID_2>.pdf",
    "size": 24381,
    ...
  },
  ...
}

πŸ“˜

If file is returned as null, repeat the request to GET /receivables/{invoice_id} after some time.

If you need just the PDF file link without the full invoice details, call GET /receivables/{invoice_id}/pdf_link:

curl -X GET 'https://api.sandbox.monite.com/v1/receivables/411dc6eb...6289b3/pdf_link' \
     -H 'X-Monite-Version: 2023-06-04' \
     -H 'X-Monite-Entity-Id: ENTITY_ID' \
     -H 'Authorization: Bearer ACCESS_TOKEN' 

It returns the following response:

{
  "file_url": "https://bucketname.s3.amazonaws.com/<random_UUID_1>/<random_UUID_2>.pdf"
}

Here's how the PDF looks like:

πŸ“˜

The PDF file is updated automatically if the invoice is changed (for example, if new line items are added to a draft invoice, or if the counterpart address is changed).

Customize the PDF file

Monite provides several built-in PDF templates for receivables. Entities can change their default template or customize their chosen templates at any time. For more information, see PDF templates.

Verify the invoice

Before a newly created invoice can be issued to a counterpart, certain required information must be present on the invoice. This includes information about the entity, counterpart, line items, and VAT rates on the invoice. To trigger regulatory checks for an invoice and check that an invoice contains all required information, send a POST request to the receivables/{receivable_id}/verify endpoint as shown:

curl -X POST 'https://api.sandbox.monite.com/v1/receivables/411dcb...289b3/verify' \
     -H 'X-Monite-Version: 2023-06-04' \
     -H 'X-Monite-Entity-Id: ENTITY_ID' \
     -H 'Authorization: Bearer ACCESS_TOKEN' \

A successful response returns an object containing the missing information required on an invoice. Fields with all the required information have a null value. For example, the following example shows the response for an invoice without entity tax ID and counterpart tax ID information.

{
    "receivable": null,
    "entity": [
        "tax_id"
    ],
    "counterpart": [
        "tax_id"
    ],
    "products": null,
    "vat_rates": null
}

Send the invoice via email

Once a draft invoice has been prepared, you can send it to the customer via email. To do this, call POST /receivables/{receivable_id}/send and provide the email subject and body text. Both the subject and body texts can include variables as placeholders for invoice-specific and counterpart-specific data. The invoice will be attached as a PDF file to the email.

curl -X POST 'https://api.sandbox.monite.com/v1/receivables/411dcb...289b3/send' \
     -H 'X-Monite-Version: 2023-06-04' \
     -H 'X-Monite-Entity-Id: ENTITY_ID' \
     -H 'Authorization: Bearer ACCESS_TOKEN' \
     -H 'Content-Type: application/json' \
     -d '{
       "subject_text": "New invoice #{invoice_number}",
       "body_text": "Dear {contact_name},\n\nThank you for your business!\nPlease pay the balance of {amount_due} (invoice #{invoice_number}) by {due_date}.\n\nFor any questions or concerns, please don’t hesitate to get in touch with us at {entity_email}. We look forward to serving you again and wish you all the best!"
     }'

The To email address is taken from the Counterpart object associated with the invoice. This address is also returned in the counterpart_contact.email field of the Receivable object that represents the invoice.

The From email address is notifications@<entity_name>.monite.com (currently not customizable).

A 200 OK response from POST /receivables/{receivable_id}/send means the email was successfully sent from the Monite email server.

πŸ“˜

Sending an invoice changes its status from draft to issued, and the issued_date field is automatically set to the current date and time. Issued invoices can no longer be edited.

Resend an invoice

To resend an already issued invoice, you can call POST /receivables/{receivable_id}/send again, optionally with different subject_text and body_text templates.

πŸ“˜

Resending an invoice does not change its status or issued_date.

Monite also automatically sends payment reminder notifications to the counterpart one day before each payment target.