Logging into both platforms for the first time
The first time I signed up for Ghost, I was sitting in a coffee shop trying to escape the swamp of unnecessary plugins in WordPress. It took two tries to get the self-hosted version of Ghost running locally with their CLI tool — because of course I was too stubborn to just pay for managed hosting at first (spoiler: I switched).
Anyway, launching Ghost on my laptop felt clean. Like, really clean. Log in, and the dashboard is minimal — default colors, very few menu items, and a big fat button that says “New Post.” No onboarding checklist. No nudging tooltips. I actually had to Google how to connect a custom domain 🫠
Substack, on the other hand, was like that overeager guy at a networking event — kind of annoyingly helpful, but honestly, I appreciated it. You create an account and within 30 seconds you’re being walked through setting up your newsletter name, a welcome post, and uploading a photo. Under five minutes in, I was writing my first post and it had already suggested a title for me (“Musings from the Pit of My Browser Tabs”). Cute.
If you’re the type who gets decision fatigue when faced with blank pages and no guidance, Substack wins this part hands down. If you like building slowly and prefer a clean slate, Ghost might be your jam.
How publishing and scheduling actually works
In Substack: you write, you hit publish or schedule. That’s it. You don’t overthink if something’s going to your RSS only, or just to email subs, or if you need to set up a route for SEO. It’s just: write the post, pick if it’s email+web or web-only, choose audience (free or paid), and then hit go.
Ghost gives you more knobs and levers — but not always in a great way. For example, let’s say I draft a new post and want to schedule it just to the web, not an email blast. That’s hidden behind this little toggle that says “Email newsletter OFF.” You won’t see that control until you’ve connected a newsletter feature through something like Mailgun. And I spent a week wondering why some scheduled posts would send and some wouldn’t until I noticed the status line quietly saying “Email not configured.” 🙂
Random issue I hit last month: I scheduled 3 posts on Ghost for Monday, Wednesday, and Friday. All were marked for email too. Only Monday’s actually went out. Turns out my Mailgun API key had expired — but Ghost didn’t throw an error, nothing in the UI changed, and I had no idea until a reader DMed me on Twitter asking if I was okay ¯\_(ツ)_/¯
Monetization and audience tiers in actual use
Substack makes this brain-dead simple. You toggle on “paid subscriptions,” set the price, and boom — a new post widget appears asking who should see it: free subs, paid subs, or founding members. When people sign up, they go through Stripe directly and Substack handles the access tiers.
In Ghost, you can technically do all the same stuff, but it either requires a managed Ghost(Pro) plan or configuring Stripe plus multiple segments manually. Founding members? That’s not a built-in label — you just make a new custom segment, tag people, and remember to set access correctly when writing a post. It works, but it’s like making every salad from scratch instead of ordering one. Tastes better, but you can’t do it when you’re tired and hungry.
Also — Ghost lets you make custom membership plans with different benefits, but there’s no upsell UI. Like, if I want to offer a $3 tier and a $10 tier, there’s nothing in the post that encourages people to switch. I ended up building my own partial content blocks using visibility helpers, which is cool but… slightly cursed.
The editor feels wildly different between platforms
Substack’s editor kind of reminds me of Medium. You write in-line, press enter, and get options for images, embeds, dividers, etc. There’s no massive formatting bar, but things like headers and bold/italic are intuitive. You paste in tweets, video URLs, or podcast players, and it embeds them instantly. The familiarity is nice — but try embedding something non-standard (like a Typeform), and the whole thing breaks. It says it’ll show up in the email version but a good chunk of times it doesn’t.
Ghost’s editor is both smarter and way more expressive — it has built-in cards for everything from toggles to videos to Markdown to HTML. Oh, and when I want to include code blocks or raw HTML? Ghost wins, no contest.
But be warned: previews in Ghost are misleading. Example: I once spent 30 minutes styling a callout block with HTML inside the editor. Preview looked perfect. Sent the email… and it came out with the raw HTML exposed. Substack prevents you from doing risky things like that by not letting you do them at all 🤷
Deliverability weirdness and email issues
Substack handles email for you, and it usually works — but from time to time I’ve had a handful of subscribers report the emails dropping straight into spam, especially Outlook domains. No way to modify headers or authenticate with your own sending domain, so you’re pretty much trusting Substack’s infrastructure. It’s a black box.
Ghost lets you use your own domain for sending — through Mailgun mostly — which sounds great… until it isn’t. First time I configured SPF and DKIM records? Messed up the DNS and accidentally broke my blog’s CSS for two days :P. And even after things were “working,” Gmail started putting my posts in the Promotions tab, which, honestly, still annoys me. There are dozens of tracker settings and link wrappers Ghost adds by default, and it’s tough to know which one is triggering things (and there’s zero deliverability dashboard).
Random quote from the Ghost forums:
> “The ‘Delivered’ status only reflects Mailgun’s API response. It does NOT confirm that the user received or opened the email.”
Yeah. That’s fun.
Customizing your site and branding
Ghost’s theme system is a double-edged sword. With themes like Dawn or Liebling, you get this clean, modern newsletter feel — and they’re super customizable with a little CSS or Handlebars experience. I ended up building a full custom landing page with dynamic pricing cards for different tiers. Did it work? Yes. Did it break twice during updates? Also yes.
Substack makes customization laughably limited. Color palette, logo, heading font. That’s basically it. No custom JavaScript, scripts, or different layouts. No homepage beyond a feed. No navigation bar beyond “Archive” and “About.” If you’re planning to build a full media site or anything that feels beyond single-column reading, Substack can’t do it.
But: that limitation makes it nearly impossible to mess things up. One of my friends built his newsletter on Substack and has ~ten thousand readers. His site works on every device, loads fast, and nothing ever breaks. Mine? I once implemented a custom Ghost theme that crashed on Microsoft Edge.
Yes. Edge. Someone actually uses Edge!
Analytics and seeing who read what
Substack gives you a decent dashboard: total subscribers, free vs paid, open rate per post, link clicks for each email. That part is fine. But if you want cohort retention, UTM tracking, or funnel analysis — nope. And don’t even think about integrating with external tools (no API access unless you’re doing OAuth or scraping).
Ghost has more data… but it’s spread out. You’ll find subscriber info under “Members,” post stats in the “Posts” tab, and newsletter performance embedded inside individual emails. There is no single place to ask: “Which posts did paid users read the most?” For that, you’re exporting CSVs and building your own reports. I built a janky Zapier flow to send each new subscriber’s data into Notion and chart it there. It usually fails if someone signs up with only a partial name.
Tip if you’re on Ghost — check your bounce rates weekly. Mailgun throttles after too many hard bounces and does NOT warn you. I lost deliverability for almost a week because a bunch of disposable emails signed up from a contest I never meant to run (long story).
Stuff that broke and drove me slightly insane
In Substack:
– One day all my post URLs suddenly shifted to a different slug pattern. No announcement.
– Embedded Spotify players stopped working in email. Still not fixed.
– A subscriber paid but wasn’t marked as a paid member for 48 hours. Stripe said it was on Substack’s side.
In Ghost:
– Scheduled emails went out twice. Cause? A triggered webhook from Zapier that wasn’t supposed to fire.
– Drag-and-drop image upload froze the editor for 15 minutes when my WiFi hiccuped.
– Updated a theme file, then all posts gave a 500 error until I rolled back the footer layout.
You win some. You debug some. And sometimes you learn a little CSS at 2am because the header spacing is off by three pixels and now it matters for some reason 🙂
Final recommendation if you still can’t decide
Use Substack if:
– You want to write and go. As in, write → send → done.
– You don’t mind one-size-fits-all design choices.
– You like having your hands tied a little.
Use Ghost if:
– You’re building a full newsletter business.
– Custom branding really matters to you.
– You’re not afraid of SSH keys, webhooks, or inspecting HTML.
Me? I’m currently running Ghost… with a backup list on Substack… and half a Zap saved in drafts for when Ghost’s email breaks again.