CSS Pricing Table Generator
A pricing table is a high-stakes piece of marketing real estate: it has to be clear, scannable, and point visitors towards the plan the business wants them to pick. This generator builds one pricing card in HTML + CSS, with a plan name, a price, and an accent colour for the price text and the call-to-action button. Compose several cards side by side to create a full pricing table, then copy the code into a landing page.
How to build a pricing table
-
1
Enter the plan name
The plan title at the top of the card, for example "Pro".
-
2
Set the price
The price in large type, for example "$29". The "/mo" suffix is added automatically.
-
3
Pick an accent colour
Used for the price text and the call-to-action button. Pick a colour that matches your brand.
-
4
Copy the code
The card includes a built-in feature list and a call-to-action button, plus its own <style> block. Edit the items directly in the code.
-
5
Repeat for more plans
For a full pricing table, duplicate the card for each plan and lay them out in a grid.
Skeleton structure
<section class="pricing">
<article class="plan">
<h3>Starter</h3>
<p class="price">$9 <span>/mo</span></p>
<p class="tagline">For solo projects.</p>
<ul class="features">
<li>3 projects</li>
<li>10 GB storage</li>
<li>Community support</li>
</ul>
<a class="cta" href="#">Start free</a>
</article>
<article class="plan featured">
<span class="badge">Most popular</span>
<h3>Pro</h3>
<p class="price">$29 <span>/mo</span></p>
<!-- ... -->
</article>
<article class="plan">
<h3>Team</h3>
<!-- ... -->
</article>
</section>
Responsive three-column grid
.pricing {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 1.5rem;
align-items: stretch;
}
.plan {
padding: 2rem 1.5rem;
background: #fff;
border: 1px solid #e5e7eb;
border-radius: 12px;
display: flex;
flex-direction: column;
}
.plan.featured {
border: 2px solid #2563eb;
position: relative;
transform: translateY(-4px);
box-shadow: 0 10px 30px rgba(37, 99, 235, 0.15);
}
auto-fit + minmax(240px, 1fr) gives a three-column layout on desktop and a single-column stack on mobile, with nothing else to configure.
The featured plan
Visual cues that draw attention:
- Coloured border matching brand accent.
- Slightly lifted with negative margin-top or
translateY(-4px). - Larger CTA button, often in the brand colour vs. outlined for other plans.
- Badge (“Most popular”, “Best value”) absolutely positioned at the top.
- Possibly taller to draw the eye, though this can hurt comparability.
Do not do all of the above, pick two or three. Too many cues flatten the hierarchy.
Monthly / annual toggle
<div class="billing-toggle">
<button data-active="true">Monthly</button>
<button>Annual · Save 20%</button>
</div>
The toggle usually swaps price values via a bit of JavaScript or uses :checked state on a radio. Display the discount percent or dollar savings in the toggle label, it is the single most persuasive element in many tables.
Feature row styling
.features {
list-style: none;
padding: 0;
margin: 1.5rem 0;
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.features li {
display: flex;
align-items: center;
gap: 0.5rem;
}
.features li.yes::before {
content: "";
width: 16px; height: 16px;
background: url(...check.svg);
}
.features li.no {
color: #9ca3af;
text-decoration: line-through;
}
Use check marks for “included”, greyed-out text or a light cross for “not included”, never cross out the text itself without reducing contrast, or it reads as emphasis.
Keep the CTA prominent
One CTA per plan, visually consistent across plans. Different copy per plan (“Start free”, “Go Pro”, “Talk to sales”) is fine and actually helpful for guiding users into the right flow.
Make it scannable
Users rarely read pricing tables left-to-right; they scan prices first, then CTAs, then feature diffs. Optimise for that:
- Plan name + price large, top of card.
- CTA visible without scrolling the card.
- Feature list below. Highlight differences between plans rather than repeating identical features everywhere.
Accessibility checklist
- Each plan is an
<article>with its own<h3>. - The “Most popular” badge is a visible text badge, not colour alone (colour-blind users).
- CTA buttons have descriptive text (“Start Pro trial”) rather than “Click here.”
- The billing toggle has
aria-pressedor radio semantics. - Price changes on toggle announce via
aria-live="polite"if implemented with JavaScript.
Frequently Asked Questions
Three is the marketing default, easier to scan, highlights a clear middle option. Four works when you genuinely have four audience tiers (solo / team / business / enterprise). Five plus usually confuses visitors; split into two tables or add a comparison chart.
Depends on the business. Annual default emphasises the discount and sets anchoring; monthly default is less aggressive. A/B test if revenue matters. A compromise: default to annual and make the monthly option one click away.
The grid repeat(auto-fit, minmax(240px, 1fr)) does it automatically. Below ~800px viewport the cards drop to a single column without a media query.
Rightmost if you use price-ascending order. The CTA text should be “Contact sales” (not a price), and the card should visually match the others to stay scannable. Some companies put enterprise in a separate section below the table to avoid disrupting the price comparison.
Related Tools
ASCII Table Reference
Full ASCII table from 0 to 127 with decimal, hex, octal, binary, standard names and HTML numeric-reference notation, including NUL, LF and DEL.
HEX Color Picker
Pick or enter a HEX colour and get RGB, HSL, approximate CMYK, relative luminance and contrast ratios against white and black.
Color Palette Generator
Generate monochromatic, analogous, complementary, triadic or tetradic color palettes from a base HEX color and export copy-ready CSS variables.
HTML Character Reference
Searchable list of HTML entities, their named and numeric codes, and a one-click copy for special characters and symbols.
FPS Counter
Measure browser FPS with requestAnimationFrame, smoothing, min/max frame rate, warnings and an optional graph. Runs locally with no upload or API.
JSON Formatter
Paste JSON to pretty-print with 2 or 4 spaces, minify it to compact output, or run a quick syntax check before copying the result.