Artificial Grass Masters: a field estimator and job sign-off app
A Flutter app for an artificial-turf installer. A rep measures a yard on a map, prices the grass, delivery and dumpster on the spot, and closes the job with photos, a customer signature and a rating. The company gets a text message when a new rating comes in.
Our role: Client project, co-built with a contractor. Simon Dziak made 11 of the 36 commits in the app repository; the contractor made the other 25 and all six commits in the backend repository.
What Artificial Grass Masters Needed to Solve
A turf quote starts with an area, and the area usually comes from a tape measure or a guess. The company wanted its reps to measure from the map on a phone, show the customer what each product costs and what it saves in water and upkeep, and then collect the customer's sign-off and feedback in the same app, so the office learns about it quickly.
How We Built It
The app uses Google Maps. The rep drops three or more markers to form a polygon, and the app computes the area and perimeter, and can split the shape into horizontal or vertical blocks. The area feeds a cost table for the chosen product. After the job, a feedback form collects ratings, photos and a drawn signature, uploads them to Firebase Storage and Firestore and appends a row to a Google Sheet. A Cloud Function then texts the company.
What the Product Does
Map measurement
Place markers on Google Maps to outline a yard, then read area and perimeter. Split the polygon into blocks when a yard is irregular.
Cost estimate
The area is multiplied by the price of the selected product, then delivery and dumpster costs are added to give a total. The product list has 12 grass products.
Product pages and carousels
Detail pages for each product and five carousel views on grass information, maintenance cost, returns, water savings and yearly savings.
Our Work gallery
Photos of finished jobs with a detail page for each, plus an About Us page and a one-tap call button.
Job sign-off
A form with the customer's name, phone and address, five ratings (project manager, installer, project, communication and company), a satisfied flag, favorite and problem photos, and a drawn signature.
Review prompt
The app includes a store-review prompt.
Google Sheet export
Each submitted form is also posted to a Google Apps Script web app that adds a row to a sheet the office can read.
The Stack, Layer by Layer
- Client app
- Flutter and Dart with Provider for state. Nine page views and five carousel views.
- Maps and math
- google_maps_flutter, geolocator and geocoding, with a maps_toolkit and custom geometry code for area, perimeter and splitting a polygon.
- Firebase
- Cloud Firestore for feedback data, Firebase Storage for photos and signatures.
- Sheet export
- An HTTP post to a Google Apps Script web URL, which follows the script's redirect and reads a status back.
- Backend
- A separate Firebase repository with one Cloud Function. It triggers when a new rating document is created and sends an SMS through Twilio to the company's phone numbers, with a time-of-day greeting.
Verifiable Facts
Counted from the private source repositories on October 13, 2026. This page makes no claims about store releases, quotes produced or revenue.
What We Learned Shipping It
Degrees are not equal distances
Rotating or splitting a polygon in latitude and longitude needs a correction for latitude, because a degree of longitude gets shorter away from the equator. The geometry code in math_utils.dart applies a cosine-of-latitude term for this. The correction was tuned in the first week of January.
Send the sign-off to where the office already looks
The Google Sheet export was added because the office lived in spreadsheets. Photos and signatures go to Firebase Storage, and the sheet gets a row.
Next step: make alert recipients editable
Recipients are set in the Cloud Function today, which was quick to ship and means a redeploy to change. A Firestore recipients document would let the office update them itself.
Share a codebase with a contractor on purpose
Two developers worked in the same app repository for about three weeks. The December work came in through two pull requests from a feature branch, and the history is easier to read for it.
Planning Something Similar?
We build Flutter and Firebase apps for startups and small businesses. Get a ballpark with our app cost calculator, see Flutter development, or tell us about your project.
More Case Studies
Workspace369: a Flutter and Firebase SaaS for client work
An all-in-one workspace for freelancers and small service businesses: CRM, proposals, invoicing and payments, scheduling, a shared email/SMS/voice inbox, accounting and AI, in one Flutter app on iOS and the web.
3693: a private music app in Flutter and Firebase
A private music app built with Flutter: search, a now-playing screen with lyrics, a queue, playlists, liked songs, a cloud library, listening stats and light and dark themes, on a typed Firebase backend.
Deep Dream: a Flutter app and a PyTorch queue behind it
A Flutter app sends a photo to a Python API. A Redis queue hands the job to a PyTorch worker that runs DeepDream on a convolutional neural network, and the dreamed image comes back to save to the gallery.
DG Card: scan a trading card and match it on the device
A Flutter app for trading card players. Point the camera at a card, on-device text recognition reads it, and the app matches it against a synced card database. From there you track a collection, build decks and trade with other players.
Bull Horn GPS Alarm: one-tap SMS commands for an alarm
A Flutter app that works as a remote control for GPS vehicle and asset alarms. Each alarm is saved once with its phone number and password, and every command after that is one tap.
saas-mcp-connector: a safe MCP server for a SaaS API
An MCP server that lets Claude Desktop, Claude Code and other MCP clients use a SaaS product's API safely. Every call is scoped to one user's workspace, writes need explicit confirmation, and the HTTP transport is rate limited.