5
STATES
3
SCENARIOS
3
PAGES
9
EMAILS
01 · How an order enters the system
ENTRY 1 · SHOPIFY (AUTO)
Customer buys on runoff.studio
Shopify sends an
orders/create webhook the moment the payment is captured. The system reads the line item title and variant to detect the tier, the paper size and the composition type. The order is created in Airtable, the OneDrive folder is generated, and the Moneybird contact is matched or created — all without any human action.▸ Shopify only sells "No background" and "Photo-based" composition types. "Reused" and "Custom" never enter via Shopify.
ENTRY 2 · FORM 4G (MANUAL)
Ruben creates the order manually
For leads that didn't come through the shop (B2B, gifts, friends, repeat customers, emails…) Ruben opens the internal page
/internal/new-order, picks one of three scenarios, fills in the form and submits. The system creates the same Airtable record + folder + contact as the Shopify flow.▸ Used for any order that didn't pay via Shopify, including B2B, personal gifts, and customers who already sent photos by email.
▼
01
Order received
SYSTEM
The order is created in the Orders table in Airtable. The system assigns the artwork number automatically (format
E26001 for Essential, S26001 for Signature, L26001 for Legacy — the digit "26" represents the year, the last three digits are sequential). A dedicated folder is created on OneDrive with five empty subfolders (customer-photo, composition, drawing, print, shipping). If the order is B2C or B2B, a Moneybird contact is matched or created. Personal-gift orders skip Moneybird entirely.
Page (Ruben · manual entry)
runoff-lp.pages.dev/internal/new-order
requires internal login · Shopify orders skip this step
AUTO · Artwork number
AUTO · Airtable record
AUTO · OneDrive folder
AUTO · Moneybird contact
PAGE · Form 4G (manual)
ENTRY 1 · SHOPIFY
Automatic from purchase
Webhook creates everything. Tier + paper size + composition type are derived from the Shopify variant title. The customer is matched in Moneybird by email.
→ 02 Awaiting client form
ENTRY 2A · MANUAL B2C
We have the lead's email, not their photo
Ruben fills 4G (customer info, tier, paper, composition…). The system sends the customer an intake link by email so they can upload their photo.
→ 02 Awaiting client form
ENTRY 2B · WITH INTAKE
Photo already received by email
Ruben fills 4G AND the intake fields (photo + brand/model + title + recipient…) in the same form. No intake email is sent. The order lands directly on 03 ready for photo review.
→ 03 Form submitted
ENTRY 2C · PERSONAL / GIFT
Internal commission or gift
Same as "With intake" but skips Moneybird (no invoice, no contact) and skips any client-facing email. Used for gifts and internal projects.
→ 03 Form submitted
▼
02
Awaiting client form
CLIENT
Applies to Shopify orders and Manual B2C only. The client receives an email with a link to the intake form (Page 4A). The form auto-detects their preferred language (NL/EN) but there is always a language switcher visible. They upload one photo of their car and fill in the details. If they don't respond, the system sends two automatic reminders.
Page (client)
runoff-lp.pages.dev/intake/[orderId]
private link sent to the client by email
EMAIL TO CLIENT · order_confirmation (with intake link)
EMAIL TO CLIENT · intake_link (manual B2C)
AUTO · Reminder 48h if no reply
AUTO · Reminder 5d if still no reply
PAGE · Form 4A
What the client receives
- One email with the order confirmation and a direct link to the intake form
- Automatic reminder at 48 hours if they haven't submitted
- Second reminder at 5 days
What you receive
- Nothing in this state — the system is waiting on the client
- You can monitor pending intakes by filtering Airtable by State =
02 Awaiting client form
▼
03
Form submitted — photo review
RUBEN
The client has submitted their photo. The photo lands on OneDrive in the order's
customer-photo folder. You receive an email at ruben@runoff.studio with a link to the internal photo review page. There you see the customer photo full size, all the intake details (brand/model, title, subtitle, recipient, notes) and two buttons: Confirm photo or Reject.
Page (Ruben)
runoff-lp.pages.dev/internal/photo-review/[orderId]
requires internal login · link sent in the team email
EMAIL TO TEAM · internal_intake_received
EMAIL TO CLIENT · intake_received_confirmation
PAGE · /internal/photo-review/[order]
DECISION · Confirm or Reject
What you receive
- Email to ruben@runoff.studio: "Intake received for E26XXX — review photo" with a direct link to the review page
- The link opens the internal photo review page (requires internal login)
- You see: customer photo (clickable for full-size), all intake fields, button to open the OneDrive folder, Confirm/Reject buttons
What the client receives
- Email "Got it — we have everything for E26XXX" confirming their submission
- No further client communication until you make a decision
▼
04
Photo rejected — AI drafts reply
AI · RUBEN · CLIENT
If you click Reject, a popup opens inside the same photo review page. You write what should change (in plain language) and the AI drafts a rejection email in the client's language with the right tone. You can edit it manually, ask the AI to regenerate with a comment, save it as a draft in Outlook, or send it directly to the client. The email always contains a link back to the intake form so the client can re-upload.
Page (Ruben)
runoff-lp.pages.dev/internal/photo-review/[orderId]
same page as state 03 · rejection popup opens inside
REJECTION FLOW · INSIDE THE PHOTO REVIEW PAGE
Reject → AI popup → review → send
1. You click Reject → popup opens with a feedback text box.
2. You write what's wrong (e.g. "blurry — retake from front three-quarter, daylight if possible").
3. Click Generate email with AI → the AI writes a polished email in the client's language.
4. Edit manually or click Regenerate with comments if the tone is off.
5. Pick: Send directly to client OR Save as draft in Outlook (send later).
6. The order moves to state
2. You write what's wrong (e.g. "blurry — retake from front three-quarter, daylight if possible").
3. Click Generate email with AI → the AI writes a polished email in the client's language.
4. Edit manually or click Regenerate with comments if the tone is off.
5. Pick: Send directly to client OR Save as draft in Outlook (send later).
6. The order moves to state
03.1 Form resubmitted when the client uploads again. The Attempts counter goes up by 1.
↻ LOOP · returns to state 03 once the client resubmits — repeat until you approve
REJECT POPUP · inside photo review page
AUTO · AI drafts rejection email
EMAIL TO CLIENT · photo_rejection (with new intake link)
AUTO · status reverts to 03.1, Attempts counter +1
What the client receives
- One email in their language explaining what needs to change
- A link to re-open the intake form and submit a new photo
- The intake form keeps their previous fields filled — they only need to replace the photo
What you receive next
- When the client resubmits, you'll get another internal_intake_received email and the order returns to state 03
- The Attempts counter on the Pipeline event shows how many rounds you've gone through
03.1
Form resubmitted
RUBEN
Internal sub-state when the client resubmits after a rejection. Behaves exactly like state 03 (photo review), but the Pipeline event records that this is a re-submission so you can see the history.
02 · Pages used in Phase A
PAGE 4G · INTERNAL
New manual order
Ruben · English
/internal/new-order
- Scenario picker (3 options)
- Customer (search existing or create new)
- Tier — Essential / Signature / Legacy
- Order type — B2C / B2B / Personal-gift
- Company logo (B2B only)
- Paper size + Composition type
- Shipping method, deadline, notes
- Intake fields (when scenario = With intake or Personal-gift)
PAGE 4A · CLIENT
Intake form
Client · NL / EN
/intake/[orderId]
- Artwork number (read-only)
- Car photo
- Brand and model
- Print title (80 char limit)
- Print subtitle (120 char limit)
- Recipient name
- Notes / extras
- Language switcher always visible
PAGE · INTERNAL REVIEW
Photo review
Ruben · English
/internal/photo-review/[orderId]
- Customer photo (clickable full size)
- Full intake details + OneDrive folder link
- Confirm button → moves to Phase B
- Reject button → opens AI rejection popup
- Rejection draft (editable, regenerable)
- Send directly or save as Outlook draft
03 · Every email sent in Phase A
TO CLIENT
On state 01 → 02
Welcome to Runoff Studio · Your order EXXXXXConfirms the order and provides the intake link. Sent for Shopify and Manual B2C orders.
order_confirmation
TO TEAM
On state 01 → 02
New order EXXXXX (Tier) — OriginHeads-up that a new order has landed. Includes the Airtable record link.
internal_new_order
TO CLIENT
Optional manual
We need a few details for your artwork EXXXXXStandalone intake invitation. Used when the customer needs a fresh nudge to fill the form.
intake_link
TO CLIENT
48h after state 02
A friendly nudge — EXXXXXFirst automatic reminder if the client hasn't submitted the intake.
intake_reminder_48h
TO CLIENT
5 days after state 02
Last call — EXXXXXSecond and final automatic reminder. After this, no more nudges are sent.
intake_reminder_5d
TO CLIENT
On state 02 → 03
Got it — we have everything for EXXXXXAcknowledges the intake submission to the client. Auto-sent the moment they submit.
intake_received_confirmation
TO TEAM
On state 02 → 03
Intake received for EXXXXX — review photoSent to ruben@runoff.studio with a direct link to the photo review page.
internal_intake_received
TO CLIENT
When you reject
About the photo for your artwork EXXXXXAI-drafted rejection email. You always review/edit before sending. Includes a link back to the intake form.
photo_rejection
TO TEAM
After you send a rejection
Photo rejection sent for EXXXXXAudit copy of the rejection email you sent, so it's logged in the team mailbox.
internal_photo_rejection_review
04 · Automations of Phase A
- ▸ NEW SHOPIFY ORDER · generates artwork number · reads tier + paper + composition from variant · creates the Airtable record · matches or creates the Moneybird contact · creates the OneDrive folder · alerts you if any field is missing
- ▸ FORM 4G SUBMITTED · generates artwork number · creates the Airtable record · matches/creates Moneybird contact (B2C/B2B only) · creates the OneDrive folder · sends the intake link to the customer (Manual B2C scenario only)
- ▸ PERSONAL / GIFT ORDER · generates artwork number · creates the Airtable record · creates the OneDrive folder · skips Moneybird · skips client emails · lands directly on state 03 ready for photo review
- ▸ INTAKE NOT SUBMITTED · 48h reminder email to the client · 5d reminder email · then silence (no further nudges)
- ▸ INTAKE SUBMITTED · uploads the photo to OneDrive · saves intake fields to the Pipeline event · sends acknowledgment to client · sends review link to ruben@runoff.studio · moves order to state 03
- ▸ YOU REJECT THE PHOTO · AI drafts the rejection email · you review/edit · system sends it (or saves as draft) · order returns to state 03.1 · Attempts counter +1
OPERATING NOTES
• Composition types restricted on Shopify. Only "No background" and "Photo-based" are sold on the website. "Reused" and "Custom" only come in through Form 4G with the "With intake" or "Personal / gift" scenario.
• The intake form (4A) only supports "No background" and "Photo-based" — those compositions don't need a brief from the customer.
• Personal-gift orders skip Moneybird entirely (no contact, no invoice). They also skip every client-facing email.
• Localization (NL / EN) is automatic based on the client's preferred language, but a manual switcher is always visible on Page 4A.
• Char counters live on title (80 chars) and subtitle (120 chars) — the form prevents going over.
• Rejection is in-page: no separate rejection page. The popup is inside
• The intake form (4A) only supports "No background" and "Photo-based" — those compositions don't need a brief from the customer.
• Personal-gift orders skip Moneybird entirely (no contact, no invoice). They also skip every client-facing email.
• Localization (NL / EN) is automatic based on the client's preferred language, but a manual switcher is always visible on Page 4A.
• Char counters live on title (80 chars) and subtitle (120 chars) — the form prevents going over.
• Rejection is in-page: no separate rejection page. The popup is inside
/internal/photo-review/[orderId].
OUT OF SCOPE FOR PHASE A
Composition work, drawing, printing, client print review, production and shipping (states 05 to 23) live in Phases B, C, D and E. The "Reused" and "Custom" composition types use an extra brief flow handled inside Phase B. AI generation of composition variants happens at the start of Phase B once the photo is approved.