Inspiration
Every freelancer knows the feeling. The client call goes great, and then you lose your evening to a proposal: a blank document, a pricing table, a PDF that the client opens on their phone, squints at, and never answers. The work is won or lost in the gap between the call and the signed proposal, and that gap is mostly formatting.
The tools that exist were built for desktops and sales teams. Freelancers, studios and small agencies sell their own work, often from a phone, between jobs. They need something that keeps up with a conversation, not a template library that takes an afternoon to fill in.
So I set out to close that gap. MyProposer turns the notes you took on the call into a priced, branded proposal in about a minute. You send it as one link, the client picks a package and signs on their own phone, and the contract or invoice drafts itself from the deal you just won. The whole loop works from the phone in your pocket, before the client has finished their coffee.
What it does
- Paste your notes, AI writes the proposal. Strategy, scope, timeline and three priced packages, all editable.
- Your brand, not a form. Your colours, fonts and logo on every document, on the client's page and in the emails.
- One link, no attachments. The client reads it in a browser, picks a package, and signs on the spot.
- You know the moment it happens. Viewed, approved or declined arrives as a push notification, and revenue updates on the dashboard.
- Approved to contract in one tap. Parties, scope and agreed price are already filled in. Quotes, contracts and invoices work the same way.
- Send from your own Gmail address, export contacts, and manage everything in one pipeline.
How I built it
The mobile app is Flutter (Riverpod, go_router), and it talks to a Next.js API and web app backed by Firebase (Auth, Firestore, Cloud Functions, App Hosting). Most of the business logic lives in the API layer, so the phone, the web app and the public client pages all behave the same way.
RevenueCat runs the subscriptions. The app uses the RevenueCat SDK (purchases_flutter) for the Starter and Pro monthly plans: one offering, two packages, two entitlements. The RevenueCat customer ID is the Firebase user ID, so a RevenueCat webhook to my server maps a purchase straight to the right account and plan. Restore purchases and manage subscription are built in, and the app polls until the webhook has landed so the plan on screen is never stale.
Other pieces: FCM and APNs for push, Sign in with Apple, Resend for branded email, and a Remotion project for the store video. Over 700 automated tests run across the mobile and web code.
Challenges I ran into
- Deleting an account is harder than it sounds. Firestore doesn't cascade deletes, so removing a user leaves documents, contacts and even an OAuth token behind. Apple also requires deletion to start inside the app. I built in-app deletion that removes every owned document and subcollection, then sends a farewell email.
- One notification, two writers. Trial users got the same notification twice because both a Cloud Function and an API route wrote it. The fix was to make one place the owner.
- A cache that refreshed nothing. After a plan change the UI stayed on Free, because evicting the cache is not the same as making the provider refetch.
- Push that only looks healthy. iOS hands out a device token even if the user tapped Don't Allow, so a registered token proves nothing. I record the actual permission answer and set up the APNs key properly.
- One blue. The brand had drifted into several blues, one with a violet cast. I unified everything to the logo blue and built a contrast ramp so text stays readable at every size.
- The App Store. An early build was rejected for missing terms and privacy links on the paywall. Fixing it taught me to verify what the store shows instead of assuming.
- Sign in with Apple sends your name exactly once, ever. If you miss it on the first sign-in, it is gone, so the capture has to be right the first time.
Accomplishments that I'm proud of
A real end-to-end loop: an AI-drafted proposal, opened and signed by a real client on their phone, arrives as a notification, and the approval turns into a contract in one tap. It launched on Google Play on August 29 and is now live on the App Store too, with RevenueCat subscriptions behind it, and I tested it on physical iPhones rather than just the simulator.
What I learned
Payments and store rules shape the product as much as the code does. I also learned to treat "it looks healthy" with suspicion: a green status can hide a total failure, and the only proof is watching the real thing work on a real device.
What's next
Account linking across Apple, Google and password sign-in, Outlook and iCloud Mail sending, and CRM sync.
Built With
- cloud-functions
- dart
- firebase
- firebase-auth
- firebase-cloud-messaging
- flutter
- gmail-api
- next.js
- react
- react-native
- remotion
- revenuecat
- sign-in-with-apple
- tailwindcss
- typescript
Log in or sign up for Devpost to join the conversation.