Additional Charges

In this how to we take you through how to create additional charges related to an Invoice.

What you’ll learn

In this how to you’ll learn:

  • What additional charges are
  • How to create additional charges using the Operator API
  • How to query additional charges using the Operator API

What are additional charges?

In specific cases—such as item returns—operators may want to recoup return shipping costs from customers to manage operational overhead. However, simply amending the original invoice (via a credit note) is not tax-compliant in some jurisdictions (e.g. the UK). Instead, a separate invoice is required.

Marketplacer supports generating a distinct additional charges invoice when sellers charge customers for returns or similar fees. These are:

  • Linked to the original order & invoice
  • Issued as a standalone invoice with a unique identifier (e.g. 12345-1-CH)

How it works

Additional charge invoices are created via the issueInvoice: true field when creating a custom line item using:

  • refundRequestApprove mutation
  • invoiceAmendmentCreate mutation

Once triggered, the system:

  • Validates the signage (must be a charge to the customer, not a refund)
  • Issues a new PDF invoice, separate from the original
  • Removes the charge from the seller’s credit note (to avoid potential double taxation)

NOTE: Charges must be added as separate custom line items with clear descriptions or a total summary per refund request. We cover this below.

Only one additional charge invoice is generated per amendment where a custom line item has issueInvoice: true.

  • Invoice ID Format: {original-invoice-id}-{amendment_number}-CH
  • Scope: Charges not tied to a specific product line but rather general costs (e.g. return fees)

These invoices:

  • Include standard seller/customer/tax details
  • Are excluded from the credit note to keep tax calculations clean and compliant

Reporting

Return charges appear in:

  1. Seller VAT Report (Refunds - Aggregated Financial Report)
    • Format matches postage refund
    • Includes the new invoice ID (XXXX-XX-CH)
  2. Refund Request Report
    • Return charges are listed alongside the original refund line items

Remittance

Return charges are treated like postage refunds:

  • Fully remitted to the seller
  • Included in seller payout calculations

Limitations and considerations

  • Only supported in verticals with Advanced Amendments enabled
  • Not tied to specific products (use custom line items)
  • One invoice per amendment: Even if multiple additional charges are included in a single refund request, they will be bundled into one additional charges invoice per amendment.

Creating an Additional Charge

Creating an addition charge can be achieved by using either of the following mutations:

  • refundRequestApprove
  • invoiceAmendmentCreate

Examples for both are provided below.

refundRequestApprove

The refundRequestApprove mutation is used by the Operator to approve the refund request as described here. In this example we use it to create an additional charge:

mutation {
  refundRequestApprove(
    input: {
      refundRequestId: "UmVmdW5kUmVxdWVzdC0yMTE="
      newCustomLineItemPriceBreakdowns: [
        {
          issueInvoice: true
          lineItemAmount: -200
          commissionAmount: 50
          custom: "Return Shipping Charge"
          remittanceAmount: 0
        }
      ]
    }
  ) {
    refundRequest {
      id
      status
      invoice {
        id
        legacyId
        statusFlags
        amendments {
          id
          additionalChargesInvoiceId
          additionalChargesNetAmountFormatted
          additionalChargesTaxAmountFormatted
          additionalChargesGrossAmountFormatted
          lineItems {
            id
            status
            custom
            issueInvoice
          }
        }
      }
    }
    errors {
      field
      messages
    }
  }
}

This would return:

{
  "data": {
    "refundRequestApprove": {
      "refundRequest": {
        "id": "UmVmdW5kUmVxdWVzdC0yMTE=",
        "status": "REFUNDED",
        "invoice": {
          "id": "SW52b2ljZS0xMDQ1Mg==",
          "legacyId": 10452,
          "statusFlags": [
            "PAID",
            "SENT",
            "REFUNDED"
          ],
          "amendments": [
            {
              "id": "SW52b2ljZUFtZW5kbWVudC0xMTk=",
              "additionalChargesInvoiceId": "10452-1-CH",
              "additionalChargesNetAmountFormatted": "$1.82",
              "additionalChargesTaxAmountFormatted": "$0.18",
              "additionalChargesGrossAmountFormatted": "$2.00",
              "lineItems": [
                {
                  "id": "SW52b2ljZUFtZW5kbWVudExpbmVJdGVtLTEzNw==",
                  "status": "REFUNDED",
                  "custom": null,
                  "issueInvoice": false
                },
                {
                  "id": "SW52b2ljZUFtZW5kbWVudExpbmVJdGVtLTEzOA==",
                  "status": "REFUNDED",
                  "custom": "Return Shipping Charge",
                  "issueInvoice": true
                }
              ]
            }
          ]
        }
      },
      "errors": null
    }
  }
}

invoiceAmendmentCreate

The invoiceAmendmentCreate mutation is used to directly create invoice amendments on an invoice, it “bypasses” the Refunds Workflow. An example of how to create an Additional Charge using this mutation is shown below.

mutation {
  invoiceAmendmentCreate(
    input: {
      invoiceId: "SW52b2ljZS0xMDQ1MA=="
      remittanceCents: 1900
      lineItems: [
        {
          custom: "Return Charge"
          issueInvoice: true
          quantity: 1
          status: REFUNDED
          lineItemPriceBreakdown: {
            lineItemAmount: 2000
            lineItemTax: 200
            commissionAmount: 100
            commissionTax: 10
            remittanceAmount: 1900
            remittanceTax: 190
          }
        }
      ]
    }
  ) {
    errors {
      field
      messages
    }
    status
    invoiceAmendment {
      id
      additionalChargesInvoiceId
      additionalChargesNetAmountFormatted
      additionalChargesTaxAmountFormatted
      additionalChargesGrossAmountFormatted
      createdAt
      invoice {
        id
        legacyId
        statusFlags
      }
      lineItems {
        id
        status
        custom
        issueInvoice
      }
    }
  }
}

This will return the following:

{
  "data": {
    "invoiceAmendmentCreate": {
      "errors": null,
      "status": 200,
      "invoiceAmendment": {
        "id": "SW52b2ljZUFtZW5kbWVudC0xMTc=",
        "additionalChargesInvoiceId": "10450-1-CH",
        "additionalChargesNetAmountFormatted": "$18.00",
        "additionalChargesTaxAmountFormatted": "$2.00",
        "additionalChargesGrossAmountFormatted": "20:00",
        "createdAt": "2025-05-27T19:29:55+10:00",
        "invoice": {
          "id": "SW52b2ljZS0xMDQ1MA==",
          "legacyId": 10450,
          "statusFlags": [
            "PAID"
          ]
        },
        "lineItems": [
          {
            "id": "SW52b2ljZUFtZW5kbWVudExpbmVJdGVtLTEzNQ==",
            "status": "REFUNDED",
            "custom": "Return Charge",
            "issueInvoice": true
          }
        ]
      }
    }
  }
}

Querying

You can query Additional Charges a number of ways, but 2 examples would be:

  • Via the amendments collection on an Invoice object
  • Directly using the InvoiceAmendment object

Examples of both of these approached are shown below:

Amendments on an Invoice

query {
  node(id: "SW52b2ljZS0xMDQ1Mg==") {
    ... on Invoice {
      legacyId
      id
      statusFlags
      totalFormatted
      subtotalFormatted
      amendments {
        id
        additionalChargesInvoiceId
        lineItems {
          id
          status
          custom
          issueInvoice
        }
      }
      refundRequests {
        id
        status
      }
    }
  }
}

Would return the following:

{
  "data": {
    "node": {
      "legacyId": 10452,
      "id": "SW52b2ljZS0xMDQ1Mg==",
      "statusFlags": [
        "PAID",
        "SENT",
        "REFUNDED"
      ],
      "totalFormatted": "$12.00",
      "subtotalFormatted": "$10.00",
      "amendments": [
        {
          "id": "SW52b2ljZUFtZW5kbWVudC0xMTk=",
          "additionalChargesInvoiceId": "10452-1-CH",
          "lineItems": [
            {
              "id": "SW52b2ljZUFtZW5kbWVudExpbmVJdGVtLTEzNw==",
              "status": "REFUNDED",
              "custom": null,
              "issueInvoice": false
            },
            {
              "id": "SW52b2ljZUFtZW5kbWVudExpbmVJdGVtLTEzOA==",
              "status": "REFUNDED",
              "custom": "Return Shipping Charge",
              "issueInvoice": true
            }
          ]
        }
      ],
      "refundRequests": [
        {
          "id": "UmVmdW5kUmVxdWVzdC0yMTE=",
          "status": "REFUNDED"
        }
      ]
    }
  }
}

Query on an InvoiceAmendment

{
  node(id: "SW52b2ljZUFtZW5kbWVudC0xMTk=") {
    ... on InvoiceAmendment {
      legacyId
      id
      additionalChargesInvoiceId
      lineItems {
        id
        status
        custom
        issueInvoice
      }
      invoice {
        id
        legacyId
        statusFlags
        refundRequests {
          id
          status
        }
      }
    }
  }
}

Would return the following:

{
  "data": {
    "node": {
      "legacyId": 119,
      "id": "SW52b2ljZUFtZW5kbWVudC0xMTk=",
      "additionalChargesInvoiceId": "10452-1-CH",
      "lineItems": [
        {
          "id": "SW52b2ljZUFtZW5kbWVudExpbmVJdGVtLTEzNw==",
          "status": "REFUNDED",
          "custom": null,
          "issueInvoice": false
        },
        {
          "id": "SW52b2ljZUFtZW5kbWVudExpbmVJdGVtLTEzOA==",
          "status": "REFUNDED",
          "custom": "Return Shipping Charge",
          "issueInvoice": true
        }
      ],
      "invoice": {
        "id": "SW52b2ljZS0xMDQ1Mg==",
        "legacyId": 10452,
        "statusFlags": [
          "PAID",
          "SENT",
          "REFUNDED"
        ],
        "refundRequests": [
          {
            "id": "UmVmdW5kUmVxdWVzdC0yMTE=",
            "status": "REFUNDED"
          }
        ]
      }
    }
  }
}