A cleaning checklist that records what was done

Updated 2026-10-30

A cleaning schedule on a wall tells me what should happen. It does not tell me what did. I want a record from the person who was there: which areas are done, what is running low, what is broken. A form on the cleaner's phone gives me that after every visit.

Who and where

Name, site, date and shift. Without these, the rest of the log means nothing. I can also see which crew was on site when something went wrong.

What got cleaned

A tick list of areas, plus a box for anything skipped and why. The tick list is quick to fill in and quick to scan. A cleaning schedule form like this one proves the work, it does not plan it.

What needs attention

Low supplies, damage, minutes spent and a rating of how the site looked. These are the items I act on before the next visit.

Who fills it and who reads it

Cleaners fill it in at the end of the shift. A supervisor reads the CSV. A cleaner's own AI can do the typing: "Which site did you clean?" Then "Which areas are done?" Then "Is anything running low?" It shows the answers and sends them only after a yes. See agent-fillable forms.

One tip

Once a week, filter the CSV for rows with something in the low supplies column, and place one restock order. Kitchens need more detail, so use a kitchen cleaning checklist there. Broken things go into a work order request. See also IT and operations forms and forms for home services and trades.

Questions

Does this replace my cleaning schedule?

No. The schedule says what should happen. This form records what did happen, visit by visit, so you can compare the two in the CSV.

Can I use one form for many sites?

Yes. The site field is free text, so one link serves every site. Sort the CSV by `site_name` to read the history of each place.

How do cleaners add photos?

The form cannot take uploads. A cleaner can paste a link to a photo stored elsewhere into the optional link field.

Try the form

Live demo ยท nothing is saved

Cleaning log

Fill this in when you finish at a site. It takes a minute and tells us what to restock or fix.

Which shift was it?
Areas you cleaned (required)
Supplies running low
How clean was the site when you left?

1 is poor, 5 is spotless.

I walked through the site after cleaning (required)

Or paste the JSON

Give this to your AI. It needs the AI Form API MCP server or an API key. It makes the form and sends you the link.

text
Create this form with the AI Form API create_form tool (or POST https://aiformapi.com/v1/forms with my API key). Then reply with the public_url.

{
  "title": "Cleaning log",
  "description": "Fill this in when you finish at a site. It takes a minute and tells us what to restock or fix.",
  "fields": [
    {
      "id": "cleaner_name",
      "label": "Your name",
      "type": "short_text",
      "required": true,
      "max_length": 150
    },
    {
      "id": "site_name",
      "label": "Site or room cleaned",
      "type": "short_text",
      "required": true,
      "max_length": 150
    },
    {
      "id": "cleaning_date",
      "label": "Date",
      "type": "date",
      "required": true
    },
    {
      "id": "shift_time",
      "label": "Which shift was it?",
      "type": "single_choice",
      "options": [
        "Morning",
        "Afternoon",
        "Evening",
        "Overnight"
      ]
    },
    {
      "id": "areas_cleaned",
      "label": "Areas you cleaned",
      "type": "multi_choice",
      "required": true,
      "options": [
        "Floors vacuumed or mopped",
        "Bathrooms",
        "Kitchen or break room",
        "Desks and surfaces wiped",
        "Bins emptied",
        "Windows and glass",
        "Entrance and reception",
        "Door handles and switches"
      ]
    },
    {
      "id": "areas_skipped",
      "label": "Areas you could not clean, and why",
      "type": "long_text",
      "max_length": 500
    },
    {
      "id": "supplies_low",
      "label": "Supplies running low",
      "type": "multi_choice",
      "options": [
        "Hand soap",
        "Paper towels",
        "Toilet paper",
        "Bin liners",
        "All-purpose spray",
        "Mop heads",
        "Gloves"
      ]
    },
    {
      "id": "minutes_on_site",
      "label": "Minutes you spent on site",
      "type": "number",
      "min": 0,
      "max": 720
    },
    {
      "id": "site_condition",
      "label": "How clean was the site when you left?",
      "type": "rating",
      "help": "1 is poor, 5 is spotless.",
      "min": 1,
      "max": 5
    },
    {
      "id": "damage_or_spills",
      "label": "Damage, spills or anything unusual",
      "type": "long_text",
      "max_length": 800
    },
    {
      "id": "photo_link",
      "label": "Link to a photo, if you took one",
      "type": "url"
    },
    {
      "id": "walked_through",
      "label": "I walked through the site after cleaning",
      "type": "checkbox",
      "required": true
    }
  ]
}

Or call the API

bash
curl -X POST https://aiformapi.com/v1/forms \
  -H "Authorization: Bearer $AIFORMAPI_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"Cleaning log","description":"Fill this in when you finish at a site. It takes a minute and tells us what to restock or fix.","fields":[{"id":"cleaner_name","label":"Your name","type":"short_text","required":true,"max_length":150},{"id":"site_name","label":"Site or room cleaned","type":"short_text","required":true,"max_length":150},{"id":"cleaning_date","label":"Date","type":"date","required":true},{"id":"shift_time","label":"Which shift was it?","type":"single_choice","options":["Morning","Afternoon","Evening","Overnight"]},{"id":"areas_cleaned","label":"Areas you cleaned","type":"multi_choice","required":true,"options":["Floors vacuumed or mopped","Bathrooms","Kitchen or break room","Desks and surfaces wiped","Bins emptied","Windows and glass","Entrance and reception","Door handles and switches"]},{"id":"areas_skipped","label":"Areas you could not clean, and why","type":"long_text","max_length":500},{"id":"supplies_low","label":"Supplies running low","type":"multi_choice","options":["Hand soap","Paper towels","Toilet paper","Bin liners","All-purpose spray","Mop heads","Gloves"]},{"id":"minutes_on_site","label":"Minutes you spent on site","type":"number","min":0,"max":720},{"id":"site_condition","label":"How clean was the site when you left?","type":"rating","help":"1 is poor, 5 is spotless.","min":1,"max":5},{"id":"damage_or_spills","label":"Damage, spills or anything unusual","type":"long_text","max_length":800},{"id":"photo_link","label":"Link to a photo, if you took one","type":"url"},{"id":"walked_through","label":"I walked through the site after cleaning","type":"checkbox","required":true}]}'

JSON definition

json
{
  "title": "Cleaning log",
  "description": "Fill this in when you finish at a site. It takes a minute and tells us what to restock or fix.",
  "fields": [
    {
      "id": "cleaner_name",
      "label": "Your name",
      "type": "short_text",
      "required": true,
      "max_length": 150
    },
    {
      "id": "site_name",
      "label": "Site or room cleaned",
      "type": "short_text",
      "required": true,
      "max_length": 150
    },
    {
      "id": "cleaning_date",
      "label": "Date",
      "type": "date",
      "required": true
    },
    {
      "id": "shift_time",
      "label": "Which shift was it?",
      "type": "single_choice",
      "options": [
        "Morning",
        "Afternoon",
        "Evening",
        "Overnight"
      ]
    },
    {
      "id": "areas_cleaned",
      "label": "Areas you cleaned",
      "type": "multi_choice",
      "required": true,
      "options": [
        "Floors vacuumed or mopped",
        "Bathrooms",
        "Kitchen or break room",
        "Desks and surfaces wiped",
        "Bins emptied",
        "Windows and glass",
        "Entrance and reception",
        "Door handles and switches"
      ]
    },
    {
      "id": "areas_skipped",
      "label": "Areas you could not clean, and why",
      "type": "long_text",
      "max_length": 500
    },
    {
      "id": "supplies_low",
      "label": "Supplies running low",
      "type": "multi_choice",
      "options": [
        "Hand soap",
        "Paper towels",
        "Toilet paper",
        "Bin liners",
        "All-purpose spray",
        "Mop heads",
        "Gloves"
      ]
    },
    {
      "id": "minutes_on_site",
      "label": "Minutes you spent on site",
      "type": "number",
      "min": 0,
      "max": 720
    },
    {
      "id": "site_condition",
      "label": "How clean was the site when you left?",
      "type": "rating",
      "help": "1 is poor, 5 is spotless.",
      "min": 1,
      "max": 5
    },
    {
      "id": "damage_or_spills",
      "label": "Damage, spills or anything unusual",
      "type": "long_text",
      "max_length": 800
    },
    {
      "id": "photo_link",
      "label": "Link to a photo, if you took one",
      "type": "url"
    },
    {
      "id": "walked_through",
      "label": "I walked through the site after cleaning",
      "type": "checkbox",
      "required": true
    }
  ]
}