A shared Google Sheet can handle a small travel group's payment reminders when each person's obligation has its own row. Keep the bill in one tab, the individual shares in another, then use due dates and status values to decide who needs a message.

That separation matters. For a $120 group dinner, the bill appears once while four $30 obligations can be filtered, marked paid, or adjusted separately. This setup fits flights, rentals, lodging, gas, meals, deposits, cancellations, and post-trip reimbursements.

Build the tracker around two tabs

Start with two tabs named Expenses and Shares. One row in Expenses is one bill; one row in Shares is one person's obligation. That small distinction prevents the total from being counted four times.

Tab Recommended columns
Expenses Expense ID, Date, Description, Category, Payer, Total amount, Split type, Receipt link, Expense status, Notes
Shares Expense ID, Person, Email, Share units, Total units, Amount owed, Due date, Status, Reminded on, Paid on, Description, Payer, Notes

Give every expense a stable ID, such as TRIP-001, and reuse that ID in the related Shares rows. Leave Email blank if you'll send reminders manually; email addresses will be visible to people who can view that tab.

Use dropdowns for Category, Split type, Expense status, and Status. Useful values include Equal, Nights, Usage, Fixed, Reimbursement, Active, Canceled, Refunded, Pending, Paid, and Waived.

Keep Date, Due date, and Paid on as real date-formatted cells, not text such as "next Friday." Freeze the header row, especially if people will check the sheet on a phone.

Give the organizer Editor access. Viewers or Commenters are safer for everyone else, and specific email sharing is preferable when the sheet contains receipts or contact details. Don't store bank logins, card numbers, or payment credentials in the file.

Set the split rule before sending reminders

The reminder is only as fair as the amount behind it. Equal sharing is straightforward for a common dinner: four people can use 1 share unit each and 4 total units, turning $120 into $30 per person.

Use nights-stayed units for a rental, or agreed usage units for gas. If one person has 3 of 8 total units, the amount formula assigns 3/8 of that expense. For fixed shares, enter the intended dollar amounts as units and make Total units equal to their sum when those amounts cover the full expense.

Flights often deserve separate expenses because fares, baggage, or seat choices may belong to one traveler. A deposit can be shared now and settled later, so record its due date instead of burying the deadline in Notes.

Travel plans move. A flight changes, someone drops a rental car, the dinner gets split differently, and the sheet can suddenly contain three versions of the same story. Keep the original expense row, mark a cancellation or refund clearly, and record how the affected shares were settled rather than deleting history.

Turns out, most awkward reminders trace back to an unspoken split rule. Put the rule in Split type, Notes, or a separate Rules tab before anyone books.

Add formulas for amounts, balances, and alerts

The formulas below assume headers are in row 1 and the columns above are unchanged. Copy them down as new rows arrive.

In Shares!F2, calculate each person's amount from the expense total and their units:

=IF(A2="","",IFERROR(VLOOKUP(A2,Expenses!A:F,6,FALSE)*D2/E2,""))

Pull the expense description into Shares!K2:

=IF(A2="","",IFNA(VLOOKUP(A2,Expenses!A:J,3,FALSE),""))

Pull the payer into Shares!L2:

=IF(A2="","",IFNA(VLOOKUP(A2,Expenses!A:J,5,FALSE),""))

These lookups depend on unique Expense IDs. If an ID is misspelled, the amount and description can stay blank, so check the ID before chasing a formula error.

On a Summary tab, put each person's name in column A, starting at A2. Label columns B through D Assigned, Paid, and Open, then use:

=SUMIF(Shares!B:B,A2,Shares!F:F)
=SUMIFS(Shares!F:F,Shares!B:B,A2,Shares!H:H,"Paid")
=SUMIFS(Shares!F:F,Shares!B:B,A2,Shares!H:H,"Pending")

To show active trip costs, use:

=SUMIFS(Expenses!F:F,Expenses!I:I,"Active")

To see what a person paid upfront, add a Fronted column:

=SUMIFS(Expenses!F:F,Expenses!E:E,A2,Expenses!I:I,"Active")

Assigned, Paid, Open, and Fronted answer different questions. Don't subtract them automatically when several people paid different bills; use the payer column and the group's agreed settlement method to work out the final transfers.

For category totals, place this in an open area of Summary:

=QUERY(Expenses!A2:F,"select D, sum(F) where D is not null group by D label sum(F) 'Total'",0)

To create a review list of unpaid shares:

=IFNA(FILTER(Shares!A2:M,Shares!H2:H="Pending"),"No pending shares")

Conditional formatting makes the due dates easier to scan. Select Shares!A2:M, choose a custom formula, and use this rule for overdue rows:

=AND($G2<>"",$G2<TODAY(),$H2="Pending")

Use a second rule for pending shares due within seven days:

=AND($G2<>"",$G2>=TODAY(),$G2<=TODAY()+7,$H2="Pending")

Test the setup with one $120 dinner in Expenses and four Shares rows. Give every person 1 share unit and 4 total units. Each amount should show $30. Mark one row Paid; the open total should fall by $30.

Run a simple reminder schedule

A cadence keeps the sheet from becoming a forgotten ledger.

  1. Record the expense promptly. Add the bill, receipt link, payer, split rule, and each person's share. During the trip, log meals, gas, and other costs as they happen.
  2. Review pending rows weekly during planning. Filter Status to Pending and check deadlines coming up in the next week.
  3. Send a pre-due message 2-7 days before payment is due. Keep it specific and give the person a way to ask about the amount.
  4. Check again on the due date. If the row is still pending, send a short factual note rather than a group-chat callout.
  5. Follow up 3-5 days after the due date. Once payment is confirmed, set Status to Paid and enter Paid on.

For final trip reimbursements, choose a date the group accepts. A 7-14 day window after returning can be a workable example, but it isn't a universal rule.

A pre-due message can stay plain:

Hi [Name] - your share of [Description] is $[Amount owed], due [Due date]. Please reply after paying so I can update the shared record. Here's the sheet: [Sheet link]. Thanks.

A post-due message should state facts, not guilt:

Hi [Name] - checking on [Description]. The $[Amount owed] share was due [Due date] and still shows Pending. If you've paid, send the payment date and I'll update the sheet. If the date or amount needs changing, let me know.

Send person-specific messages. Don't publish a list of late payers in a group chat.

Optionally automate email reminders

Manual messages are usually enough for a single trip. For repeated checks, Apps Script can read the Shares tab and send email, but it can't confirm that a payment settled or replace the Status update.

The official Google Apps Script MailApp reference documents the email service used below. This sample checks for reminders seven days before the due date, on the due date, and three days afterward.

function sendTravelReminders() {
  const sheet = SpreadsheetApp.getActive().getSheetByName('Shares');
  if (!sheet) throw new Error('Missing Shares sheet');

  const values = sheet.getDataRange().getValues();
  const timeZone = SpreadsheetApp.getActive().getSpreadsheetTimeZone();
  const today = sheetDay_(new Date(), timeZone);
  const sendOn = new Set([7, 0, -3]);

  for (let row = 1; row < values.length; row++) {
    const person = values[row][1];
    const email = values[row][2];
    const amount = values[row][5];
    const dueDate = values[row][6];
    const status = values[row][7];
    const remindedOn = values[row][8];
    const description = values[row][10] || values[row][0];

    if (!email || !dueDate || status !== 'Pending' || amount === '') continue;

    const due = sheetDay_(dueDate, timeZone);
    const daysUntilDue = (due - today) / 86400000;
    if (!sendOn.has(daysUntilDue)) continue;

    if (remindedOn) {
      const alreadySent =
        sheetDay_(remindedOn, timeZone).getTime() === today.getTime();
      if (alreadySent) continue;
    }

    const dueText = Utilities.formatDate(due, timeZone, 'MMM d, yyyy');
    const subject = `Travel payment reminder: ${description}`;
    const body = `Hi ${person},

Your share of ${description} is $${Number(amount).toFixed(2)} and is due ${dueText}.

Please reply after paying so the shared record can be updated.
Thanks`;

    MailApp.sendEmail({ to: email, subject, body });
    sheet.getRange(row + 1, 9).setValue(new Date());
  }
}

function sheetDay_(value, timeZone) {
  const parts = Utilities.formatDate(new Date(value), timeZone, 'yyyy-MM-dd')
    .split('-')
    .map(Number);

  return new Date(Date.UTC(parts[0], parts[1] - 1, parts[2]));
}

Paste the script under Extensions > Apps Script, save it, and run it once to grant permission. Then create a time-driven trigger for sendTravelReminders and test it with your own email address first.

The helper normalizes both the sheet date and today's date before comparing them. Use actual date cells; text dates can behave differently. To be honest, a manual calendar reminder is still useful if the script does not run or someone pays another way.

Know when a spreadsheet is enough

A sheet fits a one-off trip, a group that agrees on its rules, and people who want a visible record of receipts, shares, and deadlines. It also handles unusual splits without forcing every cost into the same pattern.

A dedicated app may fit better when you need a purpose-built interface, recurring notifications, or an integrated request and payment flow. Check separately for split rules, receipt handling, exports, access settings, and recordkeeping. Those functions aren't interchangeable.

Thing is, switching tools won't fix an unclear agreement. Before sharing the sheet, check that the organizer is the only Editor, each Share ID matches an expense, every due date is a real date, and canceled costs have a status. After the first reminder, review Reminded on so you don't send duplicate follow-ups.

Questions that come up

What if one person paid the full bill?

Keep that person in Payer on the Expenses tab. Add Shares rows for the people who owe reimbursement, and don't count the payer's own contribution as an amount owed unless the group agreed to do so.

Can I use one tab instead?

You can, but the two-tab structure keeps the original bill separate from individual obligations. That makes category totals, refunds, due dates, and person-by-person reminders easier to check.

What if the split is not equal?

Use Share units and Total units for nights stayed, usage, or fixed amounts. Write the rule in Split type or `Notes so everyone sees why the amounts differ.

Do I need automated email?

No. Manual messages plus a recurring calendar review are enough for many small trips. Automation is useful when the sheet has many pending rows, but you should still update statuses yourself.

Create the two tabs, enter the $120 dinner test, and send one reminder to yourself before adding the rest of the group.