I tried it using the footer the way it’s meant to be used. And yes, the merge tags work just fine.
If @Davide meant putting the footer tags directly into the theme code, those won’t be recognized. They’ll just show up as plain text.
Footer tags only work inside the actual Footer module.
But if we want to show more detailed data in our custom theme, we can tap into API3 using postMessage. That way, we can pull in extra info from Manager that merge tags alone can’t provide.
Here’s a quick example of how to grab full invoice data:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Invoice Enricher</title>
<style>
body {
font-family: monospace;
background: #111;
color: #0f0;
padding: 1rem;
}
pre {
white-space: pre-wrap;
word-break: break-word;
}
</style>
</head>
<body>
<h3>🔄 Loading and enriching invoice data...</h3>
<pre id="output">Waiting for invoice key...</pre>
<script>
const output = document.getElementById("output");
const pendingRequests = {};
const generateRequestId = () => crypto.randomUUID();
const makeManagerApiRequest = (path, method = "GET", body = null) =>
new Promise((resolve, reject) => {
const requestId = generateRequestId();
console.log(`📡 API Request: [${method}] ${path}`, body ?? "");
pendingRequests[requestId] = { resolve, reject, path, method };
window.parent.postMessage({ type: "api-request", requestId, path, method, body }, "*");
});
const safeFetch = async (path, method = "GET", body = null) => {
try {
const result = await makeManagerApiRequest(path, method, body);
return result;
} catch (err) {
console.error(`❌ API Error on [${method}] ${path}: ${err.message}`);
return null;
}
};
const apiFetchers = {
businessDetails: () => safeFetch("/api3/business-details-form"),
customer: (id) => id ? safeFetch(`/api3/customer-form/${id}`) : null,
item: async (id) => {
if (!id) return null;
for (const p of ["/api3/inventory-item-form", "/api3/non-inventory-item-form", "/api3/inventory-kit-form"]) {
const data = await safeFetch(`${p}/${id}`);
if (data) return data;
}
return null;
},
taxCode: (id) => id ? safeFetch(`/api3/tax-code-form/${id}`) : null,
reportingCategory: (id) => id ? safeFetch(`/api3/tax-code-reporting-category-form/${id}`) : null,
taxAmountReportingCategory: (id) => id ? safeFetch(`/api3/tax-amount-reporting-category-form/${id}`) : null,
salesInvoiceRef: async (id) => {
if (!id) return null;
const si = await safeFetch(`/api3/sales-invoice-form/${id}`);
return si ? {
issueDate: si.issueDate,
reference: si.reference,
fbrInvoiceNumber: si.customFields2?.strings?.["24b11f97-46d7-472e-ad4b-e99fbed9197e"] ?? null
} : null;
}
};
const enrichInvoice = async (invoice) => {
const enriched = { ...invoice };
enriched.businessDetails = await apiFetchers.businessDetails();
enriched.customer = await apiFetchers.customer(enriched.customer);
if (Array.isArray(enriched.lines)) {
for (const line of enriched.lines) {
line.item = await apiFetchers.item(line.item);
line.taxCode = await apiFetchers.taxCode(line.taxCode);
if (line.taxCode?.reportingCategory) {
line.taxCode.reportingCategory = await apiFetchers.reportingCategory(line.taxCode.reportingCategory);
}
if (line.taxCode?.taxAmountReportingCategory) {
line.taxCode.taxAmountReportingCategory = await apiFetchers.taxAmountReportingCategory(line.taxCode.taxAmountReportingCategory);
}
}
}
if (enriched.salesInvoice) {
enriched.salesInvoice = await apiFetchers.salesInvoiceRef(enriched.salesInvoice);
}
return enriched;
};
window.addEventListener("message", async (event) => {
if (event.source !== window.parent) return;
const data = event.data;
if (data.type === "context-response") {
const ctx = data.body;
const invoiceKey = ctx.Key || ctx.key || ctx.ID || ctx.Id || ctx.id;
if (!invoiceKey) {
output.textContent = "❌ Invoice key not found in context.";
return;
}
output.textContent = `🔑 Found invoice key: ${invoiceKey}\n⏳ Fetching full invoice...`;
try {
const fullInvoice = await makeManagerApiRequest(`/api3/sales-invoice-form/${invoiceKey}`);
output.textContent = "📦 Full invoice received. Enriching data...";
const enriched = await enrichInvoice(fullInvoice);
output.textContent = JSON.stringify({ context: ctx, full: enriched }, null, 2);
console.log("✅ Enriched Invoice:", enriched);
} catch (err) {
output.textContent = `❌ Error: ${err.message}`;
console.error(err);
}
}
if (data.type === "api-response") {
const { requestId, body, status, statusText } = data;
const pending = pendingRequests[requestId];
if (pending) {
const { path, method } = pending;
if (status >= 400) {
console.error(`❌ API Response Error [${method}] ${path} → HTTP ${status}: ${statusText}`);
pending.reject(new Error(`HTTP ${status}: ${statusText || "Request failed"}`));
} else {
console.log(`📥 API Response Success [${method}] ${path} → HTTP ${status}`);
pending.resolve(body);
}
delete pendingRequests[requestId];
}
}
});
window.addEventListener("load", () => {
window.parent.postMessage({ type: "context-request" }, "*");
});
</script>
</body>
</html>
Result :
🔄 Loading and enriching invoice data...
{
"context": {
"type": "salesinvoice",
"key": "e29fb8e0-f239-4abd-bd45-6134834e8b75",
"custom_theme": "a3eccec0-6993-452c-ad3d-5a7a08203dea",
"direction": "ltr",
"title": "Invoice",
"description": null,
"reference": "7",
"emphasis": {
"text": "Overdue",
"positive": false,
"negative": true
},
"fields": [
{
"key": "InvoiceDate",
"label": "Invoice date",
"text": "7/19/2025",
"emphasis": false
},
{
"key": "DueDate",
"label": "Due date",
"text": "7/19/2025",
"emphasis": false
},
{
"key": "InvoiceNumber",
"label": "Invoice number",
"text": "7",
"emphasis": false
}
],
"custom_fields": [
{
"key": "",
"label": "Total amount in words",
"text": "Eight hundred and fifty-two and 50/100",
"value": null,
"displayAtTheTop": false
}
],
"table": {
"columns": [
{
"label": "Item",
"align": "start",
"nowrap": false,
"total": false,
"emphasis": false,
"minWidth": false,
"alwaysShow": false,
"sum": null,
"sumText": null
},
{
"label": "Description",
"align": "start",
"nowrap": false,
"total": false,
"emphasis": false,
"minWidth": false,
"alwaysShow": false,
"sum": null,
"sumText": null
},
{
"label": "PCS",
"align": "center",
"nowrap": true,
"total": true,
"emphasis": false,
"minWidth": false,
"alwaysShow": false,
"sum": 3,
"sumText": "3"
},
{
"label": "Unit price",
"align": "right",
"nowrap": true,
"total": false,
"emphasis": false,
"minWidth": false,
"alwaysShow": false,
"sum": null,
"sumText": null
},
{
"label": "Price",
"align": "right",
"nowrap": true,
"total": true,
"emphasis": false,
"minWidth": false,
"alwaysShow": false,
"sum": 800,
"sumText": "800.00"
},
{
"label": "Discount",
"align": "right",
"nowrap": true,
"total": false,
"emphasis": false,
"minWidth": false,
"alwaysShow": false,
"sum": null,
"sumText": null
},
{
"label": "Total",
"align": "right",
"nowrap": true,
"total": false,
"emphasis": true,
"minWidth": false,
"alwaysShow": true,
"sum": null,
"sumText": null
}
],
"rows": [
{
"cells": [
{
"value": null,
"canBeHidden": false,
"text": "Item 01"
},
{
"value": null,
"canBeHidden": false,
"text": "desc1============"
},
{
"value": 2,
"canBeHidden": false,
"text": "2"
},
{
"value": 200,
"canBeHidden": false,
"text": "200.00"
},
{
"value": 400,
"canBeHidden": false,
"text": "400.00"
},
{
"value": 10,
"canBeHidden": false,
"text": "10.00"
},
{
"value": 390,
"canBeHidden": false,
"text": "390.00"
}
]
},
{
"cells": [
{
"value": null,
"canBeHidden": false,
"text": "Item 02"
},
{
"value": null,
"canBeHidden": false,
"text": "desc2============"
},
{
"value": 1,
"canBeHidden": false,
"text": "1"
},
{
"value": 400,
"canBeHidden": false,
"text": "400.00"
},
{
"value": 400,
"canBeHidden": false,
"text": "400.00"
},
{
"value": 15,
"canBeHidden": false,
"text": "15.00"
},
{
"value": 385,
"canBeHidden": false,
"text": "385.00"
}
]
}
],
"totals": [
{
"class": "",
"key": "",
"label": "Sub-total",
"text": "775.00",
"number": 775,
"emphasis": false
},
{
"class": "taxAmount",
"key": "",
"label": "10% VAT",
"text": "77.50",
"number": 77.5,
"emphasis": false
},
{
"class": "",
"key": "Total",
"label": "Total",
"text": "852.50",
"number": 852.5,
"emphasis": true
},
{
"class": "",
"key": "",
"label": "Credit Note — 1 — 7/27/2025",
"text": "- 660.00",
"number": 0,
"emphasis": false
},
{
"class": "",
"key": "",
"label": "Balance due",
"text": "192.50",
"number": 0,
"emphasis": true
}
]
},
"business": {
"logo": null,
"name": "My Company Name",
"address": "My Company Address",
"country": "en-PK",
"custom_fields": []
},
"recipient": {
"code": null,
"name": "Customer 01",
"address": "asfdasdfsadfsadfsadfsdfs",
"email": "asfdasdfa@asdfasdf.net",
"telephone": null
},
"timestamp": 638943120617805600,
"footers": [
"<p>Normal Tags</p>\n<p>Image:\t\t<br />\nAttachment:\tis not checked\t<br />\nIssue date:\t7/19/2025\t<br />\nDue date:\t7/19/2025\t<br />\nReference:\t7\t<br />\nSales Quote:\t\t<br />\nSales Order:\t\t<br />\nCustomer:\tCustomer 01\t<br />\nDescription:\t\t<br />\nProject:\t\t<br />\nDivision:\t\t<br />\nClosed invoice:\tis not checked\t<br />\nWithholding tax:\t\t<br />\nDiscount:\t25.00\t<br />\nInvoice Amount:\t852.50\t<br />\nCost of sales:\t0.00\t<br />\nBalance due:\t192.50\t<br />\nDays to Due Date:\t\t<br />\nDays overdue:\t67\t<br />\nStatus:\tOverdue\t<br />\nTimestamp:\t9/24/2025 7:01:01 PM</p>\n<hr />\n<p>Tag From Custom Field</p>\n<p>Application Version\tV123456789809</p>\n"
],
"serviceLink": "",
"legacyQrCodeForSaudiArabia": false,
"EmailVariables": {}
},
"full": {
"issueDate": "2025-07-19T00:00:00",
"dueDate": 0,
"dueDateDays": null,
"dueDateDate": null,
"reference": "7",
"quoteNumber": null,
"orderNumber": null,
"customer": {
"name": "Customer 01",
"code": null,
"creditLimit": 0,
"currency": null,
"billingAddress": "asfdasdfsadfsadfsadfsdfs",
"deliveryAddress": "asdfsadfsadfsadfsdf",
"email": "asfdasdfa@asdfasdf.net",
"division": null,
"controlAccount": null,
"hasDefaultDueDateDays": false,
"defaultDueDateDays": null,
"hasDefaultHourlyRate": false,
"defaultHourlyRate": 0,
"inactive": false,
"customFields": null,
"customFields2": {
"strings": null,
"decimals": null,
"dates": null,
"booleans": null,
"stringArrays": null,
"images": null
}
},
"salesQuote": null,
"salesOrder": null,
"billingAddress": null,
"exchangeRate": 0,
"exchangeRateIsInverse": false,
"description": null,
"lines": [
{
"item": {
"itemCode": null,
"itemName": "Item 01",
"unitName": "PCS",
"valuationMethod": 0,
"division": null,
"controlAccount": null,
"reorderPoint": false,
"qtyDesired": 0,
"customIncomeAccount": false,
"incomeAccount": null,
"customExpenseAccount": false,
"expenseAccount": null,
"hasDefaultLineDescription": false,
"defaultLineDescription": null,
"hasDefaultPurchaseUnitPrice": false,
"defaultPurchaseUnitPrice": 0,
"hasDefaultSalesUnitPrice": false,
"defaultSalesUnitPrice": 0,
"hasDefaultDivision": false,
"defaultDivision": null,
"hasDefaultTaxCode": false,
"defaultTaxCode": null,
"hideItemNameOnPrintedDocuments": false,
"inactive": false,
"customFields": null,
"customFields2": {
"strings": {
"a223489a-6a79-423f-a63d-b2357b18c5a4": "1234"
},
"decimals": null,
"dates": null,
"booleans": null,
"stringArrays": null,
"images": null
}
},
"account": null,
"capitalAccount": null,
"subAccount": null,
"specialAccount": null,
"fixedAsset": null,
"intangibleAsset": null,
"lineDescription": "desc1============",
"customFields": {},
"customFields2": {
"strings": {},
"decimals": {},
"dates": {},
"booleans": {},
"stringArrays": {},
"images": {}
},
"qty": 2,
"salesUnitPrice": 200,
"currencyAmount": 0,
"discountPercentage": 10,
"discountAmount": 10,
"taxCode": {
"name": "PPN 10%",
"label": "10% VAT",
"reportingCategory": null,
"reportingCategoryReversed": null,
"taxRate": 2,
"type": 0,
"rate": 10,
"account": null,
"taxAmountReportingCategory": null,
"taxAmountReversedReportingCategory": null,
"components": [
{
"name": null,
"componentRate": 0,
"componentAccount": null,
"componentTaxAmountReportingCategory": null,
"componentTaxAmountReversedReportingCategory": null
}
],
"reverseCharged": false,
"customSalesInvoiceTitle": false,
"salesInvoiceTitle": null,
"customCreditNoteTitle": false,
"creditNoteTitle": null,
"inactive": false,
"customFields": null,
"customFields2": {
"strings": null,
"decimals": null,
"dates": null,
"booleans": null,
"stringArrays": null,
"images": null
}
},
"project": null,
"division": null
},
{
"item": {
"itemCode": null,
"itemName": "Item 02",
"unitName": "PCS",
"valuationMethod": 0,
"division": null,
"controlAccount": null,
"reorderPoint": false,
"qtyDesired": 0,
"customIncomeAccount": false,
"incomeAccount": null,
"customExpenseAccount": false,
"expenseAccount": null,
"hasDefaultLineDescription": false,
"defaultLineDescription": null,
"hasDefaultPurchaseUnitPrice": false,
"defaultPurchaseUnitPrice": 0,
"hasDefaultSalesUnitPrice": false,
"defaultSalesUnitPrice": 0,
"hasDefaultDivision": false,
"defaultDivision": null,
"hasDefaultTaxCode": false,
"defaultTaxCode": null,
"hideItemNameOnPrintedDocuments": false,
"inactive": false,
"customFields": null,
"customFields2": {
"strings": {
"a223489a-6a79-423f-a63d-b2357b18c5a4": "1234"
},
"decimals": null,
"dates": null,
"booleans": null,
"stringArrays": null,
"images": null
}
},
"account": null,
"capitalAccount": null,
"subAccount": null,
"specialAccount": null,
"fixedAsset": null,
"intangibleAsset": null,
"lineDescription": "desc2============",
"customFields": {},
"customFields2": {
"strings": {},
"decimals": {},
"dates": {},
"booleans": {},
"stringArrays": {},
"images": {}
},
"qty": 1,
"salesUnitPrice": 400,
"currencyAmount": 0,
"discountPercentage": 15,
"discountAmount": 15,
"taxCode": {
"name": "PPN 10%",
"label": "10% VAT",
"reportingCategory": null,
"reportingCategoryReversed": null,
"taxRate": 2,
"type": 0,
"rate": 10,
"account": null,
"taxAmountReportingCategory": null,
"taxAmountReversedReportingCategory": null,
"components": [
{
"name": null,
"componentRate": 0,
"componentAccount": null,
"componentTaxAmountReportingCategory": null,
"componentTaxAmountReversedReportingCategory": null
}
],
"reverseCharged": false,
"customSalesInvoiceTitle": false,
"salesInvoiceTitle": null,
"customCreditNoteTitle": false,
"creditNoteTitle": null,
"inactive": false,
"customFields": null,
"customFields2": {
"strings": null,
"decimals": null,
"dates": null,
"booleans": null,
"stringArrays": null,
"images": null
}
},
"project": null,
"division": null
}
],
"hasLineNumber": false,
"hasLineDescription": true,
"discount": true,
"discountType": 1,
"amountsIncludeTax": false,
"rounding": false,
"roundingMethod": 0,
"withholdingTax": false,
"withholdingTaxType": 0,
"withholdingTaxPercentage": 0,
"withholdingTaxAmount": 0,
"earlyPaymentDiscount": false,
"earlyPaymentDiscountType": 0,
"earlyPaymentDiscountRate": 0,
"earlyPaymentDiscountAmount": 0,
"earlyPaymentDiscountDays": null,
"latePaymentFees": false,
"latePaymentFeesPercentage": 0,
"totalAmountInWords": true,
"totalAmountInBaseCurrency": false,
"bilingual": false,
"hasSalesInvoiceCustomTitle": false,
"salesInvoiceCustomTitle": null,
"hasSalesInvoiceCustomTheme": true,
"salesInvoiceCustomTheme": "a3eccec0-6993-452c-ad3d-5a7a08203dea",
"automaticReference": false,
"hideDueDate": false,
"hideBalanceDue": false,
"closedInvoice": false,
"showItemImages": false,
"showTaxAmountColumn": false,
"alsoActsAsDeliveryNote": false,
"salesInventoryLocation": null,
"hasSalesInvoiceFooters": true,
"salesInvoiceFooters": [
"7f9aebf5-c8b9-4c8a-b582-56b741439f9e"
],
"hasRelay": false,
"relay": null,
"customFields": {},
"customFields2": {
"strings": {
"9b38f0eb-ff07-4a73-9192-e6fde7a6b24c": "V123456789809"
},
"decimals": {},
"dates": {},
"booleans": {},
"stringArrays": {},
"images": {}
},
"businessDetails": {
"name": "My Company Name",
"address": "My Company Address",
"country": "en-PK",
"customFields": null,
"customFields2": {
"strings": {
"9b38f0eb-ff07-4a73-9192-e6fde7a6b24c": ""
},
"decimals": null,
"dates": null,
"booleans": null,
"stringArrays": null,
"images": null
}
}
}
}