Skip to main content
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

Formula

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

FieldDescriptionFormula
amountBase cost before taxSum of all letter costs
taxVAT (20% for UK customers)amount × 0.20 (UK only)
after_taxTotal charged to accountamount + tax
currencyCurrency codeAlways 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(`\nTotal: £${total.toFixed(2)}`);

What Affects Cost?

Primary Cost Factors

  1. Sheet Count - Physical paper sheets used (affected by double-sided printing)
  2. Postage Service - Faster/tracked services cost more
  3. Printing Options - Colour, premium quality
  4. Envelope Size - Larger envelopes cost more
  5. 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

JavaScript Cost Formatter

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'
// }

Python Cost Formatter

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

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!
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.
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.
Calculate costs ahead of time for bulk campaigns to ensure you have sufficient account balance.

Next Steps