No updates detected yet. GitHub releases will appear here.
Online booking for Turkish local businesses, with iyzico deposits and subscriptions. Next.js · Postgres · Drizzle.
翻訳待ち
Loading the full README. The saved excerpt is shown below.
Online booking for Turkish local businesses — salons, barbers, clinics. An
owner sets up services and hours, and gets a public page where customers book,
and can pay a deposit (kapora), without an account. The UI is in Turkish.Read the full README ↗Online booking for Turkish local businesses — salons, barbers, clinics. An owner sets up services and hours, and gets a public page where customers book, and can pay a deposit (kapora), without an account. The UI is in Turkish.
Live: rezerve-iota.vercel.app
/r/demo.
Cilt Bakımı takes a ₺300 kapora through iyzico's sandbox: use a test card
such as 5311 5700 0000 0005 with any future expiry and any CVC./giris as
[email protected] / rezerve-demo (Pro), or [email protected] /
rezerve-demo (free plan: the same services, but the kapora is not
collected).EXCLUDE USING gist constraint over the time range decides,
pending holds included, and the race is a test. Run with the constraint
dropped, eight of the fifty got the slot: the app's own availability check
catches most of a race, never all of it.Z; the
payouts page does not take them for UTC, which would show every payment
three hours late./v2/subscription/* call returns 100001, and iyzico's
integration team confirmed it — so Rezerve runs its own renewals, from a card
taken in its own form: a PCI trade-off made knowingly, in the sandbox. The
payouts page was corrected once for counting money iyzico still held as the
owner's, and when iyzico's daily transaction listing stopped listing on
23 September, it moved to asking about each booking by its own id.Next.js 16 (App Router, Cache Components) · React 19 · TypeScript · Tailwind v4 + shadcn/ui (Base UI) · Postgres (Neon) + Drizzle ORM · Better Auth · iyzico · React Email + Nodemailer · Bun · Biome · Vitest · Playwright
Upgrading to Pro takes the card number in Rezerve's own form
(/panel/abonelik), and a server action passes it to iyzico's direct payment
API with registerCard: 1, without 3-D Secure. The number is never logged and
never stored; only the returned cardToken and cardUserKey are kept, for
renewals.
On an iyzico marketplace account that is the only way recurring billing
works: the hosted Checkout Form carries no card object, the hosted card vault
(/v2/ucs/init) answers 42205, and iyzico's integration team points
recurring payments at card storage on the direct API. (Why this is a
marketplace account at all is under
Why there is no iyzico Abonelik integration.)
Against the sandbox, with test cards, that costs nothing. With real cards it
would cost two things this build deliberately stops short of. A card number
passing through the server puts the whole deployment in PCI DSS scope — SAQ D,
not the SAQ A a hosted payment page allows. And the first payment would have to
go through threedsInitialize for 3-D Secure; renewals stay non-3DS either way,
since the customer is not there to authenticate.
iyzico does not offer Abonelik on a marketplace account. Their integration
team was explicit: "Pazaryeri iş modelimizde tekrarlı ödemeler abonelik
özelliği ile sağlanamamaktadır" — recurring payments in the marketplace
business model are done with card storage instead. The API agrees: every
/v2/subscription/* endpoint returns 100001, before and after the account
was switched to marketplace.
The two products are account modes, not independent flags — the enablement email says the account's iş modeli was "updated to" marketplace. And the SDK shows why they can't coexist: no subscription request model accepts a submerchant field, so iyzico's subscription engine has no way to route a recurring charge to a submerchant. On a marketplace account, it is switched off wholesale.
So Rezerve owns its own billing schedule:
This is the beginning of the README. Read the rest at the original. Read the full README ↗