PrePitched Network (PPN)

Technical Schema &
Automation Map

Schema v2 10 Tables 4 Make Scenarios 14 Automations March 2026
01

Table Architecture

Airtable

Suppliers

Core business entity. One record per supplier business.
FieldTypeLogic / Description
Supplier_IDFormulaPK "SUP-" & RECORD_ID()
Business_NameSingle LinePrimary display name
Supplier_CategorySingle SelectGlamping / Marquee / Both — drives onboarding form branching
Coverage_TypeSingle SelectMiles Radius / Named Counties / National
Max_Range_MilesNumberRequired only if Coverage_Type = Miles Radius
Coverage_CountiesMulti-SelectRequired only if Coverage_Type = Named Counties
Is_NationalFormulaFormula Coverage_Type = "National" — skips Haversine in Match Engine
Tent_TypesMulti-SelectBell Tent / Tipi / Yurt / Safari / Geodome / Shepherd Hut / Other
Tent_SizesMulti-Select2 / 4 / 6 / 8 person / Custom
Min_Contract_TentsNumberMinimum units per booking (e.g. 10). Used in Match Engine filter.
Beds_IncludedCheckbox
Bed_TypeSingle SelectReal / Inflatable / Both
Decor_LevelSingle SelectRustic / Mid-Range / Boutique / High-End
Structure_TypesMulti-SelectMarquee suppliers: Traditional Pole / Frame / Stretch / Clearspan / Pagoda
Max_Structure_CapacityNumberMarquee suppliers: max headcount
Event_Types_ServedMulti-SelectWedding / Private Party / Festival / Pop-Up Campsite / Public Gathering
Event_Types_ExcludedMulti-SelectExplicit exclusions — checked in Match Engine alongside Served
Std_Payment_StructureSingle SelectFull Upfront / Deposit+Balance / Three-Stage
Std_Deposit_PctNumber% shown if Deposit applies
Std_Interim_PctNumber% shown if Three-Stage
Std_Balance_TimingSingle SelectOn Booking / 30 Days Before / 14 Days Before / On Event Day / Post-Event 14 days
Late_Threshold_DaysNumbere.g. 30 — if event is within this many days, use Late structure
Late_Payment_StructureSingle SelectSame options as Std — often defaults to Full Upfront
Late_Deposit_PctNumber
Subscription_StatusSingle SelectActive / Paused / Cancelled
Avg_RatingRollupAVERAGE(Overall_Rating) from linked Reviews
Quality_FlagFormulaFormula IF(Avg_Rating < 3, "Review Needed", IF(Avg_Rating < 4, "Monitor", "Good"))
Offers_Dry_HireCheckboxFuture use only — not used in matching v1
OutcodeFormulaFormula Extracts first half of Postcode_Raw. FK → [Ref] Outcodes
Postcode_RawSingle LineFull postcode as entered, e.g. GL7 2BX
Referral_CodeSingle LineUnique code used in supplier referral URL e.g. prepitched.co.uk/refer?ref=SMITH24. Auto-generated on onboarding, customisable via Softr dashboard in Phase X. Captured as hidden field on Event Request form.
ActiveCheckboxMatch Engine filter — only Active suppliers are matched

Contacts

Multi-user portal access. One row per login. Replaces Portal_Email on Suppliers.
FieldTypeLogic / Description
Contact_IDFormulaPK "CON-" & RECORD_ID()
Full_NameSingle Line
EmailEmailPrimary key for Softr login — must be unique across all contacts
PhonePhone
SupplierLinked RecordFK → Suppliers. Multiple contacts can link to one Supplier.
RoleSingle SelectOwner / Manager / Staff / Read-Only
Portal_RoleSingle SelectSupplier Admin / Supplier Member / Organiser Admin / Organiser Member
Primary_ContactCheckboxFlags main billing/correspondence contact
Portal_EnabledCheckboxActivates Softr login for this email
Created_AtCreated TimeAuto

Events

One record per enquiry. Dual form path: Glamping or Marquee.
FieldTypeLogic / Description
Event_IDFormulaPK "EVT-" & RECORD_ID()
Organiser_CompanySingle LineSeparate from Organiser_Name — required for Duplicate_Check_Key
Organiser_NameSingle LinePrimary contact at the organisation
Organiser_EmailEmailRecipient for quotes and satisfaction survey
Organiser_Portal_EmailEmailPortal login — set only for repeat/multi-event organisers
Portal_EnabledCheckboxOnly checked for qualifying organisers
Event_TypeSingle SelectWedding / Private Party / Festival / Pop-Up Campsite / Public Gathering
Structure_CategorySingle SelectGlamping / Marquee / Both — drives which suppliers are matched
Event_DateDateUsed for Honesty Loop trigger and Late_Threshold check
Event_End_DateDateHonesty Loop fires +48hrs after this date
Guest_CountNumberMatched against Supplier Max_Capacity
Postcode_RawSingle Line
OutcodeFormulaFormula Extracts first half of Postcode_Raw. FK → [Ref] Outcodes
StatusSingle SelectNew / Matching / Quotes Sent / Confirmed / Cancelled / Completed
Quote_TierSingle SelectFree (up to 3) / Paid (TBC)
Max_Quotes_AllowedFormulaFormula IF(Quote_Tier = "Free", 3, 5)
Quotes_Sent_CountCountCount of linked Quote records
Duplicate_Check_KeyFormulaFormula UPPER(TRIM(Organiser_Company)) & "-" & Outcode & "-" & TEXT(Event_Date,"YYYY-MM")
Duplicate_FlagCheckboxSet by Make when matching key found
Duplicate_OfLinked Record→ Events. Manually linked by Lou/Katie after review.
Referred_By_SupplierLinked RecordFK → Suppliers. Populated by Make on form submission using Referral_Code_Used lookup. Defaults to PPN House if no valid code.
Referral_Code_UsedSingle LineRaw code captured from hidden field on Event Request form (via ?ref= URL parameter). Make uses this to look up and link Referred_By_Supplier.
How_Did_You_Find_UsSingle LineOpen text field on Event Request form. Captures organic referral and marketing source where no referral link was used. For manual review and marketing insight — not used in automated matching.

Quotes

One record per supplier per event. Tracks commission, honesty loop and structure.
FieldTypeLogic / Description
Quote_IDFormulaPK "QTE-" & RECORD_ID()
EventLinked RecordFK → Events
SupplierLinked RecordFK → Suppliers
Supplier_IDLookupPulled from Supplier link — used as Softr filter anchor
CC_Reference_CodeFormulaFormula "PPN-" & Event_ID & "-" & Supplier_ID — supplier puts this in email subject when quoting
Quote_Submitted_Via_CCCheckboxSet by Make when CC alias email is detected
Days_Until_EventFormulaFormula DATETIME_DIFF(Event_Date, TODAY(), "days")
Is_Late_RequestFormulaFormula IF(Days_Until_Event <= Supplier.Late_Threshold_Days, TRUE, FALSE)
Quote_AmountCurrencySupplier's quoted price
Commission_TotalFormulaFormula Quote_Amount * 0.10
Commission_OverheadFormulaFormula Quote_Amount * 0.02 — always to PPN
Commission_SplittableFormulaFormula Quote_Amount * 0.08
Has_ReferralFormulaFormula IF(Event.Referred_By_Supplier != "PPN House", TRUE, FALSE)
Referral_Supplier_ShareFormulaFormula IF(Has_Referral, Commission_Splittable * 0.5, 0) — 4% if referral
PPN_NetFormulaFormula Commission_Overhead + (Commission_Splittable - Referral_Supplier_Share)
Applied_StructureSingle SelectFull Upfront / Deposit+Balance / Three-Stage — set at acceptance
Structure_Was_OverriddenCheckboxSet by Make if supplier changed from onboarding default
Total_Contract_ValueRollupSUM(Payment_Amount) from Payment_Schedules
Total_Commission_DueRollupSUM(Commission_Due) from Payment_Schedules
Outstanding_CommissionFormulaFormula Total_Commission_Due - Total_Commission_Received
StatusSingle SelectInvited / Submitted / Accepted / Rejected / Withdrawn
Honesty_Loop_StageSingle SelectNot Started / Loop 1 / Loop 2 / Loop 3 / Escalated / Resolved / Voided
Did_It_HappenSingle SelectYes / No / No Response
Final_Agreed_PriceCurrencyEntered via Tally on Honesty Loop "Yes" — overrides Quote_Amount if set
Organiser_ContactedCheckboxSet when escalation email fires to organiser

Payment_Schedules

Child of Quotes. One record per payment instalment. Commission tracked per tranche.
FieldTypeLogic / Description
Payment_IDFormulaPK "PAY-" & RECORD_ID()
QuoteLinked RecordFK → Quotes
SupplierLookupVia Quote link — for Softr filtering
Supplier_IDLookupVia Quote → Supplier — Softr filter anchor
Payment_TypeSingle SelectDeposit / Interim / Balance / Settlement
Due_DateDateComputed by Make from supplier timing selection at acceptance
Payment_AmountCurrencyAmount of this instalment
Commission_DueFormulaFormula Payment_Amount * 0.10
Commission_OverheadFormulaFormula Payment_Amount * 0.02
Referral_ShareFormulaFormula IF(Has_Referral, Payment_Amount * 0.04, 0)
PPN_NetFormulaFormula Commission_Due - Referral_Share + Overhead already included
Supplier_ReceivesFormulaFormula Payment_Amount - Commission_Due
StatusSingle SelectPending / Confirmed / Overdue / Waived
Confirmed_DateDateWhen supplier reports payment received
Commission_InvoicedCheckboxPPN has raised invoice for this tranche
Commission_PaidCheckboxPPN has received payment — final reconciliation flag

Referrals

Tracks which supplier introduced which event. Commission splits and subscription credits.
FieldTypeLogic / Description
Referral_IDFormulaPK "REF-" & RECORD_ID()
Referring_SupplierLinked RecordFK → Suppliers. Defaults to "PPN House" if no external referral.
Referred_EventLinked RecordFK → Events
Resulting_QuoteLinked RecordFK → Quotes. Set when a quote is accepted.
StatusSingle SelectPending / Active / Converted / Void
Commission_Split_To_SupplierLookupReferral_Supplier_Share from linked Quote — 4% of contract value
Applied_To_SubscriptionCheckboxHas this credit reduced the next subscription invoice?

Subscriptions

Monthly billing records. Net amount reduced by referral credits.
FieldTypeLogic / Description
Billing_IDFormulaPK "BIL-" & RECORD_ID()
SupplierLinked RecordFK → Suppliers
Period_Start / Period_EndDateBilling period
Gross_FeeCurrencyStandard subscription fee
Referral_Credits_AppliedCurrencyPulled from Supplier's referral credit balance
Net_Amount_DueFormulaFormula Gross_Fee - Referral_Credits_Applied
Payment_StatusSingle SelectUnpaid / Paid / Overdue
Tally_Payment_IDSingle LineReference from Tally/Stripe

Reviews

Post-event satisfaction. Drives supplier quality score and testimonial pipeline.
FieldTypeLogic / Description
Review_IDFormulaPK "REV-" & RECORD_ID()
EventLinked RecordFK → Events
SupplierLinked RecordFK → Suppliers
Supplier_IDLookupVia Supplier link — Softr filter anchor
Survey_Sent_DateDateWhen Tally survey link was emailed to organiser
Survey_RespondedCheckbox
Overall_RatingNumber1–5 star score (from Tally)
Would_RecommendCheckbox
Review_TextLong TextFree-text organiser response
Consent_To_PublishCheckbox"May we share this as a testimonial?" — asked in Tally
PublishedCheckboxLou/Katie marks when used on website/socials
Internal_FlagSingle SelectAll Good / Monitor / Escalate
Internal_NotesLong TextLou/Katie notes on poor experiences

Activity_Log

Notification feed. Make writes here on every significant event. Softr renders as supplier inbox.
FieldTypeLogic / Description
Log_IDFormulaPK "LOG-" & RECORD_ID()
SupplierLinked RecordFK → Suppliers
EventLinked RecordFK → Events (optional)
QuoteLinked RecordFK → Quotes (optional)
TypeSingle SelectNew Match / Quote Submitted / Quote Accepted / Commission Due / Referral Converted / Payment Confirmed
MessageSingle LineHuman-readable, e.g. "You've been matched to Midsummer Festival 2026"
ReadCheckboxSupplier marks as read via Softr
Created_AtCreated TimeAuto

[Ref] Outcodes

Static reference data. Loaded once. Used by Match Engine for Haversine distance calculation.
FieldTypeLogic / Description
OutcodeSingle LinePK e.g. GL7, OX1, SW1A
LatitudeNumber (decimal)Centroid latitude for this outcode area
LongitudeNumber (decimal)Centroid longitude for this outcode area
RegionSingle Linee.g. South West, London — for manual filtering
02

Commission Structure

10% total
PPN House Rule: A "PPN House" supplier record acts as the default Referred_By_Supplier when no external referral exists. This means commission split logic runs identically for all quotes — no special-case code needed.
Scenario PPN Overhead (2%) PPN Profit Share (4%) Referring Supplier (4%) PPN Total
No external referral 2% 8% 0% 10%
External referral exists 2% 4% 4% 10%

Commission is tracked per payment instalment in Payment_Schedules, not as a single lump sum. PPN takes 10% of each tranche as it falls due.

03

Decision Logic

Formulas + Make

◆ Does supplier cover this location?

Implemented in Make (Match Engine scenario)

IF Is_National → always include
ELIF Coverage_Type = "Named Counties"
  → check Event county ∈ Supplier.Coverage_Counties
ELIF Coverage_Type = "Miles Radius"
  → run Haversine, filter by Max_Range_Miles

◆ Does supplier serve this event type?

Implemented in Make (Match Engine scenario)

Event.Event_Type ∈ Supplier.Event_Types_Served
AND
Event.Event_Type ∉ Supplier.Event_Types_Excluded

◆ Is this a late request?

Formula field on Quotes

Is_Late_Request =
IF(
  Days_Until_Event <= Supplier.Late_Threshold_Days,
  TRUE,
  FALSE
)

◆ Is this a duplicate event?

Formula on Events + Make scenario

Duplicate_Check_Key =
UPPER(TRIM(Organiser_Company))
& "-" & Outcode
& "-" & TEXT(Event_Date, "YYYY-MM")

Make searches for matching key on creation. Sets Duplicate_Flag if found. Human review decides.

◆ Was a referral involved?

Formula on Quotes

Has_Referral =
IF(
  Event.Referred_By_Supplier != "PPN House",
  TRUE,
  FALSE
)

◆ Quote overdue?

Formula on Quotes

Hours_Since_Invited =
DATETIME_DIFF(NOW(), Submitted_At, "hours")

Is_Overdue =
IF(Hours_Since_Invited > 72, "Overdue", "Active")
04

Notification & Automation Ledger

18 triggers · 47 email templates
URL strategy: Store base URL as a variable in a Make Data Store — action_base_url. Phase 1 points to Tally forms. Phase X (Softr) updates this single variable and all email links update automatically.
# Trigger Recipient Email Template Data injected into email Tool
01New Event createdInternalE2 — New Enquiry AlertEvent_Name, Date, Location, Guest_Count, Service_RequiredAirtable
01bNew Event createdOrganiserE1 — Event Form Submission ConfirmationEvent_ID, all submitted fields echoed, quote tier, upgrade form linkMake
02Duplicate_Flag → TRUEInternalE3 — Duplicate Event FlagEvent_ID, matched Event_ID, Duplicate_Check_KeyAirtable
03Match Engine completeInternalInternal only — no templateEvent_ID, list of matched Supplier names, countMake
04Status → Quotes SentOrganiserE5 — Quotes On The WayEvent_Name, number of quotes incoming, 72hr deadlineAirtable
05Status → Quotes Sent (per supplier)SupplierQ1 — Invitation to Quote (ITQ)Event_ID, Event_Date, Location Outcode, Guest_Count, Service_Required, CC_Reference_Code, Quote deadlineMake
06CC alias email detectedInternalQ3 — Quote Received (Internal)Supplier name, Quote_Amount, Event_ID — Quote set to SubmittedMake
06bSupplier confirms intent (Yes on ITQ)SupplierQ2 — Full Event Details + IntroductionFull event brief, organiser contact, quote deadline, PPN intro record, 4-yr commission scheduleMake
06cSupplier declines ITQSupplierQ4 — Declined ITQEvent summary, soft referral nudgeMake
06d72hrs after ITQ, Quote still = InvitedBothQ5 — Quoting Deadline CheckSupplier: did you send? Organiser: did you receive?Make
07Winning_Quote setSupplierA1 — Booking Confirmed (Winning Supplier)Event_Name, Date, Organiser contact, bank details prompt, 48hr windowAirtable
08Winning_Quote setOrganiserA2 — Booking Confirmed (Organiser)Supplier name, Quote summary, ToS linkAirtable
09Winning_Quote setLosing SuppliersA3 — Unsuccessful Quote NotificationGeneric "not selected" messageMake
09b2–3 weeks after intro, no outcome recordedBothA4 — No Response After Intent to QuoteSupplier: did this result in a booking? Organiser: have you confirmed a supplier?Make
10+48hrs after Event_End_DateSupplierH1 — Honesty Loop Initial NudgeEvent_Name, Quote_Amount, Commission_Amount, Did_It_Happen Tally linkMake
11Did_It_Happen → YesInternalH2 — Commission Ready (Internal)Commission_Amount, PPN_Net — ready to invoiceAirtable
12Did_It_Happen → Yes (+2 days)OrganiserH3 — Post-Event Satisfaction SurveyEvent_Name, Supplier_Name, Survey link (Tally)Make
13Honesty_Loop_Stage → EscalatedOrganiser + InternalH4 — Honesty Loop EscalationSupplier_Name, Event_Name, Event_Date — combined survey + internal flagMake
14Subscription Payment_Status → OverdueSupplierB1 — Subscription Payment OverdueInvoice amount, due date, payment link (Tally)Make
15Referral record createdSupplierR1 — Referral ConfirmationReferral details, 4% commission note, bank detail promptMake
16Referral.Status → ActiveSupplierR2 — Referral MatchedReferred event matched, commission update to followMake
17Commission_Paid → TRUESupplierR4 — Commission Ready to PayCommission amount, bank details link, 14-day windowAirtable
18Scheduled — May & OctoberSupplierR5 — 4-Year Commission ReminderIntroduction_Date, Protection_End_Date, current commission rate, booking promptMake
05

Honesty Loop

Post-event verification
Design principle: PPN is a matching service. Quoting happens outside the network. The Honesty Loop tracks only the outcome — did it happen, and at what final price. Suppliers email quotes in their own system, cc'ing a PPN alias. Make detects the CC, sets the Quote to Submitted. Post-event, Make asks only for Yes/No + final price.
+48hrs
Loop 1 — "Did it happen?" nudge sent. Response links to short Tally form.
Supplier
+5 days
Loop 2 — Friendly reminder. No response to Loop 1.
Supplier
+10 days
Loop 3 — Final warning. "We'll contact the organiser if no reply within 4 days."
Supplier
+14 days
Escalation — Combined "did it happen?" + satisfaction survey sent to organiser. Internal flag raised for Lou/Katie.
Organiser + Lou/Katie
Manual
Lou/Katie reviews. Phone chase. Decision to void or pursue commission manually.
Internal
On "Yes": Make prompts supplier for final agreed price via Tally (pre-filled with quoted amount). Final_Agreed_Price is written to the Quote. Settlement Payment_Schedule record created dynamically if Three-Stage structure. Satisfaction survey fires to organiser +2 days later.
06

Payment Schedule System

Multi-stage

Suppliers declare two structures at onboarding: Standard (default) and Late Request (triggered when Days_Until_Event ≤ Late_Threshold_Days). At quote acceptance, Make pre-fills a Tally confirmation with the applicable structure. Supplier confirms or overrides.

Scenario A — Full upfront

1
Single Payment_Schedule record created
2
Type = Balance, due on booking
3
Honesty Loop fires +48hrs after event end

Scenario B — Deposit + Balance

1
Deposit record — due on booking
2
Balance record — due per Std_Balance_Timing
3
Honesty Loop fires after event end

Scenario C — Three-stage

1
Deposit record — due on booking
2
Interim record — due per timing
3
Settlement record created ONLY after Honesty Loop "Yes" + Final_Agreed_Price confirmed
Due Date resolution: Make translates the supplier's timing selection into a concrete date: On Booking → Acceptance_Date · 30 Days Before → Event_Date - 30 · Post-Event 14 Days → Event_End_Date + 14. Every Payment_Schedule record has a concrete Due_Date the moment it's created.
07

Outcode & Proximity Logic

No Google Maps API
Step 1 — Extract Outcode (Airtable Formula field on Suppliers + Events)
IF(
  FIND(" ", Postcode_Raw) > 0,
  TRIM(LEFT(Postcode_Raw, FIND(" ", Postcode_Raw) - 1)),
  LEFT(UPPER(TRIM(Postcode_Raw)), 3)
)

Examples:  "GL7 2BX" → "GL7"
           "SW1A 2AA" → "SW1A"
           "B1 1BB" → "B1"
Edge case protection: if user enters postcode without a space, falls back to first 3 characters.
Step 2 — Link to [Ref] Outcodes (Make scenario)
Trigger: Record created/updated in Suppliers or Events
Action:  Search [Ref] Outcodes where Outcode = extracted value
Action:  Update Outcode_Link field with matching record ID

Runs once on creation. Re-runs only if postcode changes.
Step 3 — Haversine Distance in Make (Match Engine)
distance_km = 2 × 6371 × ASIN(SQRT(
  SIN((lat2-lat1) × PI/180 / 2)² +
  COS(lat1 × PI/180) × COS(lat2 × PI/180) ×
  SIN((lon2-lon1) × PI/180 / 2)²
))

Filter:  distance_miles = distance_km × 0.621371
         KEEP IF distance_miles ≤ Supplier.Max_Range_Miles
         SKIP IF Supplier.Is_National = TRUE
Lat/Long pulled from Outcode_Link lookup on both Supplier and Event records.
08

Portal Readiness (Softr)

Phase X

The schema is Softr-ready from day one. The following additions have been baked in now to avoid retrofitting later.

Addition Where Why it matters for Softr
Contacts tableNew tableSoftr user directory. One row per login email. Multiple staff per Supplier account.
Supplier_ID lookupQuotes, Payments, Reviews, Activity_LogSoftr filters child records by Supplier_ID — shows only records belonging to the logged-in user's business.
Portal_Enabled checkboxContactsControls which contacts can log in. Toggled by Lou/Katie.
Portal_Role fieldContactsSoftr block visibility conditions — admin sees billing, member sees quotes only.
Activity_Log tableNew tableSoftr renders as supplier notification inbox. Data already being written from Phase 1.
action_base_url (Make Data Store)MakeSingle variable controlling email action URLs. Phase 1 = Tally. Phase X = Softr. One-line switchover.
Organiser_Portal_EmailEventsPortal login for repeat/multi-event organisers — enabled manually, not by default.
Tally stays for onboarding. New suppliers are unauthenticated — they can't log into Softr yet. Tally handles the initial onboarding form permanently. Everything post-login migrates to Softr in Phase X.
09

Build Order

50-Hour Rule
50-Hour Rule: Prefer Airtable-native features before Make. Only 4 Make scenarios required for Phase 1–2. Every notification with a simple single-record trigger uses Airtable automations (free tier).
Phase 1 — Airtable Build
  • [Ref] Outcodes table (no dependencies)
  • Suppliers table with all field sets
  • Contacts table
  • Events table with dual enquiry structure
  • Quotes table with commission formulas
  • Payment_Schedules table
  • Referrals table
  • Subscriptions table
  • Reviews table
  • Activity_Log table
  • Views: Supplier Hub, Open Events, Commission Tracker, Honesty Loop Queue
Phase 2 — Make Scenarios
  • Scenario 1: Outcode → [Ref] Outcodes linking
  • Scenario 2: Match Engine (Haversine + filters)
  • Scenario 3: Bulk ITQ emails + CC alias detection
  • Scenario 4: Honesty Loop scheduled escalation
  • Scenario 5: Payment Schedule creation on acceptance
  • Scenario 6: Duplicate event check on new Event
Phase 3 — Tally Forms
  • Supplier onboarding — Glamping path
  • Supplier onboarding — Marquee path
  • Event enquiry — Glamping path
  • Event enquiry — Marquee path
  • Payment structure confirmation (acceptance)
  • Honesty Loop "Yes" response (final price)
  • Post-event satisfaction survey
Phase X — Softr: Supplier dashboard (quotes, referrals, commission, activity feed). Organiser portal for repeat/multi-event clients. Email action URLs updated via action_base_url Data Store variable in Make.