Build a pet management app where each user can register multiple pets with profiles including species, breed, birth date, and weight. Each pet has a medical_records subcollection for vaccinations, checkups, and medications displayed as a timeline ListView. A reminders subcollection tracks feeding, medication, vet visits, and grooming with recurring schedules. A Cloud Function checks due reminders daily and sends push notifications. Multi-pet support uses a TabBar or horizontal scroll to switch between pets.
Building a Pet Care Management App in FlutterFlow
This tutorial creates a comprehensive pet care app for pet owners to track their animals' health, schedule reminders, and maintain medical records. Each pet has a profile with calculated age, a weight history chart, and a medical timeline. Reminders ensure owners never miss feeding times, medications, or vet appointments. The app supports multiple pets per user. This pattern is useful for pet care businesses, veterinary clinics, and individual pet owners.
Prerequisites
- A FlutterFlow project with Firestore and Firebase Cloud Messaging configured
- Basic understanding of subcollections and Backend Queries in FlutterFlow
- A Firebase project with Cloud Functions enabled (Blaze plan) for notifications
- Familiarity with TabBar and ListView in FlutterFlow
Step-by-step guide
Create the Firestore data model for pets, medical records, and reminders
Create the Firestore data model for pets, medical records, and reminders
Create a pets collection with fields: userId (String), name (String), species (String: dog, cat, bird, other), breed (String), birthDate (Timestamp), weight (double), photoUrl (String). Under each pet, create a medical_records subcollection with fields: type (String: vaccination, checkup, surgery, medication), title (String), date (Timestamp), vetName (String), notes (String), documentUrl (String, for PDF or image attachments). Create a reminders subcollection with fields: title (String), type (String: feeding, medication, vet_visit, grooming), recurringSchedule (String: daily, weekly, monthly), nextDueDate (Timestamp), isActive (bool). Add 2-3 sample pets with varied records.
Expected result: Firestore has pets with medical_records and reminders subcollections ready for the app.
Build the multi-pet selector and pet profile page
Build the multi-pet selector and pet profile page
Create a PetsPage. Query the pets collection filtered by userId equals current user. Display pets in a horizontal ScrollView or TabBar at the top, each tab showing the pet photo and name. Below, show the selected pet's profile: CircleImage for the photo with a camera overlay icon for updating via FlutterFlowUploadButton, the pet name, species and breed Text, calculated age using a Custom Function that returns 'X years Y months' from birthDate (handling pets under 1 year as 'X months'), and current weight. Add an Edit button that toggles between display Text and editable TextFields for name, breed, and weight. Include an Add Pet button in the TabBar that opens a form for registering a new pet.
Expected result: Users can switch between pets via tabs and view or edit each pet's profile with calculated age.
Display medical records as a timeline ListView
Display medical records as a timeline ListView
Below the pet profile, add a Medical Records section. Query the medical_records subcollection for the selected pet, ordered by date descending. Display records in a ListView styled as a timeline: each item shows a vertical line on the left with a colored dot (green for vaccination, blue for checkup, red for surgery, orange for medication), the date, title, vet name, and a truncated notes preview. Tap a record to expand or navigate to a detail view showing full notes and an attached document (Image or PDF viewer). Add a floating action button to create a new medical record with fields for type DropDown, title, date DateTimePicker, vet name, notes, and a FlutterFlowUploadButton for document attachments.
Expected result: Medical records display as a color-coded timeline with expandable details and document attachments.
Build the reminders system with recurring schedules
Build the reminders system with recurring schedules
Add a Reminders tab or section on the pet profile page. Query the reminders subcollection where isActive equals true, ordered by nextDueDate ascending. Display each reminder in a Card showing the title, type icon (food bowl for feeding, pill for medication, stethoscope for vet_visit, scissors for grooming), next due date, and recurring schedule label. Color the card amber if the due date is today, red if overdue. Add a Switch to toggle isActive. To create a new reminder, open a form with title TextField, type DropDown, recurringSchedule DropDown (daily, weekly, monthly), and starting date DateTimePicker.
Expected result: Active reminders display sorted by due date with visual indicators for overdue and due-today items.
Set up Cloud Function push notifications for due reminders
Set up Cloud Function push notifications for due reminders
Create a scheduled Cloud Function that runs daily at 8 AM. The function queries all reminders where nextDueDate is today or earlier and isActive is true. For each due reminder, it looks up the pet name and owner's FCM token, sends a push notification with the message 'Time for [pet name]'s [reminder title]', and then updates nextDueDate based on the recurringSchedule: for daily add 1 day, for weekly add 7 days, for monthly add 1 month. In FlutterFlow, ensure push notifications are enabled in Settings and the user's FCM token is stored on their user document.
1// Cloud Function: checkPetReminders (scheduled daily)2const functions = require('firebase-functions');3const admin = require('firebase-admin');4admin.initializeApp();56exports.checkPetReminders = functions.pubsub7 .schedule('0 8 * * *')8 .onRun(async () => {9 const now = admin.firestore.Timestamp.now();10 const petsSnap = await admin.firestore().collection('pets').get();1112 for (const petDoc of petsSnap.docs) {13 const reminders = await petDoc.ref14 .collection('reminders')15 .where('isActive', '==', true)16 .where('nextDueDate', '<=', now)17 .get();1819 for (const rem of reminders.docs) {20 const pet = petDoc.data();21 const userDoc = await admin.firestore()22 .collection('users').doc(pet.userId).get();23 const fcmToken = userDoc.data().fcmToken;2425 if (fcmToken) {26 await admin.messaging().send({27 token: fcmToken,28 notification: {29 title: `${pet.name} Reminder`,30 body: `Time for ${pet.name}'s ${rem.data().title}`,31 },32 });33 }3435 // Update nextDueDate based on schedule36 const schedule = rem.data().recurringSchedule;37 const next = rem.data().nextDueDate.toDate();38 if (schedule === 'daily') next.setDate(next.getDate() + 1);39 else if (schedule === 'weekly') next.setDate(next.getDate() + 7);40 else if (schedule === 'monthly') next.setMonth(next.getMonth() + 1);41 await rem.ref.update({ nextDueDate: admin.firestore.Timestamp.fromDate(next) });42 }43 }44 });Expected result: Pet owners receive daily push notifications for due reminders, and next due dates auto-advance.
Complete working example
1FIRESTORE DATA MODEL:2 pets/{petId}3 userId: String4 name: String5 species: String (dog / cat / bird / other)6 breed: String7 birthDate: Timestamp8 weight: double9 photoUrl: String10 └── medical_records/{recordId}11 type: String (vaccination / checkup / surgery / medication)12 title: String13 date: Timestamp14 vetName: String15 notes: String16 documentUrl: String17 └── reminders/{reminderId}18 title: String19 type: String (feeding / medication / vet_visit / grooming)20 recurringSchedule: String (daily / weekly / monthly)21 nextDueDate: Timestamp22 isActive: bool2324PAGE: PetsPage25 Backend Query: pets where userId == currentUser26 Page State: selectedPetIndex (int)2728 WIDGET TREE:29 Column30 ├── TabBar / Horizontal ScrollView (pet selector)31 │ └── Per pet: CircleImage (photo) + Text (name)32 ├── Pet Profile Card33 │ ├── CircleImage (photo, tap → upload new)34 │ ├── Text (name, species, breed)35 │ ├── Text (age: Custom Function from birthDate)36 │ └── Text (weight: "12.5 kg")37 ├── Section: Medical Records38 │ ├── Text ("Medical History")39 │ └── ListView (medical_records, orderBy date desc)40 │ └── Timeline item:41 │ Row42 │ ├── Column (vertical line + colored dot)43 │ └── Column (date, title, vet, notes preview)44 ├── Section: Reminders45 │ ├── Text ("Reminders")46 │ └── ListView (reminders, where isActive, orderBy nextDueDate)47 │ └── Card (type icon + title + due date + schedule)48 │ Amber if due today, Red if overdue49 └── FAB (+) → Add Record / Add Reminder bottom sheet5051CUSTOM FUNCTION: calculatePetAge(birthDate)52 diff = now - birthDate53 years = diff.inDays ~/ 36554 months = (diff.inDays % 365) ~/ 3055 if years == 0: return "$months months"56 return "$years years $months months"Common mistakes when building a Pet Care App with Reminders and Records in FlutterFlow
Why it's a problem: Calculating pet age as a simple year difference from birthDate
How to avoid: Use a Custom Function that returns 'X years Y months' for older pets and 'X months' for pets under one year.
Why it's a problem: Storing all medical records as fields on the pet document instead of a subcollection
How to avoid: Use a medical_records subcollection under each pet document for scalable, queryable storage.
Why it's a problem: Not updating nextDueDate after sending a reminder notification
How to avoid: After sending the notification, always update nextDueDate by adding the appropriate interval based on recurringSchedule.
Best practices
- Use subcollections for medical records and reminders to keep pet documents lightweight
- Calculate pet age with a Custom Function that handles both months and years
- Color-code medical record types in the timeline for quick visual scanning
- Sort reminders by nextDueDate ascending so the most urgent items appear first
- Store medical document attachments in Firebase Storage with download URLs in Firestore
- Run reminder checks via a scheduled Cloud Function rather than client-side timers
- Support multiple pets per user with a clear tab-based or scroll-based selector
Still stuck?
Copy one of these prompts to get a personalized, step-by-step explanation.
I want to build a pet care management app in FlutterFlow with multi-pet support, pet profiles with calculated age, a medical records timeline using Firestore subcollections, and recurring reminders with push notifications via Cloud Functions. Give me the data model, widget tree, age calculation function, and notification Cloud Function.
Create a pet profile page with a horizontal pet selector at the top showing pet photos and names, a profile card below with photo, name, species, breed, age, and weight, a medical records timeline section with colored dots and dates, and a reminders section with due date cards.
Frequently asked questions
Can I track weight history with a chart?
Yes. Add a weight_history subcollection with weight and date fields. Each time the owner updates weight, create a new entry. Display the history as a LineChart Custom Widget using the fl_chart package.
How do I handle pets with unknown birth dates?
Make birthDate optional. When it is empty, display 'Age unknown' instead of calculating. Allow the owner to enter an estimated birth year instead of an exact date.
Can I share a pet profile with a veterinarian?
Yes. Generate a read-only share link using a Cloud Function that creates a temporary access token. The vet can view the pet profile and medical records without needing an account.
How do I attach PDF documents to medical records?
Use a FlutterFlowUploadButton configured for file upload. Upload the PDF to Firebase Storage and save the download URL in the documentUrl field. Display it with a Custom Widget PDF viewer or Launch URL to open externally.
Can the app support exotic pets like reptiles or fish?
Yes. The species field is a String, so you can add any value. Consider adding species-specific reminder types like 'tank cleaning' for fish or 'heat lamp check' for reptiles as custom options.
Can RapidDev help build a veterinary practice management system?
Yes. RapidDev can build complete vet practice platforms with patient records, appointment scheduling, billing, prescription management, and multi-clinic support.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation