Every photographer I know has lost a shot to the clock. Not to a bad lens or bad light — to a family-formals session that ran 25 minutes over, which ate the golden-hour portraits, which is the one set the couple will actually frame.
The fix is not "be faster". It is a timeline that the couple, the planner and the second shooter all hold a copy of, that sums to the hours you were paid for, and that you can re-plan in thirty seconds when the ceremony starts late. That is a spreadsheet problem, and a small one. Here is the model, the formulas, and the three mistakes I see in most DIY versions.
1. Store durations, not start times
The instinct is to type start times down a column: 09:00, 10:00, 10:30, 10:50. It looks like a timeline. It breaks the moment anything moves, because every later cell has to be retyped.
Store the duration of each block instead, and compute the start time of every row from the row above:
A6 = $B$3 ' first block starts at the day's start time
A7 = IF(OR(C7="", A6=""), "", A6 + N(B6)/1440)
B is minutes, C is the block name, 1440 is minutes per day (Excel times are fractions of a day). N() turns a blank into zero so an unfinished row does not throw #VALUE!. Fill A7 down and the whole day chains. Ceremony started 20 minutes late? Add 20 to the buffer row and every later time updates.
Two cheap extras at the top:
End time = INDEX(A:A, COUNTA(C:C)+5) + INDEX(B:B, COUNTA(C:C)+5)/1440
Total hrs = SUM(B6:B60)/60
Now the sheet tells you, before the day, that you planned 10.8 hours against a 10-hour package.
2. Put the buffer in as a block, not as optimism
The sample day below is 14 blocks for a one-location wedding with a first look. The block most people leave out is the sixth one.
| Min | Block |
|---|---|
| 60 | Getting ready — details and candids |
| 30 | Getting ready — portraits (window light) |
| 20 | First look |
| 40 | Couple portraits, round 1 |
| 30 | Wedding-party photos |
| 30 | Buffer / guest-arrival candids |
| 30 | Ceremony |
| 30 | Family formals |
| 60 | Cocktail hour candids + empty reception room |
| 20 | Couple portraits, round 2 (golden hour) |
| 90 | Dinner and speeches |
| 20 | First dance and parent dances |
| 60 | Open dance floor |
| 10 | Send-off |
That buffer is where lateness goes to die. Without it, lateness goes into family formals, and family formals are the block you cannot shorten — grandma is not coming back next week.
The golden-hour block is the other one to protect. Look up sunset for the date, put the time in the Notes column, and plan the dinner block to start after the 20 minutes, not around it. If you are told "we'll squeeze portraits in during dinner", the answer is "sunset is 17:42, we need 17:30–17:50".
3. Family formals: list them, count them, sort Must first
Family formals run over for one reason: nobody has the list. Keep it in the same workbook as a shot list with a priority column, and put the priority to work:
Done counter = COUNTIFS(A:A, booking_id, E:E, "✓") & "/" & COUNTIF(A:A, booking_id)
Conditional format, "Must" in column D → red bold
Conditional format, $E5="✓" → green fill + strike-through
Five groupings cover 90 % of weddings: couple + both sets of parents; couple + each side's immediate family; couple + grandparents; couple + wedding party. Budget 3 minutes each, so 15 minutes for the Must set and the remaining 15 for the "and my cousins from Ohio" requests. When the 30 are up, the sheet says so.
4. The two flags that save money, not shots
If the workbook also holds bookings, two formulas pay for themselves in the first month.
Deposit overdue — a job inside 14 days whose deposit is short:
= IF(N(deposit_paid) < N(deposit_due)*0.999,
IF(AND(shoot_date<>"", shoot_date-TODAY()<=14), "DEPOSIT OVERDUE", "Deposit pending"),
IF(AND(balance_paid_date="", TODAY()>balance_due_date), "BALANCE OVERDUE",
IF(balance_paid_date="", "Balance pending", "Paid in full")))
The *0.999 tolerates a bank fee shaving a dollar off the transfer. Colour anything containing "OVERDUE" red and the dashboard can simply COUNTIF(flags, "DEPOSIT OVERDUE").
Late delivery — against a deadline computed from the shoot date plus your standard turnaround:
= IF(delivered_date="", IF(TODAY()>deadline, "LATE "&TEXT(TODAY()-deadline,"0")&"d", "on track"),
IF(delivered_date>deadline, "delivered late", "on time"))
"LATE 5d" on a dashboard, before the client writes, changes the tone of the whole conversation.
5. Three mistakes in DIY versions
- Typing times instead of durations — covered above; it is the one that makes people abandon the sheet.
-
Separate files per job. A timeline and a shot list per wedding in a folder of 40 files means no dashboard, no "what is overdue", no reuse. One workbook, one
Booking IDcolumn,INDEX/MATCHto pull client and date into every tab. -
No greying-out. If the shot list holds every job, rows for other bookings must fade (
AND($A5<>"", $A5<>$B$2)→ light grey text) or the printout is unreadable on the day.
If you would rather not build this, I put the whole thing — bookings with the two flags, the 27-shot wedding list plus product/headshot/family lists, the 14-block timeline, deliverables, a month calendar, a gear checklist and a dashboard — into one Excel workbook, English, USD formatting, 2,800 formulas and no macros: Photographer Booking & Shot-List Pack 2026 (English edition), $12. The Indonesian-language original is here. Build your own from the formulas above if you prefer — the timeline chain is five minutes of work and worth every one of them.
Top comments (0)