2023 Income Sources

Here’s where my income came from in 2023. (For newcomers, I’ve done these posts for the last few years.)

I’m a writer. My income comes from writing books and making them available. I publish both independently and through publishers. I don’t consult. I don’t seek out speaking fees. I desire to make my living as an author, creating and licensing intellectual property. I make my books available in every channel that offers reasonable terms.

Whenever I share actual dollar figures, people inform me that I can’t possibly be making that much, or that I don’t deserve to make that much, or demand I share “the secret.” The first two are not worth my time, and I’ve been trying to tell everyone the dang secret for years: keep writing, with an attitude of deliberate practice. Nothing productive can come from such discussions, so I don’t say.

How did 2023 look?

My income was flat with 2022 and 2019. While the Great Locked Inside Reading Surge of 2020-2021 supplemented my emergency fund, my income is back at its baseline. I’d like more, sure, but I have achieved Enough. Not bad for a year without many books.

Here’s the detail.

Amazon – 28.87%
Trad Pub – 17.55%
TWP direct sales – 15.29%
TWP sponsorship – 12.00%
TWP patronizer – 7.42%
IngramSpark – 5.54%
Kickstarter – 5.46%
Patreon – 4.56%
Gumroad – 1.53%
Apple – 0.70%
Kobo – 0.50%
Google – 0.37%
Draft2Digital – 0.17%
Aerio – 0.03%
Barnes & Noble – 0.01%

Can I draw any conclusions from this?

My web site (TWP, or Tilted Windmill Press) is again this year’s star. The combination of direct sales, sponsors, and my homebrew Patreon is 34.71% of my income, a couple points over last year. It’s built on Woocommerce with a handful of commercial plugins that total about $600 a year. My business goal is to get folks to buy directly from me rather than retailers, so I’m content but not satisfied.

Amazon is at 28.87%, down a couple points from last year. There’s reasons for that. They don’t have rights to distribute my newest tech book on Kindle. They’ve retaliated by deprioritizing the title in their listings. I’m not crying; I consider Amazon a discovery platform, an entry point to the Reader Acquisition Funnel. I neither love nor hate Amazon. They’re merely a retailer who offers a nonnegotiable take-it-or-leave-it deal. I accept or reject that deal on a case-by-case basis. Losing them as a channel would send me back to the “yellow zone” emergency budget, but we’d survive just fine.

Kickstarter is down, but I only ran campaigns for short story collections. My private Patronizer program grew a point, but that’s a wobble not a trend. Traditional publishing income is up, thanks to a Humble Bundle.

Then there’s the “below two percent” retailers. Gumroad, because they handle VAT for European readers. I want all the readers and Apple, Kobo, and Google serve readers other retailers don’t reach. They’re small, but those nickels spend. Unless things change, this will be the last year I report Barnes & Noble. I spent many happy hours in the 90s and the 00s wandering their aisles and I would like them to be successful for old times’ sake, but they’re just not managing it and their numbers depress me.

Here’s what the last five years have looked like. I have excluded the tiny channels.

It’s hard to call most of these lines “trends.” If you aggregate the various options from my web site, though, you can see a couple things.

Having fewer entities on this graph makes a couple things clear. I dislike that IngramSpark is shrinking year over year. I use IS to fulfill non-Amazon paperback orders and all hardcovers, so this is either an indication that either brick-and-mortar bookstores are struggling, or that I haven’t released a “hit” in a couple years. Which is it?

It also shows that my direct-to-reader business efforts are working. Readers are willing to do business directly with writers. They like supporting individual authors.

What does the swell in trad pub mean? It means that I need multiple sources of income. I have no way to control which business partner will prosper and which will pull a Wile E Coyote. No matter what, I must be able to pay the mortgage.

How much do I make off of sponsorships and Patronizers, as opposed to retailers? Fair question. Let’s see.

After a few years of growth, the non-retail income is down. Sponsorships and Patronizers were up, but Kickstarter was down (again, because I didn’t run a big one). The vital lesson here is:

if I don’t put broadly interesting product in front of people, I don’t get paid.

Now that I’ve shared the secret, it’s time to double-check last year’s expenses. Income is great, but it’s expenses that destroy you.

My Ebook Store Now Offers Gift Cards

Don’t know exactly what you want as a gift for Your Chosen Winter Solstice Holiday, but you know you want it to include my ebooks?

Tilted Windmill Press now offers gift cards. There’s no physical card, mind you. It’s a digital code that gets emailed to the recipient. But if Amazon calls this a ‘gift card’ I can too.

Yes, this is another lame excuse to take your money. Except it’s not your money, it’s money from your friends and family.

You might note that the cards are good for two years, rather than forever. People have expressed interest in TWP gift cards, but I don’t know if that will translate to actual purchases. I am buying the gift card plugin –yes, I could code something myself, but that’s specifically against my guidelines. I’m committing to buying this plugin until at least December 2025. If I decide to stop offering the gift card, I’ll buy the plugin for at least two years afterwards.

While business doesn’t bring me joy, I do find delight in trying things like this. Anything the big guys can do, I can also do. Next year, I’ll be offering some things that the big guys refuse to do. In the meantime, I have to get back to making words.

November’s Noughtwithstanding Sausage

This post went to Patronizers at the beginning of November, and the public in December. A buck a month gets you early access and more.

These posts need titles, so I go for alliteration. Alliteration gives me an excuse to grab my primordial Oxford English Dictionary. I’ve mentioned this before, but I don’t think folks quite appreciate what a font of wordage it is.


It’s ninety years old and smells like knowledge.

Anyway, it’s been quite a month. The Apocalypse Moi Kickstarter is now completely fulfilled. Just as I was writing this sentence, though, the doorbell rang. UPS dropped off two packages, and—yep. It’s two copies of the book, dropshipped from the printer. They were supposed to go to backers. Instead, they went to me. Did I screw up entering the address? Possible. Did the printer screw up? Very possible. Did the printer’s obtuse web-based ordering system refresh inconveniently and overwrite my meticulously hand-entered shipping address with the default address? Screechingly possible. Each has a shipping slip with an order number, so I get to go through the orders and figure out who got shorted.

Or maybe the printer got carried away and shipped me extra books. That happens, too.

If it wasn’t for the lack of conference calls, I’d call this the worst business ever. But then I’d remember working in the auto industry and realize it’s not nearly that bad.

Anyway. That Kickstarter’s over except for the lingering cruft.

I’m to the bit of Run Your Own Mail Server where I get to talk about filtering and greylisting and SPF and all those fun topics. That’s not a huge topic, but it might take me a little longer than I’d like to get through. Which is the story of this book. October was a crunch month for my family. The crunch ends next Monday and I’ll be free to spew words. I’m learning things about email that I didn’t want to know, and details about workarounds that I didn’t want to know. Here’s yesterday.

Postfix’s postscreen(8) performs sanity checks on incoming email connections. Spambots behave badly, taking full advantage of Jon Postel’s original Robustness Principle. Postscreen identifies those bad actors and prevents them from talking to the SMTP server. Seems fine, right?

Postscreen has optional checks that are intrusive. It does most of the SMTP transaction and, if the client behaves well throughout, adds the client’s address to a temporary allowlist. The problem is, it can’t forward that connection to the mail handler. Instead, it gives the client a 400 error to say “I’m sorry, I can’t finish this right now, please come back later.” That’s a normal part of the email protocol. When the client returns, postscreen sees the address on the allowlist and steers it straight to the SMTP server. Simple enough.

Some of you might recognize that as greylisting. Greylisting is a controversial topic that I’m not gonna get into right now, but it is what it is. How does one get email delivered immediately, while still performing sanity checks? In theory, when a mail client can’t deliver to the primary mail server, it should immediately try the backup. Small sites don’t need a backup mail server.

But you can make a faux backup server.

Add a second IP address to your mail server. List it as the backup MX.

The client goes to the primary MX, passes the intrusive tests, and gets the 400 error. It immediately goes to the second MX. That’s the same host, so it has the same temporary allowlist. The mail is immediately accepted. You need to set up the backup MX address so that SMTP connections that arrive there cannot be added to the allowlist, but that’s included in Postfix.

So I go and set this up. I dig through Vultr’s web interface until I find how to get a second IP address and how to add it to a host. I add a second IPv6 address to that test host. Reboot everything, make sure all the connectivity works. Set up Postfix as a faux backup MX, adjust the DNS records. None of this is advanced work, but it’s tedious and annoying and type-prone. But at last everything looks correct, so I go to my other test host and send an email.

The test host tries the IPv4 address, and gets a 400. Good.

The test host tries the IPv6 address. 400. Good.

And then… it stops.

Postfix doesn’t try the backup MX. Why not?

I go to my old mail server, the one that’s running Sendmail. It gets a 400, immediately tries the backup MX, and sails through. Exactly the way it should. I’ll be trying with gmail today, see what they do. While gmail retries delay-queued mail from different IP addresses, I have no idea if the immediate retries change addresses. It’s an interesting test.

But I worked in IT for decades. I know perfectly well that if someone deployed this in the real world and something went wrong with an incoming message, a manager would ask “Are they on the list?” Because that’s what they ask. That meant I had to figure out how to interrogate the allowlist cache. This is not a public Postfix interface, and Postfix’s developer never intended that people should poke at it. I have no problem telling people “this isn’t meant for you, and it might change in the future, and you shouldn’t rely on any of the other data it reveals, but here’s how you glimpse at it.” But that still leaves me figuring out how to grovel through the stupid cache. Turns out you have to specify the cache format on the command line, a hint which appears nowhere in the documentation because you’re not supposed to go poking at the cache.

Anyway.

That’s a day. Forty words written, and I still don’t know why Postfix didn’t immediately try the backup MX.

The fiction crashed to a halt this month, because of aforementioned family crunch. That’ll restart next month. I owe the world an orc baseball story. I’ve figured out how to make that a short story, finally. One of the rules to making a story short is to limit the number of characters, but a baseball team has nine players, so I’d just like to say oops this was a terrible idea.

Ah well. Live and learn. Learn something that will do you absolutely no good in the future, because part of you already knew it.

I’ve taken sponsorships on the mail book, but I’m pondering doing a Kickstarter for it anyway. Sponsors and Patronizers will get theirs, of course, but there’s a broad pool of folks who want a thing to be ready to produce before they buy it. I’m also pondering stretch goals like “for $25k, I will put the book contents on a public web site.” I’d still have the book in stores, of course. But the ebook won’t be available on Kindle. Heck, the way this book is going the ebook might be $19.99. It’s gonna be freaking huge. Anyway, that Kickstarter and such stretch goals is just idle fancy. Some authors have good results with making their books public. For others, it destroys sales.

Which am I?

Only one way to find out, and the test costs only a year’s work.

That’s it for this month. Thanks for Patronizing me. Onward!

Why My Short Fiction Is Exclusively In My Store

You might have noticed that I’ve stopped publishing my shorter fiction on third-party bookstores like Amazon and Kobo and whatnot. If it’s not credibly a novel by historical standards1, it’s in my store. If you’re unfortunate enough to be in the vicinity when someone asks me about my business model, I make a lot of noise about the importance of having your work available on every platform. Why would I break my own rule? Because I’m okay with exclusivity, so long as it’s mine.

My short stories have a publication life cycle. The good ones I publish as stand-alone chapbooks. (The bad ones get thrown in the Pit, where the stronger devour the weaker. It’s not nice, but go ask David Attenborough how nature works.) When I have enough stories on a theme, I gather them into a collection, Kickstart it, and unpublish the chapbooks. Publishing a title on every retailer takes about four to five hours. Unpublishing takes about the same, because while unpublishing requires less information, interfaces optimized for offering something to the world are often anti-optimized for undoing that. I have to expect to make a few hundred bucks to be worth the time.

As I’ve discussed earlier, Amazon penalizes pricing books outside the $2.99-$9.99 range. I’ve been forced to price my short stories at $2.99, even though I think $1.99 is a more fair price. I carried that price across all platforms. For years people bought them at that price, until suddenly they stopped.

I had no idea why they stopped. It’s not like I can reach out to people who buy through Amazon.

But after this had gone on for a while, I asked a couple folks who signed up for my Patronizer program. (It’s Patreon, except you can use either Patreon proper or go direct with me.) Every one of them gave me the same answer: “I used to buy your stories, but now I send you money every month and get them for free.”

Obvious, really. I have successfully disintermediated many of my short fiction readers! Yay me!

That’s old readers, though. But what about discoverability? Having more work in a bookstore prioritizes you in their algorithm. My fiction career is not as strong as my nonfiction career, surely I need all the help I can get. Uh… have you looked at my fiction name over at Amazon? It’s nothing to be ashamed of. Supposedly the more titles you have, the more likely it is that the Almighty Algorithm will bless you with virality. I do not chase algorithms, because The Algorithm giveth and The Algorithm taketh away. Yes, this business requires luck–but I prefer relying on the kind of luck that looks a lot like hard work, and relying on goals rather than dreams (a topic I discuss in unreasonable depth in Domesticate Your Badgers.)

Having short stories exclusively on my bookstore lets me price them at $1.99. I think that’s a fair price. After fees I make about $1.60 on each sale, which beats the heck out of Amazon’s ~$0.65 for a $1.99 tale. I no longer lose a full day on the publishing/unpublishing cycle. I’ll still publish full-length books everywhere that offers a reasonable contract, but the short stories will stay with me for now.


The new story’s on my bookstore. Imagine Nero Wolfe and Archie Goodwin, but it’s weird modern fantasy. I have almost enough of these tales to Kickstart a collection, but many of them are sitting in various trad pub channels awaiting rejection.

My Web Store Features

“Hey Lucas, what all do you offer on your web store?”

I have had to answer this question three times, mostly from other authors looking to build their own web stores. A couple of the big ebook-selling platforms are clearly embracing enshittification, and interest in disintermediation among creators is greater than I’ve ever seen it. I don’t mind sharing the information, but I do mind writing out the answer more than thrice.

I had some rules in building a web store.

  1. NO CUSTOM CODE. I can write code. It has been called “comically evil,” but I can write code. I can hire people to write competent code. Both are bad choices for a teeny-tiny business. I will merrily discuss why in meatspace, but not online.
  2. STANDARD PARTS. I will not build a business on an obfuscated WordPress module. I’ll use such modules for side details, but I won’t base the business on them. I want the source code to be readily available and readable. If Woocommerce or WordPress folds, another company will step in to provide maintenance. Same for themes. I’m even using the standard Woocommerce “Storefront” We-Will-Always-Have-This Minimum Viable Theme.
  3. HANDOVER READY. It must be simple enough that if one of my books becomes popular and I get to spend all my time writing1, I can hire a WordPress flunky2 and the design won’t shock them. See the two points above.
  4. BOOKFUNNEL. WordPress can deliver book files to readers. Life is too short to help people load files on their Kindles, let alone their weird limited-production-run-of-50 hybrid-endian built-into-a-self-cooling-beer-stein devices. Pay someone to do that for you.

According to the Wayback Machine I started the store in May 2013, more than ten years ago. I added these features one at a time. Don’t whinge at me that you can’t do all this or that I’m special. Neither could I, and I’m not. Running your own web store on any platform, Woocommerce or Shopify or whatever, requires competence. You gotta spend the time and learn. Yes, I write books on how to build your own network and run servers, but my Internet skills have no pictures, no sound, and especially no video. When I design web sites, you get my 2012 site. There are reasons I sucked it up and learned stupid WordPress and stupid Woocommerce.

Anyway. The features. With a great big helping of “YMMV” and “who knows why this business works?” What works for me might not for you, and the reverse.

  • The most vital feature I have is “Name Your Price.” It lets people overpay. About half my customers throw a little extra in my kibble bowl. Sometimes they throw a lot.
  • “Treat the Rats” is the tip jar. Before Name Your Price, it was a couple grand a year. Now it’s a couple hundred a year but, hey, the rats gotta eat.
  • Bundles like All the Fiction, All the Tech Books, This Entire Series. “The Full Michael” is everything I publish indie. (I even had a photo of me to play off The Full Monty.)
  • Bundle Exclusives. The orc kickstarter had a stretch goal of a tiny 6-recipe orcish cookbook, because a friend of mine wanted to do it. That book is only available if you buy the orc bundle direct from me. It lures people in. I intend to do more of these. Also, multiple people have reported that “Beans With Found Meat” is delicious. Weirdly, nobody has reported back after trying the “Longest Dark” orcish holiday punch.
  • Sponsorships. “I’m writing this book, and for $30 you get your name in the back of the ebook. For $100 you go in the back of the print and the ebook.” Sponsorship is the only way you can get a personalized signed copy of a book without meeting me in person. Signed Kickstarter books, I just write my name. Unless I know you and want to engage in recreational trolling, of course.
  • My loss leader freebies are all in my store. A few people grab them. Those readers have indicated a willingness to go direct immediately and I gleefully welcome them.
  • My Patreon work-alike. It’s the exact same benefits as Patreon, but the money goes straight to me. The downside is, I spend a thousand bucks a year on the WordPress plugins to do that. (The free options all annoyed me or didn’t work as I needed.) I have a sufficient number of direct Patronizers to keep that up. Plus, it lets me offer weird things like a special “29 February” option in 2024. (Pay four years of the highest level in advance, save 10%!)
  • Standalone short stories are now exclusive to my store. Once upon a time I made a few hundred bucks per indie story at outside retailers, but once I started the Patronizer program and said “$5/month gives you everything I release indie,” that dried up. Turns out all the short story buyers are now Patronizers. Ah, well. I still make out okay. If I hire my own publisher, I might reverse this decision.
  • Mechandise. Shirts and stickers and such, via Redbubble. Failed experiment. Print on demand is expensive. Very few folks buy these, so I’ve stopped adding new things except by request.
  • The Audiobook. Yes, I have one. Consider yourself warned.

I still haven’t figured out how to hook the checkout process into my mailing list signup, so folks can click a box during check-out to sign up. There’s a plugin for that. It bit me. In its defense, I have three mailing lists and they’re all stupid.

That’s it. You can do all this too. With a willingness to spend time, to learn, and to get back up after you fail. Just like the rest of being a writer.


Yes, I Know I’m In the AI Scraping Search Engine

I awakened today ready to make words on Run Your Own Mail Server only to discover that half the world wanted to be sure I knew about the search engine for Meta’s Books3 LLM training data, aka “AI.”

Yes, I know.

The search engine was created by The Atlantic, and I thank them for this public service.

Authors and publishers have already filed lawsuits against Meta and their partners. I do not have the cash to sue Meta. I must ride on the coattails of other people’s lawsuits.

For the record, most of my books are legitimately available for digestion by AI. Just as I offer my Tilted Windmill Press books for teams and groups and large corporations, I offer the entirety of those books as AI fodder for a modest annual fee and under friendly licensing terms. The default listing is for personal use because I sell many more personal licenses than AI licenses, but: a legal option exists for Meta to use my books

Now to figure out how to send Meta an invoice.

Patreon update: I got paid, mostly

The subject says it all, I guess?

Patreon appears to have sorted out their latest kerfuffle. I lost a few Patronizers, but I’m nowhere near as badly impacted as some creators.

Blaze Ward’s latest Milestone Publishing Newsletter talks about the importance of owning your platform, as greatly as possible. I mostly agree with it, except for the part about moving to Shopify. They’re an external vendor, they will enshittify. I can do everything with Woocommerce and Bookfunnel that Shopify can do, and Woo’s open code makes it enshittification-resistant. I can replace Bookfunnel if need be.

Anyway, own your platform. Have multiple streams of revenue, even if some seem redundant.

And if Patreon unsubscribed you from me, I can promise that my platform won’t do the same. Or, if something goes wrong and it does, I’ll have the data to fix it.

Patreon has stopped paying me

Patreon has failed to pay me for August, as part of their latest implosion.

If you’re one of my beloved Patronizers who backs me through Patreon, check to see if you’ve been charged. Because I haven’t got it.

If you’re flexible on where you back me, I built my own Patreon at https://www.tiltedwindmillpress.com/product-category/patronizer/. I usually do a soft sell on the whole “ditch the middleman” thing because lots of you have reasons for using Patreon, but this latest mess impels me to bring it up.

Enterprise Ebook Licensing

Tilted Windmill Press now offers group and enterprise licensing for ebooks.

I deferred implementing this for years, despite the occasional request. Then I saw Julia Evans’ income graphs, where enterprise licensing is a big chunk of her income. Somewhat amusingly, my annual income reports inspired her to post this. Be generous with information about how you run your creative business, people will build on it and you can stealborrow their improvements.

The enterprise licensing also applies to bundles.

I’ve also implemented a very special option for select users. If you want to have your computer auto-complete a book in my style, you may license my entire TWP ouvre for AI/machine learning. This option is available exclusively through my bookstore, and allows you to derive documents from my work for one year.

“Treat The Rats” updated

My ebookstore has an item where folks can buy our rats treats and supplies. A few folks wanted to know how the money would be spent, so I’ve added options where you can buy specific items.

I decided to not include the $300 “Whole Roast Pig” item, because while a video of Croghan doing his magnificent “Alien chestburster” imitation would be adorable, some of you maniacs would actually get together and buy one. Besides, I firmly believe that nobody should eat anything bigger than their own head.