Skip to content

Customer Discounts Guide

Understanding how customer-specific discounts work in the Attivita API.

Overview

The Attivita API automatically applies customer-specific discounts based on your account's discount package. This means:

  • 💰 Prices shown in API responses reflect your final price
  • 🔄 Discounts are applied automatically during order creation
  • 📊 No manual calculation needed
  • 🏷️ Transparent pricing across all endpoints

How Discounts Work

Discount Package Structure

Each customer account may have an associated discount package that defines:

javascript
{
  "discountPackage": {
    "name": "Premium Partner 2024",
    "discounts": [
      {
        "category": "Microsoft",
        "percentage": 15
      },
      {
        "category": "Adobe",
        "percentage": 10
      },
      {
        "category": "Default",
        "percentage": 5
      }
    ],
    "validFrom": "2024-01-01",
    "validUntil": "2024-12-31"
  }
}

Automatic Application

When you request products or create orders, discounts are applied automatically:

Products Endpoint

javascript
// Request
GET /api/products

// Response shows discounted prices
[
  {
    "name": "Microsoft Office 2021",
    "price": 212.49,        // ← Your discounted price (15% off)
    "listPrice": 249.99,    // ← Original price
    "discount": 15,         // ← Your discount percentage
    ...
  }
]

Orders Endpoint

javascript
// Request
POST /api/orders
{
  "products": [
    {
      "productId": "507f1f77bcf86cd799439011",
      "amount": 2
    }
  ]
}

// Response
{
  "items": [
    {
      "product": "Microsoft Office 2021",
      "quantity": 2,
      "price": 212.49,      // ← Discounted unit price
      "subtotal": 424.98    // ← Calculated with discount
    }
  ],
  "subTotal": 424.98,
  "discountTotal": 75.00,   // ← Total discount amount
  "grandTotal": 424.98
}

Understanding Price Fields

In Product Responses

FieldDescriptionExample
priceYour final price after discounts212.49
oldPricePrevious price (if changed)229.99
listPriceOriginal price before discounts249.99

In Order Responses

FieldDescriptionExample
items[].priceDiscounted unit price212.49
items[].subtotalLine total with discount424.98
subTotalOrder total before taxes424.98
discountTotalTotal discount amount75.00
grandTotalFinal total (may include VAT)505.73

Discount Calculation Examples

Example 1: Single Product Order

javascript
// Product list price: €100.00
// Your discount: 20%
// Quantity: 3

const calculation = {
  listPrice: 100.00,
  discount: 0.20,
  quantity: 3,
  
  unitPrice: 100.00 * (1 - 0.20),        // €80.00
  subtotal: 80.00 * 3,                   // €240.00
  discountAmount: (100.00 - 80.00) * 3,  // €60.00
  
  // For German customers (19% VAT)
  vat: 240.00 * 0.19,                    // €45.60
  grandTotal: 240.00 + 45.60             // €285.60
};

Example 2: Mixed Category Order

javascript
// Your discounts:
// - Microsoft: 15%
// - Adobe: 10%
// - Others: 5%

const order = {
  items: [
    {
      product: "Microsoft Office",
      listPrice: 249.99,
      discount: 0.15,
      quantity: 1,
      finalPrice: 212.49  // 249.99 * 0.85
    },
    {
      product: "Adobe Creative Cloud",
      listPrice: 599.99,
      discount: 0.10,
      quantity: 1,
      finalPrice: 539.99  // 599.99 * 0.90
    },
    {
      product: "Antivirus Software",
      listPrice: 49.99,
      discount: 0.05,
      quantity: 2,
      finalPrice: 94.98   // (49.99 * 0.95) * 2
    }
  ],
  
  subTotal: 847.46,      // Sum of final prices
  discountTotal: 107.50, // Total saved
  grandTotal: 847.46     // Before VAT
};

VAT Handling

German Customers

19% VAT is automatically added to orders for German customers:

javascript
{
  "subTotal": 100.00,
  "vatAmount": 19.00,
  "grandTotal": 119.00
}

International Customers

VAT handling depends on your location and business status. Contact support for details.

Checking Your Discount Status

While there's no direct endpoint to check your discount package, you can:

  1. Compare Prices: Check product prices against known list prices
  2. Review Orders: The discountTotal field shows applied discounts
  3. Contact Support: For detailed discount package information

Special Considerations

Volume Discounts

Some products may have additional volume-based discounts:

javascript
// Standard discount: 10%
// Volume discount: Additional 5% for 10+ units

{
  "quantity": 15,
  "baseDiscount": 0.10,
  "volumeDiscount": 0.05,
  "totalDiscount": 0.15,  // Combined discount
  "finalPrice": listPrice * 0.85 * quantity
}

Promotional Pricing

During promotions, you receive the better of:

  • Your customer discount
  • The promotional discount
javascript
// Your discount: 10%
// Promotion: 15% off
// You get: 15% (the better deal)

Subscription Products

Subscription products may have different discount structures:

javascript
{
  "product": "Microsoft 365",
  "billingCycle": "annual",
  "listPrice": 99.99,
  "yourPrice": 84.99,  // With discount
  "monthlyEquivalent": 7.08
}

Best Practices

1. Don't Cache Prices Too Long

Prices and discounts can change:

javascript
const PRICE_CACHE_TTL = 3600000; // 1 hour max

async function getProductPrice(productId) {
  const cached = priceCache.get(productId);
  
  if (cached && Date.now() - cached.time < PRICE_CACHE_TTL) {
    return cached.price;
  }
  
  const product = await api.getProduct(productId);
  priceCache.set(productId, {
    price: product.price,
    time: Date.now()
  });
  
  return product.price;
}

2. Verify Prices at Order Time

Always use current prices when creating orders:

javascript
async function createOrderWithPriceCheck(items) {
  // Get current prices
  const products = await api.getProducts();
  const priceMap = new Map(products.map(p => [p._id, p.price]));
  
  // Verify prices haven't changed significantly
  for (const item of items) {
    const currentPrice = priceMap.get(item.productId);
    const expectedPrice = item.expectedPrice;
    
    if (Math.abs(currentPrice - expectedPrice) > 0.01) {
      throw new Error(`Price changed for ${item.productId}`);
    }
  }
  
  // Create order
  return api.createOrder(items);
}

3. Display Savings to Users

Show customers how much they're saving:

javascript
function formatPriceDisplay(product) {
  const savings = product.listPrice - product.price;
  const savingsPercent = (savings / product.listPrice) * 100;
  
  return {
    listPrice: `€${product.listPrice.toFixed(2)}`,
    yourPrice: `€${product.price.toFixed(2)}`,
    savings: `€${savings.toFixed(2)}`,
    savingsPercent: `${savingsPercent.toFixed(0)}%`,
    display: `€${product.price.toFixed(2)} (Save ${savingsPercent.toFixed(0)}%)`
  };
}

Troubleshooting

Prices Seem Wrong?

  1. Check Product Categories: Different categories may have different discounts
  2. Verify Account Status: Ensure your account is active
  3. Review Order Dates: Discounts may have expiration dates
  4. Contact Support: For discount package verification

No Discount Applied?

Possible reasons:

  • Product not eligible for discounts
  • Discount package expired
  • Account status issue
  • Special pricing already applied

FAQ

Q: Can I see my discount percentage via API?

A: Not directly, but you can calculate it by comparing the price field with known list prices.

Q: Do discounts stack?

A: No, only one discount package applies per customer. You get either your negotiated discount or promotional pricing, whichever is better.

Q: Are discounts guaranteed?

A: Discounts are subject to your agreement with Attivita GmbH and may change with notice.

Q: How are multi-currency orders handled?

A: All prices in the API are in EUR. Currency conversion is handled separately.

Next Steps

The usage of this API is at your own risk. Attivita GmbH is not responsible for any damages or losses.