import { useState } from "react"; import Layout from "@theme/Layout"; const PricingComponent = () => { const [siteCount, setSiteCount] = useState(3); const handleSiteCountChange = (e) => { const value = parseInt(e.target.value); if (!isNaN(value) && value >= 1) { setSiteCount(value); } else { setSiteCount(1); } }; const increaseSiteCount = () => { setSiteCount(siteCount + 1); }; const decreaseSiteCount = () => { if (siteCount > 1) { setSiteCount(siteCount - 1); } }; const calculatePrice = () => { return 125 + siteCount * 5; }; return ( {/* Pricing Cards */}
{/* Open Source Plan */}
FREE

Open Source

Free
{/* Professional Plan */}
MOST BUSINESSES

Professional

  • All Open Source features
  • Ticket based support
  • Auto provision IdP users
  • Robust integration API for automation
  • Future licensed feature access
  • Fossorial Commercial License
Base Number of Sites
${calculatePrice()} /month
Base price $125 + ${siteCount} x $5 per site
Bulk pricing available.{" "} Contact us
{/* Enterprise Plan */}

Enterprise

  • All Professional Features
  • Tailored agreements
  • Dedicated support (meetings & calls)
  • Custom features
  • Multi-region & HA deployments
  • Custom branding (white-labeling)
  • Deployment references & assistance
Custom pricing ($1k+/month)
Schedule a Meeting with Us

Professional License FAQ

How often will I be billed?

The Professional License is billed monthly.

What if I need more sites?

When you purchase the license above you are provided with a key to unlock the features and a BASE number of sites for your instance.

You can buy more sites at any time from within your Pangolin instance. Navigate to the licensing page, indicate the amount of sites you would like to purchase, and complete the order.

How do I manage all of my keys?

You can log into{" "} Lemon Squeezy{" "} with the same email that your purchased your keys with. From here you can deactivate an instance or manage subscriptions.

Can I reuse the license keys?

No, the license keys are tied to the instance they were purchased for. If you need to move your instance to a new server, please log into Lemon Squeezy, deactivate the key, and then re-activate it on the new server.

There is an issue with my order!

Please email us immediately with any issues.

Where do I create support tickets?

Within 48 hours of your purchase you should receive an email invite to our support portal where you can interact with us.

You can then create support tickets in the{" "} support portal.

What is the difference between this and the Supporter Program?

The Supporter Program is a way to support the project and remove the support marks. It is a one time donation. No features are unlocked.

The Professional plan is a paid license that allows you to use the software in a commercial environment that unlocks features and provides support. It is a monthly subscription.

What happens if I run out of sites?

You will be warned if you go over your site limit before you create a site. If you do there will be a banner displayed in the Pangolin application and login pages stating you have gone over your limit but no functionality of the application will be lost.

--

By purchasing any license key you agree to abide by the{" "} Fossorial Commercial License and Terms

); }; // CSS Styles object const styles = { container: { display: "flex", flexDirection: "column" as const, alignItems: "center", padding: "24px", backgroundColor: "var(--ifm-background-color)", minHeight: "100vh", fontFamily: "var(--ifm-font-family-base)" }, heading: { fontSize: "30px", fontWeight: "bold", marginBottom: "48px", color: "var(--ifm-font-color-base)" }, pricingContainer: { display: "flex", flexDirection: "row" as const, justifyContent: "center", gap: "24px", width: "100%", padding: "24px", flexWrap: "wrap" as const }, card: { backgroundColor: "var(--ifm-background-color)", borderRadius: "8px", boxShadow: "var(--ifm-global-shadow-lw)", padding: "24px", border: "1px solid var(--ifm-color-emphasis-300)", position: "relative" as const, overflow: "hidden" as const, width: "300px", flex: "1 1 300px", maxWidth: "400px", minHeight: "500px", display: "flex", flexDirection: "column" as const }, cardLarge: { backgroundColor: "var(--ifm-background-color)", borderRadius: "8px", boxShadow: "var(--ifm-global-shadow-lw)", padding: "24px", border: "1px solid var(--ifm-color-emphasis-300)", position: "relative" as const, overflow: "hidden" as const, width: "100%", flex: "1 1 100%", maxWidth: "1250px", minHeight: "500px", display: "flex", flexDirection: "column" as const, marginBottom: "24px", zIndex: "1" }, highlightedCard: { backgroundColor: "var(--ifm-background-color)", borderRadius: "8px", boxShadow: "var(--ifm-global-shadow-lw)", padding: "24px", border: "1px solid var(--ifm-color-primary)", position: "relative" as const, overflow: "hidden" as const, width: "300px", flex: "1 1 300px", maxWidth: "400px", minHeight: "500px", display: "flex", flexDirection: "column" as const, zIndex: "1" }, freeTag: { position: "absolute" as const, top: "0", right: "0", backgroundColor: "var(--ifm-color-emphasis-200)", padding: "4px 12px", fontSize: "12px", fontWeight: "600" }, popularTag: { position: "absolute" as const, top: "0", right: "0", backgroundColor: "var(--ifm-color-primary)", color: "var(--ifm-color-white)", padding: "4px 12px", fontSize: "12px", fontWeight: "600" }, cardTitle: { fontSize: "20px", fontWeight: "bold", marginBottom: "16px", color: "var(--ifm-font-color-base)" }, featureList: { listStyleType: "none", padding: "0", marginBottom: "24px", flex: "1" }, featureItem: { display: "flex", alignItems: "center", marginBottom: "8px", fontSize: "14px", color: "var(--ifm-font-color-base)" }, checkIcon: { width: "16px", height: "16px", marginRight: "8px", color: "var(--ifm-color-primary)" }, buttonSecondary: { width: "100%", padding: "8px 16px", backgroundColor: "var(--ifm-color-emphasis-200)", color: "var(--ifm-font-color-base)", border: "none", borderRadius: "6px", fontWeight: "500", cursor: "pointer", transition: "background-color 0.2s", fontSize: "14px", marginTop: "auto" }, buttonPrimary: { width: "100%", padding: "8px 16px", backgroundColor: "var(--ifm-color-primary)", color: "var(--ifm-color-white)", border: "none", borderRadius: "6px", fontWeight: "500", cursor: "pointer", transition: "background-color 0.2s", fontSize: "14px", marginTop: "auto" }, counterContainer: { marginBottom: "16px" }, counterLabel: { display: "block", marginBottom: "8px", fontWeight: "500", fontSize: "14px", color: "var(--ifm-font-color-base)" }, counterControls: { display: "flex", alignItems: "center", justifyContent: "space-between" }, counterButton: { width: "32px", height: "32px", display: "flex", alignItems: "center", justifyContent: "center", backgroundColor: "var(--ifm-color-emphasis-200)", border: "none", borderRadius: "6px", cursor: "pointer" }, counterInput: { width: "48px", height: "32px", margin: "0 8px", textAlign: "center" as const, border: "1px solid var(--ifm-color-emphasis-300)", borderRadius: "6px", backgroundColor: "var(--ifm-background-color)", color: "var(--ifm-font-color-base)" }, priceDisplay: { fontSize: "24px", fontWeight: "bold", marginBottom: "16px", color: "var(--ifm-font-color-base)" }, pricePeriod: { fontSize: "14px", fontWeight: "normal", color: "var(--ifm-color-emphasis-600)", marginLeft: "4px" }, priceBreakdown: { fontSize: "14px", color: "var(--ifm-color-emphasis-600)", marginBottom: "16px" }, customPricing: { fontSize: "20px", fontWeight: "bold", marginBottom: "16px", color: "var(--ifm-font-color-base)" }, textMuted: { color: "var(--ifm-color-emphasis-600)", fontSize: "14px", marginBottom: "16px" } }; export default PricingComponent;