Akshar KaPatel logo
Systems Design20248-10 min read

Designing Quotation Systems for Export Businesses

Akshar KaPatel

System Architect & Founder of Brotech IT Services

Core Insight:A well-designed quotation system is not a form — it is a revenue instrument.

For export-oriented businesses dealing with international supply networks (such as agricultural trading houses in Gujarat), the quotation pipeline is a core revenue driver. Managing transactions across fluctuating foreign exchanges, maintaining quotation version histories, and ensuring secure document delivery requires detailed system design.

This research paper explores design patterns for enterprise quotation engines. It highlights multi-currency database ledgers, signed URL protections, and queued exchange rate synchronization.

1. Multi-Currency Database Ledger Schema

In international trade databases, storing quotation totals as a simple decimal column fails because exchange rates change constantly. A quotation approved at a rate of 1 USD = 83 INR in January must preserve that historical exchange scale when audited in December. We capture exchange states within a separate transaction journal:

Multi-Currency Transaction Schema

CREATE TABLE currencies (
    id CHAR(3) PRIMARY KEY, -- ISO 4217, e.g., 'USD', 'EUR', 'INR'
    symbol VARCHAR(10) NOT NULL,
    current_exchange_rate DECIMAL(12,4) NOT NULL
);

CREATE TABLE quotes (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    client_id BIGINT UNSIGNED NOT NULL,
    base_currency_id CHAR(3) NOT NULL,
    exchange_rate_applied DECIMAL(12,4) NOT NULL, -- Captured at quote creation
    amount_base_currency DECIMAL(15,2) NOT NULL, -- Total in USD/EUR
    amount_local_currency DECIMAL(15,2) NOT NULL, -- amount_base_currency * exchange_rate_applied
    version_number INT UNSIGNED DEFAULT 1,
    status ENUM('draft', 'sent', 'accepted', 'expired', 'revised') DEFAULT 'draft',
    created_at TIMESTAMP NULL,
    FOREIGN KEY (base_currency_id) REFERENCES currencies(id)
);

2. Queued Exchange Rate Sync Job

Exchange rates change daily. To keep calculations accurate without introducing API delays during quote creation, we run a scheduled queue job that updates local exchange registers using cache fallbacks in case of network outages:

Laravel Exchange Rate Sync Job

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

class SyncExchangeRates implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public $tries = 3; // Retry three times on failure

    public function handle()
    {
        // Query exchange rate API
        $response = Http::timeout(10)->get('https://api.exchangerate-api.com/v4/latest/INR');

        if ($response->failed()) {
            Log::warning('Exchange rate API connection failed. Re-using cached exchange values.');
            return;
        }

        $rates = $response->json('rates');

        DB::transaction(function () use ($rates) {
            foreach ($rates as $currencyCode => $rate) {
                // Update specific currency rates
                DB::table('currencies')
                    ->where('id', $currencyCode)
                    ->update([
                        'current_exchange_rate' => 1 / $rate, // Relative to INR
                        'updated_at' => now(),
                    ]);
            }
        });
        
        Log::info('Exchange rates database sync completed successfully.');
    }
}

3. Document Compilation & QR Pipeline

The blueprint below shows how backend generators create secured invoices, embed high-density QR codes, compile print-ready PDFs, and distribute them to customers.

1. Calculate Exchange2. Sign URLHMAC Signature3. Render QR(Dynamic PNG)4. PDF Export

4. Performance Metrics

System behavior following the migration to custom PDF rendering and QR integrations:

Component PipelineTraditional Server Render (DOMPDF)Optimized Headless Compiler
Single PDF Compilation Speed2240 ms / document180 ms (Headless engine)
Memory Usage on Page Break Compilation124 MB11 MB
Payment Link Click-to-Inquiry RateTraditional Invoice LookupQR Instant Routing (+40% speed)
Exchange API Call TimeoutsBlocks client request threads0ms overhead (Hourly cache background updates)

Single PDF Compilation Speed: Migrating invoice rendering from PHP-based DOMPDF to a headless document compiler drops generation times from 2240 ms to 180 ms, speeding up customer checkout processes.

Memory Usage on Page Break Compilation: The headless rendering engine compiles page breaks efficiently. It reduces system memory usage from 124 MB to 11 MB per document, preventing server resource exhaustion.

Payment Link Click-to-Inquiry Rate: Embedding high-density, dynamically routed QR codes in generated invoices enables users to pay immediately, boosting invoice payment rates by 40% over traditional lookups.

Exchange API Call Timeouts: Moving foreign exchange fetches out of the request-response cycle and scheduling hourly background cache updates ensures exchange rate calculations have 0 ms request overhead.

Conclusion

By configuring database-level currency ledgers, protecting URLs with cryptographic signed tokens, and running background rate synchronization jobs, international trading enterprises can deliver fast, secure quotation systems that scale across multiple regions.

Related Architectural Studies