helban.dev

A LearnDash course site for NUDDA, built from scratch and switched over with a way back

Antonio Faedda has been teaching NUDDA Dirty Boxing since 2006. His online Foundation Course is the first step for anyone who wants to teach the method. The old site ran WordPress with Astra, Elementor, WooCommerce and LearnDash, and had 28 plugins switched on. He asked for a new site, built from scratch, where the course can be bought and paid for without anyone stepping in. On 1 October 2026 the new site took over nudda.com, and the old one was set aside on the server, untouched, as the way back.

Role: build, payments, go-live Stack: WordPress · LearnDash 5.2 · Elementor · PHP 8.3 · Stripe Client: nudda.com
6 / 6
old buyers' accounts moved over with their passwords (01.10.2026)
14 / 14
checks passed after the switch, re-run after every later deploy
97–98
PageSpeed, home page on mobile (two runs, 02.10.2026)
The starting point

Three courses behind a shop

The old site sold three separate courses through WooCommerce. Paying in the shop gave the buyer a user role, and the role is what unlocked the lessons in LearnDash. So every sale went through two systems glued together.

Antonio decided to merge the three into one course split into sections, and to sell it straight from LearnDash, with no shop in between. His brief was short: a clean, fast site built from scratch, on LearnDash and Elementor, with payments that run on their own.

What a buyer sees

One page, one tick box, card payment, no account first

The course page ends in a buy panel: enrollment status, price, and a single box to tick. Ticking it, the buyer agrees to get the digital content straight away, gives up the 14-day withdrawal period, and accepts the terms, privacy and refund policies. Antonio wrote that wording himself, and the box is mandatory. Nobody has to make an account before paying: the card payment goes through Stripe.

The buy panel on the live course page: status, the course price, the consent box and the BUY NOW button.

Lessons open only for someone enrolled in the course. The PDFs and videos uploaded to the server go through the same enrollment check, so a file link forwarded to a friend gets them nothing. Pictures placed inside lessons are the exception: they stay public, and that gap was agreed with Antonio, not left in by accident.

Under the hood

Fewer plugins, and my code in one file

The home page is built in the free Elementor, but nobody dragged it together by hand. A script generates it from a JSON file, so the page can be rebuilt from code at any time. Everything else, from the course layout and the buy panel to the newsletter and the cookie banner, lives in one plugin I wrote for this site.

On 21 September the full plugin list on the new site was eight lines long. Two of those are gone since. Antonio had a paid Elementor Pro license, but the new site never needed it, so I deleted it on 2 October. The add-on that links LearnDash to Elementor went the day before, after a test on the staging copy: with it switched off, the course page and a lesson came out identical, element for element, down to the same CSS and JS files.

Before Antonio and I settled what the Reject button in the cookie banner should do, I went through eight pages of the site. There was no analytics and no ad tracking on any of them. What is left is Stripe on the payment page and Vimeo in the lessons, and the site does not work without either. Antonio chose to have the banner record the visitor's choice and block nothing.

No SSH

Every deploy through the hosting panel's terminal

The host offers no SSH access, and its support confirmed that in writing. What remains is the terminal inside cPanel, with WP-CLI. So every change took the same road: the file goes up to a throwaway Cloudflare Pages project, Antonio's server downloads it from there, compares its MD5 with the one I computed locally, and only then installs it. I prepared each terminal step as a ready block and checked the live site after it ran.

The checksum is not fussiness. Right after a deployment, Cloudflare Pages can hand out the old and the new version of the same file in turns for a while. Without the comparison, whichever one came back first would have ended up on his server.

The switch

1 October: swap the folders, keep the old site whole

For the whole job the new site lived on a staging address. On switch day I did not copy it anywhere. I swapped folders: the staging install moved into the main web root, and the old site went next to it, files and database untouched. Nothing was written to the old database at any point, which is why going back would have meant moving files back, with five minutes as the target. Backups of both databases came first, and the old site sat in maintenance mode for the swap. It all fitted inside the window Antonio picked himself. I did not clock the exact length of the break, so I give no number for it.

The home page at www.nudda.com after the switch. The copy on it comes from Antonio.

Right after the swap a script checks 14 things from the outside, among them: do the six key pages answer, is the search-engine block gone, does the address without www redirect to www, are the buy panel and the consent box in place, and is there no staging address left in the code. It came back 14 of 14, and I ran the same script after every deploy that followed. In the rehearsal I had broken the site on purpose to see the checks actually turn red.

Antonio named six accounts of people who had bought on the old site. I moved them over with the passwords they already had, so nobody got a reset link or a new password by email, and enrolled each of them on the new course. A read-back from the database after the import gave six of six accounts, six of six passwords and six of six enrollments, with zero messages sent. I did not log in to any real buyer's account. That an old password works on the new site I had proven earlier on test accounts, with the right password and, as a control, a wrong one.

Real money

A real card, a real euro

Antonio and I agreed to skip the payment sandbox and test with real money instead. After the switch I bought the course with my own card for 1 EUR through Stripe and went through the whole purchase, and he refunded me from his Stripe dashboard. Then I put the course back on its normal price. I built PayPal too and tested it the same way, but the next day Antonio decided to stay with card payments only for now, so PayPal is switched off.

What this case study does not claim

The 97 and 98 above are the home page on mobile. The course page scored 89 on mobile in both runs that day; on desktop the course page got 98 and the home page 87. Accessibility, best practices and SEO were 100 on both pages every time. Course certificates are issued by Antonio by hand, not by the site. And every number here carries a date on purpose: the site is his now, and he keeps adding to it.

The client

What Antonio wrote at the end

His public review on Upwork, 5.0 out of 5:

"Adam rebuilt the NUDDA site from scratch and took it live cleanly. The course pages, checkout, and student area all work, and he kept the build lean instead of loading it with plugins we did not need. He was patient through a long list of details — logins, certificates, payments, the staging-to-live switch — and he explained each step in plain terms when I asked. The launch was organised, with a fall-back in place, and the site came up as planned. Clear, careful, and easy to work with. I would hire him again."

Published with his permission, given on 2026-10-02.

Selling a course, or stuck with an old LearnDash setup?

Tell me what you sell today and what it runs on. Before we get to a price, you'll know what moves over cleanly and what happens to the people who already paid.

Ask about a course site