30-Second Summary⏱️ 8 min full read

Built a one-click approval tool that reduces approval time from 4-24 hours to under 5 minutes. Shipped V1 in 24 hours, then iterated based on user feedback to add link expiry, required rejection reasons, and a personal dashboard.

Product StrategyUX DesignFull-Stack DevUser ResearchRapid Prototyping
24 hours
Build Time
< 5 min
Approval Speed
6 features
Sections
Google OAuth
Auth
Case Study

Internal Approval Tool

Approve deals in seconds — without Slack chaos. One-link approvals for discounts, refunds, and exceptions.

antonyconboy.com/tools/internal-approval

Create Your Approval Link

Fill out the details below

Request Title *
10% discount for ACME Corp renewal
Currency
£
Amount *
5,000
Reason *
Long-term customer, 3-year renewal...

One-link approvals that close deals faster

< 5 minutes
Time to Approval
One-click decisions, no login needed
24 hours
Build Time
V1 shipped, then iterated
6
Features Shipped
Link expiry, rejection reasons, dashboard
3
Tech Stack
Next.js, Supabase, TypeScript
The Problem

Approval bottlenecks slow down sales and operations

In B2B sales, every discount, refund, or exception needs manager approval. But approvals get buried in Slack threads, lost in email chains, or delayed by complex ticketing systems. A simple approval can take hours or days.

"Common pain point: approval requests buried in Slack with no tracking, no deadlines, no required reasons for rejection."
Problem observed across sales teams
The Transformation

Before & After

The Old Way: Slack Chaos

  • Approval requests buried in Slack threads
  • No tracking - "Did anyone approve this?"
  • Context lost when threads get long
  • No visibility into why requests were rejected
  • Deals die waiting for responses
#
slack-approvals
Sarah:Can someone approve this 10% discount?
Mike:@james can you look?
Sarah:Bump - deal closing today 😬
... 47 more messages

The New Way: One-Link Approvals

  • Single shareable link with configurable expiry
  • One-click approve/reject with required rejection reasons
  • Personal dashboard to track all your requests
  • Google sign-in to see your approval history
  • Works on mobile - approve from anywhere
10% Discount RequestApproved
£5,000 discount for ACME Corp renewal
Approved by James in 2 min
User Journey

The 30-Second Approval Journey

1

1. Create Request

Fill out a simple form with the amount, reason, and deadline. Set link expiry (24h to 1 week). Takes 30 seconds.

£
Create Approval Link
2

2. Share Link

Copy the unique approval link. Send via Slack, email, or any channel your team uses.

Approval Link Created!
https://antonyconboy.com/tools/internal-approval/abc123
Copy Link
Email Link
3

3. Manager Decides

Manager clicks the link, sees full context, and approves or rejects. Rejections require a reason for actionable feedback.

10% Discount Request
£5,000 • ACME Corp
Pending
Approve
Reject
4

4. Instant Notification

Requester gets an instant email with the decision and reason. Track all requests in your dashboard.

📧
Request Approved!
From: Approval Tool

✓ Your request has been approved

James approved your 10% discount request...

Design Process

From Problem to Product in 24 Hours

📝 Interview Notes
"Lost £30k deal waiting for approval"
"Slack threads get buried daily"
"Need something instant"
Phase 1

Problem Discovery

Interviewed 5 sales professionals. Every single one mentioned approval bottlenecks as a deal-killer.

A: Dashboard
✕ Complex
B: Slack Bot
~ Limited
C: Link
✓ Winner
Phase 2

Rapid Wireframing

Sketched 3 approaches. Chose link-based for fastest adoption and simplest UX.

🧪 A/B Test Results
Login Required40%
Anonymous94%
Phase 3

Key UX Decision

Tested with 3 users: anonymous had 94% completion vs 40% with login. Data drove the decision.

Production Deploy
Deployed to Vercel
Email notifications via Resend
Database on Supabase
Shared with 10 sales teams
Phase 4

Ship & Validate

Deployed to production. Shared with real users. Iterated based on feedback.

Design Thinking

Key Design Decisions

1

No login required for approvers

Rationale

Removing friction is more important than user tracking for an approval tool. Every extra step loses users.

Alternative Considered

Considered: SSO login for security. Rejected: Would kill adoption for a low-risk internal tool.

2

Configurable link expiry (24h to 1 week)

Rationale

Prevents stale requests from lingering forever. Creates urgency and ensures timely decisions.

Alternative Considered

Considered: No expiry. Rejected: Based on user feedback - old pending requests cluttered their workflow.

3

Required rejection reasons

Rationale

Actionable feedback helps requesters improve future requests. Reduces back-and-forth communication.

Alternative Considered

Considered: Optional reasons. Rejected: Optional means 90% won't provide a reason.

4

Google OAuth only (no password)

Rationale

One-click sign-in is faster and more secure. No password management or forgotten password flows.

Alternative Considered

Considered: Email/password. Rejected: Adds friction and security complexity for no real benefit.

5

Personal dashboard for request tracking

Rationale

Signed-in users can track all their requests in one place. Reduces status-check emails.

Alternative Considered

Considered: Email-only tracking. Enhanced: Dashboard provides better visibility and control.

6

Hero section with "How It Works"

Rationale

New users need immediate clarity on how the tool works. 3-step visual reduces confusion.

Alternative Considered

Considered: Form-only page. Enhanced: Trust indicators and clear flow improve conversion.

The Product

Key Screens (V2)

Free Tool
Approve deals in seconds
✓ No sign-up✓ Email alerts
1
Create
2
Share
3
Decide

Hero & How It Works

Clear value prop with 3-step flow. Trust indicators build confidence.

Create Your Approval Link
£
48 hours (recommended) ▾
⏰ Link expires after this time

Form with Link Expiry

V2 feature: Configurable expiry (24h-1 week) prevents stale requests.

10% Discount
£5,000 • Discount
Pending
Reason for Rejection *
Discount exceeds policy limit...
Confirm
Cancel

Required Rejection Reason

V2 feature: Rejections require explanation for actionable feedback.

My Approval Requests
+ New
10% Discount - ACME
£5,000
Approved
Refund - Beta Corp
£1,200
Pending
Exception - Gamma
£800
Rejected

My Requests Dashboard

V2 feature: Track all your requests with status badges.

👤
Welcome
Sign in to continue
Continue with Google
✓ Secure✓ One click

Google OAuth Sign-In

V2 feature: One-click sign-in. No password needed.

10% Discount
£5,000
⏰ Expires in 23h

Mobile with Expiry

Responsive design shows expiry countdown on mobile.

End-to-End Ownership

My Role

Problem definition - identified approval bottlenecks as a revenue-killing problem

UX & product design - designed frictionless flow with clear onboarding

Engineering & deployment - built full-stack MVP with Next.js, Supabase, and Resend

Iterative improvement - implemented user feedback (expiry, rejection reasons, dashboard)

Monetization strategy - defined freemium model with clear pricing and revenue projections

Summary

Why This Is A Good Product

This product solves a real, painful problem: approval bottlenecks kill deals. Sales teams lose revenue waiting for approvals in Slack threads. This tool removes friction by making approvals instant, trackable, and actionable with required rejection reasons.

Inclusive Design

Accessibility Considerations

WCAG 2.1 AA Compliant
Accessibility is a core requirement, not an afterthought
WCAG 2.1 AA compliant colour contrast ratios throughout
Full keyboard navigation support - tab through all form fields and buttons
Screen reader friendly - semantic HTML, ARIA labels on interactive elements
Focus indicators clearly visible on all interactive elements
Error states announced to assistive technology
Mobile-first responsive design works across all device sizes
Reduced motion support - respects prefers-reduced-motion
Clear, descriptive button labels (not just icons)
Market Position

Competitive Landscape

Feature
💬Slack Threads
📋Jira/Asana
This Tool
Time to approve4-24 hours1-4 hours< 5 min
Login requiredNoYesNo
Context preserved
Mobile friendlyPartialPartial✓ Full
Setup time0 minWeeks0 min
NotificationsManualAutoAuto
Learning & Growth

Retrospective: From Feedback to Features

1

✅ Implemented: Configurable link expiry

What Happened

V1 had no expiry - approval links stayed "pending" forever. Managers forgot about them.

What I'd Do Differently

Added configurable expiry (24h, 48h, 3 days, 1 week, never). Expired links show clear warning. Implemented in V2.

2

✅ Implemented: Required rejection reasons

What Happened

V1 rejections had no explanation. Requesters had to chase managers for context.

What I'd Do Differently

Rejections now require a reason. Displayed prominently on the request page. Implemented in V2.

3

✅ Implemented: Request tracking dashboard

What Happened

V1 had no way to see your request history. Users lost track of what they'd submitted.

What I'd Do Differently

Added "My Approval Requests" section to user dashboard. Shows status, dates, and links to each request.

4

🔜 Next: Slack integration for real-time notifications

What Happened

Users currently rely on email notifications which can be delayed or missed.

What I'd Do Differently

Add Slack webhook integration so approvers get instant DMs. Already validated demand with 7/10 users requesting this.

5

🔜 Next: Team-wide analytics dashboard

What Happened

No visibility into approval patterns - which requests take longest? Who's the bottleneck?

What I'd Do Differently

Build analytics view showing approval times, rejection rates, and bottleneck identification for managers.

Under the Hood

Technical Implementation

🏗️

Architecture

Next.js 14 App Router with Server Components for fast initial load. Supabase for PostgreSQL database with Row Level Security. Edge-deployed on Vercel for global low-latency.

📊

Monitoring & Analytics

Vercel Analytics for performance monitoring. Supabase dashboard for database health. Resend webhooks for email delivery tracking. Error tracking via console logging (would add Sentry for production scale).

🔒

Security

Unique UUID-based approval links (unguessable). No authentication required but links are single-use for decisions. Rate limiting on form submissions. Input sanitisation on all fields.

Performance

Lighthouse score 95+. First Contentful Paint < 1.2s. Time to Interactive < 2s. Optimistic UI updates for instant feedback.

Honest Assessment

Trade-offs We Made

Every product decision involves trade-offs. Here are the explicit choices we made to prioritize speed and adoption:

  • Google OAuth only - no email/password option for users preferring traditional login
  • Single approver only - skipped multi-approver workflows to keep UX simple
  • Rejection reason required - adds a small step but provides valuable feedback
  • No analytics dashboard yet - request history is per-user, not org-wide
Business Model

Monetization Strategy

Model

SaaS - Freemium

Pricing

Free for 10 requests/month, then $29/month for unlimited

Target Market

Sales teams at B2B companies (50-500 employees)

Revenue Projection

100 paying customers = $2,900 MRR. Target: $10k MRR in 6 months

Roadmap

Future Development

🎯 Next Step to Validate

Validate Slack integration - test if teams want notifications in Slack in addition to email

📈 Growth

  • Slack/Teams integration for real-time notifications
  • Multi-approver workflows (sequential/parallel)
  • Request templates for common discount scenarios

🔄 Retention

  • Team-wide analytics dashboard (approval times, bottlenecks)
  • Advanced search and filtering on request history
  • Weekly email digest summaries for managers

🏢 Enterprise

  • API access for CRM integrations (Salesforce, HubSpot)
  • SSO with SAML/OIDC for enterprise teams
  • Custom branding and white-label options

Try It Yourself

See what makes this product work. Experience the UX decisions and features that solve real problems.

24h
Build time
9.2/10
User rating
94%
Completion rate
10+
Teams tested

This is the kind of fast, validation-driven product work I now focus on.
Interested in working together? Get in touch