PrePitched Network (PPN)

Technical Schema &
Automation Map

Schema v6 11 Tables 6 Make Scenarios 18 Automations Updated 25 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
Referral_CodeSingle LineUnique per supplier. Auto-generated by Make at onboarding (e.g. SMITH24). Customisable via Softr Phase X. Make matches incoming Referral_Code_Used on Events against this field. Decision S-10.
Coverage_TypeSingle SelectMiles Radius / Named Counties / Named Regions / Counties + Regions / National — determines Match Engine path. Decision S-11.
Max_Range_MilesNumberRequired only if Coverage_Type = Miles Radius
Coverage_CountiesMulti-SelectRequired if Coverage_Type = Named Counties or Counties + Regions. Match Engine checks Event_County ∈ this list.
Coverage_RegionsMulti-SelectRequired if Coverage_Type = Named Regions or Counties + Regions. Options: North East / North West / Yorkshire and the Humber / East Midlands / West Midlands / East of England / London / South East / South West / Wales / Scotland / Northern Ireland / Ireland. Match Engine ORs across Coverage_Counties and Coverage_Regions. Decision S-11.
Is_NationalFormulaFormula Coverage_Type = "National" — skips all distance/county/region checks 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 Tent / Frame Tent / Clear Span / Sailcloth Tent / Stretch Tent / Pagoda / Sperry Tent / Other. Used in Match Engine for marquee enquiries. Decision I-02 fix.
Max_CapacityNumberMarquee suppliers: maximum guest capacity. Matched against Event.Guest_Count in Match Engine. Decision I-02 fix — field confirmed and renamed from Max_Structure_Capacity.
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 SelectPending (default — onboarded, not yet invoiced) / Free Trial / Active / Paused / Cancelled. Decision S-17.
Trial_Months_GrantedNumberNumber of free introductory months offered. Set at onboarding or manually by Lou. Decision S-17.
Trial_End_DateDateSet by Make when supplier is activated. Make flips Subscription_Status to Active when TODAY() passes this date. Decision S-17.
Avg_RatingRollupAVERAGE(Overall_Rating) from linked Reviews
Supplier_ScoreFormulaFormula Placeholder: Avg_Rating. Awaiting Lou decision on composite weighting (rating + booking count + response rate). Supplier Hub view sorts by this field. See Open Decision A-01. Audit fix G-06.
Quality_FlagFormulaFormula IF(Avg_Rating < 3, "Review Needed", IF(Avg_Rating < 4, "Monitor", "Good"))
Capacity_FromRollupSUM(Capacity_From_This_Type) from linked Supplier_Stock records. Total minimum guest capacity across all tent types. Decision S-19.
Capacity_ToRollupSUM(Capacity_To_This_Type) from linked Supplier_Stock records. Total maximum guest capacity across all tent types. Decision S-19.
Offers_Booking_SystemCheckboxPhase X stub only. No automation dependency at launch. Decision S-19.
WhatsApp_NumberPhonePhase X stub. Not used until WhatsApp Business API is activated. Decision M-03.
Comms_PreferenceSingle SelectEmail Only / Email + WhatsApp. Phase X stub. Make routes notifications by this field when WhatsApp is live. Decision M-03.
WhatsApp_Opted_InCheckboxGDPR opt-in for WhatsApp notifications. Captured at onboarding. Required before any WhatsApp messages can be sent. Phase X stub. Decision M-03. Audit fix G-05.
Offers_Dry_HireCheckboxExpression of interest in PPN Dry Hire Network (separate future project). Captured at end of onboarding form. Not used in matching v1. Decision S-10 / I-03 context.
Dry_Hire_NotesLong TextOptional — what equipment would they offer for dry hire? No automation dependency. For Lou/Katie review only.
Stripe_Connect_IDSingle LineStripe Connect account ID. Populated when supplier completes Stripe onboarding. Used for automated commission payouts. Decision S-12.
Bank_Details_ConfirmedCheckboxSet when supplier has confirmed payment details (Stripe Connect connected or Payment Link confirmed). Required before commission can be paid. Decision S-12.
Payout_MethodSingle SelectStripe Connect / Stripe Payment Link / Manual. Lou decision on mechanism — schema consistent across all options. Decision S-12.
Referral_Credits_BalanceCurrency (£)Accumulated referral commission credits. Updated by Make when a referred event converts. Applied against next subscription invoice. Decision S-12.
OutcodeFormulaFormula Extracts first half of Postcode_Raw. Text value only (not a link). Make uses this to search [Ref] Outcodes and write Outcode_Link. Note: postcodes must include a space for correct extraction of 4-character outcodes (e.g. SW1A). Audit fix G-02 / G-15.
Outcode_LinkLinked RecordFK → [Ref] Outcodes. Written by Make Scenario 1. Provides lat/long for Haversine and County/Region for matching. Mirrors pattern on Events table. Audit fix G-02.
Postcode_RawSingle LineFull postcode as entered, e.g. GL7 2BX. Must include a space between outcode and incode halves. Tally form validates format. Audit note G-15.
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()
First_NameSingle LineUsed in Make email salutation: "Hi {{First_Name}}," — Decision S-02. Audit fix G-12.
Last_NameSingle LineConcatenate with First_Name when full name needed. Decision S-02. Audit fix G-12.
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
Contact_StageSingle SelectWaitlist / Onboarding / Active / Inactive. Make filters pre-launch email workflows by this field. Decision S-06. Audit fix G-13.
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()
Event_NameSingle LineHuman-readable name (e.g. "The Johnson Wedding", "Latitude Village 2026"). Airtable primary field. Referenced by 6 email templates (E2, E5, A1, H1, H3, H4). Captured via Tally Event Request form. Audit fix N-02.
Organiser_CompanySingle LineOrganisation name. Optional for private individuals — Duplicate_Check_Key falls back to Organiser_Name if blank. Decision S-18.
Organiser_NameSingle LinePrimary contact at the organisation
Organiser_EmailEmailRecipient for quotes and satisfaction survey
Organiser_PhonePhoneOptional. For Lou/Katie operational use — not used in automations. Decision A-03.
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 for marquee events
Glamping_Tent_PreferenceSingle SelectOpen / Type Specified / Fully Specified. Determines how much detail the organiser provided about tent requirements. Decision S-19.
Glamping_Tent_Types_RequestedMulti-SelectBell Tent / Tipi / Yurt / Safari / Geodome / Shepherd Hut / Other. Populated when Glamping_Tent_Preference = Type Specified or Fully Specified. Decision S-19.
Glamping_Units_RequestedNumberTotal units requested by the organiser. Decision S-19.
Glamping_Spec_NotesLong TextFree text for fully specified requests (e.g. "10 bell tents, 5 tipis, all with real beds"). Decision S-19.
Payment_ArrangementSingle SelectOrganiser Pays Supplier / Guests Book Direct / TBC. Decision S-19.
Postcode_RawSingle LineFull postcode as entered. Outcode formula extracts first half. Must include a space between outcode and incode halves for correct 4-char outcode extraction. Tally form validates format. Audit note G-15.
OutcodeFormulaFormula Extracts first half of Postcode_Raw. Used as lookup key for Make to link Outcode_Link.
Outcode_LinkLinked RecordFK → [Ref] Outcodes. Written by Make Scenario 1. Provides lat/long for Haversine and County/Region for matching.
Event_CountyLookupPulls County from linked Outcode_Link record. Make reads this for Named Counties matching. Decision S-11 / C-01 chain.
Event_RegionLookupPulls Region from linked Outcode_Link record. Make reads this for Named Regions matching. Decision S-11.
StatusSingle SelectNew / Matching / Quotes Sent / Confirmed / Cancelled / Completed
Quote_TierSingle SelectFree (up to 3) / Paid (up to 5)
Max_Quotes_AllowedFormulaFormula IF(Quote_Tier = "Free", 3, 5)
Quotes_Sent_CountCountCount of linked Quote records
Duplicate_Check_KeyFormulaFormula IF(Organiser_Company, UPPER(TRIM(Organiser_Company)), UPPER(TRIM(Organiser_Name))) & "-" & Outcode & "-" & TEXT(Event_Date,"YYYY-MM") — falls back to Organiser_Name if company blank. Decision S-18.
Duplicate_FlagCheckboxSet by Make when Duplicate_Check_Key matches an existing record. Triggers E3 internal alert.
Dedup_ReviewedCheckboxTicked by Lou/Katie after reviewing a flagged duplicate. Clears record from Duplicate Flags view. Decision S-15.
Duplicate_OfLinked Record→ Events. Manually linked by Lou/Katie after review.
Referred_By_SupplierLinked RecordFK → Suppliers. Written exclusively by Make on submission via Referral_Code_Used lookup. Defaults to PPN House if no valid code found. Decision S-10.
Referral_Code_UsedSingle LineRaw value captured from hidden ?ref= URL parameter on Event Request form. Make uses this to look up and populate Referred_By_Supplier. Decision S-10.
How_Did_You_Find_UsLong TextOpen text from form. Marketing insight only — no automation reads this field. Decision S-10.
Winning_QuoteLinked RecordFK → Quotes (single record). Written by Make when a Quote status moves to Accepted. Email A3 trigger fires on this field being set. Decision S-16.

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
Event_IDLookupPulled from Event link. Required by CC_Reference_Code formula. Airtable formulas cannot reference linked table fields directly. Audit fix G-10.
Event_DateLookupPulled from Event link. Required by Days_Until_Event formula. Audit fix G-08.
Late_Threshold_DaysLookupPulled from Supplier link. Required by Is_Late_Request formula. Audit fix G-09.
Referred_By_Supplier_NameLookupPulls the linked record display name from Event → Referred_By_Supplier. Required by Has_Referral formula. Audit fix G-07.
CC_Reference_CodeFormulaFormula "PPN-" & Event_ID & "-" & Supplier_ID — both values are local Lookups. Supplier includes this in email subject when quoting. Audit fix G-10.
Quote_Submitted_Via_CCCheckboxSet by Make when CC alias email is detected
ITQ_Sent_AtDateTimeWritten by Make when the ITQ email is dispatched. Starts the 72-hour overdue clock. Decision S-14 (C-06 fix).
Days_Until_EventFormulaFormula DATETIME_DIFF(Event_Date, TODAY(), "days") — Event_Date is a local Lookup. Audit fix G-08.
Hours_Since_InvitedFormulaFormula DATETIME_DIFF(NOW(), ITQ_Sent_At, "hours") — references ITQ_Sent_At, not Submitted_At. Decision S-14.
Is_OverdueFormulaFormula IF(Hours_Since_Invited > 72, "Overdue", "Active")
Is_Late_RequestFormulaFormula IF(Days_Until_Event <= Late_Threshold_Days, TRUE, FALSE) — Late_Threshold_Days is a local Lookup from Supplier. Audit fix G-09.
Quote_AmountCurrencySupplier's quoted price
Applied_Commission_RateNumber (2 d.p.)Written by Make at quote creation. Checks Referrals for active protection period between same Organiser and Supplier — sets 0.10 / 0.08 / 0.06 / 0.04 depending on year. All commission formulas reference this field. Decision S-13 (C-01 fix).
Commission_TotalFormulaFormula Quote_Amount * Applied_Commission_Rate
Commission_OverheadFormulaFormula Quote_Amount * 0.02 — always 2% to PPN regardless of referral or tapering
Commission_SplittableFormulaFormula Commission_Total - Commission_Overhead
Has_ReferralFormulaFormula IF(Referred_By_Supplier_Name != "PPN House", TRUE, FALSE) — uses local Lookup, not cross-table reference. Also surfaced as a Lookup on Payment_Schedules. Audit fix G-07.
Referral_Supplier_ShareFormulaFormula IF(Has_Referral, Commission_Splittable * 0.5, 0)
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 linked Payment_Schedules
Total_Commission_DueRollupSUM(Commission_Due) from linked Payment_Schedules
Total_Commission_ReceivedRollupSUM(Commission_Paid_Amount) from linked Payment_Schedules. Uses helper formula field (not conditional filter, which Airtable doesn't support). Audit fix G-11.
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
Has_ReferralLookupPulled from linked Quote. Required here because Airtable formulas cannot reference fields on a linked table directly — Referral_Share formula depends on this. Decision C-02 fix.
Applied_Commission_RateLookupPulled from linked Quote. Required here because Commission_Due formula references this value and Airtable formulas cannot reach across linked tables. Audit fix G-01.
Payment_TypeSingle SelectDeposit / Interim / Balance / Settlement
Due_DateDateComputed by Make from supplier timing selection at acceptance. See Open Decision I-04 for timing field design.
Payment_AmountCurrencyAmount of this instalment
Commission_DueFormulaFormula Payment_Amount * Applied_Commission_Rate — Applied_Commission_Rate is a local Lookup from linked Quote. Audit fix G-01.
Commission_OverheadFormulaFormula Payment_Amount * 0.02
Referral_ShareFormulaFormula IF(Has_Referral, (Commission_Due - Commission_Overhead) * 0.5, 0) — half of the splittable commission. Adapts to tapering rates automatically (at 10%: 4%, at 8%: 3%, at 6%: 2%, at 4%: 1%). Uses local fields only. Audit fix N-01.
PPN_NetFormulaFormula Commission_Due - Referral_Share
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
Commission_Paid_AmountFormulaFormula IF(Commission_Paid, Commission_Due, 0) — helper field for Quotes.Total_Commission_Received rollup. Airtable rollups cannot conditionally filter, so this formula zeroes out unpaid rows. Audit fix G-11.

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?
Introduction_DateDateDate the organiser was introduced to the supplier through PPN. Starts the 4-year protection clock. Decision S-07 / C-04 fix.
Protection_End_DateDate (or Formula)DATEADD(Introduction_Date, 4, 'years'). Make scheduled scenario (May and October) queries where Protection_End_Date is in the future for R5 email. Decision S-07 / C-04 fix.

Subscriptions

Monthly billing records. Net amount reduced by referral credits.
FieldTypeLogic / Description
Billing_IDFormulaPK "BIL-" & RECORD_ID()
SupplierLinked RecordFK → Suppliers
Period_StartDateBilling period start date. Audit fix N-06.
Period_EndDateBilling period end date. Audit fix N-06.
Gross_FeeCurrencyStandard subscription fee
Referral_Credits_AppliedCurrencyPulled from Supplier's referral credit balance for this billing cycle
Net_Amount_DueFormulaFormula Gross_Fee - Referral_Credits_Applied
Payment_StatusSingle SelectUnpaid / Paid / Overdue
Stripe_Customer_IDSingle LineStripe Customer ID for this supplier. Used to associate invoices and payments in Stripe. Decision S-12.
Stripe_Subscription_IDSingle LineStripe Subscription object ID if using recurring billing. Decision S-12.
Next_Billing_DateDateNext invoice due date. Set by Make when subscription is activated or renewed. Decision S-12.

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
Supplier_IDLookupVia Supplier link — Softr filter anchor. Required by Decision S-08. Audit fix G-04.
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

Supplier_Stock

One record per tent type per supplier. Layer 2 stub: structure only, no automation at launch. Decision S-19.
FieldTypeLogic / Description
Stock_IDFormulaPK "STK-" & RECORD_ID()
SupplierLinked RecordFK → Suppliers
Supplier_IDLookupVia Supplier link — Softr filter anchor
Tent_TypeSingle SelectBell Tent / Tipi / Yurt / Safari / Geodome / Shepherd Hut / Other
Tent_Size_mNumberDiameter in metres e.g. 4, 5, 6
Units_AvailableNumberTotal units of this type the supplier has
Persons_Per_Unit_FromNumberIdeal minimum occupancy per unit
Persons_Per_Unit_ToNumberIdeal maximum occupancy per unit
Beds_IncludedCheckbox
Bed_TypeSingle SelectReal / Inflatable / Both
Capacity_From_This_TypeFormulaFormula Units_Available * Persons_Per_Unit_From
Capacity_To_This_TypeFormulaFormula Units_Available * Persons_Per_Unit_To
NotesLong TextOptional notes about this stock line

[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
TownSingle LineNearest town/city. From Gibbs CSV. Useful for ops views and manual review. Decision S-04. Audit fix G-03.
CountySingle Linee.g. Gloucestershire, Greater London. Required for Named Counties matching — Events.Event_County is a Lookup pulling this field. Decision S-11. Audit fix G-03.
RegionSingle Linee.g. South West, London — for Named Regions matching and manual filtering. Events.Event_Region is a Lookup pulling this field.
CountrySingle LineEngland / Wales / Scotland / Northern Ireland. From Gibbs CSV. Decision S-04. Audit fix G-03.
02

Commission Structure

10% standard
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. Standard rate is 10% of each tranche. For repeat bookings under the 4-year tapering schedule (Decision B-02), Applied_Commission_Rate on each Quote is set by Make to 10% / 8% / 6% / 4% depending on the year since introduction. All formulas reference this field, not a hardcoded rate. Audit fix P-01.

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 = "Named Regions"
  → check Event_Region ∈ Supplier.Coverage_Regions
ELIF Coverage_Type = "Counties + Regions"
  → check Event_County ∈ Coverage_Counties
    OR Event_Region ∈ Coverage_Regions
ELIF Coverage_Type = "Miles Radius"
  → run Haversine, filter by Max_Range_Miles

Event_County and Event_Region are Lookup
fields on Events pulling from Outcode_Link.
Decision S-11.

◆ 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 <= Late_Threshold_Days,
  TRUE,
  FALSE
)

Days_Until_Event uses Event_Date (local Lookup).
Late_Threshold_Days is a local Lookup
from Supplier. Audit fixes G-08 / G-09.

◆ Is this a duplicate event?

Formula on Events + Make scenario

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

Falls back to Organiser_Name when
company is blank (e.g. private weddings).
Decision S-18. Audit fix G-14.

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(
  Referred_By_Supplier_Name != "PPN House",
  TRUE,
  FALSE
)

Referred_By_Supplier_Name is a local
Lookup (Event → Referred_By_Supplier).
Audit fix G-07.

◆ Quote overdue?

Formula on Quotes

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

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

Decision S-14: ITQ_Sent_At replaces
Submitted_At. Audit fix N-03.
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, Structure_CategoryAirtable
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, Structure_Category, 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_Total, Did_It_Happen Tally linkMake
11Did_It_Happen → YesInternalH2 — Commission Ready (Internal)Commission_Total, PPN_Net — ready to invoiceAirtable
12Did_It_Happen → Yes (+2 days)OrganiserH3 — Post-Event Satisfaction SurveyEvent_Name, Business_Name, Survey link (Tally)Make
13Honesty_Loop_Stage → EscalatedOrganiser + InternalH4 — Honesty Loop EscalationBusiness_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"
Limitation: if postcode is entered without a space, falls back to first 3 characters, which truncates 4-character outcodes (e.g. SW1A → SW1). Tally form validation enforces the space. Audit fix N-08.
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_Log, Supplier_StockSoftr 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. 6 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
  • Supplier_Stock table (Layer 2 stub — Decision S-19)
  • 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.