Landscaping / Field sales

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.

The Problem

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.

The Build

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.

Features

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.

Architecture

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.
By the Numbers

Verifiable Facts

Dec 2020
First commit to the app repository (December 17)
Jan 2021
Most recent commit (January 8)
36
Commits in the app repository, 11 of them by Simon
12
Grass products in the app's catalog
5
Rating questions on the sign-off form

Counted from the private source repositories on October 13, 2026. This page makes no claims about store releases, quotes produced or revenue.

Lessons

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.

Technologies Used
Flutter•Dart•Google Maps•Firebase•Cloud Firestore•Cloud Functions•Twilio•Google Apps Script
Timeline
December 17, 2020 to January 8, 2021 (app repository commits)

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

SaaS / Business software

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.

Read Case Study →
Consumer / Music

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.

Read Case Study →
AI / Image processing

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.

Read Case Study →
Consumer / Collectibles

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.

Read Case Study →
Automotive / Security hardware

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.

Read Case Study →
AI integration / Open source

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.

Read Case Study →