You are not logged in.
+ + Go to login + +You are not logged in.
+ + Go to login + +Signing you in…
+{error}
+ )} + > + )} + + {step === "sent" && ( + <> ++ We sent a login link to {email}. +
+ ++ The link expires in 15 minutes. +
+ > + )} ++ {step === "email" ? "Enter email" : "Check inbox"} +
+
- Automatically create and mark Xero invoices as paid when a Stripe payment succeeds.
-
- Built for people who value time more than pressing buttons.
+
+ When a Stripe payment succeeds, a Xero invoice is + automatically created and marked as paid.
- Authentication is passwordless. We only store intent and proof of login.
+
+ Start by logging in.
- Once connected, everything runs automatically.
- No manual reconciliation. No “awaiting payment” state.
-
- Your next Stripe payment will automatically reconcile in Xero.
-
- £200 / month — unlimited invoices.
-
- This page is intentionally simple.
-
- These are the only docs needed to implement magic-link auth with Next.js + AWS SES.
-
-{`Browser
- |
- | POST /auth/login (email)
- v
-Backend
- - find or create user
- - generate token
- - hash token
- - store login_tokens row
- - send email (SES)
- |
- v
-Email (magic link)
- |
- | GET /auth/callback?token=XYZ
- v
-Backend
- - hash token
- - validate token (unused + not expired)
- - mark token as used
- - create session
- |
- v
-Set session cookie
-`}
-
-
- {/* Step-by-step breakdown */}
-
-
+
+ Log in →
+
login_tokens.
- Stripe → Xero automation flow
-
-
-{`Stripe payment succeeds
- |
- | Webhook
- v
-Backend
- - verify Stripe event
- - map payment to customer
- - create Xero invoice
- - mark invoice as paid
- |
- v
-Xero (reconciled automatically)
-`}
-
-
- Proof, not promises
-
-
- No manual matching. No bookkeeping busywork.
- Pricing
-
-
- The product is the automation, not the UI.
- Implementation notes (for future me)
-
-
-
-