The verdict in brief
PDFShift does one job and keeps it simple. You hand it HTML, or the address of a page, and Chromium prints it. There are no templates to manage, which suits teams that already build their HTML elsewhere.
CastPDF is for documents you build from data, again and again. You design an invoice or a report once, store it, and send JSON for each copy. Print mode repeats table headers and numbers the pages. Each PDF counts once, whatever its size, and 100 live PDFs a month are free.
Prices side by side
The cheapest monthly plan that includes each volume, from each vendor's public pricing page (checked October 2026, before tax). Where a vendor sells extra documents on a smaller plan, that can cost less than the plan shown; the text below works it out where it matters. CastPDF counts one PDF per document, whatever its page count.
| PDFs a month | CastPDF | PDFShift |
|---|---|---|
| 1,000 | $19 (Starter) | $24 (Boost) |
| 10,000 | $49 (Growth) | $99 (Business) |
| 50,000 | $129 (Pro) | $149 (Shift 50k) |
| Free plan | 100 PDFs a month | 50 credits a month |
PDFShift: One credit is one document per 5 MB of output.
A converter and a template API
With PDFShift, your code produces the final HTML. You might render it with a server-side template engine, then post the result, or you point PDFShift at a URL. Its engine is Chromium, so modern CSS behaves as it does in Chrome.
With CastPDF, the template lives in the dashboard. You write HTML and CSS with Liquid tags, see a live preview with your sample data, and keep versions. Your app sends template_id and a JSON object. A colleague can adjust the sample data in Simple mode, a form that needs no code.
One honest gap
CastPDF does not take a URL to convert. It renders the HTML or template you send. If your workflow is "print this page of our site", PDFShift fits it directly, and CastPDF would need you to send the page’s HTML instead.
You can also send raw HTML to CastPDF, exactly as you would to a converter. Add data and that HTML becomes a Liquid template for one request. That makes a gradual move possible: keep your current HTML first, then move the layout into a stored template.
Side-by-side facts
| CastPDF | PDFShift | |
|---|---|---|
| Engine | Chromium, with Paged.js in print mode | Chromium |
| Input | HTML, or a stored template plus JSON | Finished HTML or a URL |
| Templates | Liquid templates with live preview and versions | None |
| Free plan | 100 live PDFs a month, unlimited test PDFs | 50 credits a month |
| How usage counts | One document, whatever its size (up to 40 MB) | One credit per document, counted per 5 MB of output |
| Going over your plan | From $9.00 down to $1.75 per 1,000, up to your spending cap | Extra credits from $40 per 1,000 (Starter) down to $15 per 1,000 (Shift 50k) |
| Repeating table headers and page numbers | Built in (print mode) | Not stated on the pricing page |
Facts about PDFShift come from its pricing page and home page, linked in the sources below. "Not stated" means we did not find it there.
Credit math at five volumes
Both products sell extra documents on top of a plan, so the cheapest route is not always the plan that covers your volume. We checked both routes for each product. On PDFShift, extra credits are rarely the better deal. At 1,000 documents, Starter plus 500 extra credits at $40 per 1,000 comes to $29. The Boost plan costs $24.
| PDFs a month | CastPDF | PDFShift |
|---|---|---|
| 1,000 | $19 (Starter) | $24 (Boost) |
| 5,000 | $41.50 (Starter plus 2,500 extra) | $39 (Growth) |
| 10,000 | $49 (Growth) | $99 (Business) |
| 100,000 | $299 (Scale) | $249 (Shift 100k) |
| 250,000 | $386.50 (Scale plus 50,000 extra) | $499 (Shift 250k) |
At 10,000, PDFShift Growth plus 5,000 extra credits would cost at least $114, even at its lowest listed rate. So Business is its cheaper route there. At 100,000, CastPDF Pro plus overage would be $304, so Scale is our cheaper route, and PDFShift is cheaper still.
File size matters too. PDFShift counts one credit per 5 MB of output, so a 12 MB product catalogue uses three credits. CastPDF counts one document for any PDF up to 40 MB. If your PDFs are image-heavy, recalculate with your real file sizes.
In short: CastPDF costs less at 1,000 and 10,000 documents and at very large volumes. PDFShift costs less around 5,000 and around 100,000 documents a month. Annual billing lowers CastPDF further; see the pricing page.
What CastPDF adds on top of conversion
- Stored templates. The layout stays in one place. Your code sends only data, so a design change never needs a deploy.
- A live preview. Edit the HTML and CSS and see the PDF update with your sample data. The guide to generating a PDF from JSON shows the whole loop.
- Print mode for long documents. Table headers repeat, rows stay whole and pages show "Page 2 of 6". Learn how in the guide to page numbers in HTML to PDF.
- Clear template errors. A broken Liquid tag returns
template_render_errorwith the line and column, so you fix it in seconds. - Billing you can predict. Email alerts at 80% and 100% of your PDFs, a spending cap on overage, and unused PDFs that roll over on paid plans.
- Safe retries. An
Idempotency-Keymakes a repeated request return the first PDF, never a second charge.
When PDFShift is the better choice
- You convert existing pages by URL. Receipts, dashboards or articles that already live on your site can go straight to PDFShift. CastPDF needs the HTML itself.
- You print very high volumes on its large tiers. Around 100,000 documents a month, its Shift 100k plan is cheaper than our plans.
- Your HTML is already finished. If another system builds the final markup and you only need it printed, a template layer adds nothing for you.
- Your volume sits near 5,000 a month. Its Growth plan at $39 is slightly cheaper than CastPDF at that volume.
Switching from PDFShift, step by step
Most PDFShift users build HTML in their own code. The move has two stages: send that HTML to CastPDF unchanged, then move the layout into a template so your code only sends data.
- Start with a test key. Create a free test key. The quickstart shows the first request in curl, Node.js and Python.
- Send the HTML you send today. Post it in the
htmlfield. Set"mode": "print"if the document runs over several pages. - If you converted URLs. Fetch the page’s HTML on your side and send it, or rebuild the page as a template. Pages behind a login or on a private network cannot be loaded by the renderer.
- Move the layout into a template. Paste the HTML into a new template. Replace values with Liquid tags and loops, and paste one real JSON payload as sample data.
- Send data instead of HTML. Change your code to send
template_idanddata, as in the Python example below. Then switch to a live key.
<table>
<thead>
<tr><th>SKU</th><th>Item</th><th>Qty</th><th>Unit price</th></tr>
</thead>
<tbody>
{% for line in lines %}
<tr>
<td>{{ line.sku }}</td>
<td>{{ line.description }}</td>
<td>{{ line.qty }}</td>
<td>{{ line.price | money: "EUR" }}</td>
</tr>
{% endfor %}
</tbody>
</table>import os
import requests
payload = {
"template_id": os.environ["CASTPDF_TEMPLATE_ID"],
"data": {
"order": "SO-20931",
"customer": {"name": "Harbor Supply Co.", "city": "Rotterdam"},
"lines": [
{"sku": "PAL-120", "description": "Euro pallet", "qty": 40, "price": 12.5},
{"sku": "STR-09", "description": "Stretch film roll", "qty": 12, "price": 18.0},
],
},
"filename": "packing-list-SO-20931.pdf",
}
resp = requests.post(
"https://api.castpdf.com/v1/pdf",
headers={
"Authorization": f"Bearer {os.environ['CASTPDF_API_KEY']}",
"Idempotency-Key": "packing-list-SO-20931",
},
json=payload,
timeout=60,
)
if resp.status_code != 200:
error = resp.json()["error"]
raise RuntimeError(f"{error['code']}: {error['message']}")
with open("packing-list-SO-20931.pdf", "wb") as f:
f.write(resp.content)Sources
Every fact about another product on this page comes from that product's own pages, checked October 2026. CastPDF's prices and limits come from our pricing page.
| PDFShift | What it says | Source |
|---|---|---|
| Free plan | 50 credits a month | pdfshift.io/pricing |
| How usage counts | One credit per document, counted per 5 MB of output | pdfshift.io/pricing |
| Extra credits | From $40 per 1,000 (Starter) down to $15 per 1,000 (Shift 50k) | pdfshift.io/pricing |
| Engine | Chromium | pdfshift.io |
| Templates | None: you send finished HTML or a URL | pdfshift.io/pricing |