X1Plus Expander: calling my shots

One of my original goals with the X1Plus Expander program was to try to be as transparent as I could about it -- all the work that I did, where the money went, and where the time went. My best guess was that I wasn't going to make much money from it, and definitely not enough to try to hold secrets about it -- I expected that the most important outcome for me would be educational. And, if I documented the project, it might also serve as good reference material for other people trying to do a similar thing!

I set these as my goals -- make more than zero money; deliver a product; and write about it -- but along the way, I made plenty of predictions just for myself. So here's the question: how many of these goals did I succeed in? And, if I made predictions, did I get anywhere close to calling my shots?

Dolla dolla bill, y'all

The not-so-secret here is that I'm really bad at accounting -- mostly because it's a task that I don't have good methodologies around, and also, it's a task that I hate doing, so I keep not doing it. But accounting is like cleaning a toilet -- if you keep up with it regularly, it's not so bad, and if you keep putting it off, it is a disgusting mess.

My books for this project are a disgusting mess.

Top-down cost

What we did is that every time I, Dan, or Accelerated Tech spent money, I put it in a Google Sheets with a description of the expense, the date, the dollar amount, and who paid. The good news, I suppose, is that there were few enough expenses that I could categorize it later by hand, and totalize it with a script.

Since I was working on this project as Accelerated Tech, I set up X1Plus Expander in my time-tracking system, TSheets. I "billed time" to Expander when I used hours that I otherwise would have spent doing paying client work. What that meant was if I spent an evening working on Expander firmware because I wanted to, it didn't count -- that was home time. But if I spent an office day forcing myself to test boards, that was billable time, because I sure wasn't going to spend that evening doing client work instead! To put a dollar value on it, I took the number of hours billed to the program, and multiplied by my current open source "friends rate".

Once I categorized everything, I got to do the fun part -- some data visualization! Because I was fully budgeting based on vibes, I didn't already know where all the money went on this project, and this was the first time I got to find out. I threw it into d3.js, and out came the following Sankey chart.

Initial crowdfunding volume $29,320Gross takings $76,377Post-crowdfunding sales $47,057Credit card fees $848Crowdfunding fee $3,508Item fee $1,427Initial transfer $61,144Unsold inventory $13,737Mouser margin on post-campaign sales $23,189Prototype and validation $5,348Production NRE $2,842Production samples $1,806Box art $650Production COGS $24,751EXW goods $20,391Tariffs $1,597Shipping $2,763Profit! $28,489In the red! $711Accelerated Tech hourly rate $29,200X1P-002 mainboards $10,447X1P-001 harnesses $1,852Boxes $1,110Ping pong balls $771Instructions for Safe Use $140Module boards $2,321SLS cases $3,337Shipping to Mountain View $1,465Shipping to Mouser $1,298Initial crowdfunding volume → Gross takings $29,320Post-crowdfunding sales → Gross takings $47,057Gross takings → Credit card fees $848Gross takings → Crowdfunding fee $3,508Gross takings → Item fee $1,427Gross takings → Initial transfer $61,144Unsold inventory → Mouser margin on post-campaign sales $13,737Gross takings → Mouser margin on post-campaign sales $9,452Initial transfer → Prototype and validation $5,348Initial transfer → Production NRE $2,842Production NRE → Production samples $1,806Production NRE → Box art $650Initial transfer → Production COGS $24,465Production COGS → EXW goods $20,391Production COGS → Tariffs $1,597Production COGS → Shipping $2,763Initial transfer → Profit! $28,489In the red! → Accelerated Tech hourly rate $711Profit! → Accelerated Tech hourly rate $28,489EXW goods → X1P-002 mainboards $10,447EXW goods → X1P-001 harnesses $1,852EXW goods → Boxes $1,110EXW goods → Ping pong balls $771EXW goods → Instructions for Safe Use $140EXW goods → Module boards $2,321EXW goods → SLS cases $3,337Shipping → Shipping to Mountain View $1,465Shipping → Shipping to Mouser $1,298Initial crowdfunding volumeGross takingsPost-crowdfunding salesCredit card feesCrowdfunding feeItem feeInitial transferUnsold inventoryMouser marginon post-campaign salesPrototype and validationProduction NREProduction samplesBox artProduction COGSEXW goodsTariffsShippingProfit!In the red!Accelerated Tech hourly rateX1P-002 mainboardsX1P-001 harnessesBoxesPing pong ballsInstructions for Safe UseModule boardsSLS casesShipping to Mountain ViewShipping to Mouser

Hey, this is not a bad outcome at all! I had a few hunches, and this validates them:

  • Crowd Supply told me not to price prototype costs in, but I was pretty sure it was going to cover them eventually -- even though the prototype costs felt pretty big at the time (we spent $500 at a time on validation runs of the mainboard). It did; we spent $5,348 on prototype equipment, or about 9% of the whole program budget. I guess that was fine.
  • I thought that the COGS was going to be a relatively small percentage of where the money went. That's about right: of the $76,377 that came in, the landed cost of goods at Mouser was $24,751, or 32%.
  • I thought that I was going to be net profitable, if you didn't count my time at all. I was -- there was positive profit in there!
  • I wasn't sure where we were going to land on Accelerated Tech cost (that is to say, including time I billed to work), but I had a hunch it was going to be about a wash. It turns out that I spent slightly more time than Accelerated Tech made in profit on this whole program.

    If you include the time I spent from work, Accelerated Tech came out in the red by... $711, on a $61,144 program (or, I went overbudget on time by 1.2%). I'd say that's as close as it gets to hitting the nail on the head, especially for my first try at one of these.

Of course, if you consider my and Dan's home time -- conservatively, we spent close to 1500 hours hacking on this? -- well... let's just say the situation becomes a whole lot more grim.

Initial crowdfunding volume $29,320Gross takings $76,377Post-crowdfunding sales $47,057Credit card fees $848Crowdfunding fee $3,508Item fee $1,427Initial transfer $61,144Unsold inventory $13,737Mouser margin on post-campaign sales $23,189Prototype and validation $5,348Production NRE $2,842Production samples $1,806Box art $650Production COGS $24,751EXW goods $20,391Tariffs $1,597Shipping $2,763Profit! $28,489X1P-002 mainboards $10,447X1P-001 harnesses $1,852Boxes $1,110Ping pong balls $771Instructions for Safe Use $140Module boards $2,321SLS cases $3,337Shipping to Mountain View $1,465Shipping to Mouser $1,298Accelerated Tech hourly rate $29,200In the red! $300,711Unaccounted nights & weekends $300,000Initial crowdfunding volume → Gross takings $29,320Post-crowdfunding sales → Gross takings $47,057Gross takings → Credit card fees $848Gross takings → Crowdfunding fee $3,508Gross takings → Item fee $1,427Gross takings → Initial transfer $61,144Unsold inventory → Mouser margin on post-campaign sales $13,737Gross takings → Mouser margin on post-campaign sales $9,452Initial transfer → Prototype and validation $5,348Initial transfer → Production NRE $2,842Production NRE → Production samples $1,806Production NRE → Box art $650Initial transfer → Production COGS $24,465Production COGS → EXW goods $20,391Production COGS → Tariffs $1,597Production COGS → Shipping $2,763Initial transfer → Profit! $28,489EXW goods → X1P-002 mainboards $10,447EXW goods → X1P-001 harnesses $1,852EXW goods → Boxes $1,110EXW goods → Ping pong balls $771EXW goods → Instructions for Safe Use $140EXW goods → Module boards $2,321EXW goods → SLS cases $3,337Shipping → Shipping to Mountain View $1,465Shipping → Shipping to Mouser $1,298Profit! → Accelerated Tech hourly rate $28,489In the red! → Accelerated Tech hourly rate $711In the red! → Unaccounted nights & weekends $300,000Initial crowdfunding volumeGross takingsPost-crowdfunding salesCredit card feesCrowdfunding feeItem feeInitial transferUnsold inventoryMouser marginon post-campaign salesPrototype and validationProduction NREProduction samplesBox artProduction COGSEXW goodsTariffsShippingProfit!X1P-002 mainboardsX1P-001 harnessesBoxesPing pong ballsInstructions for Safe UseModule boardsSLS casesShipping to Mountain ViewShipping to MouserAccelerated Tech hourly rateIn the red!Unaccounted nights & weekends

Good thing we agreed not to count that.

Cost of goods sold

There's another view -- how did the unit economics for the project compare to what I predicted? I have data on this, too! Roughly:

  • When I submitted the project to Crowd Supply in July 2024, I expected that my cost of goods sold, landed in Mountain View, was going to be $47.08/unit, in quantity 200, including extras for yield fallout. (I think I got quotes from JLC for this, and used some hand-waving math to guess everything else.)
  • Later, in September 2024, they gave me an actual spreadsheet to work through! I got quotes from a bunch of vendors that time -- I had PCBWay quote me in qty200, I got JLC to autoquote me, and I also got quotes from my final selected vendor, King Credie, in quantities 150, 300, and 500. In quantity 500, I predicted that my landed cost was going to be $29.50/unit, including fallout.
  • When all was said and done, I made and sold 567 units, and the total cost by the time it arrived on my front door (including extras) was $15,695.29, or $27.68/unit.

I broke this down graphically by where the specific costs went.

July 2024 PCBA $25.00 eachSeptember 2024 PCBA $15.62 eachActual PCBA $18.43 eachJuly 2024 Harness $3.00 eachSeptember 2024 Harness $2.27 eachActual Harness $3.27 eachJuly 2024 Tariffs $9.80 eachSeptember 2024 Tariffs $4.47 eachActual Tariffs $0.09 eachJuly 2024 Shipping to MTV $1.00 eachSeptember 2024 Shipping to MTV $1.96 eachActual Shipping to MTV $1.92 eachJuly 2024 Packaging $4.00 eachSeptember 2024 Packaging $2.00 eachActual Packaging $3.97 eachJuly 2024 Yield $4.28 eachSeptember 2024 Yield $2.63 eachActual Yield $0.00 eachJuly 2024 PCBA $25.00 eachSeptember 2024 PCBA $15.62 eachActual PCBA $18.43 eachJuly 2024 Harness $3.00 eachSeptember 2024 Harness $2.27 eachActual Harness $3.27 eachJuly 2024 Tariffs $9.80 eachSeptember 2024 Tariffs $4.47 eachActual Tariffs $0.09 eachJuly 2024 Shipping to MTV $1.00 eachSeptember 2024 Shipping to MTV $1.96 eachActual Shipping to MTV $1.92 eachJuly 2024 Packaging $4.00 eachSeptember 2024 Packaging $2.00 eachActual Packaging $3.97 eachJuly 2024 Yield $4.28 eachSeptember 2024 Yield $2.63 eachActual Yield $0.00 eachJuly 2024September 2024Actual$0$5$10$15$20$25$30$35$40$45PCBAHarnessTariffsShipping to MTVPackagingYieldComponents

A few things to note:

  • I had expected tariffs to be much higher. In reality, I got lucky in three ways. For one, the HTS codes that my products were classified as more towards the 10% side than the 25% side, at the time. For another, many of my shipments were relatively small pieces, and therefore fell under the de minimis threshold -- and so therefore, the tariff load was $0 for those shipments! And third, and most importantly, the shipments (mostly) arrived before the Liberation Day tariffs, which would have easily doubled my COGS. Sheesh.
  • I explicitly multiplied out for yield fallout in my preproduction estimates, but when I actually ordered parts, I did this by ordering about 10% more. But, since that was part of the order, I couldn't really split it out of the unit cost -- so it gets folded into each individual piece in the final tally.
  • This doesn't include production samples, which I hadn't budgeted for at the beginning; that amortizes to about an extra $1.98/unit. But, on the other hand, if I were going to order another run, the marginal cost of more units would not include this, so I didn't include it here.

All told, I'm also pretty impressed by this! Coming in below my estimate is surprising, especially given that the scope crept a fair bit to add nicer boxes, screws, a document, labels, etcetera; I ended up coming in about 6% under budget, which is pretty darn good. Obviously I got lucky on tariffs, but even if I hadn't, and I had paid 25% on everything that I brought into the US, I would have come in only 9% high.

Schedule

I was pretty happy with what I achieved in terms of cost. On schedule, things were... well, a little less rosy. The executive summary is that, over the course of a 13 month program, the delivery dates pushed by about two and a half months. This is not great, but maybe by the standards of crowdfunding projects, it's not the end of the world...

I was going to try to put together a graphical timeline for this, but gosh, this post has taken long enough to write at this point, and I couldn't find a good library to generate one. So, instead, here's a rough chronological history of Expander.

  • July 11, 2024: I submitted the project to Crowd Supply. (More on that in some future post, maybe.)
  • August 8, 2024: Hey, mail from Josh at Crowd Supply -- we had an agreement signed!
  • August 30, 2024: The project pre-launched on Crowd Supply.
  • September 19, 2024: In some internal communication to Crowd Supply, I said that for a fund-to-shipment time, an "8 week turn time seems believable ... the initial shipment could be 200 units, with 200 units per week thereafter". Man, that was optimistic!
  • October 25, 2024: This one isn't exactly schedule-related, but I commented that "re: the other accessories: I expect the take rate to be relatively low". It was not! I made 567 Expanders, 642 modules, and 315 cases. That's an accessory take rate of, uh... 169%. Well then.
  • November 2, 2024: During Supercon, we kicked off crowdfunding! I gave my first public commitment: I said that I'd deliver by April 12, 2025.
  • December 13, 2024: Crowdfunding was finished.
  • December 16, 2024: I had a signed purchase order in hand from Crowd Supply! (For tax reasons, I had them wait to send me the money until January 1st, but I started executing.)
  • January 14, 2025: The first production samples arrived in hand.
  • January 23, 2025: In internal communication to Crowd Supply, I optimistically said that "X1P-100 is trending on time". Then I went on vacation to go skiing in Japan for a few weeks.
  • March 5, 2025: Three gigantic boxes of mainboard PCBAs arrive on my doorstep. I started questioning my life choices.
  • April 10, 2025: PCBs have definitely not left my house. My life choices continue to come into question. I send e-mail saying that I'm "hoping to get the first shipment in the mail to Mouser by the end of April". My (fantastic!) Crowd Supply project manager, Chris, having played this game before, sets the revised ship date on the web site to May 31st, rather than April 30th.
  • May 6, 2025: The first shipment goes out to Mouser! It's 80 sets of X1P-800 plastics.
  • May 8, 2025: Emboldened by my success, I put another box in the mail, this time some module boards. I figure that I wanted to make sure that there was a good stock of add-ons, so that people who ordered more stuff and gave me more money didn't have to wait longer than people who gave me less money.
  • May 22, 2025: The first 48 X1P-100 bundles go in the mail to Mouser! Technically, a non-zero number of X1P-100s have arrived in customer hands by the promised May 31st. We update the site to say "orders placed now ship June 30th".
  • June 13, 2025: Enough X1P-100 bundles go in the mail to fulfill all crowdfunding orders (but not preorders placed between December and June!).
  • July 30, 2025: We update the box to say "Orders placed now ship August 1st".
  • August 16, 2025: Enough X1P-100 bundles go in the mail to fulfill all outstanding orders!
  • August 26, 2025: The remaining few bundles and cases go in the mail, finally fulfilling all my obligations to Mouser / Crowd Supply. At long last, I take a deep breath.

I think this outcome is not horrible. Does it seem like something I could improve on? Yeah, it is. But the biggest thing about this is that people were always very happy to receive their packages! And buyers were really quite gracious when I sent e-mails announcing delays. (It is almost like they have bought crowdfunded projects before.) So, you know, all's well that ends well.

Other thoughts

Back when I was at NVIDIA, one of the things that I always found interesting is that we tried pretty hard to call our shots. Obviously we wanted silicon to have the best performance and power consumption and all that, and obviously if we missed our specs, that was bad and some manager was probably going to get a bit of a dressing down for that.

But the other direction was about as important! Not only was it important to have good results, but it was important that we were able to accurately predict what we were going to achieve. If we had dramatically better results than we had planned, Jensen was also going to get on someone's case for that, because that was also a bug in our process.

I took that lesson to heart. I knew going into this program that I was not going to make a huge amount of money. That was something I accepted as the cost of getting to learn how to do this. But I did try to be at least reasonably methodical in my estimation of what things would cost -- and if I had to make wild-assed guesses, at least they ought be scientific wild-assed guesses. There is definitely a satisfaction to not just delivering the thing, but approximately doing it when and how I predicted.

At the start, I had claimed to myself that my goals were:

  • Make an amount of money greater than or equal to $0
  • Deliver roughly what I had promised, roughly when I promised
  • Try to write about it and set an example for other people to either follow or avoid

The execution on this project was far from perfect (and that'll be the subject of my last post on the matter, coming next!) ... but through the lens of the above goals, it seems like I might not have done half bad at all.