Learn how Intelliprint calculates and represents costs, including the 8-decimal precision system and how to convert to real GBP amounts.
The 8-Decimal System
Intelliprint uses 8 decimal places for cost precision. This allows for accurate pricing on bulk orders where sub-penny precision matters.
Critical: All cost amounts from the API must be divided by 100,000,000 (10^8) to get the real GBP price.
Why 8 Decimals?
For large bulk orders, even fractional pennies add up:
Example: 10,000 letters at £0.445 each
= £4,450.00 total
vs
10,000 letters at £0.45 each
= £4,500.00 total
Difference: £50 savings with precise pricing
Converting Cost Values
Real GBP Price = API Cost Value ÷ 100,000,000
Examples
// API returns cost values like this:
const printJob = await ip . prints . retrieve ( 'print_abc123' );
// Raw values (8-decimal precision)
const amount = printJob . cost . amount ; // e.g., 45000000
const tax = printJob . cost . tax ; // e.g., 9000000
const total = printJob . cost . after_tax ; // e.g., 54000000
// Convert to GBP
const amountGBP = amount / 100000000 ; // £0.45
const taxGBP = tax / 100000000 ; // £0.09
const totalGBP = total / 100000000 ; // £0.54
console . log ( `Subtotal: £ ${ amountGBP . toFixed ( 2 ) } ` );
console . log ( `VAT (20%): £ ${ taxGBP . toFixed ( 2 ) } ` );
console . log ( `Total: £ ${ totalGBP . toFixed ( 2 ) } ` );
Cost Structure
Every print job includes detailed cost information:
{
"cost" : {
"amount" : 45000000 , // Pre-tax cost (£0.45)
"tax" : 9000000 , // VAT (£0.09)
"after_tax" : 54000000 , // Total cost (£0.54)
"currency" : "GBP"
}
}
Cost Fields
Field Description Formula
amountBase cost before tax Sum of all letter costs taxVAT (20% for UK customers) amount × 0.20 (UK only)after_taxTotal charged to account amount + taxcurrencyCurrency code Always GBP
VAT (Value Added Tax)
UK customers: 20% VAT is charged and shown separately.
Non-UK customers: VAT is 0 (reverse charge / outside UK VAT scope).
// Check if VAT was charged
if ( printJob . cost . tax > 0 ) {
console . log ( 'VAT applies (UK customer)' );
} else {
console . log ( 'No VAT (Non-UK customer)' );
}
Per-Letter Costs
Each letter in a print job has individual cost details:
const printJob = await ip . prints . retrieve ( 'print_abc123' );
printJob . letters . forEach (( letter , index ) => {
const cost = letter . cost . after_tax / 100000000 ;
console . log ( `Letter ${ index + 1 } : £ ${ cost . toFixed ( 2 ) } ` );
console . log ( ` Pages: ${ letter . pages } ` );
console . log ( ` Envelope: ${ letter . envelope } ` );
console . log ( ` Service: ${ letter . postage_service } ` );
});
// Total for all letters
const total = printJob . cost . after_tax / 100000000 ;
console . log ( ` \n Total: £ ${ total . toFixed ( 2 ) } ` );
What Affects Cost?
Primary Cost Factors
Sheet Count - Physical paper sheets used (affected by double-sided printing)
Postage Service - Faster/tracked services cost more
Printing Options - Colour, premium quality
Envelope Size - Larger envelopes cost more
Quantity - Volume discounts may apply
Double-Sided Printing Cost Savings
Double-sided printing reduces the number of physical sheets, which lowers your costs :
// Example: 4-page letter
// Single-sided (default)
const singleSided = await ip . prints . create ({
testmode: true ,
content: '...4 pages of content...' ,
recipients: [{ address: { /* ... */ }}],
printing: { double_sided: 'no' },
confirmed: true
});
console . log ( 'Pages:' , singleSided . pages ); // 4 pages
console . log ( 'Sheets:' , singleSided . sheets ); // 4 sheets
console . log ( 'Cost:' , singleSided . cost . after_tax / 100000000 );
// Double-sided
const doubleSided = await ip . prints . create ({
testmode: true ,
content: '...4 pages of content...' ,
recipients: [{ address: { /* ... */ }}],
printing: { double_sided: 'yes' },
confirmed: true
});
console . log ( 'Pages:' , doubleSided . pages ); // 4 pages
console . log ( 'Sheets:' , doubleSided . sheets ); // 2 sheets (HALF!)
console . log ( 'Cost:' , doubleSided . cost . after_tax / 100000000 );
// Cost savings
const savings = ( singleSided . cost . after_tax - doubleSided . cost . after_tax ) / 100000000 ;
console . log ( `Savings: £ ${ savings . toFixed ( 2 ) } ` );
Pages vs Sheets:
Pages = Total number of document pages in your letter
Sheets = Physical pieces of paper used (what you’re charged for)
Single-sided: 4 pages = 4 sheets
Double-sided: 4 pages = 2 sheets (printed front & back)
For bulk campaigns, double-sided printing can save significant costs. A 1,000-letter campaign with 4 pages each could save £100+ by using double-sided printing.
Current Pricing
For up-to-date pricing information on letters, postcards, and all postage services, visit the Intelliprint Pricing Page .
Get exact costs: Use testmode: true when creating print jobs to see the precise cost for your specific configuration without being charged.
Calculate Costs Before Sending
Use Test Mode
The best way to calculate costs is to create a test print job:
// Create test print to see exact costs
const test = await ip . prints . create ({
testmode: true , // Won't charge or send
content: '<h1>Your content</h1>' ,
recipients: [{ address: { /* ... */ }}],
postage: { service: 'uk_first_class' },
printing: { premium_quality: true },
confirmed: true
});
// Get exact cost
const costPerLetter = test . letters [ 0 ]. cost . after_tax / 100000000 ;
console . log ( `Cost per letter: £ ${ costPerLetter . toFixed ( 2 ) } ` );
// Calculate for bulk
const recipientCount = 1000 ;
const totalCost = costPerLetter * recipientCount ;
console . log ( `Cost for ${ recipientCount } recipients: £ ${ totalCost . toFixed ( 2 ) } ` );
Helper Functions
function formatCost ( apiCostValue ) {
const gbp = apiCostValue / 100000000 ;
return `£ ${ gbp . toFixed ( 2 ) } ` ;
}
function getCostBreakdown ( printJob ) {
return {
subtotal: formatCost ( printJob . cost . amount ),
vat: formatCost ( printJob . cost . tax ),
total: formatCost ( printJob . cost . after_tax ),
letterCount: printJob . letters . length ,
costPerLetter: formatCost (
printJob . letters [ 0 ]?. cost . after_tax || 0
)
};
}
// Usage
const breakdown = getCostBreakdown ( printJob );
console . log ( breakdown );
// {
// subtotal: '£0.45',
// vat: '£0.09',
// total: '£0.54',
// letterCount: 1,
// costPerLetter: '£0.54'
// }
def format_cost ( api_cost_value ):
gbp = api_cost_value / 100000000
return f '£ { gbp :.2f} '
def get_cost_breakdown ( print_job ):
return {
'subtotal' : format_cost(print_job.cost.amount),
'vat' : format_cost(print_job.cost.tax),
'total' : format_cost(print_job.cost.after_tax),
'letter_count' : len (print_job.letters),
'cost_per_letter' : format_cost(
print_job.letters[ 0 ].cost.after_tax if print_job.letters else 0
)
}
# Usage
breakdown = get_cost_breakdown(print_job)
print (breakdown)
# {
# 'subtotal': '£0.45',
# 'vat': '£0.09',
# 'total': '£0.54',
# 'letter_count': 1,
# 'cost_per_letter': '£0.54'
# }
Bulk Campaign Cost Calculator
Calculate costs for large campaigns:
async function estimateCampaignCost ( config ) {
// Create test with one recipient
const test = await ip . prints . create ({
testmode: true ,
content: config . content ,
recipients: [ config . sampleRecipient ],
postage: config . postage ,
printing: config . printing ,
background: config . background ,
extra_documents: config . extraDocuments ,
confirmed: true
});
// Get cost per letter
const costPerLetter = test . letters [ 0 ]. cost . after_tax / 100000000 ;
// Calculate campaign total
const totalRecipients = config . recipientCount ;
const totalCost = costPerLetter * totalRecipients ;
return {
costPerLetter: `£ ${ costPerLetter . toFixed ( 2 ) } ` ,
totalRecipients: totalRecipients ,
totalCost: `£ ${ totalCost . toFixed ( 2 ) } ` ,
pages: test . letters [ 0 ]. pages ,
envelope: test . letters [ 0 ]. envelope ,
service: test . letters [ 0 ]. postage_service
};
}
// Usage
const estimate = await estimateCampaignCost ({
content: '<h1>Campaign Letter</h1>' ,
sampleRecipient: { address: { /* ... */ }},
recipientCount: 5000 ,
postage: { service: 'uk_first_class' },
printing: { premium_quality: true }
});
console . log ( 'Campaign Cost Estimate:' );
console . log ( ` Per letter: ${ estimate . costPerLetter } ` );
console . log ( ` Recipients: ${ estimate . totalRecipients } ` );
console . log ( ` Total: ${ estimate . totalCost } ` );
Common Mistakes
Forgetting to divide by 100000000
Wrong: const cost = printJob . cost . after_tax ; // 54000000 (not £54M!)
console . log ( `Cost: £ ${ cost } ` ); // Wrong!
Correct: const cost = printJob . cost . after_tax / 100000000 ; // £0.54
console . log ( `Cost: £ ${ cost . toFixed ( 2 ) } ` ); // Correct!
Using wrong precision for display
Always use .toFixed(2) for GBP display: const cost = 54123456 / 100000000 ; // 0.54123456
console . log ( cost ); // 0.54123456 (too precise)
console . log ( `£ ${ cost . toFixed ( 2 ) } ` ); // £0.54 (correct)
Remember that UK customers pay VAT: // Show VAT separately
const subtotal = printJob . cost . amount / 100000000 ;
const vat = printJob . cost . tax / 100000000 ;
const total = printJob . cost . after_tax / 100000000 ;
console . log ( `Subtotal: £ ${ subtotal . toFixed ( 2 ) } ` );
console . log ( `VAT: £ ${ vat . toFixed ( 2 ) } ` );
console . log ( `Total: £ ${ total . toFixed ( 2 ) } ` );
Best Practices
Use testmode: true to get exact costs before committing to large campaigns.
Store costs in your database
When creating print jobs, store the cost for your records: const printJob = await ip . prints . create ({ /* ... */ });
// Store in your database
await db . invoices . update ( invoiceId , {
print_job_id: printJob . id ,
postage_cost: printJob . cost . after_tax / 100000000
});
Always show costs with proper GBP formatting and VAT breakdown for transparency.
Budget for bulk campaigns
Calculate costs ahead of time for bulk campaigns to ensure you have sufficient account balance.
Next Steps