Merge pull request #24 from MealCraft/feature/magic_link_user_login

added landing page
This commit is contained in:
Jun-te Kim 2025-12-28 16:41:36 +00:00 committed by GitHub
commit 8c15e6be43
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 295 additions and 0 deletions

View file

@ -0,0 +1,125 @@
// app/page.tsx
export default function Home() {
return (
<main className="max-w-3xl mx-auto p-8 space-y-14">
{/* Hero */}
<section>
<h1 className="text-3xl font-semibold tracking-tight">
Stripe Xero, done properly
</h1>
<p className="mt-4 text-lg text-gray-700">
Automatically turn Stripe payments into paid Xero invoices
with VAT correctness and accountant sign-off in mind.
</p>
<p className="mt-2 text-gray-600">
No journals. No spreadsheets. No month-end fixing.
</p>
</section>
{/* Who it's for */}
<section>
<h2 className="text-xl font-medium">Who this is for</h2>
<ul className="mt-4 space-y-1 list-disc list-inside text-gray-700">
<li>UK businesses</li>
<li>VAT registered</li>
<li>Using Stripe Checkout or Payment Links</li>
<li>Using Xero</li>
<li>Billing is one-off, annual, or fixed recurring</li>
</ul>
<p className="mt-2 text-gray-600">
If you rely on usage billing or proration, this is not a fit.
</p>
</section>
{/* Problem */}
<section>
<h2 className="text-xl font-medium">The problem</h2>
<p className="mt-2 text-gray-700">
Stripe is excellent at taking payments.
Xero is required for accounting and VAT.
</p>
<p className="mt-2 text-gray-700">
The gap between them is usually filled with manual journals,
spreadsheets, and well fix it at month-end.
</p>
<p className="mt-2 text-gray-600">
That works until it doesnt.
</p>
</section>
{/* Solution */}
<section>
<h2 className="text-xl font-medium">The solution</h2>
<p className="mt-2 text-gray-700">
This system makes Xero the invoice-of-record and treats Stripe
purely as payment execution.
</p>
<p className="mt-2 text-gray-700">
When a Stripe payment succeeds, a matching invoice appears in Xero
and is automatically marked as paid.
</p>
<p className="mt-2 text-gray-600">
Refunds become credit notes. Fees are handled separately.
Everything is explainable.
</p>
</section>
{/* How it works */}
<section>
<h2 className="text-xl font-medium">How it works</h2>
<ol className="mt-4 space-y-2 list-decimal list-inside text-gray-700">
<li>Connect Stripe</li>
<li>Connect Xero</li>
<li>A real payment is made</li>
<li>An invoice appears in Xero as paid</li>
<li>Month-end reconciliation just works</li>
</ol>
</section>
{/* Why it's different */}
<section>
<h2 className="text-xl font-medium">Why this is different</h2>
<ul className="mt-4 space-y-1 list-disc list-inside text-gray-700">
<li>Xero remains the legal source of truth</li>
<li>Invoices are immutable once issued</li>
<li>Edge cases are logged, not hidden</li>
<li>Humans approve exceptions and month-end</li>
</ul>
<p className="mt-2 text-gray-600">
This is a financial control, not a data sync.
</p>
</section>
{/* Pricing */}
<section>
<h2 className="text-xl font-medium">Pricing</h2>
<p className="mt-2 text-gray-700">
£200 per month.
</p>
<p className="mt-1 text-gray-600">
Unlimited invoices. No per-transaction fees.
</p>
<p className="mt-2 text-gray-600">
Costs less than fixing Stripe in Xero manually.
</p>
</section>
{/* CTA */}
<section className="pt-8 border-t">
<p className="text-gray-700">
If Stripe and Xero already match perfectly for you,
you dont need this.
</p>
<p className="mt-2 text-gray-700">
If someone fixes them every month, you probably do.
</p>
<p className="mt-4 text-sm text-gray-500">
This page is intentionally simple. The proof is your next payment.
</p>
</section>
</main>
)
}

View file

@ -0,0 +1,170 @@
// app/checklist/page.tsx
export default function GoToMarketChecklist() {
return (
<main className="max-w-3xl mx-auto p-8 space-y-16">
{/* Header */}
<section>
<h1 className="text-2xl font-semibold">
Go-to-Market Checklist (Post-MVP)
</h1>
<p className="mt-2 text-gray-600">
A step-by-step execution checklist to find the right customers,
sell with certainty, and avoid wasted effort.
</p>
</section>
{/* ICP */}
<section>
<h2 className="text-xl font-medium">1. Confirm the target customer (non-negotiable)</h2>
<ul className="mt-4 space-y-1 list-disc list-inside text-gray-700">
<li>UK-based business</li>
<li>VAT registered</li>
<li>Uses Stripe Checkout or Payment Links</li>
<li>Uses Xero (or QuickBooks)</li>
<li>Wants invoices to exist cleanly in the ledger</li>
<li>Billing is one-off, annual, or fixed recurring</li>
<li className="text-gray-500">No usage billing, no proration</li>
</ul>
<p className="mt-2 text-gray-600">
If any of these are false, do not sell to them.
</p>
</section>
{/* Problem Validation */}
<section>
<h2 className="text-xl font-medium">2. Validate pain before pitching</h2>
<ul className="mt-4 space-y-1 list-disc list-inside text-gray-700">
<li>Ask: Do Stripe payouts and Xero invoices always match?</li>
<li>Listen for: manual fixes, journals, spreadsheets, month-end stress</li>
<li>Confirm VAT reconciliation is a pain point</li>
<li>Confirm a human currently checks or fixes things</li>
</ul>
<p className="mt-2 text-gray-600">
No visible pain = no sale.
</p>
</section>
{/* Channels */}
<section>
<h2 className="text-xl font-medium">3. Choose acquisition channel (in order)</h2>
<div className="mt-4 space-y-6">
<div>
<h3 className="font-medium">A. Accountants & bookkeepers (primary)</h3>
<ul className="mt-2 space-y-1 list-disc list-inside text-gray-700">
<li>UK-based Xero partners</li>
<li>Bookkeepers handling Stripe clients</li>
<li>Fractional CFOs</li>
</ul>
<p className="mt-1 text-gray-600">
Pitch: Stripe payments accountant-approved Xero invoices. Automatically.
</p>
</div>
<div>
<h3 className="font-medium">B. Reddit & communities (problem-aware)</h3>
<ul className="mt-2 space-y-1 list-disc list-inside text-gray-700">
<li>Search Stripe + Xero reconciliation threads</li>
<li>Explain why the problem exists</li>
<li>Describe the accounting-first solution</li>
<li>Let people DM you</li>
</ul>
</div>
<div>
<h3 className="font-medium">C. Targeted founder outbound</h3>
<ul className="mt-2 space-y-1 list-disc list-inside text-gray-700">
<li>UK agencies</li>
<li>B2B SaaS with annual or fixed billing</li>
<li>Founder still involved in finance</li>
</ul>
</div>
</div>
</section>
{/* Sales Execution */}
<section>
<h2 className="text-xl font-medium">4. Close with outcome, not features</h2>
<ul className="mt-4 space-y-1 list-disc list-inside text-gray-700">
<li>Do not demo dashboards</li>
<li>Do not explain internals</li>
<li>Promise: Next Stripe payment appears as paid in Xero</li>
<li>Charge £200/month immediately</li>
</ul>
<p className="mt-2 text-gray-600">
If they want a free trial, they are not the customer.
</p>
</section>
{/* Delivery */}
<section>
<h2 className="text-xl font-medium">5. Deliver proof immediately</h2>
<ul className="mt-4 space-y-1 list-disc list-inside text-gray-700">
<li>Connect Stripe</li>
<li>Connect Xero</li>
<li>Trigger a real payment</li>
<li>Show paid invoice in Xero</li>
<li>Send screenshot or reconciliation summary</li>
</ul>
<p className="mt-2 text-gray-600">
The product is the outcome.
</p>
</section>
{/* Objections */}
<section>
<h2 className="text-xl font-medium">6. Capture objections and edge cases</h2>
<ul className="mt-4 space-y-1 list-disc list-inside text-gray-700">
<li>Ask: What would make this risky?</li>
<li>Ask: What would your accountant question?</li>
<li>Log every concern verbatim</li>
<li>Turn repeated concerns into rules or exclusions</li>
</ul>
</section>
{/* Narrow */}
<section>
<h2 className="text-xl font-medium">7. Narrow the ICP aggressively</h2>
<ul className="mt-4 space-y-1 list-disc list-inside text-gray-700">
<li>Remove customers that add complexity</li>
<li>Publish exclusions clearly</li>
<li>Optimise for repeatability, not volume</li>
</ul>
</section>
{/* Scale */}
<section>
<h2 className="text-xl font-medium">8. Scale only what already works</h2>
<ul className="mt-4 space-y-1 list-disc list-inside text-gray-700">
<li>Automate manual steps youve repeated 10×</li>
<li>Build exception handling before new features</li>
<li>Add period close + human sign-off</li>
</ul>
</section>
{/* Scoreboard */}
<section>
<h2 className="text-xl font-medium">9. Weekly scoreboard</h2>
<ul className="mt-4 space-y-1 list-disc list-inside text-gray-700">
<li>New paid conversations</li>
<li>Time to first reconciled payment</li>
<li>Monthly churn</li>
<li>Unresolved exceptions</li>
</ul>
</section>
{/* Close */}
<section className="pt-8 border-t">
<p className="text-gray-500 text-sm">
If this business fails, it will not be because the software didnt work.
It will be because the wrong customers were targeted or certainty wasnt proven.
</p>
</section>
</main>
)
}