Coresecure

Say it in Slack. File it in NetSuite.

Hourstamp turns a plain sentence typed after /time into a reviewed, native NetSuite timebill. You check every field before anything is saved, and NetSuite stays the single source of truth.

Moving off the Harvest app? Hourstamp logs time from Slack straight into NetSuite, so there is no second time tracker to sync.

1 command/time is the only way to log
1 reviewEvery entry is checked before Save
0 databasesSaved time lives only in NetSuite
5 PM ETWeekday reminder, built from last week
01 / Commands

Five surfaces, one habit.

Everything starts from /time. The first word decides what happens: status and projects read from NetSuite, anything else opens the Review form. Typing a message in the Hourstamp DM does not log time; the bot replies with how to use /time and says nothing was saved.

/time 2h today on ACME website, fixed the login bug

Log time in plain language

A loading view opens instantly, then a language model reads the sentence and the same view becomes Review time, prefilled. Nothing is saved until you press Save.

  • Prefills date, project, service item, hours, and memo
  • The memo keeps only the work note, never the matched project name
  • /time 2h today opens Review with the project left empty for you to pick
  • An unclear or ambiguous project stays empty instead of guessing
  • Projects read Company · Project and are searchable live from NetSuite
  • Hours accept 2, 2.5, 2h 15m, or 2:15
  • One sentence can hold several entries; each becomes its own timebill
  • After Save, a line in the DM shows what NetSuite actually stored
Slack · Review modal
HourstampAPP
Fri Oct 9 · Website Build · Consulting · 2:00 · fixed the login bug
/time status

The crew's week, in the channel

Posts a shared card in the channel where you ran it. One plain line per person, Name · hours, for the current Monday to Sunday week in Eastern Time.

  • Crew = anyone with NetSuite time in the last 30 days who matches a Slack user by email
  • Ordered from fewest hours to most, then by name
  • /time status @user shows one person: week total plus up to 10 projects, highest first
  • Add last week, lastweek, or prev for the previous week
  • If a mention does not match an employee, the card says so instead of showing anyone else
Slack · #team channel
/time projects

What you can log against, right now

A private card only you can see. It lists every live In Progress project straight from NetSuite, the same list the Review dropdown and Save use.

  • Header with the project count
  • Sorted A to Z by company, then project
  • Each line: NetSuite id, then Company · Project
  • No cached fallback: if NetSuite cannot be reached, the card says so
Slack · ephemeral
App Home

Your week, editable

Open the Hourstamp app in Slack to see this Monday to Sunday week, read live from NetSuite, refreshed after each save.

  • Week total, hours by day, hours by project
  • Every entry with date, hours, project, service item, and memo
  • Edit reopens the same form as Edit time; Delete asks to confirm
  • Approved entries are locked and show Approved, with no buttons
  • Memos over 300 characters are not editable here; Home points you to NetSuite
Slack · App Home
Weekday nudge · 5 PM ET

A draft, not a nag

At 5 PM Eastern on weekdays, Hourstamp DMs anyone on the crew who has nothing logged today but had time on the same weekday last week. It offers last week's entries as today's draft.

  • Skips anyone who already logged today, or had nothing on that day last week
  • Review rereads NetSuite, so time logged since the DM is not doubled
  • Opens the same Review form; billable starts unchecked
  • Saving the same reminder twice finds the first row instead of adding another
Slack · DM from Hourstamp
02 / Flow

From a sentence to a timebill.

Slack expects an answer within three seconds. A small front door answers right away; the slower work (language model, NetSuite) happens in a separate worker that fills in the form you are already looking at.

Hourstamp request flow Slack sends /time to an HTTP function that acknowledges within three seconds and opens a loading modal. It hands the job to an async worker, which calls the language model and NetSuite, then updates the modal to Review time. On Save, the worker creates a timebill through the NetSuite REST API and posts a confirmation in the DM. Separately, two weekday EventBridge schedules run the nudge function, which reads NetSuite and DMs a draft. REQUEST PATH SCHEDULED SLACK /time, Save, Home, Review You, in any channel or DM HTTP FUNCTION Acks within 3s Checks Slack signature Opens the loading modal Serves project search WORKER Parse, check, save Matches you by email Asks the language model Fills Review time NETSUITE REST API Source of truth read projects read employees read week write timebill create, edit, delete read back after save LANGUAGE MODEL Text in, structured draft out event async Review time appears in your open modal, thenin the DM project typeahead Schedules Weekdays, 2 runs Nudge function Acts only at 5 PM ET DM with Review Draft from last week reads the crew and their weeks
Request and data path Back to you, or a read
Type

/time plus a sentence. A loading view opens in under three seconds.

Review

The view becomes Review time with every field filled in. Change anything.

Save

The worker checks identity, project, and service item, then writes the timebill.

Confirm

One read back from NetSuite becomes the line in your DM. Home refreshes.

03 / Guardrails

Built to be boring in the right ways.

When something goes wrong, you see it. Hourstamp prefers a clear message over a silent retry, and it never saves a guess.

Duplicate check

Before creating, Hourstamp looks for a row with the same person, date, and submission reference. Pressing Save twice, or saving the same reminder twice, shows the existing entry instead of adding another.

Identity by email

Your Slack email (lowercased) must match an active NetSuite employee, or failing that an active vendor with Give Access. If not, you get a clear message, not a save.

I can't log time for you yet. Your Slack email doesn't match an active NetSuite employee...

Your time, unlocked only

People edit and delete only their own entries, and only before approval. Approved rows are read only. An admin may log for a named teammate; edits stay personal.

Visible failures

NetSuite errors are shown back in plain words. Every failure message says whether anything was saved.

Something went wrong. Nothing was saved.

One attempt, on purpose

Background retries are off for the worker and the reminders, and the language model call is not retried. Slack's own retries are ignored at the front door. If you close the modal early, the worker finishes quietly.

Truth from NetSuite

The line is read back from the saved record, not echoed from what you typed. Projects come live from NetSuite with no cached fallback. There is no separate database.

04 / Under the hood

Small, serverless, deployed on push.

A handful of AWS Lambda functions, no servers to patch and no database to back up. A push to the main branch deploys through GitHub Actions and SST. Hourstamp is deployed with csd, our deploy tooling.

Front doorLambda function URLReceives Slack, verifies, acks fast
WorkAsync workerLanguage model, NetSuite reads and writes
ScheduleEventBridgeTwo weekday runs cover 5 PM ET across daylight saving
RecordNetSuite RESTtimebill records, plus reads for projects, people, weeks
ShipGitHub Actions + SSTPush to main, deploy to AWS