Chaque changement de canusign, documenté de manière transparente — ce que nous avons construit, quand et pourquoi. Commentaires bienvenus via commentaires.
Sharpened the landing experience around the pay-per-signature wedge (no subscription, no account for signers, eIDAS-compliant) after a competitive audit confirmed that the real competition is free-tier-then-upsell tools like DigiSigner and BoldSign, not enterprise DocuSign. The pricing line on the landing page now anchors to the actual single-signature price (€1.49) instead of the cheapest-per-credit bulk-discount floor, which was misleading first-time visitors. Two new in-product nudges surface the 'your credit covers it' framing exactly where the data showed users abandoning: above the Continue button in the editor, and as a re-engagement banner on the dashboard for users with credits and a finished draft. The new duplicate-for-new-signer action turns a one-time signed contract into the starting point for the next one, which is how the top power users actually use the product (property managers sending the same lease to multiple tenants, B2B onboardings, repeating coaching agreements). Help and contact also got a clear home inside Settings instead of being hidden behind the generic Feedback link.
Duplicate a contract for a new signer
New
Any contract with a document now has a "Duplicate for new signer" action in the dashboard menu. It clones the source contract, including its uploaded PDF/text pages and field placements, as a fresh draft with a new token and "(copy)" appended to the title — ready to send to the next tenant, client, or counterparty without re-uploading and re-placing signature fields. This is the path most of our recurring users were taking manually (re-upload, re-place fields each time); now it is one click.
Help & contact section in Settings
New
Logged-in users had no obvious path to get in touch from inside the app — the Feedback menu item buried the contact form behind a tab. Settings now has a dedicated Help & contact section with three entries: "Send us a message" (deep-links to /feedback?tab=contact, the contact form opens immediately), a direct mailto:contact@canusign.com fallback for users who prefer their own mail client, and "Request a feature" pointing at the public feature-voting list. Fully translated in all 10 supported languages.
Cost preview above the Continue button in the editor
New
Once a user has placed at least one signature field, the editor now shows a one-line cost preview directly above the Continue button so the price impact is visible before the user clicks through to /payment. Logged-in users with credits see "Free — your credit covers it" (with available balance); logged-in users at zero balance see "€1.49 — one credit required"; guests see "First signature free — no subscription". The signal closes the loop on the analytics data showing 30 contract_finalized → 19 checkout_opened drop that was driven by users not realising the credit covered the cost.
Re-engagement banner for stuck drafts on the dashboard
New
Users with at least one draft contract that already has a document attached and credits in their balance now see a prominent mint/coral banner above the contract list: "You have N drafts ready to send — your credit covers it." Clicking jumps straight into the editor for the first stuck draft. Targets the cohort the analytics surfaced: 22 users (29% of accounts) who got their free signup credit, uploaded a PDF, but never finalised — the largest single activation gap in the funnel.
Landing hero rewritten around the no-subscription wedge
Improvement
New hero copy in all 10 languages: "Sign PDFs. No subscription." with subtitle "Need a signature today? Pay €1.49 once — no trial, no account for your signers. eIDAS-compliant, built for the EU." Replaces the previous neutral "Sign PDFs Online / Upload any PDF, add signatures..." framing. The new copy explicitly targets the real competitive set — free-tier tools that pressure users into subscriptions after the trial — rather than enterprise e-signature players that share none of our pay-per-use audience.
Landing page price anchor — €1.49 per signature, not $0.49 per credit
Fix
The landing page advertised "from $0.49 per credit", which was the cheapest-per-credit price floor when buying the largest bulk pack — and in the wrong currency. First-time visitors then hit the Single pack at €1.49 at checkout and felt baited. The label now anchors to the actual single-signature price they will see at checkout (€1.49 in EUR; geo-currency adapted), and the wording shifted from "per credit" to "per signature" across all 10 locales so the same noun is used end-to-end from landing → editor → checkout.
v0.22.0
Passkey login, Google OAuth, admin dashboard — auth fully replaced
Swapped the entire auth stack from NextAuth v5 to Better Auth and put the new capabilities in front of users. /login now offers three sign-in methods: magic link (email), passkey (Touch ID / Face ID / Windows Hello via WebAuthn conditional UI), and Google OAuth. /settings/security is the new home for managing passkeys and listing active sessions, with one-click revoke per device or sign-out-everywhere-else. /admin is a role-gated dashboard for paginated user management — set role, ban with reason, impersonate, hard-delete. The post-payment success card no longer bleeds packs and promo banners through; once the credit is purchased, only the magic-link confirmation remains visible. Account creation is now tracked uniformly from all three signup code paths (magic link, post-payment, Stripe webhook) so the funnel doesn't lose attribution at the moment users convert.
Passkey login with conditional UI
New
Email field on /login carries autocomplete="username webauthn" so browsers surface saved passkeys directly in the autofill dropdown. An explicit "Sign in with Passkey" button handles the fallback. Per-user passkey management at /settings/security (add, rename, delete) lists every credential with the device type and registration date.
Google OAuth sign-in
New
Continue-with-Google button on /login wired to Google Cloud OAuth. Gated by NEXT_PUBLIC_GOOGLE_LOGIN_ENABLED so previews without credentials still build cleanly.
Active session list + revoke
New
/settings/security lists every active session with the browser/OS guess, IP, and sign-in date. "Current" badge on the active session, per-row revoke, plus "Sign out other devices" when more than one session exists.
/admin dashboard with role-gated access
New
Paginated user list (email, role, plan, status, joined) with email search. Per-user actions: toggle admin role, impersonate, ban with reason, unban, hard delete. Server-side guard rechecks role against the DB on every request so a fresh promote takes effect immediately.
Cleaner post-payment success screen
Improvement
Pack selector, promo banner, trust badges, comparison hint, and Sign-up-free CTA all collapse once payment succeeds. Only the magic-link confirmation card stays visible — guests see one obvious next step instead of a scroll of unrelated UI.
account_created event fires from every signup path
Improvement
Better Auth signups (databaseHooks.user.create.after), guest-pays-then-enters-email (/api/checkout/auto-login), and Stripe webhook auto-create (handlePaymentIntentSucceeded + handleCheckoutCompleted) all emit account_created with the provider label. The post-payment funnel finally attributes signups to the path that produced them.
NextAuth removed, schema migrated
Infra
next-auth and @auth/prisma-adapter uninstalled. User.emailVerified migrated from DateTime to Boolean (timestamp preserved in emailVerifiedAt). Session, Account, and Verification tables recreated with Better Auth's shape. New Passkey table for WebAuthn credentials. All 45 useSession / signIn / signOut / auth() callsites migrated to authClient + getSession. See docs/BETTER_AUTH_MIGRATION.md.
v0.21.0
Full funnel visibility: editor, redirect-payments, per-product CTR
Up to now the conversion funnel had two big blind spots: the editor step between upload and checkout (we knew people uploaded PDFs but had no idea what they did before paying), and Stripe-hosted Checkout-Session redirects (Pro subscriptions and sublease document payments fired no payment_succeeded events at all, so the dashboard showed real money coming in but no funnel attribution). This release wires both up. Five new editor events (editor_opened → document_added → field_placed → editor_continue_clicked → contract_finalized) make every step between upload and payment visible, and three new redirect-flow events (checkout_opened → checkout_redirected → payment_succeeded on the success page) close the gap for subscription and sublease purchases. The funnel-snapshot script now produces per-product CTR for credit-pack, pro-subscription, and sublease-document so we can see which entry point converts best.
Editor funnel events — see drop-off between upload and checkout
New
editor_opened (with template/draft/from-landing breakdown), document_added, field_placed, editor_continue_clicked (with docCount and types), contract_finalized, and editor_continue_failed for backend errors. Each fires once per editor session so counts are comparable to upload and payment events.
Redirect-payment tracking for Pro Subscription and Sublease
New
Pro Subscription (CTA on landing → Stripe-hosted Checkout) and Sublease Document Payment (sublease form → Stripe-hosted Checkout) now fire checkout_opened before redirecting and payment_succeeded on their success pages. Real Stripe charges that previously didn't appear in the funnel are now attributed to a product.
All payment events tagged with product slug
Improvement
Inline credit-pack purchases (checkout-form.tsx) now include product, packId, and flow on every event. Funnel-snapshot script splits per-product CTR (credit-pack vs. pro-subscription vs. sublease-document) so we can see which path converts best at every step.
checkout_failed — catches backend errors before Stripe loads
New
When the create-checkout API call fails (network error, 500 response, missing URL), checkout_failed fires with the error type. We see hangs at 'opened but no Stripe' before users do.
Funnel-snapshot script: full 11-step session funnel
Infra
scripts/funnel-snapshot.ts now reports the complete page_view → upload_completed → editor_opened → document_added → field_placed → editor_continue_clicked → contract_finalized → checkout_opened → payment_submitted → payment_succeeded order with drop-off rates, plus per-product breakdown and per-flow split (inline vs. redirect).
v0.20.0
Locale-aware blog content & dependency refresh
Cleaned up 61 mis-localized blog posts that were literal translations of US-centric content into FR/IT/PT/NL/PL/TR/JA — they ranked for nothing because they referenced US laws (HIPAA, ESIGN, IRS) instead of local frameworks (eIDAS, RGPD, Kodeks cywilny, KEP). Posts with organic traffic now redirect to the locale blog index. New blog generation is locale-aware: banned-term enforcement plus required local legal frameworks per market. Stripe SDK upgraded to v22 along with all other dependencies.
Blog content now respects local jurisdictions
Improvement
Articles for non-English locales now reference the actual local legal framework (eIDAS, RGPD, BGB, Codice Civile, KEP, 電子署名法) instead of US-only terms. Geo-locked topics (HIPAA, IRS Form 8879, ABA Model Rules) are blocked from generating in non-US locales.
Removed 61 mis-localized blog posts
Infra
Posts that were just translations of US-specific topics into FR/IT/PT/NL/PL/TR/JA were deleted. The 6 posts with organic traffic now permanently redirect to the locale blog index so search-engine visitors land on something useful.
Stripe SDK upgraded to v22
Security
Stripe Node SDK bumped from v21 to v22, plus 23 other dependency updates including Next 16.2.4, React 19.2.5, Prisma 7.8, lucide-react 1.14, next-intl 4.11, zod 4.4 — keeps payment processing on the latest secure baseline.
v0.19.0
Funnel analytics & meta polish
Better visibility into the conversion funnel and a tightened Open Graph / manifest setup so links shared on social platforms render with the proper preview, theme color, and Apple web-app metadata. Plus the usual round of small UX fixes on the payment page.
Funnel-tracking analytics
New
Custom events now fire across the upload → editor → payment → sign funnel so we can see where users drop off. Wired into Vercel Analytics and Microsoft Clarity for session replay.
Manifest, theme color & Apple web-app metadata
Design
Proper PWA manifest, theme color tokens for browser chrome, and Apple-specific metadata so the site behaves like a native install on iOS Safari "Add to Home Screen".
Browser-back from payment now lands in editor
Fix
Hitting the browser back button after a Stripe redirect used to throw users into a broken state. Now it properly returns to the editor with the document still loaded.
Pricing copy reflects credit-pack model
Fix
Removed legacy "€1/document" claims from marketing pages — pricing now matches the actual credit-pack tiers (Single €1.49, Starter €4.90, Popular €9.90, Business €24.90, Pro €15/mo).
v0.18.0
Credit system, accounts & anti-abuse
The biggest change since launch: moved from per-document Stripe checkout to a credit pack system with user accounts, magic-link login, and a personal dashboard. New users get one free credit on signup, then buy packs with bonus credits stacked on top. Inline Stripe payment element means no more redirect to checkout. Plus a referral program, anti-abuse system, and exit-intent conversion optimization.
Credit packs with bonus tiers
New
Buy credits in bundles: Single (€1.49), Starter (€4.90 with +1 bonus), Popular (€9.90 with +5 bonus), Business (€24.90 with +15 bonus), or Pro at €15/month for unlimited use. Bonus credits highlighted in green throughout the UI.
User accounts & dashboard
New
Magic-link login via email (no passwords). Personal dashboard shows your documents, credit balance, and credit history. Guest documents created before signup get migrated to your account on first login.
Inline Stripe payment
New
No more redirect to Stripe Checkout. Card form is embedded directly on the payment page so you stay in context. Single pack pre-selected for one-click purchases.
Referral program
New
Each account has a 6-character referral code. Invite a friend and you both get a free credit when they sign up. Email notification when someone redeems your link.
Anti-abuse system
Security
Disposable email domains blocked at signup (~100 domains covered). IP rate limit: max 3 bonus-credit signups per IP per 24h. Browser fingerprint plus signup-fingerprint persistence prevent bonus farming via account deletion + re-registration.
Avatar dropdown & credit badge
Improvement
New header with avatar dropdown (Settings / Feedback / Logout) and a credit badge that turns mint when you have credits, gray when at zero. Click the badge to jump straight to your settings.
Conversion optimization
Improvement
Trust badges (SSL, eIDAS, GDPR), social proof on the homepage, exit-intent popup with discount, and a sticky blog CTA bar that follows you while reading articles.
v0.17.0
Better signing flow & mobile polish
The signing experience got a major redesign with an integrated document header, page tabs with status icons, and proper mobile gestures. Loading states feel responsive, navigation is unified across all step types, and pinch-to-zoom works the way users expect.
Integrated document header during signing
Improvement
Status, page counter, page tabs and the action button are now combined into one header on top of the document. Page tabs are numbered and show a pen icon for unsigned pages, a check for signed ones — colored to match each signer.
Pinch-to-zoom on mobile
Improvement
Native pinch gesture support plus dedicated zoom controls underneath the document. Touch targets for navigation arrows enlarged for fingers.
Unified navigation for every step type
Improvement
Same navigation pattern whether the document is a contract, uploaded PDF, text, or image. Reduces cognitive load and code surface.
Signing loader overlay
New
Visible loading state during the signing API call — no more wondering if the click was registered.
"Partially signed" status
New
Documents with at least one signature but not all show as "Partially signed" in the dashboard, with a clear count of remaining signers.
Une fonctionnalité vous manque ou vous avez des commentaires ?