Making proposals on a project-based session
What each per-field proposal modal looks like, the rules it enforces, and the gotchas worth knowing — Date, Time, Duration, Price, Deposit, and Location, from the practitioner's seat.
A project-based session has six fields you negotiate one at a time: Date, Time, Duration, Price, Deposit, and Location (location is tattoo-only). The rhythm of the response loop — the dual-card view, when to drop, what each status colour means — is covered in Responding to a project-based booking request. The per-tab dot and per-session badge taxonomy is in Session statuses, explained.
This article is the per-field reference. Tap any field row on a session to open its proposal modal; each step below describes one modal — what it puts on screen, what it lets you submit, and what it blocks. You can read them in order, or jump straight to the field you're trying to change.
Propose a Date
Tap the Date row to open the calendar. The view is a single month with day cells you can scroll through.
Each cell can show several overlays at once:
- R / S / I / E badges in the top-right corner count what's already on that day from your own calendar: R = received bookings, S = sent bookings (the ones you booked with someone else), I = job interviews, E = events you're attending. The R and S badges take the same green / yellow / orange colour code used elsewhere in the booking system — green for confirmed, yellow for pending, orange for action-needed.
- Shaded background — the client's preferred dates from their scheduling preferences. Either specific dates they picked, dates inside a range they gave, or every weekday that matches their weekly pattern.
- Orange bar at the top of the cell — that day falls inside one of your confirmed guest spots.
- Faded orange day with a muted number — that day is inside one of your guest spots, but this booking is for your home studio, so the day is blocked. Tapping it opens an alert explaining which guest spot it conflicts with.
- Past days are greyed out and cannot be tapped.
Tapping a day that isn't blocked opens a confirmation panel covering everything you'd want to see before locking the date in: the client's available time ranges on that day (if they set any), the list of your other bookings and commitments on that day with their times and statuses, and any warnings — same-day session conflict, outside your guest spot period (when the booking is a guest-spot booking — this one blocks selection), date isn't in the client's preferred dates (a warning, not a block — softer wording if the client said they're flexible). The bottom of the panel has Select This Date to lock it in.
If the field is currently Confirmed, the modal asks for a Reason for Change before letting you submit — up to 200 characters. The client sees this reason on their side.
The backend hard-blocks four things: a date in the past, a date another session of this booking already holds (one session per day rule), a date outside the booking's guest spot period (when the booking is on a guest spot), and a home-studio date that overlaps one of your confirmed guest spots.
Propose a Time
Tap the Time row to open the hour-and-minute picker. Two scroll columns: hours (
00–23) on the left, minutes in 15-minute steps (00,15,30,45) on the right.The picker reads your Availability & Schedule info card for your break-between-clients setting and folds that buffer into every conflict check. The modal then walks every time slot on the chosen day and tags each one:
- Blocked (red dot, struck-through text) — the slot would overlap with a confirmed booking, a job interview, or an event. Tapping it pops an alert; you can't select it.
- Pending conflict (orange dot) — the slot would overlap with a pending booking. Tapping it warns you that the first side to confirm wins the slot, and lets you propose anyway.
- Available (no dot).
Above the picker, the modal lists every existing booking on that day so you can see what you're working around — start time, end time (with your buffer baked in), client name, and a dot showing whether it's confirmed or pending.
If the client gave time ranges for the day and your start time falls outside them, you get an "Outside Available Hours" warning before submit. You can still propose it; the warning is informational.
Confirmed times also get the Reason for Change prompt, up to 200 characters.
The backend hard-blocks a time that's already passed and a slot where two confirmed bookings already overlap — beyond two confirmed overlaps the request is rejected outright. It also blocks a time that would conflict with one of your own sent bookings (cases where you're the client on another practitioner's calendar).
Propose a Duration
Tap the Duration row to open the hours-and-minutes picker. Hours run from
0to12; minutes step in 15-minute increments.The conflict logic is the same shape as the time picker but in reverse: it tests every duration option against your other bookings using the session's current start time, and tags each option as blocked (would overlap a confirmed booking), warning (would overlap a pending booking), or available. Blocked options are struck through and pop an alert when tapped; warnings let you propose anyway.
If the client gave a time range for the day and your duration would push the session end past the end of their range, the modal warns "Session would end at X, but client is only available until Y." You can still propose it.
The end-time is recalculated from the new duration and stored alongside the session — you don't enter it directly.
Same Reason for Change rule on a confirmed duration, 200-character limit.
The backend hard-blocks a duration that would make the session end in the past.
Propose a Price
Tap the Price row to open the pricing modal. The top of the modal is a three-button Pricing Mode selector:
- Fixed — one number, the exact price. Displayed to the client as a single amount.
- Estimate — one number, flagged as approximate. Displayed with a
~prefix. - Range — two numbers, min and max. The min must be strictly less than the max.
Pick a mode, enter the value(s), optionally add a Note — a short free-text field for explaining anything that goes with the price (materials, complexity caveat, etc.). The note ships alongside the proposal and is visible on the client side.
If the request came from a converted broadcast, the client's budget range is shown at the top of the modal as a reference — it doesn't enforce anything, just helps you anchor.
Confirmed prices show the Reason for Change field (200 characters).
The same modal handles re-proposals across modes: if you proposed a range and the client rejected, you can switch to fixed and propose a single number, and the per-session price history records both rounds.
Propose a Deposit
The Deposit row stays disabled until the session has a price set — without a price, the deposit modal can't translate amounts into percentages and the field row dims out. Set a price first.
Tap the row (once unlocked) to open the deposit modal. Above the inputs sits a No deposit required toggle: flipping it on sets the deposit to zero and marks the field as "not required", which auto-confirms it the moment your proposal goes out — the client has nothing to pay.
If you leave the toggle off, two inputs render side by side, linked together: the absolute Deposit Amount in euros and the Deposit Percentage of the session price. Typing in one auto-fills the other in lockstep. The amount is capped at the session price; the percentage at 100%. Only the amount is actually stored on the session — the percentage is a calculator, not a separate field.
A running summary card underneath shows the deposit, the percentage, and what the client still owes after the deposit lands.
Submitting a deposit greater than zero sends its own Deposit Required push to the client immediately — it does not wait for Submit Proposal. Other fields you queued at the same time still go out together when you hit Submit; the deposit is the one exception to the batching rule.
Propose a Location
The Location row only appears for tattoo artists. Body-modification practitioners don't see it — guest spots are tattoo-only on InkMap today, so a body-mod booking always happens at the practitioner's studio. The row also doesn't exist for the initial location on a session: every session starts out inheriting the booking-level location the client picked when they submitted the request. The modal is a change tool, and its title literally reads Change Location.
Tap the row to open it. The top section shows the location currently set on the session. Below it, the list of locations you can propose:
- Custom Location — sits at the top, always available. Tap it to open a Google Places search; pick an address from the suggestions and that becomes the proposed location.
- Your resident studio — your home shop, when applicable.
- Your confirmed guest spots — each one tagged with its date range. Each guest spot also shows Date OK (green) or Outside period (orange) based on the session's current date.
- Current badge marks the location that's already set, so you can't accidentally propose the one you already have. Selecting it disables the submit button.
- In client's area badge highlights any of the above that fall inside the client's broadcast area (when the request came from a broadcast). Distance is computed from the location's coordinates; the badge isn't a block, it's a hint.
A Reason for Change field appears once you select something different from the current location. It's optional and free-form, no character cap.
Frequently asked questions
- I queued a date change on one session and a deposit change on another, then tapped Submit Proposal. Did the client get one notification or two?
Two. The deposit fires its own immediate push the moment you set it. The Submit Proposal batch then sends a single consolidated "new proposals" push covering every other field you changed across every session. See Step 5.
- I proposed a Fixed price, the client rejected, I want to switch to a Range. Will the history still show what I proposed originally?
Yes. Each proposal is recorded individually with whatever values it carried — the Fixed round saves the single price, the Range round saves the min and max — so switching modes mid-negotiation doesn't erase the earlier rounds. The client's rejection is also kept on the rejected round.
- The Date modal shows R and S badges with letters and numbers. What's the difference between R and S?
R counts bookings other people sent to you (received). S counts bookings you sent to other practitioners as a client. Both can land on the same day; the colour reflects whichever is the most action-needed across them.
- Why is the Duration field rejecting my pick with "session would end in the past"?
The session has a start time and a date already set, and the duration you picked would push the end past the current moment. Pick a shorter duration, or propose a new date and time first.
- I set the deposit to zero. Why doesn't the client see a "deposit pending" prompt?
Because the No deposit required toggle marks the field as
not_requiredon the session — that auto-confirms the deposit field the same way an accepted proposal would. The client has nothing to pay and the deposit-related parts of their UI stay quiet.- Can I propose a Location for a body-modification booking?
No — guest spots are tattoo-only on InkMap today, so a body-mod booking always happens at the practitioner's studio. If you need to change the location for a specific session, DM the client to coordinate.
- I want to propose a date that's a few months out but the client only listed the next two weeks as preferred. Will it be blocked?
No, only warned. The modal flags "this date isn't in the client's preferred dates" — softer if the client said they're flexible, sharper if not — but doesn't stop you from submitting. The client can still accept or reject.
- A confirmed Date is now in the past. Can I re-propose without giving a reason?
Yes. Expired Date / Time / Duration auto-reject and the Reason for Change field stops being required — the prompt only appears while the field is still
confirmed.
Related concepts
- Session statuses, explainedThe status dot, the status badge, and the lifecycle they describe — how to read where a session sits inside a project-based booking at a glance, and the one place Delete and Drop look the same but aren't.
- Deposit rules and refund eligibilityHow deposits work on InkMap — how they're set, how you pay them, and what happens to your money if a booking is cancelled.
- Booking statuses, explainedWhere a booking lives on InkMap — Pending, Confirmed, or Review — and what makes it move from one to the next.
Was this helpful?