Codapult
DocsBlogPricingPluginsDemo
Get Codapult
Logo

Build your SaaS with AI. Keep the architecture under control.

Get Codapult

Product

  • Pricing
  • Architecture
  • Modules
  • AI platform
  • Plugins

Developers

  • MCP
  • CLI
  • Documentation

Resources

  • Blog
  • FAQ

Connect

  • Contact
  • GitHub

Compare

  • SaaS template comparison
  • Codapult vs Supastarter
  • Codapult vs Makerkit
  • Codapult vs ShipFast
  • Codapult vs SaaSBold
  • Codapult vs Gravity
  • Codapult vs Nextbase
  • Codapult vs BuilderKit

Featured on

Codapult on LaunchNestCodapult on LaunchNestbetterlaunch.cobetterlaunch.coFeatured on LaunchBuffFeatured on LaunchBuffCodapult on PeerPushCodapult on PeerPushFeatured on LaunchItFeatured on LaunchIt
© 2026 Codapult·All rights reserved·Privacy Policy·Terms of Service
Full source code · One-time purchase · Self-host anywhere
All articles

Getting Started

  • Introduction
  • Quick Start
  • Project Structure
  • License and Permitted Use

Configuration

  • Environment Variables
  • App Configuration

Authentication

  • Authentication
  • OAuth Providers
  • Two-Factor & Passwordless
  • Enterprise SSO (SAML)

Database

  • Database
  • Migrations

Teams

  • Teams & Organizations
  • Permissions & RBAC
  • SCIM Provisioning

Payments

  • Payments & Billing
  • Stripe Setup
  • LemonSqueezy Setup
  • Polar Setup
  • Payment Webhooks

Api

  • API Layer
  • tRPC
  • GraphQL

Ai

  • AI Features
  • Streaming Chat
  • RAG and Semantic Search
  • Quotas and Memory

Email

  • Email
  • Email Templates

Infrastructure

  • Infrastructure
  • Self-Hosting
  • File Storage
  • Docker
  • Background Jobs
  • Terraform & Pulumi
  • Kubernetes

Ui

  • UI & Theming

I18n

  • Internationalization

Content Management

  • Content Management

Admin

  • Admin Panel

Security

  • Security

Monitoring

  • Analytics & Monitoring

Modules

  • Module Architecture
  • Waitlist
  • Audit Log
  • White-Labeling
  • Workflow Automation
  • A/B Testing
  • Welcome Page
  • Referrals
  • GDPR Export and Deletion
  • Promotions
  • Outgoing Webhooks

Plugins

  • Plugin System
  • CRM Plugin
  • Helpdesk Plugin
  • Email Marketing Plugin

Deployment

  • Deployment
  • Troubleshooting

Upgrading

  • Upgrading Codapult

Developer Tools

  • AI Agents & IDEs
  • MCP Server
  • Testing
Modules

Promotions

Configure promotion codes and product-specific pricing overrides for marketing and app checkout flows.

The promotions module stores discount and custom-price rules in the database. Base prices remain in the product-specific pricing source of truth: marketing prices come from src/config/marketing-pricing.ts, while app prices come from src/lib/payments/plans.ts.

Promotion management is available to administrators at /admin/promotions. Customer-facing pages only resolve a code and display or apply the resulting price.

Marketing URL

Pass the promotion code in the promo query parameter:

https://your-domain.example/?promo=LAUNCH20

The landing page reads promo, previews the code for each marketing product, displays the discounted price, and adds the same parameter to the checkout link. The checkout endpoint therefore receives URLs such as:

/api/checkout?product=full&promo=LAUNCH20

The parameter is case-insensitive and is normalized server-side. App billing accepts the same promotion concept through its billing form rather than through a page URL.

Product keys

Promotion rules use a namespaced product key so products with the same ID do not collide:

Product keyApplies to
app:proThe app's pro plan
template:fullThe marketing template's full tier
app:*Every product in the app namespace
template:*Every product in the template namespace
plugin:*Every product in a custom namespace

An exact key takes precedence over a namespace wildcard when both rules exist. The namespace is not limited to app and template; new product namespaces can be added without a schema change.

Pricing modes

  • percent stores a percentage from 0 to 100.
  • fixed_discount stores a discount in the currency's minor units.
  • fixed_price stores the resulting price in minor units.

The checkout flow calculates the final amount server-side from the canonical base price. It passes the custom amount to the active payment adapter and disables provider-side promotion entry for that checkout.

Feature flag

ENABLE_PROMOTIONS="false"

When disabled, the admin page and navigation item are hidden, /admin/promotions returns 404, and checkout and marketing pages ignore promotion codes.

GDPR Export and DeletionOutgoing Webhooks