Additional Charges
5 minute read
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
)
Important
Additional charges invoices are only available on Marketplacer instances with Advanced Amendments enabled.
You can check to see whether Advanced Amendments are enabled by referring to the Seller Settings on your Marketplacer instance, this is covered in this Knowledge Base article.
How it works
Additional charge invoices are created via the issueInvoice: true
field when creating a custom line item using:
refundRequestApprove
mutationinvoiceAmendmentCreate
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:
- Seller VAT Report (Refunds - Aggregated Financial Report)
- Format matches postage refund
- Includes the new invoice ID (XXXX-XX-CH)
- 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 anInvoice
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"
}
]
}
}
}
}