EU/UK Cosmetics Responsible Person Cost Calculator

Get an instant estimate for EU/UK cosmetics Responsible Person (RP) cost based on your market coverage, portfolio size, and required services. Compare prices from 20+ verified providers and request competitive quotes. No email required — get your estimate in 60 seconds.

✓ EU/UK Regulation Logic ✓ CPNP/SCPN Pricing ✓ Per SKU vs Retainer ✓ No Email Required

Quick Estimate

Get your estimate in 60 seconds

Enter the number of cosmetic products/SKUs you need RP services for

EUR

On this page

EU/UK Cosmetics Responsible Person Cost Calculator

Use the calculator above to get an instant estimate, or review the detailed breakdown below.

Your Estimate

Low Estimate

€0

Typical Range

€0

High Estimate

€0

Onboarding Timeline

-

Services Included

Cost Breakdown by Service

Find and Compare Cosmetics RP Providers → Request Quotes from Providers →

How Responsible Person service scope is determined

EU/UK cosmetics Responsible Person (RP) cost depends on the scope of services required, which is determined by three key factors:

1. Market Coverage

Your target markets determine which regulatory systems you need to comply with:

2. Portfolio Size

The number of cosmetic products (SKUs) you need to register affects pricing structure:

3. Service Scope

The level of regulatory support required determines service complexity:

EU/UK Regulatory Requirements

Under EU Regulation 1223/2009 and UK Cosmetics Regulation, every cosmetic product placed on the market must have a designated Responsible Person who ensures compliance. The RP must:

Real-World Examples

Example 1: Small Brand (EU Only, 3 Products)

Portfolio: 3 cosmetic products (face cream, serum, cleanser)

Services Required:

  • CPNP notifications (EU) — $500-$800 per product
  • Basic PIF management — $300-$500 per product
  • Responsible Person role — included

Total baseline: $2,400-$3,900 annually (per-SKU pricing)

Timeline: 2-4 weeks for initial setup

Example 2: Medium Brand (EU + UK, 15 Products)

Portfolio: 15 cosmetic products across multiple categories

Services Required:

  • CPNP + SCPN notifications — $800-$1,200 per product
  • Full PIF management — $500-$800 per product
  • Safety assessment support — $200-$400 per product
  • Responsible Person role — included

Total baseline: $22,500-$36,000 annually (hybrid pricing with volume discounts)

Timeline: 4-8 weeks for initial setup

Example 3: Large Brand (EU + UK, 50 Products)

Portfolio: 50+ cosmetic products, multiple brands

Services Required:

  • Unlimited CPNP + SCPN notifications — included in retainer
  • Full PIF management — included
  • Comprehensive safety assessment support — included
  • Dedicated Responsible Person — included
  • Regulatory consulting and strategy — included

Total baseline: $12,000-$25,000 annually (retainer-based pricing)

Timeline: 6-12 weeks for initial setup and onboarding

💡 Tip: Work with a verified cosmetics Responsible Person provider to develop a compliance strategy before launching. A well-planned approach can help you avoid common pitfalls and reduce costs by 20-40%.

Find and Compare Cosmetics RP Providers →

Cost breakdown by Responsible Person services

Below is a detailed breakdown of typical costs for Responsible Person services, based on comprehensive analysis of pricing data from 20+ verified cosmetics Responsible Person providers in our directory. Our pricing analysis includes providers from the EU, UK, and international markets, accounting for regional variations, service scope, and portfolio size differences.

Data Sources: Pricing ranges are derived from:

Note: Actual quotes may vary ±20-30% based on portfolio size, market coverage, and service scope. Always request quotes from multiple providers for accurate pricing.

CPNP Notification (EU Market)

Typical cost: €300-€800 per product

What it is: Cosmetic Products Notification Portal submission required for all cosmetic products sold in the EU under Regulation 1223/2009.

When required: Mandatory for all cosmetic products placed on the EU market.

Turnaround: 1-2 weeks for submission

Includes: Product registration, formula submission, safety data upload

SCPN Notification (UK Market)

Typical cost: €250-€700 per product

What it is: Submit Cosmetic Product Notification required for all cosmetic products sold in the UK under UK Cosmetics Regulation.

When required: Mandatory for all cosmetic products placed on the UK market.

Turnaround: 1-2 weeks for submission

Includes: Product registration, formula submission, safety data upload

Product Information File (PIF) Management

Typical cost: €300-€800 per product annually

What it is: Creation, maintenance, and updates of mandatory Product Information Files containing safety data, formula details, and compliance documentation.

When required: Required for all cosmetic products - PIF must be maintained and accessible to authorities.

Turnaround: 2-4 weeks for initial PIF creation

Includes: PIF compilation, safety assessment review, formula documentation, label compliance check

Responsible Person Role

Typical cost: Included in service packages

What it is: Designated Responsible Person who ensures product compliance, handles regulatory inquiries, and manages market surveillance responses.

When required: Mandatory for all cosmetic products - must have a designated RP in EU/UK.

Includes: Regulatory oversight, compliance monitoring, inquiry handling, recall management if needed

Safety Assessment Support

Typical cost: €200-€500 per product

What it is: Review and support for cosmetic product safety assessments, formula reviews, and ingredient compliance checks.

When required: Often included in full-service packages, or available as add-on service.

Turnaround: 1-3 weeks for review

Includes: Safety assessment review, ingredient restriction checks, formula compliance verification

Regulatory Consulting

Typical cost: €150-€400 per hour or included in retainer

What it is: Strategic regulatory guidance, compliance strategy, and regulatory support for product launches and ongoing compliance.

When required: Available as add-on service or included in enterprise retainer packages.

Includes: Regulatory strategy, compliance planning, ingredient advice, market entry guidance

What makes Responsible Person cost vary?

Understanding the factors that drive cosmetics Responsible Person cost helps you budget accurately and identify opportunities to optimize spending. Here are the primary cost drivers:

1. Market Coverage (EU vs UK vs Both)

Impact: High — This is the primary cost driver. More markets = higher cost.

Some providers offer discounts for dual-market coverage. Compare providers to find the best value.

2. Portfolio Size

Impact: High — Affects pricing model selection

3. Service Scope

Impact: Medium-High — More services = higher cost

4. Product Complexity

Impact: Medium — Complex products may require premium pricing

5. Pricing Model

Impact: Medium — Choose the right model for your portfolio

6. Provider Experience & Location

Impact: Low-Medium — Regional and experience variations

7. Onboarding Timeline

Impact: Low — Rush service may add premium

8. Additional Services

Impact: Medium — Add-ons increase cost

9. Contract Terms

Impact: Low-Medium — Longer contracts may offer discounts

10. Provider Selection

Impact: Medium — Compare multiple providers

💡 Compare Regional Pricing: Our EU/UK Cosmetics Compliance directory includes providers from across Europe. Compare pricing, service scope, and regulatory expertise to find the best match for your portfolio and budget.

💡 Cost Optimization: Work with experienced Responsible Person providers that can help you optimize your service package. A well-structured agreement with clear service scope can reduce costs by 20-30% while maintaining full compliance.

Browse Cosmetics RP Providers →

Typical timelines (planning your submission)

Biocompatibility testing timelines are critical for regulatory submission planning. Below are typical timelines by test bundle, from sample submission to final report delivery.

Basic Triplet (Surface Device, Limited Contact)

Tests: Cytotoxicity + Sensitization + Irritation

Timeline: 6-10 weeks

Critical path: Sensitization is typically the longest test in this bundle.

Prolonged Contact External Communicating Device

Tests: Cytotoxicity + Sensitization + Irritation + Systemic Toxicity + Genotoxicity + Pyrogenicity

Timeline: 12-16 weeks

Critical path: Genotoxicity (Ames test) is typically the bottleneck. Some tests can run in parallel.

Implant / Permanent Contact Device

Tests: Full battery + Implantation + Chemical Characterization (if needed)

Timeline: 20-36 weeks

Critical path: Implantation study has the longest fixed timeline due to observation periods.

Planning Your Submission Timeline

Start early: Begin biocompatibility planning during device design phase. Here's a recommended timeline for regulatory submission planning:

9-12 Months Before Submission

  • Material selection and supplier qualification
  • Initial biocompatibility strategy discussion
  • Research existing material data and equivalency opportunities

6-9 Months Before Submission

  • Develop Biological Evaluation Plan (BEP) with accredited biocompatibility lab
  • Select and contract with testing lab
  • Order device samples for testing
  • Begin material characterization if needed (EU/UK Cosmetics Regulation-18)

4-6 Months Before Submission

  • Submit samples to lab
  • Testing begins (critical path items start first)
  • Monitor testing progress and address any issues

2-3 Months Before Submission

  • Testing complete
  • Biological Evaluation Report (BER) finalized
  • Review reports for regulatory submission readiness
  • Prepare biocompatibility section of regulatory filing

Submission

  • Include biocompatibility data in regulatory filing (510(k), PMA, MDR, etc.)
  • Respond to regulatory questions if needed

Rush Options (If Available)

Some biocompatibility testing labs offer rush services, but:

Factors That Can Delay Timelines

💡 Pro Tip: Work with experienced biocompatibility labs that can help you plan your timeline and identify critical path items. Early engagement can help you avoid delays and optimize your submission schedule.

Find Experienced Labs →

How to reduce cost without risking compliance

Reducing cosmetics Responsible Person cost doesn't mean cutting corners. A risk-based approach, proper planning, and strategic material selection can reduce costs by 20-40% while maintaining regulatory compliance.

1. Use Existing Material Characterizations (Where Justified)

Potential savings: $10,000-$28,000

2. Avoid Unnecessary Endpoints Through Strong Rationale

Potential savings: $2,000-$12,000 per avoided test

3. Plan Sample Quantities Early

Potential savings: $500-$2,000 + time

4. Choose Labs That Can Bundle and Coordinate

Potential savings: 10-20% on total project

5. Optimize Extraction Strategy

Potential savings: $1,000-$3,000

6. Consider In Vitro Methods When Acceptable

Potential savings: $1,500-$4,000 per test

7. Avoid GLP When Not Required

Potential savings: 10-25% per test

8. Plan for Success (Avoid Failures)

Potential savings: $5,000-$20,000+ (avoiding re-tests)

9. Strategic Lab Selection

Potential savings: 15-30% regional variation

10. Avoid Rush When Possible

Potential savings: 15-50% premium avoided

⚠️ Important: Never skip required endpoints or use inadequate testing to save costs. Regulatory non-compliance will cost far more in delays, rejections, and potential recalls. Always work with accredited biocompatibility testing labs and follow risk-based, scientifically sound approaches.

How to choose a biocompatibility testing lab

Selecting the right biocompatibility testing lab is critical for regulatory success, cost optimization, and timeline management. Use this checklist to evaluate labs:

1. Relevant Testing Scope

2. Chemical Characterization + Toxicology Capabilities

3. Turnaround SLAs and Capacity

4. Report Quality & Regulatory Familiarity

5. Communication & Project Management

6. Accreditation & Quality Systems

7. Pricing & Value

8. BEP/BER Support

9. Geographic Considerations

10. References & Track Record

💡 Find the Right Lab: Use our biocompatibility testing labs directory to compare 20+ verified providers. Filter by location, capabilities, and read provider profiles to find the best match for your project.

Compare 70+ Labs → Get Multiple Quotes →

Red Flags to Avoid

✅ Verified Labs: All labs in our biocompatibility testing directory are verified and accredited. We screen labs for proper accreditation, quality systems, and regulatory experience to ensure you're working with reputable providers.

Find and Compare EU/UK Cosmetics Compliance Providers

Get quotes from 70+ accredited EU/UK Cosmetics Regulation testing labs

Browse Labs Directory → Request Quotes →

Get quotes (fast)

Ready to get competitive quotes from accredited biocompatibility testing labs? Follow these three simple steps:

1

Use the Calculator

Fill out the calculator above to get your cost estimate and required endpoints list.

2

Browse Labs

Review 70+ accredited biocompatibility testing labs, read profiles, and compare capabilities.

Browse Labs →
3

Request Quotes

Submit your device requirements and get competitive quotes from multiple labs in one request.

Request Quotes →

Send Your Calculator Results to Labs

After using the calculator, you can include your endpoint list and cost estimate when requesting quotes. This helps labs provide more accurate pricing.

Request Quotes with Calculator Results → Browse All Labs →

Frequently asked questions about cosmetics Responsible Person cost

How much does cosmetics Responsible Person cost?
EU/UK cosmetics Responsible Person (RP) cost ranges from €1,500-€3,500 per year for basic EU-only notifications (1-5 SKUs) to €15,000-€35,000+ per year for full-service EU+UK coverage with large portfolios (100+ SKUs) and PIF management. Cost depends on market coverage (EU, UK, or both), portfolio size, service scope (notifications only vs full PIF management), and contract duration. Use our calculator above to get an estimate for your specific portfolio.
How much does Responsible Person cost for a medium portfolio?
Medium portfolio (6-25 SKUs) Responsible Person services typically cost €5,000-€15,000 annually depending on market coverage and service scope. EU-only with basic notifications costs €3,000-€8,000, while EU+UK with full PIF management costs €8,000-€15,000. Get quotes from multiple providers to compare pricing and service levels.
What's the minimum cost for Responsible Person services?
The minimum cost for basic Responsible Person services (EU-only, 1-2 SKUs, notifications only) starts around €1,500-€2,500 per year. This includes CPNP notification and basic RP role. However, most brands need PIF management and additional services, which increases costs. For UK-only, expect €1,200-€2,000. Compare providers to find the best value for your needs.
Do I need Responsible Person services for both EU and UK?
If you're selling in both EU and UK markets, you need separate Responsible Person services for each. EU requires CPNP notification under Regulation 1223/2009, while UK requires SCPN notification under UK Cosmetics Regulation. Some providers offer combined EU+UK services at discounted rates. If selling in only one market, you only need RP services for that market.
What drives Responsible Person cost the most?
The primary cost drivers are portfolio size and service scope. Small portfolios (1-5 SKUs) typically use per-SKU pricing (€500-€1,500 per product), while large portfolios (26+ SKUs) use retainer pricing (€5,000-€25,000+ annually). Full PIF management adds €300-€800 per SKU. Market coverage (EU+UK vs single market) and contract duration also affect pricing. Compare providers to find the best value.
How long does Responsible Person onboarding take?
Responsible Person onboarding typically takes 2-6 weeks depending on portfolio size and service scope. Basic CPNP/SCPN notifications can be completed in 2-4 weeks. Full PIF management and comprehensive service setup takes 4-8 weeks. Large portfolios (50+ SKUs) may take 6-12 weeks. Plan ahead to ensure compliance before product launch.
Can I use in vitro irritation testing instead of animal testing?
Yes, EU/UK Cosmetics Regulation-23:2021 emphasizes in vitro methods for irritation testing, which are faster (4-8 weeks vs 8-12 weeks) and less expensive ($3,500-$8,000 vs $5,000-$12,000) than traditional animal-based methods. Many regulatory authorities accept in vitro irritation testing when properly justified. Discuss with your biocompatibility lab and regulatory team.
What's the difference between EU/UK Cosmetics Regulation-10 and EU/UK Cosmetics Regulation-23?
EU/UK Cosmetics Regulation-10 covers sensitization testing (allergic reactions). EU/UK Cosmetics Regulation-23:2021 is the newer standard for irritation/intracutaneous reactivity testing that emphasizes in vitro methods, reducing animal testing requirements. Both standards are current - EU/UK Cosmetics Regulation-10 for sensitization, EU/UK Cosmetics Regulation-23 for irritation. Many labs now use EU/UK Cosmetics Regulation-23 in vitro methods for irritation testing.
When is chemical characterization (EU/UK Cosmetics Regulation-18) needed?
Chemical characterization (EU/UK Cosmetics Regulation-18) is required for devices with new materials, multi-material assemblies, coatings, drug-device combinations, or when material composition is unknown. It costs $10,000-$28,000 but can reduce overall testing costs by eliminating unnecessary biological tests through toxicological risk assessment (EU/UK Cosmetics Regulation-17). If you have existing material data, you may be able to justify skipping chemical characterization.
What is a Biological Evaluation Plan (BEP) and Biological Evaluation Report (BER)?
A Biological Evaluation Plan (BEP) is a document that outlines which biocompatibility tests are needed for your device based on EU/UK Cosmetics Regulation-1 risk assessment. BEP development costs $2,000-$5,000. The Biological Evaluation Report (BER) summarizes all biocompatibility data and conclusions. Many labs provide BEP/BER services - this upfront planning can reduce overall testing costs by 20-40% by avoiding unnecessary tests.
Does FDA require EU/UK Cosmetics Regulation-1 testing for 510(k)?
FDA requires biocompatibility evaluation for 510(k) submissions, and EU/UK Cosmetics Regulation-1 is the accepted framework. FDA guidance references EU/UK Cosmetics Regulation-1 and provides endpoint tables. The extent of testing depends on market coverage and portfolio size, duration, and site. Not all 510(k) devices require full test batteries - risk-based approach is acceptable. Work with your biocompatibility lab to develop an appropriate testing strategy.
What's the difference between CPNP and SCPN notifications?
CPNP (Cosmetic Products Notification Portal) is for EU market under Regulation 1223/2009. SCPN (Submit Cosmetic Product Notification) is for UK market under UK Cosmetics Regulation. Both require similar information (product details, formula, safety data), but are separate systems. If selling in both markets, you need both notifications. Many Responsible Person providers handle both.
What's included in Responsible Person services?
Responsible Person services typically include: CPNP/SCPN notification submission, Product Information File (PIF) management, regulatory compliance oversight, handling market surveillance inquiries, product recall management if needed, and regulatory consulting. Service scope varies by provider - basic packages include notifications only, while full-service packages include comprehensive PIF management and regulatory support.
How do I compare quotes from Responsible Person providers?
Compare total project cost (not just per-SKU pricing), including all fees (setup, annual retainer, per-notification fees, PIF management). Ensure both quotes include the same service scope (notifications only vs full PIF management). Consider turnaround times, provider experience with your product categories, and regulatory support. Get quotes from multiple verified providers to ensure competitive pricing.
Are retainer packages cheaper than per-SKU pricing?
For large portfolios (26+ SKUs), retainer packages typically offer better value than per-SKU pricing. Retainers often include unlimited notifications, comprehensive PIF management, and dedicated regulatory support at a fixed annual cost. For small portfolios (1-5 SKUs), per-SKU pricing may be more cost-effective. Compare both pricing models when requesting quotes.
How much does hemocompatibility testing add for blood-contact devices?
Hemocompatibility testing (EU/UK Cosmetics Regulation-4) adds $5,000-$12,000 to cosmetics Responsible Person costs and 6-10 weeks to timelines. It's required for all devices contacting circulating blood (direct or indirect). Hemocompatibility includes multiple tests: hemolysis, thrombosis, coagulation, complement activation, and platelet activation. This is one of the more expensive test categories due to complexity.
How much does implantation testing cost for implants?
Implantation testing (EU/UK Cosmetics Regulation-6) costs $8,000-$18,000 and takes 12-20 weeks. It's required for all implant devices with prolonged or permanent contact. This is typically the most expensive and time-consuming test due to animal study requirements, surgical procedures, observation periods, and histopathology evaluation.
Can I reuse previous biocompatibility data after a design change?
You may be able to reuse data if the change doesn't affect biocompatibility (e.g., color change, minor dimensional changes). Material changes, new materials, or changes affecting contact duration/site typically require new testing. Work with your biocompatibility lab and regulatory team to evaluate material equivalency and determine if new testing is needed.
Does sterilization method affect biocompatibility requirements?
Yes, sterilization method can affect biocompatibility. Some sterilization methods (e.g., ethylene oxide, gamma) can create new compounds or alter material properties. Testing should be performed on sterilized devices, not unsterilized materials. Ensure your biocompatibility lab tests the final sterilized device to account for sterilization effects.
Does device surface area change cost?
Surface area affects extraction volumes needed but typically doesn't significantly change per-test costs. However, very large surface areas may require more extraction work, and very small devices may need special handling. Most labs have standard pricing regardless of device size, but discuss with your lab if you have unusually large or small devices.
How do I reduce cost without increasing regulatory risk?
Use existing material characterizations where justified, ensure accurate device categorization to avoid unnecessary endpoints, plan sample quantities early, choose labs that bundle tests, consider in vitro methods when acceptable, avoid GLP when not required, and work with labs that provide BEP/BER support. A risk-based approach with proper planning can reduce costs 20-40% while maintaining compliance.
What should I send a lab to get an accurate quote?
Provide device description, contact category and duration, contact site, material composition, regulatory target (FDA/EU/UK), preferred timeline, GLP requirements, and any existing biocompatibility data. The more detail you provide, the more accurate the quote. Many labs offer free consultations to help determine required testing scope.
Can Cruxi send my calculator results to multiple labs for quotes?
Yes! Use our biocompatibility testing labs directory to request quotes from multiple accredited labs. You can submit your device requirements and get competitive quotes from 70+ labs. This helps you compare pricing, timelines, and capabilities to find the best match for your project.

Editorial Standards & Review

Reviewed by: Regulatory and biocompatibility subject matter experts with experience in EU/UK Cosmetics Regulation testing, FDA submissions, and EU MDR compliance.

Editorial Policy: We do not sell lab services. We connect buyers to labs through our directory platform. All cost estimates are based on:

Estimates should be used as guidance only. Actual quotes from labs may vary ±20-30% based on specific device requirements, lab capacity, and project complexity.

Disclaimer: Estimates are for planning purposes only. Lab quotes vary based on specific device requirements, sample preparation needs, project scope, lab location, accreditation level, and current capacity. Always request quotes from multiple accredited labs to ensure competitive pricing. This calculator does not replace consultation with accredited biocompatibility testing labs or regulatory experts.

Last Updated: January 2026. Pricing data reviewed quarterly based on directory provider updates and market analysis.

References & Resources

The following resources provide authoritative information on biocompatibility testing requirements, standards, and regulatory guidance:

Regulatory Standards & Guidance

Find Accredited EU/UK Cosmetics Compliance Providers

Compare 70+ accredited biocompatibility testing labs in our directory:

Related Regulatory Directories

Explore related regulatory services:

Related Guides & Resources

Directory Data & Analysis

Our pricing estimates are based on comprehensive analysis of 20+ verified cosmetics Responsible Person providers in our directory, including:

To get accurate pricing for your specific portfolio: Use our quote request system to receive competitive quotes from multiple providers. This ensures you're comparing apples-to-apples pricing based on your exact requirements.

💡 Need Help Finding a Responsible Person? Our cosmetics Responsible Person providers directory helps you compare 20+ verified providers, read provider profiles, and request quotes. All providers are verified and experienced in EU/UK cosmetics compliance.

Find and Compare Providers → Get Quotes →
if (quoteAmount && quoteAmount > 0) { const overpayResult = checkOverpaying(quoteAmount, results.total.typical, results.total.high); if (overpayResult) { const overpayDiv = document.getElementById('overpay-check'); overpayDiv.style.display = 'block'; overpayDiv.style.borderColor = overpayResult.color; document.getElementById('overpay-result').textContent = `${overpayResult.verdict}: ${overpayResult.message}`; document.getElementById('overpay-result').style.color = overpayResult.color; if (overpayResult.reasons) { const reasonsList = document.getElementById('overpay-reasons'); reasonsList.innerHTML = overpayResult.reasons.map(r => `
  • ${r}
  • `).join(''); } else { document.getElementById('overpay-reasons').innerHTML = ''; } } } else { document.getElementById('overpay-check').style.display = 'none'; } } // ============================================ // EVENT HANDLERS // ============================================ document.getElementById('portfolioSize').addEventListener('input', updatePortfolioBand); // Auto-update SCPN checkbox based on market coverage document.querySelectorAll('input[name="marketCoverage"]').forEach(radio => { radio.addEventListener('change', function() { const scpnCheckbox = document.getElementById('service-scpn'); if (this.value === 'uk' || this.value === 'euuk') { scpnCheckbox.disabled = false; } else { scpnCheckbox.checked = false; scpnCheckbox.disabled = true; } }); }); // Auto-update CPNP checkbox based on market coverage document.querySelectorAll('input[name="marketCoverage"]').forEach(radio => { radio.addEventListener('change', function() { const cpnpCheckbox = document.getElementById('service-cpnp'); if (this.value === 'eu' || this.value === 'euuk') { cpnpCheckbox.disabled = false; } else { cpnpCheckbox.checked = false; cpnpCheckbox.disabled = true; } }); }); document.getElementById('calc-form').addEventListener('submit', function(e) { e.preventDefault(); const marketCoverage = document.querySelector('input[name="marketCoverage"]:checked')?.value; const portfolioSize = document.getElementById('portfolioSize').value; const portfolioBand = document.querySelector('input[name="portfolioBand"]:checked')?.value; const services = Array.from(document.querySelectorAll('input[name="services"]:checked')).map(cb => cb.value); const pricingModel = document.querySelector('input[name="pricingModel"]:checked')?.value || 'either'; const onboarding = document.querySelector('input[name="onboarding"]:checked')?.value || 'standard'; const quoteAmount = parseFloat(document.getElementById('quoteAmount').value) || 0; if (!marketCoverage || !portfolioSize || !portfolioBand || services.length === 0) { alert('Please fill in all required fields.'); return; } // Calculate costs const results = calculateCosmeticsRPCost(marketCoverage, portfolioSize, portfolioBand, services, pricingModel, onboarding); // Display results displayResults(results, services, quoteAmount); }); // Smooth scroll for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); if (target) { target.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }); }); console.log('EU/UK Cosmetics RP Cost Calculator - Ready'); // Auto-update SCPN checkbox based on market coverage document.querySelectorAll('input[name="marketCoverage"]').forEach(radio => { radio.addEventListener('change', function() { const scpnCheckbox = document.getElementById('service-scpn'); if (this.value === 'uk' || this.value === 'euuk') { scpnCheckbox.disabled = false; } else { scpnCheckbox.checked = false; scpnCheckbox.disabled = true; } }); }); // Auto-update CPNP checkbox based on market coverage document.querySelectorAll('input[name="marketCoverage"]').forEach(radio => { radio.addEventListener('change', function() { const cpnpCheckbox = document.getElementById('service-cpnp'); if (this.value === 'eu' || this.value === 'euuk') { cpnpCheckbox.disabled = false; } else { cpnpCheckbox.checked = false; cpnpCheckbox.disabled = true; } }); }); document.getElementById('calc-form').addEventListener('submit', function(e) { e.preventDefault(); const marketCoverage = document.querySelector('input[name="marketCoverage"]:checked')?.value; const portfolioSize = document.getElementById('portfolioSize').value; const portfolioBand = document.querySelector('input[name="portfolioBand"]:checked')?.value; const services = Array.from(document.querySelectorAll('input[name="services"]:checked')).map(cb => cb.value); const pricingModel = document.querySelector('input[name="pricingModel"]:checked')?.value || 'either'; const onboarding = document.querySelector('input[name="onboarding"]:checked')?.value || 'standard'; const quoteAmount = parseFloat(document.getElementById('quoteAmount').value) || 0; if (!marketCoverage || !portfolioSize || !portfolioBand || services.length === 0) { alert('Please fill in all required fields.'); return; } // Calculate costs const results = calculateCosmeticsRPCost(marketCoverage, portfolioSize, portfolioBand, services, pricingModel, onboarding); // Display results displayResults(results, services, quoteAmount); }); // Smooth scroll for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); if (target) { target.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }); }); console.log('EU/UK Cosmetics RP Cost Calculator - Ready'); if (quoteAmount && quoteAmount > 0) { const overpayResult = checkOverpaying(quoteAmount, results.total.typical, results.total.high); if (overpayResult) { const overpayDiv = document.getElementById('overpay-check'); overpayDiv.style.display = 'block'; overpayDiv.style.borderColor = overpayResult.color; document.getElementById('overpay-result').textContent = `${overpayResult.verdict}: ${overpayResult.message}`; document.getElementById('overpay-result').style.color = overpayResult.color; if (overpayResult.reasons) { const reasonsList = document.getElementById('overpay-reasons'); reasonsList.innerHTML = overpayResult.reasons.map(r => `
  • ${r}
  • `).join(''); } else { document.getElementById('overpay-reasons').innerHTML = ''; } } } else { document.getElementById('overpay-check').style.display = 'none'; } } // ============================================ // EVENT HANDLERS // ============================================ document.getElementById('portfolioSize').addEventListener('input', updatePortfolioBand); // Auto-update SCPN checkbox based on market coverage document.querySelectorAll('input[name="marketCoverage"]').forEach(radio => { radio.addEventListener('change', function() { const scpnCheckbox = document.getElementById('service-scpn'); if (this.value === 'uk' || this.value === 'euuk') { scpnCheckbox.disabled = false; } else { scpnCheckbox.checked = false; scpnCheckbox.disabled = true; } }); }); // Auto-update CPNP checkbox based on market coverage document.querySelectorAll('input[name="marketCoverage"]').forEach(radio => { radio.addEventListener('change', function() { const cpnpCheckbox = document.getElementById('service-cpnp'); if (this.value === 'eu' || this.value === 'euuk') { cpnpCheckbox.disabled = false; } else { cpnpCheckbox.checked = false; cpnpCheckbox.disabled = true; } }); }); document.getElementById('calc-form').addEventListener('submit', function(e) { e.preventDefault(); const marketCoverage = document.querySelector('input[name="marketCoverage"]:checked')?.value; const portfolioSize = document.getElementById('portfolioSize').value; const portfolioBand = document.querySelector('input[name="portfolioBand"]:checked')?.value; const services = Array.from(document.querySelectorAll('input[name="services"]:checked')).map(cb => cb.value); const pricingModel = document.querySelector('input[name="pricingModel"]:checked')?.value || 'either'; const onboarding = document.querySelector('input[name="onboarding"]:checked')?.value || 'standard'; const quoteAmount = parseFloat(document.getElementById('quoteAmount').value) || 0; if (!marketCoverage || !portfolioSize || !portfolioBand || services.length === 0) { alert('Please fill in all required fields.'); return; } // Calculate costs const results = calculateCosmeticsRPCost(marketCoverage, portfolioSize, portfolioBand, services, pricingModel, onboarding); // Display results displayResults(results, services, quoteAmount); }); // Smooth scroll for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); if (target) { target.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }); }); console.log('EU/UK Cosmetics RP Cost Calculator - Ready'); }); document.getElementById('calc-form').addEventListener('submit', function(e) { e.preventDefault(); const marketCoverage = document.querySelector('input[name="marketCoverage"]:checked')?.value; const portfolioSize = document.getElementById('portfolioSize').value; const portfolioBand = document.querySelector('input[name="portfolioBand"]:checked')?.value; const services = Array.from(document.querySelectorAll('input[name="services"]:checked')).map(cb => cb.value); const pricingModel = document.querySelector('input[name="pricingModel"]:checked')?.value || 'either'; const onboarding = document.querySelector('input[name="onboarding"]:checked')?.value || 'standard'; const quoteAmount = parseFloat(document.getElementById('quoteAmount').value) || 0; if (!marketCoverage || !portfolioSize || !portfolioBand || services.length === 0) { alert('Please fill in all required fields.'); return; } // Calculate costs const results = calculateCosmeticsRPCost(marketCoverage, portfolioSize, portfolioBand, services, pricingModel, onboarding); // Display results displayResults(results, services, quoteAmount); }); // Smooth scroll for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); if (target) { target.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }); }); console.log('EU/UK Cosmetics RP Cost Calculator - Ready'); // Auto-update SCPN checkbox based on market coverage document.querySelectorAll('input[name="marketCoverage"]').forEach(radio => { radio.addEventListener('change', function() { const scpnCheckbox = document.getElementById('service-scpn'); if (this.value === 'uk' || this.value === 'euuk') { scpnCheckbox.disabled = false; } else { scpnCheckbox.checked = false; scpnCheckbox.disabled = true; } }); }); // Auto-update CPNP checkbox based on market coverage document.querySelectorAll('input[name="marketCoverage"]').forEach(radio => { radio.addEventListener('change', function() { const cpnpCheckbox = document.getElementById('service-cpnp'); if (this.value === 'eu' || this.value === 'euuk') { cpnpCheckbox.disabled = false; } else { cpnpCheckbox.checked = false; cpnpCheckbox.disabled = true; } }); }); document.getElementById('calc-form').addEventListener('submit', function(e) { e.preventDefault(); const marketCoverage = document.querySelector('input[name="marketCoverage"]:checked')?.value; const portfolioSize = document.getElementById('portfolioSize').value; const portfolioBand = document.querySelector('input[name="portfolioBand"]:checked')?.value; const services = Array.from(document.querySelectorAll('input[name="services"]:checked')).map(cb => cb.value); const pricingModel = document.querySelector('input[name="pricingModel"]:checked')?.value || 'either'; const onboarding = document.querySelector('input[name="onboarding"]:checked')?.value || 'standard'; const quoteAmount = parseFloat(document.getElementById('quoteAmount').value) || 0; if (!marketCoverage || !portfolioSize || !portfolioBand || services.length === 0) { alert('Please fill in all required fields.'); return; } // Calculate costs const results = calculateCosmeticsRPCost(marketCoverage, portfolioSize, portfolioBand, services, pricingModel, onboarding); // Display results displayResults(results, services, quoteAmount); }); // Smooth scroll for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); if (target) { target.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }); }); console.log('EU/UK Cosmetics RP Cost Calculator - Ready'); if (quoteAmount && quoteAmount > 0) { const overpayResult = checkOverpaying(quoteAmount, results.total.typical, results.total.high); if (overpayResult) { const overpayDiv = document.getElementById('overpay-check'); overpayDiv.style.display = 'block'; overpayDiv.style.borderColor = overpayResult.color; document.getElementById('overpay-result').textContent = `${overpayResult.verdict}: ${overpayResult.message}`; document.getElementById('overpay-result').style.color = overpayResult.color; if (overpayResult.reasons) { const reasonsList = document.getElementById('overpay-reasons'); reasonsList.innerHTML = overpayResult.reasons.map(r => `
  • ${r}
  • `).join(''); } else { document.getElementById('overpay-reasons').innerHTML = ''; } } } else { document.getElementById('overpay-check').style.display = 'none'; } } // ============================================ // EVENT HANDLERS // ============================================ document.getElementById('portfolioSize').addEventListener('input', updatePortfolioBand); // Auto-update SCPN checkbox based on market coverage document.querySelectorAll('input[name="marketCoverage"]').forEach(radio => { radio.addEventListener('change', function() { const scpnCheckbox = document.getElementById('service-scpn'); if (this.value === 'uk' || this.value === 'euuk') { scpnCheckbox.disabled = false; } else { scpnCheckbox.checked = false; scpnCheckbox.disabled = true; } }); }); // Auto-update CPNP checkbox based on market coverage document.querySelectorAll('input[name="marketCoverage"]').forEach(radio => { radio.addEventListener('change', function() { const cpnpCheckbox = document.getElementById('service-cpnp'); if (this.value === 'eu' || this.value === 'euuk') { cpnpCheckbox.disabled = false; } else { cpnpCheckbox.checked = false; cpnpCheckbox.disabled = true; } }); }); document.getElementById('calc-form').addEventListener('submit', function(e) { e.preventDefault(); const marketCoverage = document.querySelector('input[name="marketCoverage"]:checked')?.value; const portfolioSize = document.getElementById('portfolioSize').value; const portfolioBand = document.querySelector('input[name="portfolioBand"]:checked')?.value; const services = Array.from(document.querySelectorAll('input[name="services"]:checked')).map(cb => cb.value); const pricingModel = document.querySelector('input[name="pricingModel"]:checked')?.value || 'either'; const onboarding = document.querySelector('input[name="onboarding"]:checked')?.value || 'standard'; const quoteAmount = parseFloat(document.getElementById('quoteAmount').value) || 0; if (!marketCoverage || !portfolioSize || !portfolioBand || services.length === 0) { alert('Please fill in all required fields.'); return; } // Calculate costs const results = calculateCosmeticsRPCost(marketCoverage, portfolioSize, portfolioBand, services, pricingModel, onboarding); // Display results displayResults(results, services, quoteAmount); }); // Smooth scroll for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); if (target) { target.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }); }); console.log('EU/UK Cosmetics RP Cost Calculator - Ready'); // Auto-update SCPN checkbox based on market coverage document.querySelectorAll('input[name="marketCoverage"]').forEach(radio => { radio.addEventListener('change', function() { const scpnCheckbox = document.getElementById('service-scpn'); if (this.value === 'uk' || this.value === 'euuk') { scpnCheckbox.disabled = false; } else { scpnCheckbox.checked = false; scpnCheckbox.disabled = true; } }); }); // Auto-update CPNP checkbox based on market coverage document.querySelectorAll('input[name="marketCoverage"]').forEach(radio => { radio.addEventListener('change', function() { const cpnpCheckbox = document.getElementById('service-cpnp'); if (this.value === 'eu' || this.value === 'euuk') { cpnpCheckbox.disabled = false; } else { cpnpCheckbox.checked = false; cpnpCheckbox.disabled = true; } }); }); document.getElementById('calc-form').addEventListener('submit', function(e) { e.preventDefault(); const marketCoverage = document.querySelector('input[name="marketCoverage"]:checked')?.value; const portfolioSize = document.getElementById('portfolioSize').value; const portfolioBand = document.querySelector('input[name="portfolioBand"]:checked')?.value; const services = Array.from(document.querySelectorAll('input[name="services"]:checked')).map(cb => cb.value); const pricingModel = document.querySelector('input[name="pricingModel"]:checked')?.value || 'either'; const onboarding = document.querySelector('input[name="onboarding"]:checked')?.value || 'standard'; const quoteAmount = parseFloat(document.getElementById('quoteAmount').value) || 0; if (!marketCoverage || !portfolioSize || !portfolioBand || services.length === 0) { alert('Please fill in all required fields.'); return; } // Calculate costs const results = calculateCosmeticsRPCost(marketCoverage, portfolioSize, portfolioBand, services, pricingModel, onboarding); // Display results displayResults(results, services, quoteAmount); }); // Smooth scroll for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); if (target) { target.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }); }); console.log('EU/UK Cosmetics RP Cost Calculator - Ready'); }); document.getElementById('calc-form').addEventListener('submit', function(e) { e.preventDefault(); const marketCoverage = document.querySelector('input[name="marketCoverage"]:checked')?.value; const portfolioSize = document.getElementById('portfolioSize').value; const portfolioBand = document.querySelector('input[name="portfolioBand"]:checked')?.value; const services = Array.from(document.querySelectorAll('input[name="services"]:checked')).map(cb => cb.value); const pricingModel = document.querySelector('input[name="pricingModel"]:checked')?.value || 'either'; const onboarding = document.querySelector('input[name="onboarding"]:checked')?.value || 'standard'; const quoteAmount = parseFloat(document.getElementById('quoteAmount').value) || 0; if (!marketCoverage || !portfolioSize || !portfolioBand || services.length === 0) { alert('Please fill in all required fields.'); return; } // Calculate costs const results = calculateCosmeticsRPCost(marketCoverage, portfolioSize, portfolioBand, services, pricingModel, onboarding); // Display results displayResults(results, services, quoteAmount); }); // Smooth scroll for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); if (target) { target.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }); }); console.log('EU/UK Cosmetics RP Cost Calculator - Ready'); // Auto-update SCPN checkbox based on market coverage document.querySelectorAll('input[name="marketCoverage"]').forEach(radio => { radio.addEventListener('change', function() { const scpnCheckbox = document.getElementById('service-scpn'); if (this.value === 'uk' || this.value === 'euuk') { scpnCheckbox.disabled = false; } else { scpnCheckbox.checked = false; scpnCheckbox.disabled = true; } }); }); // Auto-update CPNP checkbox based on market coverage document.querySelectorAll('input[name="marketCoverage"]').forEach(radio => { radio.addEventListener('change', function() { const cpnpCheckbox = document.getElementById('service-cpnp'); if (this.value === 'eu' || this.value === 'euuk') { cpnpCheckbox.disabled = false; } else { cpnpCheckbox.checked = false; cpnpCheckbox.disabled = true; } }); }); document.getElementById('calc-form').addEventListener('submit', function(e) { e.preventDefault(); const marketCoverage = document.querySelector('input[name="marketCoverage"]:checked')?.value; const portfolioSize = document.getElementById('portfolioSize').value; const portfolioBand = document.querySelector('input[name="portfolioBand"]:checked')?.value; const services = Array.from(document.querySelectorAll('input[name="services"]:checked')).map(cb => cb.value); const pricingModel = document.querySelector('input[name="pricingModel"]:checked')?.value || 'either'; const onboarding = document.querySelector('input[name="onboarding"]:checked')?.value || 'standard'; const quoteAmount = parseFloat(document.getElementById('quoteAmount').value) || 0; if (!marketCoverage || !portfolioSize || !portfolioBand || services.length === 0) { alert('Please fill in all required fields.'); return; } // Calculate costs const results = calculateCosmeticsRPCost(marketCoverage, portfolioSize, portfolioBand, services, pricingModel, onboarding); // Display results displayResults(results, services, quoteAmount); }); // Smooth scroll for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); if (target) { target.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }); }); console.log('EU/UK Cosmetics RP Cost Calculator - Ready'); if (quoteAmount && quoteAmount > 0) { const overpayResult = checkOverpaying(quoteAmount, results.total.typical, results.total.high); if (overpayResult) { const overpayDiv = document.getElementById('overpay-check'); overpayDiv.style.display = 'block'; overpayDiv.style.borderColor = overpayResult.color; document.getElementById('overpay-result').textContent = `${overpayResult.verdict}: ${overpayResult.message}`; document.getElementById('overpay-result').style.color = overpayResult.color; if (overpayResult.reasons) { const reasonsList = document.getElementById('overpay-reasons'); reasonsList.innerHTML = overpayResult.reasons.map(r => `
  • ${r}
  • `).join(''); } else { document.getElementById('overpay-reasons').innerHTML = ''; } } } else { document.getElementById('overpay-check').style.display = 'none'; } } // ============================================ // EVENT HANDLERS // ============================================ document.getElementById('portfolioSize').addEventListener('input', updatePortfolioBand); // Auto-update SCPN checkbox based on market coverage document.querySelectorAll('input[name="marketCoverage"]').forEach(radio => { radio.addEventListener('change', function() { const scpnCheckbox = document.getElementById('service-scpn'); if (this.value === 'uk' || this.value === 'euuk') { scpnCheckbox.disabled = false; } else { scpnCheckbox.checked = false; scpnCheckbox.disabled = true; } }); }); // Auto-update CPNP checkbox based on market coverage document.querySelectorAll('input[name="marketCoverage"]').forEach(radio => { radio.addEventListener('change', function() { const cpnpCheckbox = document.getElementById('service-cpnp'); if (this.value === 'eu' || this.value === 'euuk') { cpnpCheckbox.disabled = false; } else { cpnpCheckbox.checked = false; cpnpCheckbox.disabled = true; } }); }); document.getElementById('calc-form').addEventListener('submit', function(e) { e.preventDefault(); const marketCoverage = document.querySelector('input[name="marketCoverage"]:checked')?.value; const portfolioSize = document.getElementById('portfolioSize').value; const portfolioBand = document.querySelector('input[name="portfolioBand"]:checked')?.value; const services = Array.from(document.querySelectorAll('input[name="services"]:checked')).map(cb => cb.value); const pricingModel = document.querySelector('input[name="pricingModel"]:checked')?.value || 'either'; const onboarding = document.querySelector('input[name="onboarding"]:checked')?.value || 'standard'; const quoteAmount = parseFloat(document.getElementById('quoteAmount').value) || 0; if (!marketCoverage || !portfolioSize || !portfolioBand || services.length === 0) { alert('Please fill in all required fields.'); return; } // Calculate costs const results = calculateCosmeticsRPCost(marketCoverage, portfolioSize, portfolioBand, services, pricingModel, onboarding); // Display results displayResults(results, services, quoteAmount); }); // Smooth scroll for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); if (target) { target.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }); }); console.log('EU/UK Cosmetics RP Cost Calculator - Ready');