A field-tested, step-by-step procedure for taking the FreelancePro Toolkit from zero to a live, paying website on Atspace paid hosting — with a realistic plan to make it profitable in the first 30 days.
Work top-left to bottom-right. Don't skip blocks — they're ordered so each one unblocks the next. If you hit a wall, mark it, move on, and come back. Perfectionism kills launches.
Verify Atspace plan has PHP 8.3 + MySQL. Log into cPanel.
MySQL DB + user + password via cPanel wizard.
index.html, launch.html, outlook.html, subscribe.php, config.php.
Create table. Edit config.php. Test email capture.
Create Gumroad product. Paste URL into index.html.
Visit site, submit email, verify DB, click buy, test receipt.
Point domain, enable Let's Encrypt, force HTTPS.
First Reddit + X + LinkedIn posts. Send to 5 people personally.
Atspace's paid tier (anything above the free ad-supported plan) ships with PHP 8.3.3 and MySQL by default, but double-check before you build on top of it.
atspace.com and sign into your account.8.3 (or the highest 8.x available).What you need from Atspace: your FTP credentials (host, username, password), your domain or temporary subdomain (something like yourname.atspace.cc), and the cPanel login.
This is where subscriber emails will live. We're keeping the schema minimal on purpose — simpler to debug, easy to export to Mailchimp or ConvertKit later.
freelancepro. The final name will be prefixed, e.g. youracct_freelancepro — save this full name.fpadmin, with a strong password (use a password manager). Save the full username (it will also be prefixed).The schema:
CREATE TABLE subscribers ( id INT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(255) NOT NULL UNIQUE, source VARCHAR(64) DEFAULT 'homepage', ip VARCHAR(45), user_agent VARCHAR(255), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_created (created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Four fields: email, where they came from, some metadata, timestamp. You should see a green "1 table created" message.
You'll upload five files to the public_html/ directory. You can use FileZilla (FTP) or cPanel's built-in File Manager — both work. For a one-shot launch, File Manager is faster.
public_html/.index.html, delete or rename it.index.html, launch.html, outlook.html.config.php and subscribe.php.Create two small PHP files. The first holds your credentials (keep it out of Git if you're versioning). The second handles the form submission.
config.php — paste this, replace the placeholders with your real values:
<?php // config.php — database credentials. Do NOT commit to git. return [ 'host' => 'localhost', 'dbname' => 'youracct_freelancepro', 'username' => 'youracct_fpadmin', 'password' => 'YOUR_STRONG_PASSWORD_HERE', 'charset' => 'utf8mb4', ];
subscribe.php — handles the form POST, validates, and inserts:
<?php // subscribe.php — newsletter signup endpoint. PHP 8.3+. declare(strict_types=1); header('Content-Type: application/json; charset=utf-8'); header('X-Content-Type-Options: nosniff'); function respond(int $code, array $data): never { http_response_code($code); echo json_encode($data); exit; } if ($_SERVER['REQUEST_METHOD'] !== 'POST') { respond(405, ['ok' => false, 'message' => 'POST only.']); } $email = trim((string)($_POST['email'] ?? '')); if (!filter_var($email, FILTER_VALIDATE_EMAIL) || strlen($email) > 255) { respond(400, ['ok' => false, 'message' => 'Please enter a valid email.']); } // Simple rate-limit: 1 submission / IP / 60s via a lock file. $ipHash = hash('sha256', $_SERVER['REMOTE_ADDR'] ?? ''); $lock = sys_get_temp_dir() . "/fp_{$ipHash}.lock"; if (file_exists($lock) && (time() - filemtime($lock)) < 60) { respond(429, ['ok' => false, 'message' => 'Easy — already received.']); } touch($lock); try { $cfg = require __DIR__ . '/config.php'; $dsn = "mysql:host={$cfg['host']};dbname={$cfg['dbname']};charset={$cfg['charset']}"; $pdo = new PDO($dsn, $cfg['username'], $cfg['password'], [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]); $stmt = $pdo->prepare( 'INSERT INTO subscribers (email, source, ip, user_agent) VALUES (:email, :source, :ip, :ua) ON DUPLICATE KEY UPDATE created_at = created_at' ); $stmt->execute([ ':email' => $email, ':source' => 'homepage', ':ip' => substr((string)($_SERVER['REMOTE_ADDR'] ?? ''), 0, 45), ':ua' => substr((string)($_SERVER['HTTP_USER_AGENT'] ?? ''), 0, 255), ]); respond(200, [ 'ok' => true, 'message' => 'Subscribed. Check Sunday\'s inbox.' ]); } catch (Throwable $e) { error_log('subscribe.php: ' . $e->getMessage()); respond(500, ['ok' => false, 'message' => 'Something went sideways. Try again in a minute.']); }
config.php out of any public repo — if you version-control the site, add it to .gitignore and upload it separately via FTP.
Test it immediately:
yourdomain.com/index.html.subscribers table — you should see one row.config.php with your real DB credentials.subscribe.php with the code above.public_html/.subscribers table in phpMyAdmin.Gumroad handles Stripe, PayPal, taxes, receipts, and file delivery for a flat fee. For a 60-minute launch it's unbeatable. Stripe Checkout is an option too, but Gumroad's built-in digital delivery saves you an hour.
gumroad.com, complete payout info (Stripe or PayPal).$29. Enable Pay What You Want with a minimum of $29 if you want tipping, otherwise fixed.https://gumroad.com/l/xxxxxx.index.html, find the buy-btn script at the bottom, and replace the placeholder Gumroad URL with your real one.Before you send a single marketing message, run this checklist. If any item fails, fix it before launching — a broken checkout on day one is a brand wound that's hard to heal.
index.html, launch.html, outlook.html — all load.A custom domain makes the site trustworthy. Skip this at your peril — conversion rates on .atspace.cc subdomains are notably lower.
@ and www to Atspace's IP address (also in the welcome email).dnschecker.org to confirm.public_html/.http://yourdomain.com and confirm it redirects to https://.You're live. Now: your first five customers come from people who already trust you. Don't broadcast to strangers yet — the social proof comes later.
Launching is five minutes. Selling is forever. Here's a realistic four-week plan to go from "it's live" to "it's making money." Spend 60–90 minutes/day on marketing. Protect this time like it's a paying client.
Not every channel makes sense for a $29 product. Here's honest guidance on which to prioritize, which to skip, and roughly what to expect.
One breakout thread can drive 2,000+ clicks. Post 3×/week. Lead with a number, end with the link. Best channel for creators.
Effort: 1hr/post · Payback: 2–7 daysB2B freelancers live here. Personal stories outperform promos 10×. Aim for 5 posts/week, optimize the first 2 lines.
Effort: 30min/post · Payback: 1–3 daysThe compounding asset. Every sub = ~$1.50–$3/yr. At 2,000 subs you've got a predictable engine. Start the list today.
Effort: Weekly · Payback: 30+ daysNever post the sales page. Post the calculator. Offer genuine help. Moderators will ban promos. Done right: 50–300 signups/post.
Effort: 30min/post · Payback: 1–5 daysSlow but durable. Target long-tail queries: "how to calculate freelance rate," "freelance contract template." 3–6 months to rank.
Effort: 3hr/post · Payback: 90–180 days30–40% commission on a $29 product = $8–12 per sale. Recruit creators whose audience matches. Can become 30–40% of revenue by month 6.
Effort: Recruiting · Payback: 60+ daysHard to make work at $29 AOV. Only scale after the organic funnel converts. Test with $50, kill fast.
Effort: $ + time · Payback: UncertainBig reach potential, but low-intent audience. One viral video could 10× your month, or you could post 30 times for nothing.
Effort: High · Payback: LotteryGreat for trust + long-tail SEO. Hard to attribute. Do once you have a $99+ upsell to recoup the time investment.
Effort: High · Payback: 90+ daysThe 14 boxes below should all be checked before you tell anyone the site is live. Ten minutes of checking beats ten hours of damage control. Tap each item — progress saves automatically.