Files
gw-svelte/mail-api/__pycache__/main.cpython-314.pyc
T

2734 lines
339 KiB
Plaintext
Raw Normal View History

2026-05-04 20:32:24 +12:00
+
2026-07-04 10:00:16 +12:00
÷îBjDÌã"óêaERLEt,0t^RIt^RIt^RIHt^RIHt^RIt^RIH t ^RI
2026-05-04 20:32:24 +12:00
t
2026-07-04 10:00:16 +12:00
^RI t ^RI t ^RI
t
^RIt^RIt^RIt^RIHtHtHt^RIHt^RIHt^RIt^RIHtHtHt^R IHt^R
IH t ^R I!H"t"H#t#^R I$H%t%H&t&H't'H(t(^RI)t*^R
I+H,t,^RI-H.t/H0t0H1t1H2t2H3t3H4t4H5t5H6t6H7t7H8t8H9t9H:t;H<t<H=t=H>t>H?t?H@tAHBtBHCtCHDtDHEtEHFtFHGtHHItIHJtJHKtKHLtLHMtMHNtNHOtOHPtPHQtQHRtRHStSHTtUHVtVHWtWHXtX^RIYHZtZH[t[H\t\H]t]H^t^H_t_H`t`HataHbtbHctcHdtdHeteHftfHgtgHhthHitiHjtj]RRl4tk]!R]kR7tlRRltmRRltnRRltoRRltpRRltqRRltrR R!ltsR"R#lttR$R%ltuR&R'ltvR(R)ltwR*R+ltxR,R-ltyR.R/ltzR0R1lt{R2R3lt|R4R5lt}R6R7lt~]n!4s]^k]M'd6EP]MEP!4EP44/tƒ]^k/t„]^k/t…]^k]p!4s†]^k]r!4s‡]^k/tˆ]^k/t‰]^k]EP!4tRsŒ]^k]t!4s]^ kRsŽ]^
k]EP!4t]XEP !R8]!44R9R:ltR;R<lt“R=R>lt”R?R@lt•RARBltRCRDlt—RERFlt˜RGRHlt™RIRJltšRKRLltRMRNltœRORPltRQRRltžRSRTltŸRURVlt RWRXlt¡RYRZlt¢R[R\l!R]R^4t¤R_R`lt¥]lEPM]¤]JRa7]lEPM] ]§!]W4Rb7]lEPM]]§!]<4RcRd..ERMOReRfRg7]lEPQRh4RiRjl4t©RkRlltªRmRnlt«/t¬]^ k/t­]^ k]EP!4t®RoRplt¯RqRrlt°RsRtlt±RuRvlt²RwRxlt³RyRzlt´R{R|ltµR}R~lt¶RR€lt·RRlt¸R„lt¹R…R†ltºR‡Rˆlt»R‰lt¼Rlt½Rlt¾RRlt¿RRltÀERNR”R•lltÁRR—ltÂR˜R™ltÃRšRltÄRœRltÅRžltÆR ltÇR¢ltÈRetÉR¤tÊR¥ltËR§ltÌR©ltÍR«ltÎR­ltÏR¯ltÐR±ltÑR³R´ltÒRµltÓ]lER·4R¸l4tÕRºltÖR¼lt×R¾tØR¿tÙRÀtÚRÁtÛRÂtÜRÃtÝRÄRÅRÆRÅRÇ]Ø/lltÞRÊltßRÌltàRÎltáRÐRÑ]Ø RÒ2RÓRÔ]Ø RÕ2RÖR× RØ2RÙRÚ]Ø RÛ2RÜRÝRÞRÝRßRà]Ø Rá2RâRãRäRåRæRçRèRé/ tâRêRâRëRäRìRÐ/tã0EROm!Rî] 4tåRïltæRñltçRóltèRõR“RöR“R÷R“RøR“Rù]ÙRú]ÚRûR¤RüR“RýR¤/ RþRÿlltéRøR“/ERERlltêERERltëERERltìERPERERlltíERER ltîERQER
ER lltïER ER
2026-06-17 21:51:29 +12:00
ltðERERltñ]
2026-07-04 10:00:16 +12:00
E!ER4tó]lEER4ERERl4tõ]lEER4ERERl4tö]lEER4ERERl4t÷]lEER4ERERl4tø]lEER4ERERl4tùER /ER!ER bER"ER#bER$ER%bER&ER'bER(ER)bER*ER+bER,ER-bER.ER/bER0ER1bER2ER3bER4ER5bER6ER7bER8ER-bER9ER+bER:ER;bER<ER-bER=ER1bER>ER?ER@ER+ERAER-ERBR“ERCR“ERDEREERFERGERHERIERJERKERLR“ERMERNEROERP/ CERQ/ER!ERQbER"ERRbER$ERSbER&ERTbER(ERUbER*ERVbER,RÅbER.ERWbER0ERXbER2ERYbER4ERZbER6ER7bER8ER[bER9RÅbER:ER\bER<ER[bER=ER]bER>ER^ER@ERVERAER_ERBER`ERCERaERDERbERFERcERHERdERJEReERLERfERMERNEROERg/ CERh/ER!ERhbER"ERibER$ERjbER&ERkbER(ERlbER*ERmbER,ERnbER.ERobER0RÅbER2ERnbER4ERpbER6ERqbER8ERrbER9ERsbER:ERtbER<ERubER=ERnbER>ERvER@ERmERAERsERBERwERCERxERDERyERFERzERHER{ERJER|ERLER}ERMERNEROER~/ CER/ER!ERbER"ER€bER$ERbER&ERbER(ERƒbER*ER„bER,ER…bER.ER…bER0ER†bER2ER‡bER4ERˆbER6ER‰bER8ERŠbER9ER„bER:ERbER<ERŠbER=ER„bER>ERŒER@ER„ERAER‡ERBERERCERŽERDERERFERERHERERJERERLER“ERMERNEROER”/ CER•/ER!ER•bER"ERbER$ER—bER&ER˜bER(ER™bER*ER+bER,ER-bER.ERšbER0ERbER2ER3bER4ERZbER6ER7bER8ER-bER9ER+bER:ERœbER<ER-bER=ER+bER>ERER@ER+ERAER-ERBERžERCERŸERDER ERFER¡ERHER¢ERJER£ERLER¤ERMERNEROER¥/ C/tú]^
2026-05-19 23:36:58 +12:00
kER¦ER!ER¦ER"ER§ER¨ER©ERªR“ER«ER¬/ER­ER!ER­ER"ER®ER¨ER¯ERªER°ER«ER¯/ER±ER!ER±ER"ER²ER¨ER¬ERªER³ER«ER´/ERµER!ERµER"ER¶ER¨ER·ERªER¸ER«ER·/ER¹ER!ER¹ER"ERºER¨ER»ERªER¼ER«ER»/ER½ER!ER½ER"ER¾ER¨ER¿ERªERÀER«ER¿/ERÁER!ERÁER"ERÂER¨ERÃERªERÄER«ERÃ/ERÅER!ERÅER"ERÆER¨ERÇERªERÈER«ERÇ//tû]^kEEltüEEltýEEltþERREElltÿERSEEllEt]lEERÓ4EEl4Et]lEERÖ4ER×El4Et]lEERÙ4EEl4Et]lEERÜ4EEl4Et]lEERß4EEl4Et]lEERâ4EEl4Et]lEERå4EEl4Et]lEERè4EEl4Et]lEERë4EEl4Et ]lEERî4EEl4Et
]lEERñ4EEl4Et ]lEERô4EEl4Et ]lEER÷4EEl4Et
2026-07-04 10:00:16 +12:00
]lEERú4EEl4Et]lEERý4EERÿl4Et]lEER4ERERl4Et]lEER4ERERl4Et]lEER4ERERl4Et]lEER 4ER
2026-05-19 23:36:58 +12:00
ER l4Et]lEER 4ER
2026-07-04 10:00:16 +12:00
ERl4Et]lEER4ERERl4EtERERlEtERERlEtERRERRERR/ERERllEtERTERERllEtERR/ERERllEtERER lEtER!ER"lEt]lEER#4ER$ER%l4EtER&ER'lEt]lEER(4ER)ER*l4Et]lEER+4ER,ER-l4Et ]lEER.4ER/ER0l4Et!]lEER14ER2ER3l4Et"]lEER44ER5ER6l4Et#]lEER74ER8ER9l4Et$]lEER:4ER;ER<l4Et%]lEER=4ER>ER?l4Et&ER@ERAlEt'ERBERClEt(ERDERElEt)]lEERF4ERGERHl4Et*]lEERI4ERJERKl4Et+R#(UéN)Údeque)Úasynccontextmanager)Ú
2026-05-19 23:36:58 +12:00
HTMLParser)ÚdatetimeÚ timedeltaÚtimezone)ÚPath)ÚAny)ÚFastAPIÚ
HTTPExceptionÚRequest)ÚCORSMiddleware)ÚTrustedHostMiddleware)Ú JSONResponseÚResponse)ÚASGIAppÚReceiveÚScopeÚSend)Úmyob)&ÚALLOWED_EMAILS_FILEÚ APP_VERSIONÚAUTH_CODE_MAX_ATTEMPTSÚAUTH_CODE_REQUESTS_PER_HOURÚAUTH_CODE_TTL_SECONDSÚAUTH_IP_BLOCK_DURATIONÚAUTH_IP_FAILURE_WINDOWÚAUTH_IP_MAX_FAILURESÚAUTH_SESSION_TTL_SECONDSÚBIRTHDAY_CHECK_INTERVAL_SECONDSÚ
CLIENT_BCCÚCLIENT_PROFILES_FILEÚCORS_ALLOWED_ORIGINSÚCP_ADMIN_EMAILSÚDEPLOY_SMOKE_SECRETÚDEV_MODEÚ DRAFTS_FILEÚEMAIL_SEND_TIMEOUT_SECONDSÚENABLE_GENERAL_ENQUIRIESÚFORM_MAX_SECONDSÚFORM_MIN_SECONDSÚ
FROM_EMAILÚLEGACY_SEED_FILEÚLOGO_URLÚMAX_REQUEST_BODY_BYTESÚMAX_SEND_ATTEMPTSÚ OWNER_BCCÚ OWNER_EMAILÚRATE_LIMIT_MAX_PER_EMAILÚRATE_LIMIT_MAX_PER_IPÚRATE_LIMIT_MIN_INTERVAL_SECONDSÚRATE_LIMIT_WINDOW_SECONDSÚREPLY_TOÚ SCHEDULED_CHECK_INTERVAL_SECONDSÚSCHEDULED_EMAILS_FILEÚSTARTUP_TEST_RECIPIENTÚ
TRUSTED_HOSTSÚlogger)ÚBaseSubmissionÚBirthdayAutoSendRequestÚBirthdayEmailRequestÚClientDogUpsertRequestÚClientProfileUpdateÚBookingSubmissionÚClientStatusUpdateÚContractSubmissionÚDeleteClientRequestÚNewClientRequestÚOnboardingSubmissionÚRenderMessageRequestÚResetOnboardingRequestÚScheduledEmailCancelRequestÚScheduledEmailRescheduleRequestÚSendMessageRequestÚWelcomePackEmailRequestcó$V^8„dQhR\/#)éÚapp)r )Úformats"Ú3C:\Users\mattc\gw-svelte\gw-svelte\mail-api\main.pyÚ __annotate__rSYs÷ñcóš"\4GRjxL
2026-07-04 10:00:16 +12:00
R5x\4GRjxL
2026-05-19 23:36:58 +12:00
R#LL \4GRjxL
i;i5i©N)Ú_startup_mail_checkÚ_shutdown_background_tasks)rPs&rRÚ _lifespanrYXs<éä
Ó
×Ðð
2026-07-04 10:00:16 +12:00
ä ñ +øÔ*×*üs<A /A 3
A ¨1©A ±A ³AÁAÁAÁA zGoodWalk Mail API)ÚtitleÚlifespancó4V^8„dQhR\R\RR/#)rOÚpathÚpayloadÚreturnN)r Úobject)rQs"rRrSrSes!÷
ñ
œ$ð
¬ð
°Dñ
rTcóTVPPRRR7VPVPR,4pVP \
2026-06-17 21:51:29 +12:00
P !V^R7RR7\P!VR4\P!W 4R# \dL%i;i) zÊAtomically write a JSON file and chmod it owner-only (0600).
2026-07-04 10:00:16 +12:00
2026-05-19 23:36:58 +12:00
The chmod is best-effort: it is a no-op on Windows, but on the Linux
Docker host it ensures the file with PII is unreadable by other users.
T)ÚparentsÚexist_okz.tmp)Úindentúutf-8©Úencodingi€N) ÚparentÚmkdirÚ with_suffixÚsuffixÚ
write_textÚjsonÚdumpsÚosÚchmodÚOSErrorÚreplace)r]r^Útmps&& rRÚ_write_pii_jsonrtes„ð  ‡Kјd¨TÐÔ
×
Ñ
˜4Ÿ;™;¨Õ
2026-07-04 10:00:16 +12:00
0€C؇NN”4—:’:˜g¨aÔ0¸7€NÔ
2026-05-19 23:36:58 +12:00
Ü
Šô‡J‚JˆsÖøô ô
2026-07-04 10:00:16 +12:00
Ù ð
úsÁ*B B'Â&B'có:V^8„dQhR\\,/#©rOr_©ÚsetÚstr)rQs"rRrSrSus÷ñ¬¬C­ñrTcó0\PPRR4PR4Uu0uF8qP 4'gKVP 4P 4kK: pp\ P!4'dT\P!\ P!RR74pVPRVPR.444V#uupi \d#p\P!RT4Rp?T#Rp?ii;i) ÚALLOWED_EMAILSÚÚ,rerfc3ór"TF-p\V\4'gKVP4xK/ R#5irV©Ú
2026-05-19 23:36:58 +12:00
isinstanceryÚlower©Ú.0Úes& rRÚ <genexpr>Ú1_load_allowed_emails_from_file.<locals>.<genexpr>zs'éÐXÑ+A aÄZÐPQÔSV×EWœ ˜ŸŸ ˜ Ó+Aùó7Ÿ7Úemailsz&Could not load allowed_emails file: %sN)roÚenvironÚgetÚsplitÚstriprÚ_ALLOWED_EMAILS_FILEÚexistsrmÚloadsÚ read_textÚupdateÚ Exceptionr<Úwarning)r„ÚseedÚdataÚexcs rRÚ_load_allowed_emails_from_filer—uÜ')§z¡z§~¡~Ð6FÈÓ'K×'QÑ'QÐRUÔ'VÓ dÑ'V !×ZaÑZa×ZcÔ ˆAG‰GIO‰OÖ Ñ'V€DÐ FÜ × &× —:2×<ÀgÔOˆ K‰KÑX¨4¯8©8°H¸bÔ+AÓ  €Kùò eøô
ôFÜŠÐ× €KûðFús$²C#Á"C#Á3A.C(Ã( DÃ3DÄDcó>V^8„dQhR\\,RR/#)rOrˆr_Nrw)rQs"rRrSrSs"÷FñF¤c¬#¥hðF°4ñFrTcóž\\R\V4/4R# \d#p\P
!RT4Rp?R#Rp?ii;i)rˆz&Could not save allowed_emails file: %sN)rtrÚsortedrr<r“)rˆrs& rRÚ_save_allowed_emails_filers@ðFÜÔ,¨x¼À»Ð.HÖIøÜ ôFÜŠÐ×EûðFúsŸ A ªAÁA cóFV^8„dQhR\\\3,/#rv©Údictry)rQs"rRrSrSs÷ñ¬¬c´4¨i­ñrTcóö\P!4'd,\P!\P!RR74#/# \
d#p\ P!RT4Rp?/#Rp?ii;i)rerfz'Could not load client_profiles file: %sN)Ú_CLIENT_PROFILES_FILErŽrmrrrr<r“©rs rRÚ_load_client_profiles_from_filer¢siðGÜ × '× —:3×=ÀwÔ   €Iøô ôGÜŠÐ@À#×
2026-07-04 10:00:16 +12:00
€IûðGúóA *A Á A8ÁA3Á3A8có(V^8„dQhR\RR/#)rOÚprofilesr_)rQs"rRrSrSs÷GñG¬ðG°$ñGrTcóˆ\\V4R# \d#p\P!RT4Rp?R#Rp?ii;i)z'Could not save client_profiles file: %sN)rtr rr<r“)rs& rRÚ_save_client_profiles_filer¨s7ðGÜÔ-¨xÖ8øÜ ôGÜŠÐ@À#×FûðGúó AŸ<¼Acó$V^8„dQhR\/#rv)rQs"rRrSrSs÷ñ¤ñrTcóö\P!4'd,\P!\P!RR74#/# \
d#p\ P!RT4Rp?/#Rp?ii;i)rerfzCould not load drafts file: %sN)Ú _DRAFTS_FILErŽrmrrrr<r“s rRÚ_load_drafts_from_filer­seð × Ò × Ò Ü—:’:œl×4¸gÔ   €Iøô ôŠÐ×
€Iûð>úr£có(V^8„dQhR\RR/#)rOÚdraftsr_Nr¦)rQs"rRrSrS s÷>œdð> >rTcóˆ\\V4R# \d#p\P!RT4Rp?R#Rp?ii;i)zCould not save drafts file: %sN)rtrr<r“)rs& rRÚ_save_drafts_filer± s3𜠠-øÜ ôŠÐ7¸×=ûð>úr©cóFV^8„dQhR\\\3,/#rvr)rQs"rRrSrS§s÷ñ¬$¬s´D¨y­/ñrTcó$\P!4'dD\P!\P!RR74p\ V\ 4'dV#/# \d#p\P!RT4Rp?/#Rp?ii;i)rerfz(Could not load scheduled_emails file: %sN)
2026-05-18 22:25:43 +12:00
Ú_SCHEDULED_EMAILS_FILErŽrmrrr€rr<r“)r•rs rRÚ _load_scheduled_emails_from_filerµ§suðHÜ —:4×ÔQˆ˜$¤× ð €Iøô ôHÜŠÐAÀ3×
€IûðHúsA"AA"Á" BÁ-B
Â
Bcó(V^8„dQhR\RR/#)rOÚ scheduledr_Nr¦)rQs"rRrSrS²s÷HñH¬4ðH°DñHrTcóˆ\\V4R# \d#p\P!RT4Rp?R#Rp?ii;i)z(Could not save scheduled_emails file: %sN)rtr´rr<r“)rs& rRÚ_save_scheduled_emails_filer¹²s7ðHÜÔ.° Ö:øÜ ôHÜŠÐAÀ3×GûðHúr©cóV^8„dQhRR/#©rOr_)rQs"rRrSrS¹s÷ Eñ E¨4ñ ErTcƒóh"\P!4p\P4UUu/uF wrVPR^4V8”gKWbK" ppp\P
!RV4GRjxL
R#uuppiL \ d#p\P!RT4Rp?R#Rp?ii;i5i)Persist live sessions to admin_kv so they survive container restarts.
Snapshot filters out expired entries before writing. Best-effort —
2026-05-19 23:36:58 +12:00
failure is logged but does not block the auth flow (memory remains
2026-05-18 22:25:43 +12:00
authoritative for the current process).
Ú
expires_atÚactive_sessionsNz%Could not persist active_sessions: %s) ÚtimeÚ_active_sessionsÚitemsrŠÚadmin_dbÚset_kvrr<r“)ÚnowÚtokÚsnapshotrs rRÚ_save_active_sessions_asyncrɹséô )Š)+€CÜ%5×%;Ñ%;Ô%=Ô^Ñ%=™6˜ÇÁÀ|ÐUVÓAWÐZ]ÑA]”Ñ%=€HÑEÜoŠoÐÓ:ùó_á:øÜ ôEÜŠÐ×DûðEüsR-B2¯A:ÁA:ÁB2ÁBÁ3BÁ4BÁ8B2ÂB B/Â
B*Â$B2Â*B/Â/B2cóFV^8„dQhR\\\3,/#rvr)rQs"rRrSrSÈs÷ñ¬4´´T° ­?ñrTc ƒó@"\P!4'g/#\P!R4GRjxL
p\V\4'g/#\
P
!4pVP
4UUu/uF\wr#\V\4'gK\VPR4\\34'gKJVR,V8”gKZW#bK^ upp#Lªuuppi \d$p\P!RT4/uRp?#Rp?ii;i5i)r¿Nr¾z0Could not load active_sessions from admin_kv: %s)
2026-07-04 10:00:16 +12:00
Ú
2026-05-18 22:25:43 +12:00
is_enabledÚget_kvr€ÚintÚfloatrr<r“)r•rs rRÚ_load_active_sessions_asyncrÐÈéÜ × Ò × Ò Øˆ ð Ü—_’_Ð%6Óܘ$¤×ˆIÜiŠi‹kˆðŸ*™*œ,ô
2026-07-04 10:00:16 +12:00
á&ܘ!œT×
2026-06-17 21:51:29 +12:00
ä'1°!·%±%¸ Ó2EÌÌUÀ|×'Tô
àYZÐ[gÕYhÐknÑYnô
ˆCŠFÙ
ð
ñ 8ùó
øô
ôÜŠÐIÈ3Ô ûðüstD¡C-ºC%»C-ÁDÁ(C-Á?C'Â(C'Ã C'ÃC'Ã!C-Ã$DÃ%C-Ã'C-Ã- DÃ8DÄDÄDÄDÄDcó4V^8„dQhR\R\RR/#)rOÚkeyÚvaluer_ryr
)rQs"rRrSrSÚs&÷gñg¤Cðg´ðg¸ñgrTcƒó°"\P!W4GRjxL
R#L \d#p\P!RY4Rp?R#Rp?ii;i5i)zHWrite a single admin_kv blob to postgres when the database is available.NzBPostgres persist (%s) failed; JSON copy is still authoritative: %s)rr<r“)rs&& rRÚ_persist_admin_staterÖÚsAéðgÜoŠo˜cÓ)øÜ ôgÜŠÐ[Ð]`×fûðgüs6A&$ž&¢A¤&¦ A±AÁAÁAÁAcóV^8„dQhRR/#)rQs"rRrSrSâs÷""?°Tñ"?rTc ƒóŠ"\PPRR4;'gRP4P 4pVR8XdR#\
P !4'gR#VR8Xd&\
P!4GRjxL
'dR#\4p\\44p\4pV'gV'g V'gR#V'd \
2026-07-04 10:00:16 +12:00
P!RV4GRjxL
2026-06-17 21:51:29 +12:00
V'd"\
P!RRV/4GRjxL
2026-07-04 10:00:16 +12:00
V'd \
P!RV4GRjxL
\P!R V\V4\V4\V44R#LLfLA \ d#p\P"!R
T4Rp?R#Rp?ii;i5i) a`Seed admin_kv from the JSON files on disk.
2026-05-19 23:36:58 +12:00
Controlled by ADMIN_DATA_SEED_FROM_JSON:
- "never": do nothing
- "auto": seed only when admin_kv has no rows yet (default, safe on every boot)
- "force": overwrite postgres with whatever the JSON files currently hold
2026-07-04 10:00:16 +12:00
The deployer exposes -SeedAdminData which sets this to "force" for one boot.
ÚADMIN_DATA_SEED_FROM_JSONÚautoÚneverNÚclient_profilesÚallowed_emailsrˆzCSeeded admin_kv from JSON (mode=%s): clients=%d emails=%d drafts=%dzAdmin seed from JSON failed: %s)ror‰rÚ
has_any_valuer¢r—r­r<ÚinfoÚlenrr“)ÚmodeÚ seed_clientsÚ seed_emailsÚ seed_draftsrs rRÚ%_seed_admin_state_from_json_if_neededråâsAéô
2026-05-18 22:25:43 +12:00
J‰JN‰NÐÓ ?× IÀ6× Z€DØ ˆw„ÙÜ × Ò × Ò Ùð 6Œ>¤H×$:Ò$:Ó$<× Ü8ˆ ÜÔ Ü ß§K¿ Ù ß Ü—/’/Ð"3°\ÓB× Ü—//Ð"2°X¸{Ð4KÓL× Ü—/’/ (¨KÓ  Š Ø ”##¤S¨Ó%5´s¸;Ó7Gö
ñ
Cá 8øô
2026-07-04 10:00:16 +12:00
ôŠÐ8¸#×>ûð?üs®A*GÁ-GÁ0FÂF Â FÂGÂ6FÃFÃGÃFÃ%FÃ?F
2026-05-19 23:36:58 +12:00
Ä FÄ FÄ(FÄ) FÄ5FÅFÅ9FÆ GÆ FÆ
2026-05-18 22:25:43 +12:00
FÆFÆFÆ GÆF;Æ5GÆ;GÇGcóV^8„dQhRR/#)rQs"rRrSrSs÷=ñ=¨Tñ=rTcƒóÚ"\pVP4'gR#\P!VP RR74p\T\4'd T'gR#.p^pTP4wrV\T\4'd\T\4'gK3TP4P4pT'gK[T\P!4P48XdK…T\9d T^,
2026-05-19 23:36:58 +12:00
pKT\T&TP!T4 T'g$\ P"!RT\%T44R#\\4p\&P(!\*T4GRjxL
\-RT4GRjxL
2026-07-04 10:00:16 +12:00
\ P"!R \%T4T\%\44R# \
d#p\ P!RY4Rp?R#Rp?ii;iLz \
2026-05-19 23:36:58 +12:00
d"p\ P!RT4Rp?LŸRp?ii;iL \
2026-07-04 10:00:16 +12:00
d"p\ P!RT4Rp?L»Rp?ii;i5i)
2026-06-17 21:51:29 +12:00
aEMerge the shipped legacy-clients-seed.json into _client_profiles.
2026-07-04 10:00:16 +12:00
Add-only: never overwrites an email that already exists in the live data.
Idempotent: re-running on every boot is a no-op once the entries are in.
Writes the updated profiles back to the JSON file + admin_kv so the merged
state survives container restarts.
Nrerfz$Legacy seed file unreadable (%s): %sz8Legacy seed already merged (existing=%d, candidates=%d).z5Could not save client_profiles after legacy merge: %srÜzDCould not persist client_profiles to postgres after legacy merge: %sz?Legacy seed merged: added=%d skipped_existing=%d total_after=%d)Ú_LEGACY_SEED_FILErŽrmrrrr<r“r€ryrr2Ú_client_profilesÚappendrßÚasyncioÚ to_threadr¨) Ú seed_pathr”rÚaddedÚskipped_existingÚ raw_emailÚprofileÚemailrÈs rRÚ_merge_legacy_seed_if_presentróéô"€IØ × Ñ × Ò ÙðÜzŠz˜)×-°wÐô
dœD× Ùà€EØÐà"Ÿj™jžlш ܘ)¤S׸GÄT×1JÒ1JÙ ØÓ!×)ˆßÙ Ø ”K× Ø Ô  Õ Ù Ø")Ô˜ÑØ
ñ Ü Š Ø œc $›iô
ñ äÔ%€HðUÜ×ÒÔ :¸HÓE×dÜ"Ð#4°hÓ?× ‡K‚KØ ˆE‹
Ð$¤cÔ*:Ó&;öøôS ôÜŠÐ=¸yÔûðúñB FøÜ ôUÜŠÐNÐPS×TûðUúñ @øÜ ôdÜŠÐ]Ð_b×cûðdüs´I+¢&GÁI+Á&A.I+ÃA'I+Ä=2I+Å0H ÆH ÆH ÆH<Æ#H:Æ$H<Æ(1I+Ç HÇ$HÇ;I+ÈHÈI+È H È H7ÈH2È-I+È2H7È7I+È:H<È< I(ÉI#ÉI+É#I(É(I+có:V^8„dQhR\\,/#rvrw)rQs"rRrSrSGs÷  ,¬#¬c­ ,rTcƒó0"\P!4'\P!R4GRjxL
p\V\4'd´VP R.4p\V\ 4'\PP RR4PR4Uu0uF8q"P4'gKVP4P4kK: ppVPRV44V#\4#L×uupi5i)Nrˆr{r|r}c3ór"TF-p\V\4'gKVP4xK/ R#5irVrrs& rRr…Ú-_load_allowed_emails_async.<locals>.<genexpr>Ns#éÐL©v¨!¼ÀAÄs×9KœI˜AŸG™GŸI˜I«vùr‡)r€Úlistror‰rrrr—)r•rˆr„r”s rRÚ_load_allowed_emails_asyncrùGéÜ×Ò×ÒÜ—_’_Ð%5ÓÜ dœD× —X‘X˜Ó+ˆ˜&¤$×'Ü35·:±:·>±>ÐBRÐTVÓ3W×3]Ñ3]Ð^aÔ3bÓpÑ3b¨a×fmÑfm×foÔŸ› ŸÖ)Ñ3bÐ ÑL©vÓ Ü 7ùòqùs(5D·D¸A3DÂ+DÃ"DÃ)'DÄDcóFV^8„dQhR\\\3,/#rvr)rQs"rRrSrSSs÷-¬4´´­-rTcƒóÄ"\P!4'd7\P!R4GRjxL
p\V\4'dV#\ 4#L&5i)N)r€©r•s rRÚ_load_client_profiles_asyncrýSsFéÜ×Ò×ÒÜ—_’_Ð%6ÓÜ dœD× ˆKÜ 8ùó5A ·A¸'A có$V^8„dQhR\/#rv)rQs"rRrSrS[s÷$¤$ñ$rTcƒóÄ"\P!4'd7\P!R4GRjxL
p\V\4'dV#\ 4#L&5i)N)r€r­s rRÚ_load_drafts_asyncr[sEéÜ×Ò×ÒÜ—_’_ XÓÜ dœD× ˆKÜ /ùrþcóFV^8„dQhR\\\3,/#rvr)rQs"rRrSrScs÷.¬D´´­.rTcƒóÄ"\P!4'd7\P!R4GRjxL
p\V\4'dV#\ 4#L&5i)Úscheduled_emailsN)r€s rRÚ_load_scheduled_emails_asyncrcsFéÜ×Ò×ÒÜ—_’_Ð%7ÓÜ dœD× ˆKÜ 9ùrþz Auth: loaded %d allowed email(s)có0V^8„dQhR\R\/#©rOÚrequestr_©r
ry)rQs"rRrSrSs÷ ñ ¬'ð ´ rTcƒó,"VPPRR4pVPR4P4pV'g\ RRR7h\
;_uu_4GRjxL
\ PV4pV'g\ RRR7h\P!4VR,8”d$\ PVR4\ RR R7hVR
,uuRRR4GRjxL
#LL +GRjxL
'giR#;i5i) Ú
Authorizationr|úBearer izNo token provided.©Ú status_codeÚdetailNzInvalid session.r¾z&Session expired. Please sign in again.rò) ÚheadersrŠÚ removeprefixrŒr Ú
_auth_lockrÁÚpop)rÚ auth_headerÚtokenÚsessions& rRÚ_require_session_emailr騗/‘/×% o°rÓ:€KØ × $ YÓ 7€Eç ܨÐ4HÔzŽzÜ"×& -ˆßܨCÐ8JÔ 9Š9‹;˜ Õ × Ñ  ¨Ô ¨CÐ8`Ô ÷zzzzzˆzüsOA#DÁ%C3Á&DÁ)A7C7Ã
2026-07-04 10:00:16 +12:00
DÃ-C5Ã.DÃ5DÃ7D Ã=DÃ>
D Ä D Ä Dcó0V^8„dQhR\R\/#rr )rQs"rRrSrSs÷ñ¬ð´CñrTcƒóh"\V4GRjxL
pV\9d\RRR7hV#L5i)Né“zOwner access required.r
)rr$r )rs& rRÚ_require_owner_emailrs2éÜÓ 1€EØ ”OÔ¨Ð4LÔ €Lñ
2ùs 202có(V^8„dQhR\RR/#)rOr_ry)rQs"rRrSrSs÷
2026-06-17 21:51:29 +12:00
Nñ
N¤ð
2026-07-04 10:00:16 +12:00
N¨ñ
2026-06-17 21:51:29 +12:00
NrTcƒó"VP4P4pV'gR#\;_uu_4GRjxL
V\9d\P V4\ \4p\ P!\\\44GRjxL
\RRV/4GRjxL
\P!RV4RRR4GRjxL
R#LEL1L +GRjxL
2026-07-04 10:00:16 +12:00
'giR#;i5i)NrÝrˆz&Auth: registered new allowed email: %s)
2026-06-17 21:51:29 +12:00
rrÚ_allowed_emailsÚaddršrrxr<)Ú
normalizedrÈs& rRÚ_register_emailr"éØ×&€Jß ÙßzŽzØ œ_Ô × Ñ  
Ô œoÓ.ˆHÜ×#Ô$=¼sÄ?Ó?SÓT× &Ð'7¸(ÀHÐ9MÓN× KŠKÐ@À*Ô
2026-07-04 10:00:16 +12:00
z
UÙ zzzüsp;D½C ¾DÁAC(ÂC"ÂC(Â2C$Â3C(Ã DÃC&ÃDÃ"C(Ã$C(Ã&DÃ(D Ã.C1Ã/
D Ã:D Ã< Dcó0V^8„dQhR\R\/#©rOr_)Úbool)rQs"rRrSrS¦s÷DñD¤$ðD¬4ñDrTcó|VPR4p\V\4'gR#VPR4R9#)z—True if outreach (welcome pack, birthday email, etc.) should still target
2026-06-17 21:51:29 +12:00
this client. Excludes lifecycle states that mean the relationship has ended.
Ú lifecycleTÚstatus>ÚarchivedÚ cancelled)r€)r's& rRÚ_client_is_reachabler+¦s7ð ˜KÓ(€IÜ × Ø =‰=˜Ó "Ð*CÑ CrTcó0V^8„dQhR\R\/#©rOr_r)rQs"rRrSrS°s÷1”Sð1œSñ1rTcó\P!RRT;'gRP4P44PR4pT;'g*R\P
!4P R, 2#)ú
[^a-z0-9]+Ú-r|zdog-ºNéN)ÚreÚsubrŒrÚuuidÚuuid4Úhex)Úslugs& rRÚ _dog_slugr9°s^Ü
2026-07-04 10:00:16 +12:00
6Š6-  u§{ ×&9Ñ&9Ó&;×&AÑ&AÓ&CÓ D× JÈ3Ó O€DØ × 0Tœ$Ÿ*š*›,×*¨2Õ0rTcó`V^8„dQhR\R\\\3,R,/#)rOÚrawr_N)r
ry)rQs"rRrSrSµs'÷ñ¤cð¬d´3¼°8­n¸tÕ.CñrTcó\V\4'gR#\VPR4;'gVPR4;'gR4P 4p\VPR4;'gVPR4;'gR4P 4p\VPR4;'gVPR4;'gR4P 4pV'gV'g V'gR#\VPR4;'gVPR 4;'gR4P 4;'g \ T;'g
T;'gT4pRTRTRTRTR
\
VPR
44R \VPR 4;'gR4P 4R \VPR 4;'gR4P 4/#)
nameÚdogNamer|ÚbreedÚdogBreedÚ birthDateÚdogAgeÚidÚdogIdÚbirthdayAutoSendÚbirthdayEmailLastSentAtÚbirthdayEmailLastSentYear)r€ryr9r%)r;r=r?Ú
2026-06-17 21:51:29 +12:00
birth_dateÚdog_ids& rRÚ_normalize_profile_dog_entryrJµÜ cœ4× Ò ÙÜ ˆsw‰wv×: #§'¡'¨)Ó"4×:¸Ó ;× C€DÜ ˜Ó ×= C§G¡G¨JÓ$7×=¸ >× F€EÜS—WW˜[Ó)×D¨S¯W©W°XÓ->×DÀ"ÓE×M€Jß Ÿ§jÙÜ
˜×8 #§'¡'¨'Ó"2×8°bÓ
9×
2026-07-04 10:00:16 +12:00
A×
kÄYÈt×OjÐOjÐW\×OjÐOjÐ`jÓEk€Fà ˆØØœD §¡Ð);Ó!<Ó!¤3 s§w¡wÐ/HÓ'I×'OÐ'OÈRÓ#P×#VÑ#VÓ#XØ#¤S¨¯©Ð1LÓ)M×)SÐ)SÐQSÓ%T×%ZÑ%ZÓ%\ð ðrTcóŠV^8„dQhR\\\3,R\\\\3,,/#r$©ryr
)rQs"rRrSrSÉs/÷&œt¤C¬ H&´$´t¼CĸHµ~Õ2Fñ&rTcó2VPR4p.p\4p\V\4'dVVFOp\ V4pV'dVR,V9dK&VP VR,4VP
V4KQ V'dV#\ RRRVPRR4RVPRR4RVPR R4R
VPR
R 4R VPR R4R
VPR
R4/4pV'dV.#.#)ÚdogsrCÚprimaryr=r>r|r?r@rArBrEFrFrG)rxr€rJr )Úraw_dogsrNÚseen_idsr;ÚdogÚlegacys& rRÚ_get_profile_dogsrTÉØ{‰{˜"€HØ!#€DÜ€HÜ(œD׈CÜ.¨sÓ3ˆCߘ#˜d) xÔØ L‰L˜˜TÔ K‰K˜Ö ñ ÷  ؈ ä
2026-06-17 21:51:29 +12:00
 G—KK  ¨2Ó W—[‘[ ¨RÓ ˜Ÿ X¨rÓ  § ¡ Ð,>ÀÓ FØ % w§{¡{Ð3LÈbÓ'QØ ¯©Ð5PÐRTÓ)Uð
2026-07-04 10:00:16 +12:00
ó
2026-06-17 21:51:29 +12:00
€F÷ˆFˆ% %rTcó¸V^8„dQhR\\\3,R\\\\3,,R\\\3,/#)rOrNr_rL)rQs"rRrSrSåsC÷ñ¤¤c¬3 h¥ð´t¼DÄÄcÀ½NÕ7KðÔPTÔUXÔZ]ÐU]ÕP^ñrTcób\V4pV'dd.p\4pVFOp\V4pV'dVR,V9dK&VPVR,4VP V4KQ TpV'dV^,pWR&VP RR4VR&VP RR4VR&VP RR4VR&\
2026-07-04 10:00:16 +12:00
VP R 44VR &VP R
2026-06-17 21:51:29 +12:00
R4VR
&VP R R4VR &V#R
FpVPVR 4K V#)rCrNr=r|r>r?r@rArBrErFrGN)rNr>r@rBrErFrG)rxrJr r%r) rñrNÚ next_profileÚnormalized_dogsrQr;rRrOs && rRÚ_apply_profile_dogsrYås/ܘ“=€Lß ØˆÜ ›UˆÛˆCÜ.¨sÓ3ˆCߘ#˜d) xÔØ L‰L˜˜TÔ × "  ð ˆç Øq•'ˆØ#Ø")§+¡+¨f°bÓ"9ˆ Ø#*§;¡;¨w¸Ó#;ˆ  Ø!(§¡¨[¸"Ó!=ˆ Ü+/°· ± Ð<NÓ0OÓ+Pˆ Ð(Ø29·+±+Ð>WÐY[Ó2\ˆ Ð/Ø4;·K±KÐ@[Ð]_Ó4`ˆ Ð
ÐóIˆCØ × Ñ ˜S  Ið ÐrTcó¢V^8„dQhR\\\3,R\\\3,R\\\3,/#)rOÚexistingÚupdatesr_©ryr
)rQs"rRrSrSsC÷kñk¤D¬¬c¨¥Nðk¼TÄ#ÄsÀ(½^ðkÔPTÔUXÔZ]ÐU]ÕP^ñkrTcóv/VCVCP4UUu/uF,wr#VfK \V\4'd
VR8XdK*W#bK. pppRV9dG\T\VP R4\
4'dVP R44#.4#0RmpVP
VP44'EdJ\V4pV'd\V^,4MR R
/p\VP RR44P4VR &\VP RR44P4VR &\VP RR44P4VR
&\VP R44VR&\VP RR44P4VR&\VP RR44P4VR&V'dV.VR,,MV.p\WH4#\V4'd\V\V44#T#uuppi)Nr|rNr>r@rBrErFrGrCrOr=r?rANN>rBr>r@rErFrG) r€ryrYÚ intersectionÚkeysrTr%) r[r\ÚmergedÚdog_related_keysrNrOÚ next_dogss && rRÚ_merge_client_profilergð,+ 7Ðá3‰DˆAØ ô
ä",¨Q´×"4Ò"4¸¸ô
ˆŠÙ ñð ÔÜ" 6Ä*ÈWÏ[É[ÐY_ÓM`Ôbf×BgÒBg¨7¯;©;°vÓ+>ÓpÐmoÓEÐØ×$ W§\¡\£^×  Ó*ˆß#'”$t˜A•w”-¨d°IÐ->ˆÜ˜fŸj™j¨°BÓ8×@ˆÜ˜vŸz™z¨*°bÓBˆÑÜ" 6§:¡:¨h¸Ó#;Ó<×Dˆ ÑÜ&*¨6¯:©:Ð6HÓ+IÓ&JˆÐ#Ü-0°·±Ð<UÐWYÓ1ZÓ-[×-aÑ-aÓ-cˆÐ*Ü/2°6·:±:Ð>YÐ[]Ó3^Ó/_×/eÑ/eÓ/gˆÐ,ß,0WI  Ö(°w°iˆ Ü" 5äEVÐW]×E^ÒE^Ô ˜vÔ'8¸Ó'@Ó jÐdjÐjùó-s˜H5¥H5ÁH5cóœV^8„dQhR\\\3,R\R,R\\\3,R,/#)rOrINr_r])rQs"rRrSrSs<÷ ñ œt¤C¬ H ´s¸Tµzð ÄdÌ3ÔPSÈ8ÅnÐW[ÕF[ñ rTcó˜\V4pV'gR#V'g
V^,#VFpVPR4V8XgKVu# R#)NrC)rT)rIrNrRs&& rRÚ_get_selected_dogrjsBÜ ˜WÓ %€Dß Ùß ØAÛˆØ 7‰74=˜FÖ ŠJññ rTcó4V^8„dQhR\R\RR/#)rOr_ry)rQs"rRrSrS(s&÷ Dñ D¤sð D´ D¸ DrTcƒóâ"VP4P4pV'gR#\;_uu_4GRjxL
\P V/4p\ W14pWC8wdPV\V&\
\4p\P!\V4GRjxL
\RV4GRjxL
RRR4GRjxL
R#L,LL +GRjxL
2026-07-04 10:00:16 +12:00
'giR#;i5i)NrÜ) rrrg)r!r[rds&& rRÚ_store_client_profilern(éØ×&€Jß ÙßzŽzÜ#×
°BÓ7ˆÜ& xÓØ Ô Ø+1Ô ˜ZÑ Ô-ˆHÜ×#Ô$>ÀÓI× &Ð'8¸C× z
JÙ zzzüsp;C/½C
¾C/ÁACÂC Â CÂ3CÂ4CÂ8 C/ÃCÃC/Ã CÃCÃC/ÃC, ÃCÃ
C, Ã$C, Ã& C/cóV^8„dQhRR/#)rQs"rRrSrS6s÷ñ=rTcƒó¢"\\4p\P!\V4GRjxL
\ RV4GRjxL
R#LL5i)zˆWrite the scheduled-email queue to the JSON file + postgres. Callers
must hold _scheduled_lock so the snapshot is internally consistent.Nr)Ú_scheduled_emailsrë)s rRÚ_persist_scheduled_emailsrr6sCéôÔ&€HÜ
×
Ò
Ô7¸Ó
B×
Ð1°8Ó
<×CÙ<ùs!.A°A ±AÁA
ÁAÁ
Acó0V^8„dQhR\R\/#r-©ryr)rQs"rRrSrS>s÷ñ¤Cð¬HñrTcó&T;'gRP4pV'g\RRR7h\P!V4pTP
e!TP
4PRR7pT# \d\RRR7hi;i)zîParse an ISO 8601 datetime from the owner UI (datetime-local sends
'YYYY-MM-DDTHH:MM'). Returns a naive local datetime to match the rest of
the app, which compares against datetime.now(). Raises HTTPException(400)
on anything unparseable.r|éz4Please choose a date and time to schedule the email.r
z+That schedule time could not be understood.N©Útzinfo)r rÚ
fromisoformatÚ
ValueErrorrxÚ
astimezonerr©r;Úparseds& rRÚ_parse_schedule_datetimer~>sð
;ˆ;B×
Ñ
Ó
€Cß Ü¨Ð4jÔcÜ×Ó,ˆð‡} Ø×$×,°DÐØ €Møô ôcܨÐ4aÔcús ±A7Á7Bc
óŒV^8„dQhR\R\R\\\3,R\\\3,/#)rOÚ
next_emailÚprofile_updatesr_©ryr
)rQs"rRrSrSPs@÷;ñ;Ü ð;äð;ôœ#œs˜(•^ð;ô
Œ#Œsˆ(…^ñ ;rTcƒóÀ"VP4P4pVP4P4pV'd V'g\RRR7h\;_uu_4GRjxL
\P V4p\
V\4'g\RRR7h\P V4pWC8wd$\
V\4'd\RRR7h\WR4pWC8wEd+\PVR4V\V&\PVR4pVe
V\V&\PVR4p V e
V \V&\PVR4p
V
e
V
\V&\P4F7p \
V \4'gKV P R4V8XgK3WKR&K9 V\P!4P48wd\ P#V4\ P%V4M V\V&\\4p \\4p
\'\ 4pRRR4GRjxL
\(P*!\,X 4GRjxL
\(P*!\.X
4GRjxL
\(P*!\0\3X44GRjxL
\5R V 4GRjxL
\5R
V
4GRjxL
\5R R V/4GRjxL
\74GRjxL
X#E+GRjxL
'giLâ;iL{LiLWLCL35i)
rvúA valid email is required.r
Né”úClient not found.é™z/Another client already uses that email address.ròrˆ)rr rr€rgrÚ_draftsÚ_pending_codesÚ_code_requestsrÁÚvaluesr2rÚdiscardr rrx)r€rr!Únext_normalizedr[Útarget_existingrdÚdraftÚpendingÚ
code_requestsrÚprofiles_snapshotÚdrafts_snapshotÚallowed_emails_snapshots&&& rRÚ_update_client_profiler•Ps˜éð
×&€JØ ×(×0€Oß Ÿ_ܨÐ4PÔzŽzÜ#×
Óܘ(¤DרCÐ8KÔ ÓØ Ô (¬Z¸Ì×-NÒ-NܨCÐ8iÔ & Aˆà Õ × Ñ  ¨TÔ 2Ø06Ô ˜_Ñ —KK 
¨DÓ1ˆEØÒ Ø+0”˜Ñ°TÓ:ˆGØÒ"Ø29”˜Ñ*×.¨z¸4Ó@ˆMØÒ(Ø2?”˜Ñ4ܘg¤t×·±¸WÓ1EÈÖ1SØ'6˜œ[×0××
2026-06-17 21:51:29 +12:00
Ô × Ñ  Õ 0à+1Ô ˜ZÑ  Ô!1ÓÜœw-ˆÜ"(¬Ó"9Ð÷OzôR ×
Ò
Ô6Ð8IÓ
J×
×
Ò
ÔÓ
?×
×
Ò
Ô5´sÐ;RÓ7SÓ
2026-07-04 10:00:16 +12:00
T×
2026-06-17 21:51:29 +12:00
Ð0Ð2CÓ
D×
˜Ó
9×
Ð/°(Ð<SÐ1TÓ
U×
2026-07-04 10:00:16 +12:00
'× €M÷czzzúñRKÙ'ùsÚA MÁMÁ.L/Á/MÁ2D;L4Æ2L4Ç
BL4É MÉ&L2É'"MÊ MÊ
2026-07-04 10:00:16 +12:00
"MÊ,MÊ-+MËMËMË,MË-MÌMÌMÌMÌMÌ(MÌ)MÌ2MÌ4M
Ì:L=Ì;
M
2026-07-04 10:00:16 +12:00
ÍM
Í MÍMÍMÍMÍMÍMÍMcóRV^8„dQhR\R\\\3,/#©rOr_r)rQs"rRrSrSŽs"÷,,ð,8´´S¼#°Xµñ,8rTc ƒó¶"VP4P4pV'g\RRR7hV\P!4P48Xd\RRR7h\;_uu_4GRjxL
V\
9d\RRR7h\
P
V/4p\P
2026-07-04 10:00:16 +12:00
VR4\P
VR4\P
2026-07-04 10:00:16 +12:00
VR4\P4UUu.uF7wr4\V\4'gKVPR4V8XgK5VNK9 uppFp\P
VR4K \P!V4\\
4p\\4p\#\4pRRR4GRjxL
\$P&!\(X4GRjxL
\$P&!\*X4GRjxL
2026-05-19 23:36:58 +12:00
\$P&!\,\/X44GRjxL
\1R V4GRjxL
2026-07-04 10:00:16 +12:00
\1R
2026-05-19 23:36:58 +12:00
V4GRjxL
\1R R V/4GRjxL
\34GRjxL
\4;_uu_4GRjxL
2026-07-04 10:00:16 +12:00
\6P4U U
2026-05-19 23:36:58 +12:00
u.uF]wrš\V
\4'gK\9V
PRR
44P4P4V8XgK[V NK_ p p p
V Fp \6P
V R4K V 'd\;4GRjxL
RRR4GRjxL
2026-07-04 10:00:16 +12:00
\X\4'dV#/#ELõuuppiE+GRjxL
'giELß;iEEEL{ELjELYELFEL7EL#uup
p iLuLg +GRjxL
2026-05-19 23:36:58 +12:00
'giL~;i5i)aPermanently remove a client: their profile, saved draft, any pending login
codes/sessions, their allowed-email entry (so they can no longer sign in),
2026-07-04 10:00:16 +12:00
and any welcome emails still queued to send to them. The business owner's own
account can never be deleted.rvr„r
2026-05-19 23:36:58 +12:00
z-The business owner account cannot be deleted.Nr…r†rˆr|)rr r2rrrˆr‰r€rr›rxÚ_scheduled_lockrqryrr) r!ÚremovedÚtrÇrrr“r”ÚeidÚentryÚstales & rRÚ_delete_client_profilerŸŽéð
×&€Jß Ü¨Ð4PÔ”[×(רÐ4cÔzŽzØ Ô ¨CÐ8KÔ "×& z°2Ó6ˆÜ Ô×ј: tÔ×ј: ,Ü$4×$:Ñ$:Ô$<ÔuÑ$<™D˜
2026-07-04 10:00:16 +12:00
È1Ìd×@S”aÐXY×X]ÑX]Ð^eÓXfÐjtÑXt—aaÑ$<Õuˆ × Ñ  ¨Ö vä×Ñ 
2026-05-19 23:36:58 +12:00
Ô Ô!1ÓÜœw-ˆÜ"(¬Ó"9Ð÷ ×
Ò
2026-07-04 10:00:16 +12:00
Ô6Ð8IÓ
2026-05-04 20:32:24 +12:00
J×
×
Ò
2026-05-19 23:36:58 +12:00
ÔÓ
2026-05-04 20:32:24 +12:00
?×
2026-07-04 10:00:16 +12:00
×
Ò
2026-05-19 23:36:58 +12:00
Ô5´sÐ;RÓ7SÓ
T×
2026-07-04 10:00:16 +12:00
Ð0Ð2CÓ
D×
2026-06-17 21:51:29 +12:00
˜Ó
9×
Ð/°(Ð<SÐ1TÓ
U×
2026-07-04 10:00:16 +12:00
'׎Ü'8×'>Ñ'>Ô'@ôkÑ'@™˜Ü˜u¤d×Ü03°E·I±I¸gÀrÓ4JÓ0K×0QÑ0QÓ0S×0YÑ0YÓ0[Ð_iÑ0i÷Ñ'@ˆñkãˆ × ! # tÖ ç Ü
ô¬$×/ˆ7Ð7°RÐ7òCùóv÷zzŒzúò KÚùókñ
2026-05-04 20:32:24 +12:00
2026-07-04 10:00:16 +12:00
2026-05-19 23:36:58 +12:00
ŠüsdA;OÁ=M2Á>OÂBM>Ä M5
2026-05-04 20:32:24 +12:00
Ä(M5
2026-05-19 23:36:58 +12:00
ÅM5
2026-05-04 20:32:24 +12:00
ÅA#M>Æ) OÆ4M;Æ5"OÇNÇ"OÇ:NÇ;+OÈ&N!È'OÈ:N$È;OÉN'ÉOÉ$N*É%OÉ6N-É7OÊ
2026-05-19 23:36:58 +12:00
N0ÊOÊN=Ê)N3
Ë9N3
2026-05-04 20:32:24 +12:00
ÌN3
2026-05-19 23:36:58 +12:00
Ì )N=Ì6
N=ÍN9ÍN=Í OÍN;ÍOÍ5M>Í;OÍ>N ÎNÎ
2026-07-04 10:00:16 +12:00
N ÎN Î
2026-05-04 20:32:24 +12:00
OÎOÎ!OÎ$OÎ'OÎ*OÎ-OÎ0OÎ3N=Î;OÎ=O ÏOÏ
2026-05-19 23:36:58 +12:00
O ÏO ÏOcóRV^8„dQhR\R\\\3,/#r—r)rQs"rRrSrS½s"÷"ñ"¬#ð"´$´s¼C°xµ.ñ"rTcƒóú"VP4P4pV'g\RRR7h\;_uu_4GRjxL
\P V4p\
V\4'g\RRR7h\V4pRVR&VPR R
4pVPR R4pV'dWCR &VeWSR
2026-07-04 10:00:16 +12:00
&\P!4PRR7VR&V\V&\\4pRRR4GRjxL
2026-05-04 20:32:24 +12:00
\P!\X4GRjxL
\RV4GRjxL
X#ELL@ +GRjxL
'giLW;iL;L)5i)a]Mark a client's onboarding as incomplete while keeping every saved detail.
2026-07-04 10:00:16 +12:00
2026-05-04 20:32:24 +12:00
Used for clients imported from the legacy Gravity Forms data: they keep their
2026-05-19 23:36:58 +12:00
contact/dog details (and their previous submission is archived for reference),
but they drop back into the pending list so they can sign in with their email
2026-07-04 10:00:16 +12:00
and complete the new onboarding form.
2026-05-04 20:32:24 +12:00
rvr„r
Nr…r†onboardingCompletedÚonboardingSubmittedAtr|ÚonboardingSubmissionÚpreviousOnboardingSubmittedAtÚpreviousOnboardingSubmissionÚseconds©ÚtimespecÚonboardingResetAtrÜ)rr rr€rrÚ isoformatrë)r!r[ÚupdatedÚprevious_submittedÚprevious_submissionrÈs& rRÚ_reset_client_onboardingr¯½s3éð×&€Jß Ü¨Ð4PÔzŽzÜ#×
2026-05-19 23:36:58 +12:00
Óܘ(¤DרCÐ8KÔ x“.ˆØ).ˆÐ%Ÿ[™[Ð)@À"ÓØ%Ÿk™kÐ*@À$Óß Ø7IÐ Ò *Ø6IÐ 3Ü'/§|¢|£~×'?Ñ'?ÈÐ'?Ó'SˆÐ$à'.Ô˜ÑÔ÷%zô( ×
2026-05-04 20:32:24 +12:00
Ò
Ô6¸Ó
A×
2026-05-19 23:36:58 +12:00
Ð0°(Ó
2026-05-04 20:32:24 +12:00
;× €N÷-zzzúñ(BÙ;ùsmAE;ÁEÁ E;Á CEÄ
E;ÄEÄ"E;Ä;E7Ä<E;ÅE9ÅE;ÅE;ÅE4 Å!E$Å"
2026-07-04 10:00:16 +12:00
E4 Å-E4 Å/ E;Å9E;có4V^8„dQhR\R\RR/#)rOÚipÚ
request_idr_Nr)rQs"rRrSrSâs!÷

!œ#ð
!¬3ð
2026-07-04 10:00:16 +12:00
!°4ñ
!rTcó(\P!4p\PV4pVedW#8dU\ W2,
2026-05-04 20:32:24 +12:00
4p\
P !RWV4\RRV^<,^, R2R\V4/R7h\VR#R#)Nz([%s] auth: blocked ip=%s (%ds remaining)é­z'Too many failed attempts. Try again in z minute(s).z Retry-After)rrr) rÀÚ monotonicÚ _blocked_ipsrŠr<r“r ry)Ú
unblock_atÚ remainings&& rRÚ_check_ip_blockedr¹âÜ
2026-05-19 23:36:58 +12:00
.Š.Ó
2026-05-04 20:32:24 +12:00
€CÜ×! %€JØÒØ Ô Ü˜JÕ-ˆIÜ NŠNÐEÀzÐW`Ô ØØÈbÅÐSTÕATÐ@UÐU`ШI«Ðð
ô ˜RÒ ñrTcó@V^8„dQhR\R\R\RR/#)rOÚreasonr_Nr)rQs"rRrSrSòs(÷ 
2026-05-19 23:36:58 +12:00
ñ 
2026-05-04 20:32:24 +12:00
œSð 
¬cð 
2026-05-19 23:36:58 +12:00
¼3ð 
2026-05-04 20:32:24 +12:00
À4ñ 
rTc óÖ\P!4p\PV\ 44pV'd+W4^,,
2026-05-19 23:36:58 +12:00
\
2026-05-04 20:32:24 +12:00
8”dVP
2026-07-04 10:00:16 +12:00
4K2VPV4\P!RWV\V44\V4\d=V\,\V&\P!RW\\V44R#R#)rz5[%s] auth: failure ip=%s reason=%r total_in_window=%dz2[%s] auth: ip=%s BLOCKED for %ds after %d failuresN)Ú_auth_failures_by_ipÚ
setdefaultrrÚpopleftrêr<r“rr)Úfailuress&&& rRÚ_record_auth_failurerÁòÜ
.Š.Ó
€CÜ.¨r´5³7Ó;€Hß
2026-07-04 10:00:16 +12:00
s a(Ô+AÔ×ÑÖØ ‡OOÜ
‡NJÈJÐ\bÔdgÐhpÓdqÔ
ˆ8ƒ}ÔÔ!7Õ ÜŠØ Ô2´C¸³Mö
2026-07-04 10:00:16 +12:00
ñ-rTcóHa]tRtRtoRtV3RlRltV3RlRltRtVtR#) Ú_BodySizeLimitMiddlewareizûReject requests whose Content-Length exceeds MAX_REQUEST_BODY_BYTES.
2026-05-19 23:36:58 +12:00
2026-07-04 10:00:16 +12:00
Defence-in-depth alongside nginx ``client_max_body_size``. Streaming
requests without a Content-Length header are tracked byte-by-byte and
short-circuited if they overflow the cap.
2026-06-17 21:51:29 +12:00
có*<V^8„dQhRS[RS[RR/#)rOrPÚ max_bytesr_N)r)rQÚ
2026-05-19 23:36:58 +12:00
__classdict__s"€rRrSÚ%_BodySizeLimitMiddleware.__annotate__ s"ø€÷#™Gðð#¸ñ#rTcóWnW nR#rV©rP)ÚselfrPs&&&rRÚ__init__Ú!_BodySizeLimitMiddleware.__init__ s ØŒØrTcó0<V^8„dQhRS[RS[RS[RR/#)rOÚscopeÚreceiveÚsendr_N)rrr)rQs"€rRrS
2026-07-04 10:00:16 +12:00
s)ø€÷6¡Eð6±Gð6Á4ð6ÈDñ6rTcƒóbaaa a
"VR,R8wdSPVSV4GRjxL
2026-06-17 21:51:29 +12:00
R#VPR.4UUu/uF4wrEVPR4P4VPR4bK6 pppVPR4pVe2\ V4SP
2026-07-04 10:00:16 +12:00
8”d\
V4GRjxL
2026-05-04 20:32:24 +12:00
R#^o
Ro V VV
V3RlpS 'd\
2026-07-04 10:00:16 +12:00
V4GRjxL
R#SPWV4GRjxL
R#LäuuppiLU \dL]i;iL=L#5i)ÚtypeÚhttpNrzlatin-1zcontent-lengthFcóÀ<"S!4GRjxL
2026-05-04 20:32:24 +12:00
pVR,R8Xd:S\VPRR44,
oSSP8”dRoRR/#V#LM5i)NrÒz http.requestÚbodyrTTzhttp.disconnect))ÚmessageÚ
overflowedrÏÚreceivedrÊs €€€€rRÚ_wrapped_receiveÚ;_BodySizeLimitMiddleware.__call__.<locals>._wrapped_receives\øéá#I—oˆGØv .ÔœC § ¡ ¨F°CÓ 8Ó9ؘdŸn™nÔ,Ø!%"Ð$5Ј
&ùsƒ AŽAAA)rPÚdecoderÚ _send_413rz) rbrcrÚdeclaredrÙr×s f&f& @@rRÚ__call__Ú!_BodySizeLimitMiddleware.__call__
sûéØ =˜ —((˜5 '¨4Ó0× àPU×PYÑPYÐZcÐegÔPhÔiÑPhÉÈ1—88˜&×·±¸Ó0CÒCÑPhˆÑ—;‘;ÐØ Ò ð
Üx“= 4§>¡>Ô# D/×ð ˆØˆ
÷ ð ÷ ܘD“/× Øh‰hÓ5ñ;
2026-07-04 10:00:16 +12:00
1ùójñ
*øäô
2026-05-04 20:32:24 +12:00
Ùð
úñ"
5ùs{†%D/«D¬D/Á:DÂD/Â(DÃDÃDÃD/ÃD/Ã-D+Ã.D/Ä D-Ä
D/ÄD/ÄDÄ D(Ä%D/Ä'D(Ä(D/Ä-D/N) Ú__name__Ú
__module__Ú __qualname__Ú__firstlineno__Ú__doc__rËÚ__static_attributes__Ú__classdictcell__)s@rRsø‡ñ÷6rTcó(V^8„dQhR\RR/#)rOr_N)r)rQs"rRrSrS/s÷ ñ œ$ð   rTcƒól"V!RRRRRR ./4GRjxL
V!RRRR/4GRjxL
2026-07-04 10:00:16 +12:00
R#LL5i)
zhttp.response.startr(irNzhttp.response.bodyrÕs${"detail":"Request body too large."})s content-typesapplication/jsonr¼)s&rR/s_éÙ
ØÐÐó ÷ðñ
ØÐÐó ÷òñ ñ
ùs404©2ª4²4))Ú
2026-05-04 20:32:24 +12:00
allowed_hostsÚPOSTÚGETFiX)Ú
allow_originsÚ
allow_methodsÚ
allow_headersÚallow_credentialsÚmax_agerÓcó$V^8„dQhR\/#©rOr©r
)rQs"rRrSrSHs÷ñ¬wñrTcƒó„"\P!4PR,pW Pn\
P !4pV!V4GRjxL
2026-05-18 22:25:43 +12:00
p\
2026-05-04 20:32:24 +12:00
P !4T,
R,p\P!RY PTPPTPT4Y$PR&T#Ly \d]\
2026-07-04 10:00:16 +12:00
P !4T,
R,p\P!RY PTPPT4hi;i5i)r1Néèz[%s] %s %s crashed after %.0fmsu[%s] %s %s → %d (%.0fms)z X-Request-ID)r5r6r7Ústater²rr<Ú exceptionÚmethodÚurlr]rr)rÚ call_nextr²ÚstartedÚresponseÚ
2026-05-04 20:32:24 +12:00
elapsed_mss&& rRÚ_request_logging_middlewarerþGéä×! "Õ%€JØ)‡MÜnŠnÓ€GðÙ" +×+ˆô—." Õ4€JÜ
‡K‚KØ—NN G§K¡K×$4Ñ$4°h×6JÑ6JÈJôð(2×Ñ €Oñ,øÜ ôÜ—n’nÓÕ0°DÕ8ˆ
Ü×ÒØ Ÿ¨¯ © ×(8Ñ(8¸*ô
ð ð
üs2A EÁ CÁCÁCÁA5EÃCÃA'D=Ä=Ecó0V^8„dQhR\R\/#rr )rQs"rRrSrS`s÷@ñ@”Wð@¤ñ@rTcóèVPPR4pV'd'VPR4^,P4#VP'dVPP
#R#)zx-forwarded-forr}Úunknown)rrÚclientÚhost)rÚ forwardeds& rRÚ_get_ipr`sTØ×#Ð$5Ó6€Iߨ˜# &×.Ø")§.§. .ˆ7>‰>× Ñ Ð?°iÐ?rTcó0V^8„dQhR\R\/#r)r
r%)rQs"rRrSrSgs÷ Bñ Bœgð B¬$ñ BrTcó²\'gR#VPPR4;'gRpV'gR#\P!V\4#)zûTrue when the request carries a matching X-Deploy-Smoke header.
Used by the deploy script to verify the form endpoints are reachable and
parse a valid payload, without producing a real submission. Disabled
entirely when DEPLOY_SMOKE_SECRET is unset.
Fzx-deploy-smoker|)r%rÚsecretsÚcompare_digest)rÚ presenteds& rRÚ_is_deploy_smoker gsD÷ Ó ÙØ×#Ð$4Ó€Iß ÙÜ × ! )Ô-@Ó ArTcó0V^8„dQhR\R\/#r-r)rQs"rRrSrS{s÷ñ”CðœCñrTcó"VP4#rV©©s&rRÚ_trimmedr{sØ ;‰;rTcóVV^8„dQhR\\,R\R\RR/#)rOÚattemptsrÅÚwindow_secondsr_N)r)rQs"rRrSrSs-÷ñœe¤E´ðÌðÐPTñrTcófV'd)W^,,
V8”dVP4K.R#R#)rN)r¿)rrs&&&rRÚ_prune_attemptsrs&ß
s a(¨>Ô×ÑÖñ:‰(rTcóHV^8„dQhR\R\R\R\/#)rOÚlast_attempt_atrÅÚmin_interval_secondsr_))rQs"rRrSrSs*÷ñ¬Eð¼ðÔUXðÔ]`ñrTcóJ\^\W!V,
,
44pV#)r_)ÚmaxrÎ)rrÚ retry_afters&&& rRÚ_seconds_until_allowedrs"ÜÐ1¸?Õ5JÕM€KØ ÐrTcó@V^8„dQhR\R\R\RR/#)rOr_Nr)rQs"rRrSrSs(÷44#´4#¼3ð4#Äsð4#Ètñ4#rTc
ƒóö"\P!4pVP4P4p\;_uu_4GRjxL
2026-07-04 10:00:16 +12:00
\
2026-05-04 20:32:24 +12:00
P
V\44p\P
V\44p\WS\4\Wc\4V'dmW5R
,,
\8dU\VR
,V\4p\P!RVVW5R
,,
\4\RRV R2R7h\!V4\"d0\P!RVV\"\4\RRR7h\!V4\$d0\P!RVV\$\4\RR R7hVP'V4VP'V4RRR4GRjxL
R#ELL +GRjxL
'giR#;i5i) NzB[%s] rate limited: ip=%s submitted again after %.1fs (minimum %ss)r´zPlease wait about z seconds before trying again.r
z7[%s] rate limited: ip=%s exceeded %d submissions in %sszIToo many enquiries from this connection. Please try again a little later.z:[%s] rate limited: email=%s exceeded %d submissions in %sszQThat email address has reached the enquiry limit for now. Please try again later.éÿÿÿÿ)rÚ_submit_rate_limit_lockÚ_submit_attempts_by_ipr¾rÚ_submit_attempts_by_emailrr6r5rr<r“r r4r3)Únormalized_emailÚ ip_attemptsÚemail_attemptsrs&&& rRÚ_enforce_submit_rate_limitsr&éÜ
.Š.Ó
€CØ—{‘{“}×ç&×,×7¸¼E»GÓDˆ Ü2×=Ð>NÔPUÓPWÓXˆä˜ Ô*CÔ˜Ô-FÔ ˜3¨R¥Õ0Ô3RÔ¸RµÀ#ÔGfÓgˆKÜ NŠNØØØ "•oÕ 
ô ØØ+¨K¨=Ð8UÐð
ô
ˆ{Ó Ô NŠNØØÜ 
ô ØØð
ô
ˆ Ô":Ô NŠNØØ Ü 
ô ØØð
ð
×ј3ÔØ×ј"÷a'×&×&×&×&×&üsOAG9ÁGÁ G9Á E9GÇ G9ÇGÇG9ÇG9ÇG6 Ç"G%Ç#
G6 Ç.G6 Ç0 G9có4V^8„dQhR\R\RR/#©rOr•r_N)ryr=)rQs"rRrSrSÀs!÷ 
ñ 
¤Sð 
2026-07-04 10:00:16 +12:00
´ð 
2026-05-04 20:32:24 +12:00
À4ñ 
rTcóÈVPeVP^8:d%\P!RV4\RRR7h\P!4R,VP,
R, pV\
8d+\P!RVV\
4\RRR7hV\ 8”d+\P!RVV\ 4\RR R7hR#)
Nz/[%s] rejected: missing or invalid formStartedAtrvz&Please refresh the page and try again.r
z7[%s] rejected: form submitted too quickly (%.2fs < %ss)z;Please take a moment to fill in the form before sending it.z2[%s] rejected: stale form submission (%.0fs > %ss)zLThis form has been open for too long. Please refresh the page and try again.)Ú
formStartedAtr<r“r r+r*)r•Úelapsed_secondss&& rRÚ_enforce_form_timingr,ÀØ ×ÑÒ! T×%7Ñ%7¸1Ô%<ÜŠÐHÈ*ÔØØ
ð
ô
—yy“{ )¨D×,>Ñ,>Õ>À$ÕF€OàÔŠØ Ø Ü ô 
ô ØØ
ð
ð
ÔŠØ Ø Ü ô 
ô ØØ
ð
ñ*rTcó0V^8„dQhR\R\/#©rOr•r_)r=r%)rQs"rRrSrSãs÷ð(´(rTcó>\\VP44#rV)r%rÚwebsiterüs&rRÚ_is_honeypot_triggeredr1ãsÜ ˜ŸÓ 'rTcó0V^8„dQhR\R\/#r.)rBr%)rQs"rRrSrSçs÷;´;rTcóN\VP4P4R8H#)Úgeneral)rÚ enquiryTypers&rRÚ_is_general_enquiryr6çs!Ü  %× Ñ :rTcó0V^8„dQhR\R\/#r.©rBry)rQs"rRrSrSës÷QñQÔQ´QrTcó,\V4'dR#R#)zGeneral enquiryzBooking enquiry)r6s&rRÚ_enquiry_type_labelr:ësÜ 3°D× 9Ò 9Ð ÐPÐ?PÐPrTcó4V^8„dQhR\R\RR/#r()ryrB)rQs"rRrSrSïs"÷3
ñ3
¤Sð3
Ô0Að3
Àdñ3
rTcó²\VP4P4pVR9d/\P!RWP4\ RRR7h\VP 4'g%\P!RV4\ RRR7h\VP4'g%\P!RV4\ RRR7h\V4'dr\'g%\P!R V4\ R
R R7h\VP4'g%\P!R V4\ RR
R7hR#\VP4'g%\P!RV4\ RRR7h\VP4'g%\P!RV4\ RRR7hR#)Úbookingz%[%s] rejected: invalid enquiryType=%rrvz1Please choose a valid enquiry type and try again.r
z [%s] rejected: missing full nameúPlease enter your full name.z#[%s] rejected: missing phone numberz!Please enter your contact number.z-[%s] rejected: general enquiries are disabledrz>General enquiries are currently unavailable through this form.z.[%s] rejected: missing general enquiry messagezPlease tell us how we can help.Nz[%s] rejected: missing pet nameúPlease enter your dog's name.z[%s] rejected: missing locationzPlease enter your location.>r=r4)
rr5rr<r“r ÚfullNameÚphoner6r)ÚpetNameÚlocation)r•Ú enquiry_types&& rRÚ_validate_submissionrEïsˆÜ˜D×5€LàЊÐ
×L\ÑL\ÔØØ
ð
ô
D—MM× ŠÐ9¸ØØ
ð
ô
D—J‘J× Ò ÜŠÐ<¸jÔØØ
ð
ô
˜4× Ò ß NŠNÐJÈJÔ ØØð
ô˜Ÿ × NŠNÐKÈZÔ ØØð
ñ ä D—L‘L× ŠÐ8¸*ÔØØ
ð
ô
D—MM× ŠÐ8¸ØØ
ð
ñ #rTcó(V^8„dQhR\RR/#©rOr•r_rB)rQs"rRrSrS%s÷ñÔ 1ð°dñrTcóœ\V4'dRMRVn\VP4Vn\VP4Vn\VP
4Vn\VP 4Vn\VP4Vn\VP4Vn\VP4Vn VPUu.uF!p\V4'gK\V4NK# upVn
VPUu.uF!p\V4'gK\V4NK# upR,Vn \^VP4Vn
RF'p\W4pVe
V^8:gK\WR4K) \V4'dRVnRVn.Vn
2026-07-04 10:00:16 +12:00
R#R#uupiuupi)r4r=:Né NNr|©ÚvisitStartedAtÚ
2026-05-04 20:32:24 +12:00
pageEnteredAtÚfirstInteractionAtÚ
2026-07-04 10:00:16 +12:00
sendClickedAt)r6r5rr@rArBrCÚreferrerÚpageÚservicesÚjourneyrÚ stepChangesÚgetattrÚsetattr)r•ÚserviceÚstepÚ
2026-05-04 20:32:24 +12:00
field_namerÓs& rRÚ_normalize_submissionrZ%sJÜ$7¸×$=Ò$=‘yÀ9€DÔܘTŸ]™]Ó+€D„Mܘ$Ÿ*™*Ó%€D„JܘDŸL™LÓ)€D„LܘTŸ]™]Ó+€D„MܘDŸL™LÓ)€D„LܘTŸ]™]Ó+€D„MܘŸÓ#€D„IØ6:·m²mÓY±m¨7ÄxÐPW×GXÔ&”X˜&±mÑY€D„MØ/3¯|ª|ÓN©| t¼xÈ¿~”N”H˜T–N©|ÑNÈsÕS€D„Lܘ1˜d×/€DÔã
Ü˜ÓØ Š=˜E QžJÜ D  aô
2026-07-04 10:00:16 +12:00
˜4× Ò ØˆŒ ؈Œ
2026-05-04 20:32:24 +12:00
؈Ž
ñ!ùòZùÚNsÃGÃ7GÄG Ä4G có4V^8„dQhR\R\RR/#r()ryrG)rQs"rRrSrS=s(÷4añ4a´ð4aÔ;Oð4aÐTXñ4arTcóX\VP4'g%\P!RV4\ RRR7h\VP
2026-07-04 10:00:16 +12:00
4'g%\P!RV4\ RRR7hRRRR R
2026-05-04 20:32:24 +12:00
R R R
RRRRRRRRRR/ pVP
4FCwr4\\W44'dK!\P!RW4\ RVR7h VP'g%\P!RV4\ RRR7hVPR%9d\ RRR7hVPR%9d\ RRR7hVPR8Xd VP'g\ RRR7hVP'g\ RRR7hVP'g\ RR R7h\VP4pVPR!4'd\!V4^€8d%\P!R"V4\ RR#R7hR$#)&z+[%s] onboarding rejected: missing full namervr>r
z'[%s] onboarding rejected: missing phoneúPlease enter your phone number.ÚaddressúPlease enter your address.r>r?r@úPlease enter your dog's breed.rBz&Please enter your dog's date of birth.ÚvetNamez"Please enter your vet clinic name.Ú
vetAddresszPlease enter your vet address.ÚvetPhonez#Please enter your vet phone number.ÚemergencyContactNamez'Please enter an emergency contact name.ÚemergencyContactPhonez/Please enter an emergency contact phone number.z$[%s] onboarding rejected: missing %sz*[%s] onboarding rejected: missing servicesz#Please choose at least one service.ÚnozEPlease confirm whether your dog gets regular flea and tick treatment.z2Please confirm whether your dog has pet insurance.zPPlease confirm the owner-expense acknowledgement for dogs without pet insurance.z,Please confirm emergency veterinary consent.z*Please confirm the onboarding declaration.údata:image/png;base64,z3[%s] onboarding rejected: invalid signature payloadú)Please add your signature before sending.N>rfÚyes)rr@r<r“r rArUÚservicesNeededÚregularFleaTickTreatmentÚ petInsuranceÚ petInsuranceOwnerExpenseAcceptedÚemergencyVetConsentÚ
termsAcceptedÚsignatureDataUrlÚ
startswithrà)r•Úrequired_fieldsrYÚ signatures&& rRÚ_validate_onboarding_submissionrt=Ü D—MM× ŠÐDÀjÔ¨Ð4RÔ D—J‘J× Ò ÜŠÐ@À*Ô¨Ð4UÔ ÐÐÐÐÐÐÐÐ IØÐ!Rð
€Oðˆ
Üœ Ó NŠNÐAÀ:Ô ¨C¸Ô 
2026-07-04 10:00:16 +12:00
× × Ð ÜŠÐCÀZÔ¨Ð4YÔ ×$¨MÔ¨Ð4{Ô ×Ñ 
2026-05-04 20:32:24 +12:00
Ô¨Ð4hÔ ×јDÔ ¨×)N×)NÐ)Nܨð5GôHð Hð × ¨Ð4bÔ × × Ð Ü¨Ð4`Ô˜×/€IØ × Ñ Ð 8× 9¼SÀ»^ÈcÔ=QÜŠÐLÈjÔ¨Ð4_Ô>RrTcó(V^8„dQhR\RR/#rG)rG)rQs"rRrSrSts÷,Ô+?ð,ÀDñ,rTcóÒ\VP4Vn\VP4Vn\VP4Vn\VP4Vn\VP
4Vn\VP 4Vn\VP4Vn\VP4Vn\VP4Vn \VP4Vn
\VP4Vn \VP4Vn \VP4Vn
\VP4Vn\VP4P!4Vn\VP"4P!4Vn\VP$4Vn\VP&4VnVP(Uu.uF!p\V4'gK\V4NK# upR,VnRF'p\+W4pVe
V^8:gK\-WR4K) R#uupi)r1NrK)rr@rAr^r>r@rBÚ temperamentÚ medicalNotesÚaccessInstructionsrarbrcrdrerkrrlrPrQrjrUrV)r•rWrYs& rRÚ _normalize_onboarding_submissionrztܘTŸ]™]Ó+€D„Mܘ$Ÿ*™*Ó%€D„JܘDŸL™LÓ)€D„LܘDŸL™LÓ)€D„LܘTŸ]™]Ó+€D„Mܘ4Ÿ;™;Ó'€D„KÜ × 0Ñ 0Ó1€DÔÜ  ×!2Ñ!2Ó3€DÔÜ& t×'>Ñ'>Ó?€DÔܘDŸL™LÓ)€D„LܘtŸÓ/€D„OܘTŸ]™]Ó+€D„MÜ (¨×)BÑ)BÓ C€DÔÜ!)¨$×*DÑ*DÓ!E€DÔÜ$,¨T×-JÑ-JÓ$K×$QÑ$QÓ$S€DÔ  ×!2Ñ!2Ó;€DÔܘTŸ]™]Ó+€D„MܘŸÓ#€D„IØ<@×<OÒ<OÓeÑ<O°ÔS[Ð\c×SdÔ,œ8 ,Ñ<OÑeÐfhÕi€DÔã`ˆ
Ü˜ÓØ Š=˜E QžJÜ D  aùòfs Ç?I$ÈI$có0V^8„dQhR\R\/#)rOÚuar_r)rQs"rRrSrSs÷

$”#ð
$œ#ñ
2026-07-04 10:00:16 +12:00
$rTcóŽaS'gR#.ROp.ROp\V3RlV4R4p\V3RlV4R4pV RV 2#)ÚUnknownc3ó><"TFwrVS9gKVxK R#5irV©Únr|s& €rRr…Ú_parse_ua.<locals>.<genexpr>—søéÐ6¡(™$˜!¨a°2©g—A’A£(ùóƒ 
2026-05-04 20:32:24 +12:00
zUnknown browserc3ó><"TFwrVS9gKVxK R#5irVr€s& €rRr…˜søéИ¨A°©G—1’1£ùr„z
Unknown OSú on ))zEdg/ÚEdge)zOPR/ÚOpera)zChrome/ÚChrome)zFirefox/ÚFirefox)zSafari/ÚSafari))z
Windows NT 10z
Windows 10/11)z Windows NT 6z Windows 8)zMac OS XÚmacOS)ÚiPhoner)ÚiPadrŽ)ÚAndroidr)ÚLinuxr)Únext)r|ÚbrowsersÚsystemsÚbrowserÚsystemsf rRÚ _parse_uarsPø€ß
Ùò@€Hò;€GôÔ6¡(Ó6Ð8IÓJ€GÜ
ÔÓ4°lÓ
C€F؈Yd˜6˜ #rTcó<V^8„dQhR\R\R\/#©rOÚlabelrÓr_r)rQs"rRrSrSœs!÷ 
ñ 
”sð 
¤3ð 
¬3ñ 
rTcó(V'gR#RV RV R2#)r|
2026-05-04 20:32:24 +12:00
<tr>
<td style="padding:8px 0;color:#888;font-size:13px;white-space:nowrap;
font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
vertical-align:top;width:130px;">z×</td>
<td style="padding:8px 0 8px 16px;color:#213021;font-size:14px;font-weight:500;
font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
vertical-align:top;">ú</td>
</tr>r¼©r™s&&rRÚ _detail_rowrœs/ß Ùð49°'ð:'ð(- .
ð
ð
rTcó<V^8„dQhR\R\R\/#r˜r)rQs"rRrSrSªs!÷ 
ñ 
”Sð 
¤ð 
– 
rTcó(V'gR#RV RV R2#)r|
<tr>
<td style="padding:5px 0;color:#aaa;font-size:12px;white-space:nowrap;
font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
vertical-align:top;width:100px;">zÙ</td>
<td style="padding:5px 0 5px 16px;color:#666;font-size:12px;
font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
vertical-align:top;word-break:break-all;">rs&&rRÚ _meta_rowr ªs1ß Ùð49°'ð:<ð=B¸C
ð
ð
rTcó>V^8„dQhR\R,R\/#)rOÚ duration_msNr_©ry)rQs"rRrSrS¸s÷ ñ ¤S¨4¥Zð ´Cñ rTcóÐVeV^8dR#\\VR, 44p\V^<4wr#\V^<4wrBV^8”d V RV R2#V^8”d V RV R2#V R2#)Nr|zh Úmzm rÇ)ÚroundÚdivmod)Ú
total_secondsÚminutesr§Úhourss& rRÚ_format_duration_msr«¸sØÒ˜k¨AœoÙ䜘k¨DÕ2€Mܘm¨RÓ€GܘG RÓ(N€Eà ˆq„yؘ˜7˜) 1Є{ؘ"˜W˜I ˆYaˆrTcóXV^8„dQhR\R,R\R,R\/#)rOÚstart_msNÚend_msr_)rQs"rRrSrSÇs)÷ 
ð2´C¸$µJð2Ä3ñ2rTcóDVe VeW8dR#\W,
4#)Nr|))r­s&&rRÚ_duration_betweenr°Çs"ØÒ˜6š>¨VÔ->ÙÜ ˜ 1rTcóFV^8„dQhR\\,R\/#)rOrSr_©ry)rQs"rRrSrSÍs÷ ñ œ4¤ ¬ñ rTcó8V'gR#RPV4#)r|z -> )Újoin)rSs&rRÚ
_journey_textrµÍsß ÙØ ;‰; ÐrTr|có<V^8„dQhR\R\R\/#)rOÚ
badge_htmlÚsubtitler_r)rQs"rRrSrSÕs!÷
ñ
œSð
´ð
¼cñ
rTcóbV'dRV R2MRpV'dRV R2MRpR\ RV RV R2#)z<div style="margin-top:20px;">ú</div>r|z¿<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:13px;color:#7aaa7a;letter-spacing:0.04em;margin-top:8px;">
zx
<tr>
<td style="background:#213021;padding:36px 48px 32px;text-align:center;">
<img src="zŠ" width="161" height="32" alt="GoodWalk"
style="display:inline-block;max-width:161px;height:auto;border:0;">
ú
z
</td>
</tr>)r.)r¸Úbadger4s&& rRÚ _logo_headerr½ÕscßCMÐ,¨Z¨L¸Ñ ?ÐSU€E÷(0ðà
˜ $à57ððô !
à
ˆ
Ø
ˆð
 ðrTcó0V^8„dQhR\R\/#r.r8)rQs"rRrSrSås÷F ñF ÔF ¬SñF rTc ó\V4pVP'dRPVP4MRp\RVP4\R\ VP 44\RVP4\R\V44.pV'd?VP'd&VP\RVP44RpRpR pMŸVP\R
VP4\R VP4\R V4.4VP'd&VP\R
VP44RVP R2pRVP R2pRpR\VR7 RVPP4^, RV RRPV4 RV R2 #)ú, z
Not specifiedz Your nameÚEmailÚPhoneÚTypeÚMessagezBWe&rsquo;ve received your message and we will be in touch shortly.z<We will review your message and reply within 1 business day.z)General enquiries and dog walking supportzDog&rsquo;s nameÚLocationÚServicesú
About the dogz•We&rsquo;ve received your enquiry and we will be in touch shortly to arrange a <strong style="color:#213021;">Meet &amp; Greet</strong> with you and Ú.zWe will review your details and reach out within 1 business day to schedule a free Meet &amp; Greet. No commitment required &mdash; just a chance for z to make a new best friend.z!Professional dog walking servicesav<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>We received your enquiry</title>
</head>
<body style="margin:0;padding:0;background:#f2f2f0;">
<table width="100%" cellpadding="0" cellspacing="0" role="presentation"
style="background:#f2f2f0;padding:40px 16px;">
<tr><td align="center">
<table width="600" cellpadding="0" cellspacing="0" role="presentation"
style="max-width:600px;width:100%;border-radius:16px;overflow:hidden;
box-shadow:0 4px 24px rgba(0,0,0,0.08);">
2026-05-04 20:32:24 +12:00
)r¸a?
<!-- Body -->
<tr>
2026-05-04 20:32:24 +12:00
<td style="background:#ffffff;padding:48px 48px 40px;">
2026-05-04 20:32:24 +12:00
<h1 style="margin:0 0 8px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
2026-07-04 10:00:16 +12:00
font-size:26px;font-weight:700;color:#213021;line-height:1.2;">
2026-05-04 20:32:24 +12:00
Thanks, zÚ! &#x1F43E;
</h1>
<p style="margin:0 0 32px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:16px;color:#555;line-height:1.65;">
2026-05-04 20:32:24 +12:00

</p>
2026-05-04 20:32:24 +12:00
<!-- Details card -->
<table width="100%" cellpadding="0" cellspacing="0" role="presentation"
style="background:#f8f7f4;border-radius:12px;margin-bottom:36px;">
2026-05-04 20:32:24 +12:00
<tr>
<td style="padding:28px 32px;">
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:11px;font-weight:700;letter-spacing:0.1em;
color:#888;text-transform:uppercase;margin-bottom:20px;">
Your enquiry summary
</div>
<table width="100%" cellpadding="0" cellspacing="0" role="presentation">
2026-05-04 20:32:24 +12:00
r|a*
</table>
</td>
</tr>
</table>
<!-- What's next -->
<table width="100%" cellpadding="0" cellspacing="0" role="presentation"
style="border-left:3px solid #FFD100;margin-bottom:36px;">
<tr>
2026-05-04 20:32:24 +12:00
<td style="padding:4px 0 4px 20px;">
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:13px;font-weight:700;color:#213021;margin-bottom:6px;">
What happens next?
</div>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:14px;color:#666;line-height:1.6;">

</div>
</td>
</tr>
</table>
<p style="margin:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:14px;color:#888;line-height:1.6;">
Questions? Just reply to this email or reach us at 022 642 1011.
</p>
</td>
</tr>
<!-- Footer -->
<tr>
<td style="background:#213021;padding:24px 48px;text-align:center;">
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:12px;color:#5a8a5a;line-height:1.6;">
GoodWalk &middot; Auckland, New Zealand<br>
<a href="https://www.goodwalk.co.nz" style="color:#7aaa7a;text-decoration:none;">
goodwalk.co.nz
</a>
</div>
</td>
</tr>
</table>
</td></tr>
</table>
</body>
</html>)r6rRr´rr@ryrAr:ÚextendrBrCr)r•Ú
is_generalÚ
services_textÚenquiry_summary_rowsÚ
intro_htmlÚnext_steps_htmlÚ
logo_subtitles& rRÚ client_emailrÐås¿Ü$ *€JØ04·
·
°
D—II˜dŸm™mÔ,À?€Mä§¡ÓGœS §¡›_ÓG˜TŸZ™ZÓÓÐ÷Ø <<ˆ × °I¸t¿|¹|Ó(LÔ  ð
Kð ðD
à×з ± Ó˜J¨¯
©
Ó˜
Ó
ô
ð <<ˆ × °OÀTÇ\Á\Ó(RÔ 
Yà|‰|ˆn˜
ð ð 
àŸ,™,˜Ð'Bð
Dð ð
<ˆ
ð ô"
˜}Ô -Ð/ð—}‘}×,¨QÕ1ðˆlðð—W‘WÐ4ð" &ðy\ ð\ rTcóHV^8„dQhR\R\R\R\/#©rOr•r”r_r8)rQs"rRrSrSns/÷w ñw Ôw ¬Sðw ¼3ðw Ä3ñw rTcóÌ\V4pVP'dRPVP4MRp\P!4pVP R4P
2026-05-04 20:32:24 +12:00
R4pVPP4'd"VPP4^,MRpV'dRMRpV'dRMRp VP'dR V R
VP R 2MR p
R
PVR7p VP'd\RVP4M \RR4p VP'd\RVP4MR p
\R\VP VP"44p\R\VP$VP"44p\R\VP&VP"44p\R\VP(VP"44pVP*'d \R\-VP*44MR p\R\/VP044pV'dRMRp\3R\5V44.pV'dpVP6'd&VP9\3RVP644VP:'d&VP9\3RVP:44MFVP=\3RVP64\3RVP:4\3RV4.4R P.RNV NRN\?V R 7 NR!NV NR"NVP@ NR#NVP@ NR$NVP NR%NVP@ NR&NVP@ NR'NVPB NR&NVPB NR(NV NR)NR PV4 NR*NV
NR+NVP@ NR,NV NR-NVPB NR.NVPB NR/N\R0V4 NR*N\R1V4 NR*NV NR*NV NR*NV NR*NV NR*NV NR*NV NR*NV
NR*NV NR2N4#)3rÀõ—ú%d %b %Y at %I:%M %pÚthemzNew GoodWalk EnquiryzNew GoodWalk LeadrÄa)
<tr>
<td colspan="2" style="padding:16px 0 0;">
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:11px;font-weight:700;letter-spacing:0.08em;color:#888;
text-transform:uppercase;margin-bottom:8px;">zë</div>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:14px;color:#444;line-height:1.6;background:#f0efe9;
border-radius:8px;padding:14px 16px;">z</div>
</td>
</tr>r|ar<div style="display:inline-block;background:#FFD100;border-radius:100px;
padding:10px 28px;">
<span style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:18px;font-weight:700;color:#213021;">
&#x1F4E9;&nbsp; New enquiry!
</span>
</div>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:12px;color:#5a8a5a;margin-top:12px;">
Submitted {submitted_at}
</div>)Ú submitted_atú Came fromúDirect / bookmarkÚPageú Time on siteú Time on pageúActive form timeúForm open timez Step changesÚJourneyzEnquiry detailszDog &amp; servicesrÃÚDogrÅzú<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="color-scheme" content="light only">
<meta name="supported-color-schemes" content="light">
<title>a</title>
<style>
:root {
color-scheme: light only;
supported-color-schemes: light;
2026-05-04 20:32:24 +12:00
}
body,
table,
td,
div,
p,
span,
a {
forced-color-adjust: none !important;
-webkit-text-size-adjust: 100%;
}
.gw-owner-body {
background: #f2f2f0 !important;
color: #213021 !important;
}
.gw-owner-shell {
background: #ffffff !important;
}
.gw-owner-dark-panel {
background: #213021 !important;
2026-07-04 10:00:16 +12:00
}
2026-05-04 20:32:24 +12:00
.gw-owner-email-chip {
display: inline-block;
background: #ffffff !important;
color: #213021 !important;
border-radius: 10px;
padding: 12px 14px;
border: 1px solid #d9dfd9;
text-decoration: none !important;
}
.gw-owner-email-chip,
2026-05-04 20:32:24 +12:00
.gw-owner-email-chip a,
2026-07-04 10:00:16 +12:00
a.gw-owner-email-chip {
color: #213021 !important;
}
@media (prefers-color-scheme: dark) {
html,
body,
2026-06-17 21:51:29 +12:00
.gw-owner-body {
background: #f2f2f0 !important;
2026-07-04 10:00:16 +12:00
color: #213021 !important;
}
.gw-owner-shell,
.gw-owner-shell td {
background: #ffffff !important;
color: #213021 !important;
}
.gw-owner-dark-panel,
.gw-owner-dark-panel td {
background: #213021 !important;
}
.gw-owner-email-chip,
.gw-owner-email-chip a,
a.gw-owner-email-chip {
background: #ffffff !important;
color: #213021 !important;
}
}
</style>
</head>
<body class="gw-owner-body" style="margin:0;padding:0;background:#f2f2f0;color:#213021;">
<table width="100%" cellpadding="0" cellspacing="0" role="presentation" bgcolor="#f2f2f0"
style="background:#f2f2f0;padding:40px 16px;">
<tr><td align="center">
<table class="gw-owner-shell" width="600" cellpadding="0" cellspacing="0" role="presentation" bgcolor="#ffffff"
style="max-width:600px;width:100%;border-radius:16px;overflow:hidden;
box-shadow:0 4px 24px rgba(0,0,0,0.08);background:#ffffff;">
)a
<!-- Body -->
<tr>
<td bgcolor="#ffffff" style="background:#ffffff;padding:40px 48px 36px;color:#213021;">
<!-- Quick contact -->
<table class="gw-owner-dark-panel" width="100%" cellpadding="0" cellspacing="0" role="presentation" bgcolor="#213021"
style="background:#213021;border-radius:12px;margin-bottom:28px;">
<tr>
<td bgcolor="#213021" style="padding:22px 24px;background:#213021;">
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:11px;font-weight:700;letter-spacing:0.1em;color:#7aaa7a;
text-transform:uppercase;margin-bottom:10px;">
Quick contact
</div>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:14px;color:#d8e6d8;line-height:1.6;margin-bottom:10px;">
Email z| directly:
</div>
<div style="margin-bottom:12px;">
<a href="mailto:aß" class="gw-owner-email-chip"
2026-07-04 10:00:16 +12:00
style="display:inline-block;background:#ffffff;color:#213021 !important;
font-family:Menlo,Consolas,'SFMono-Regular',monospace;
font-size:20px;font-weight:700;line-height:1.4;word-break:break-all;
border-radius:10px;padding:12px 14px;border:1px solid #d9dfd9;
text-decoration:none;">
a 
</a>
</div>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:12px;color:#b7cbb7;line-height:1.6;">
Tap and hold the address to copy on iPhone, or tap below to open a new email.
</div>
</td>
</tr>
</table>
<!-- Owner details -->
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:11px;font-weight:700;letter-spacing:0.1em;color:#888;
text-transform:uppercase;margin-bottom:16px;">Owner details</div>
<table width="100%" cellpadding="0" cellspacing="0" role="presentation"
style="background:#f8f7f4;border-radius:12px;margin-bottom:28px;">
<tr><td style="padding:24px 28px;">
<table width="100%" cellpadding="0" cellspacing="0" role="presentation">
<tr>
2026-07-04 10:00:16 +12:00
<td style="padding:6px 0;font-size:13px;color:#888;width:80px;
font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
vertical-align:top;">Name</td>
<td style="padding:6px 0 6px 16px;font-size:15px;font-weight:600;
color:#213021;font-family:-apple-system,BlinkMacSystemFont,
'Segoe UI',sans-serif;vertical-align:top;">a#</td>
</tr>
<tr>
<td style="padding:6px 0;font-size:13px;color:#888;
2026-07-04 10:00:16 +12:00
font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
vertical-align:top;">Email</td>
<td style="padding:6px 0 6px 16px;font-size:14px;
font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
vertical-align:top;">
<a href="mailto:zX" style="color:#213021;font-weight:500;
text-decoration:none;">a9</a>
</td>
</tr>
2026-06-17 21:51:29 +12:00
<tr>
2026-07-04 10:00:16 +12:00
<td style="padding:6px 0;font-size:13px;color:#888;
font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
vertical-align:top;">Phone</td>
<td style="padding:6px 0 6px 16px;font-size:14px;
font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
vertical-align:top;">
<a href="tel:a¤</a>
</td>
</tr>
</table>
2026-07-04 10:00:16 +12:00
</td></tr>
</table>
<!-- Dog & service details -->
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:11px;font-weight:700;letter-spacing:0.1em;color:#888;
text-transform:uppercase;margin-bottom:16px;">aO</div>
<table width="100%" cellpadding="0" cellspacing="0" role="presentation"
style="background:#f8f7f4;border-radius:12px;margin-bottom:28px;">
2026-07-04 10:00:16 +12:00
<tr><td style="padding:24px 28px;">
<table width="100%" cellpadding="0" cellspacing="0" role="presentation">
ú
a4
</table>
2026-06-17 21:51:29 +12:00
</td></tr>
</table>
2026-06-17 21:51:29 +12:00
<!-- CTA buttons -->
<table cellpadding="0" cellspacing="0" role="presentation" style="margin-bottom:32px;">
2026-06-17 21:51:29 +12:00
<tr>
2026-07-04 10:00:16 +12:00
<td style="padding-right:12px;">
<a href="mailto:ac"
2026-05-18 22:25:43 +12:00
style="display:inline-block;background:#213021;color:#FFD100;
font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:14px;font-weight:600;text-decoration:none;
2026-05-19 23:36:58 +12:00
border-radius:8px;padding:12px 24px;">
Email zb
2026-07-04 10:00:16 +12:00
</a>
2026-05-18 22:25:43 +12:00
</td>
<td>
<a href="tel:a{"
style="display:inline-block;background:#f8f7f4;color:#213021;
font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:14px;font-weight:600;text-decoration:none;
border-radius:8px;padding:12px 24px;border:1px solid #e0e0d8;">
Call aµ
</a>
</td>
</tr>
</table>
<!-- Session info -->
<table width="100%" cellpadding="0" cellspacing="0" role="presentation"
2026-07-04 10:00:16 +12:00
style="border-top:1px solid #eeeee8;padding-top:20px;">
2026-05-18 22:25:43 +12:00
<tr><td>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
2026-07-04 10:00:16 +12:00
font-size:11px;font-weight:700;letter-spacing:0.08em;color:#ccc;
text-transform:uppercase;margin-bottom:12px;">Session info</div>
<table width="100%" cellpadding="0" cellspacing="0" role="presentation">
ú
2026-06-17 21:51:29 +12:00
IP addressÚBrowseraE
</table>
2026-07-04 10:00:16 +12:00
</td></tr>
</table>
</td>
2026-06-17 21:51:29 +12:00
</tr>
<!-- Footer -->
<tr>
<td style="background:#f8f7f4;padding:18px 48px;text-align:center;
border-top:1px solid #e8e8e4;">
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:12px;color:#bbb;">
Sent automatically by GoodWalk enquiry form
</div>
</td>
</tr>
</table>
</td></tr>
</table>
</body>
</html>)"r6rRr´rÚstrftimeÚlstripr@rrQrPr rQrLrOrMrNr*rTryrSrr:rBrCrA)r•r”Ú
first_nameÚ email_titleÚ
message_labelÚ
message_blockr¼Ú referrer_rowÚpage_rowÚvisit_time_rowÚ
page_time_rowÚactive_time_rowÚ
form_time_rowÚstep_changes_rowÚ journey_rowÚdetail_headingÚ detail_rowss&&& rRÚ owner_emailrõnÜ$ *€JØ04·
·
°
D—II˜dŸm™mÔ,À5€MÜ
,Š,.€CØ—<<Ð 6Ó7×>¸C€LØ-1¯]©]×-@Ñ-@×-BÒ-B×& €Jß,6Ñ(Ð<O€Kç!+€Mð ðBð
CPÀðQ<@¿<¹<¸I
ñ

ð#%ðð
÷¨\˜Ó
ð=A¿M¿M¸M”9˜[¨$¯-©-Ô8ÌyÐYdÐfyÓOz€LØ/3¯y¯y¨yŒy˜ §¡Ô+¸b€Hܘ~Ô/@À×ATÑATÐVZ×VhÑVhÓ/iÓj€NܘnÔ.?À×@RÑ@RÐTX×TfÑTfÓ.gÓh€MÜÐ 2Ô4EÀd×F]ÑF]Ð_c×_qÑ_qÓ4rÓs€OÜÐ.Ô0AÀ$×BTÑBTÐVZ×VhÑVhÓ0iÓj€MØKO×K[×K[ÐK[”y ´°T×5EÑ5EÓ1FÔGÐacÐܘI¤}°T·\±\Ó'BÓC€Kß*4Ñ&Ð:N€NܘvÔ':¸4Ó'@ÓB€KçØ <<ˆ × Ñ œ{¨5°$·,±,Ó ==ˆ=Ø × Ñ œ{¨:°t·}±}Ó Føà×Ñä˜E 4§<¡<Ó˜¯
©
Ó˜
Ó
ô
÷} ó} ð
ð} ð ˆð} ðU ð} ôx
 Ô 'Ð(ðy} ðx)ðy} ð\&˜,ð]} ð\'%ð]} ðb&*§Z¡Z Lðc} ðb1ðc} ðn—zzlðo} ðn#Kðo} ðbLPÏ=É=È/ðc} ðb Z'ðc} ðt(,§z¡z lðu} ðt31ðu} ðv26·±° ðw} ðv
=$ðw} ðJ%)§J¡J <ðK} ðJ01ðK} ðL26·±° ðM} ðL
=GðM} ð`HVÐFVða} ð`Wða} ðl—77˜(ðm} ðl)ðm} ðn!/ðo} ðn "#ðo} ð@$(§:¡: ,ðA} ð@/ðA} ðJ&˜,ðK} ðJ' ðK} ðR!%§
¡
˜|ðS} ðR,ðS} ð\Ÿ*™*˜ð]} ð\&ð]} ôx˜\¨2Ó/ðy} ðx0ðy} ôz˜Ó1ð{} ðz2ð{} ð|"ð}} ð|#ð}} ð~!} ð~"ð} ð@#ðA} ð@$ðA} ðB!/ðC} ðB"ðC} ðD$ðE} ðD%ðE} ðF .ðG} ðF!ðG} ðH*ðI} ðHðI} ðJ-ðK} ðJ ôK} ð} rTcóHV^8„dQhR\R\R\R\/#©rGry)rQs"rRrSrS¨s0÷j ñj Ô!5ðj ¼3ðj Ìðj ÔQTñj rTc ó` \P!4PR4PR4pRP VP
4p\
R\VPVP44p\
R\VPVP44p\
R\VPVP44p\
R\VPVP44pVP'd\
RVP4M \
RR4p VP'd\
R VP4MR
p
VP'dR VP R 2MR
p VP 'dR
VP R 2MR
p VP"'dRVP" R 2MR
p
RVP$ R2pRV R2pR
P .RN\'VRR7 NRNVP( NRNVP( NRNVP* NRNVP* NRN\-RVP.4 NRN\-R\1VP(44 NRN\-RVP*4 NRN\-RVP24 NRNV
NR N\-R!VP44 NRN\-R"VP64 NRN\-R#VP8;'gR$4 NRN\-R%V4 NRNV NRNV NR&N\-R'VP:4 NRN\-R(VP<4 NRN\-R)VP>4 NRN\-R*VP@4 NRN\-R+VPB4 NRN\-R,VPDR-8XdR.MR/4 NRN\-R0VPFR-8XdR.MR/4 NRNVPFR18XdVPH'd
\-R2R34MR
NRN\-R4VPJ'dR3MR54 NRN\-R6VPL'dR3MR54 NRN\-R7R34 NRN\-R8R94 NR:NV NR;N\
R<V4 NRN\
R=V4 NRNV NRNV NRNV NRNV NRNV NRNV
NR>N4#)?rÕr|a;
<tr>
<td colspan="2" style="padding:16px 0 0;">
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:11px;font-weight:700;letter-spacing:0.08em;color:#888;
text-transform:uppercase;margin-bottom:8px;">Temperament and routine</div>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:14px;color:#444;line-height:1.6;background:#f0efe9;
border-radius:8px;padding:14px 16px;">ú </div>
</td>
</tr>a1
<tr>
<td colspan="2" style="padding:16px 0 0;">
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:11px;font-weight:700;letter-spacing:0.08em;color:#888;
text-transform:uppercase;margin-bottom:8px;">Medical notes</div>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:14px;color:#444;line-height:1.6;background:#f0efe9;
border-radius:8px;padding:14px 16px;">a<
<tr>
<td colspan="2" style="padding:16px 0 0;">
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:11px;font-weight:700;letter-spacing:0.08em;color:#888;
text-transform:uppercase;margin-bottom:8px;">Home access instructions</div>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:14px;color:#444;line-height:1.6;background:#f0efe9;
border-radius:8px;padding:14px 16px;">á•
<div style="margin-top:16px;border-radius:16px;background:#ffffff;border:1px solid #e3e3db;padding:14px 14px 10px;">
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:11px;font-weight:700;letter-spacing:0.1em;color:#888;
text-transform:uppercase;margin-bottom:10px;">Captured signature</div>
<img src="ú{" alt="Client signature" style="display:block;max-width:100%;height:auto;border-radius:10px;background:#fff;">
</div>aT<div style="display:inline-block;background:#FFD100;border-radius:100px;
padding:10px 28px;">
<span style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:18px;font-weight:700;color:#213021;">
2026-07-04 10:00:16 +12:00
&#x270D;&nbsp; New onboarding form
</span>
2026-06-17 21:51:29 +12:00
</div>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
font-size:12px;color:#5a8a5a;margin-top:12px;">
2026-07-04 10:00:16 +12:00
Submitted ú
</div>aZ<!DOCTYPE html>
2026-05-19 23:36:58 +12:00
<html lang="en">
<head>
2026-07-04 10:00:16 +12:00
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
2026-06-17 21:51:29 +12:00
<title>New GoodWalk onboarding form</title>
</head>
<body style="margin:0;padding:0;background:#f2f2f0;">
2026-07-04 10:00:16 +12:00
<table width="100%" cellpadding="0" cellspacing="0" role="presentation" style="background:#f2f2f0;padding:40px 16px;">
2026-05-19 23:36:58 +12:00
<tr><td align="center">
<table width="680" cellpadding="0" cellspacing="0" role="presentation"
2026-05-19 23:36:58 +12:00
style="max-width:680px;width:100%;border-radius:16px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.08);">
zSigned onboarding form©r¸
<tr>
<td style="background:#ffffff;padding:38px 40px 34px;">
<table width="100%" cellpadding="0" cellspacing="0" role="presentation"
style="background:#213021;border-radius:12px;margin-bottom:26px;">
<tr>
2026-07-04 10:00:16 +12:00
<td style="padding:22px 24px;">
2026-05-19 23:36:58 +12:00
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:11px;font-weight:700;letter-spacing:0.1em;color:#7aaa7a;text-transform:uppercase;margin-bottom:10px;">
Quick contact
2026-07-04 10:00:16 +12:00
</div>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:14px;color:#d8e6d8;line-height:1.6;margin-bottom:10px;">
Reply directly to the owner or call them back:
</div>
<div style="margin-bottom:10px;">
2026-07-04 10:00:16 +12:00
<a href="mailto:úé" style="display:inline-block;background:#ffffff;color:#213021;text-decoration:none;border-radius:10px;padding:12px 14px;border:1px solid #d9dfd9;font-family:Menlo,Consolas,'SFMono-Regular',monospace;font-size:18px;font-weight:700;">ú=</a>
</div>
<a href="tel:úã" style="display:inline-block;background:#ffd100;color:#213021;text-decoration:none;border-radius:999px;padding:10px 16px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:14px;font-weight:700;">Call aU</a>
</td>
2026-07-04 10:00:16 +12:00
</tr>
</table>
2026-07-04 10:00:16 +12:00
2026-05-19 23:36:58 +12:00
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:11px;font-weight:700;letter-spacing:0.1em;color:#888;text-transform:uppercase;margin-bottom:16px;">Owner details</div>
<table width="100%" cellpadding="0" cellspacing="0" role="presentation" style="background:#f8f7f4;border-radius:12px;margin-bottom:24px;">
2026-07-04 10:00:16 +12:00
<tr><td style="padding:24px 28px;">
2026-05-19 23:36:58 +12:00
<table width="100%" cellpadding="0" cellspacing="0" role="presentation">
ÚNamerâÚAddressac
</table>
</td></tr>
</table>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:11px;font-weight:700;letter-spacing:0.1em;color:#888;text-transform:uppercase;margin-bottom:16px;">Dog and service details</div>
<table width="100%" cellpadding="0" cellspacing="0" role="presentation" style="background:#f8f7f4;border-radius:12px;margin-bottom:24px;">
<tr><td style="padding:24px 28px;">
<table width="100%" cellpadding="0" cellspacing="0" role="presentation">
2026-07-04 10:00:16 +12:00
ÚBreedú
Date of birthrÔÚServiceaZ
</table>
2026-06-17 21:51:29 +12:00
</td></tr>
2026-05-19 23:36:58 +12:00
</table>
2026-06-17 21:51:29 +12:00
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:11px;font-weight:700;letter-spacing:0.1em;color:#888;text-transform:uppercase;margin-bottom:16px;">Safety details</div>
2026-05-19 23:36:58 +12:00
<table width="100%" cellpadding="0" cellspacing="0" role="presentation" style="background:#f8f7f4;border-radius:12px;margin-bottom:24px;">
<tr><td style="padding:24px 28px;">
<table width="100%" cellpadding="0" cellspacing="0" role="presentation">
2026-06-17 21:51:29 +12:00
ú
Vet clinicú Vet phoneú Vet addressúEmergency contactúEmergency phoneúRegular flea and tick treatmentriÚYesÚNoú
Pet insurancerfúOwner covers all vet costsÚ ConfirmedúCouncil registrationuNot confirmed — follow upÚ VaccinationsúEmergency consentÚ DeclarationÚSignedú*
2026-07-04 10:00:16 +12:00
</table>
á
</td></tr>
2026-05-19 23:36:58 +12:00
</table>
<table width="100%" cellpadding="0" cellspacing="0" role="presentation" style="border-top:1px solid #eeeee8;padding-top:20px;">
2026-06-17 21:51:29 +12:00
<tr><td>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:11px;font-weight:700;letter-spacing:0.08em;color:#ccc;text-transform:uppercase;margin-bottom:12px;">Session info</div>
2026-07-04 10:00:16 +12:00
<table width="100%" cellpadding="0" cellspacing="0" role="presentation">
2026-06-17 21:51:29 +12:00
úž
</table>
2026-07-04 10:00:16 +12:00
</td></tr>
</table>
2026-06-17 21:51:29 +12:00
</td>
</tr>
2026-07-04 10:00:16 +12:00
</table>
</td></tr>
</table>
</body>
</html>)'rr´rjr rLrOrMrNr*rPrQrwrxryrprArr@ryr^r>r@rBrarcrbrdrerkrlrmÚcouncilRegistrationConfirmedÚvaccinationsConfirmed)r•r”Údog_notes_blockÚ
medical_blockÚ access_blockÚsignature_blockr¼s&&& rRÚowner_onboarding_emailr¨Ü—<<“>×*Ð+AÓB×IÈ#ÓN€LØ—I‘I˜d×2€Mܘ~Ô/@À×ATÑATÐVZ×VhÑVhÓ/iÓj€NܘnÔ.?À×@RÑ@RÐTX×TfÑTfÓ.gÓh€MÜÐ 2Ô4EÀd×F]ÑF]Ð_c×_qÑ_qÓ4rÓs€OÜÐ.Ô0AÀ$×BTÑBTÐVZ×VhÑVhÓ0iÓj€MØ<@¿M¿M¸M”9˜[¨$¯-©-Ô8ÌyÐYdÐfyÓOz€LØ/3¯y¯y¨yŒy˜ §¡Ô+¸b€Hð×"×>B×=MÑ=MÐ<NðO ñ
ð)+ðð,×#×>B×=NÑ=NÐ<OðP ñ
ð*,ðð,×)×>B×=TÑ=TÐ<UðV ñ
ð02ððð
×*
ð €Oð ð)˜*ð
€E÷h óh ð
 ðh ô
 Ð1IÔ JÐh ðLh ð8&*§Z¡Z Lð9h ð81Zð9h ð8[_÷[eñ[eðZfð9h ð8f ð9h ð<!%§
¡
˜|ð=h ð<,Oð=h ð<PT÷PZñPZðO[ð=h ð< [ð=h ôN˜v t§}¡}Ó6ðOh ðN7ðOh ôP˜w¬¨D¯J©J«Ó9ðQh ðP:ðQh ôR˜¯
©
Ó4ðSh ðR5ðSh ôT˜y¨$¯,©,Ó8ðUh ðT9ðUh ðV .ðWh ðV !ðWh ôh˜u d§l¡lÓ4ðih ðh5ðih ôj˜¯
©
Ó7ðkh ðj8ðkh ôl˜°· ± ×0DÐ0D¸uÓFðmh ðlGðmh ôn˜y¨-Ó9ðoh ðn:ðoh ðp#ðqh ðp$ðqh ðr!/ðsh ðr "ðsh ôD˜|¨T¯\©\Ó;ðEh ðD<ðEh ôF˜{¨D¯M©MÓ;ðGh ðF<ðGh ôH˜}¨d¯o©oÓ?ðIh ðH@ðIh ôJÐ2°D×4MÑ4MÓOðKh ðJPðKh ôLÐ0°$×2LÑ2LÓNðMh ðLOðMh ôNÐ@È4×KhÑKhÐlqÔKqÁ%Ðw{Ó}ðOh ðN~ðOh ôP˜¸×9JÑ9JÈeÔ9S±ÐY]Ó_ðQh ðP`ðQh ðRNR×M^ÑM^ÐbfÔMfÐko÷lQ÷lQðlQ”;Ð;¸WYðZðSh ðRZðSh ôTÐ5Àd×Fg×FgÐFg±{ðnKóLðMðUh ðTMðUh ôV˜~¸d×>X×>XÐ>X©{Ð^{Ó}ðWh ðV~ðWh ôXÐ2°KÓAðYh ðXBðYh ôZ˜}¨hÓ8ð[h ðZ9ð[h ð^!ð_h ð^"ð_h ôn˜\¨2Ó/ðoh ðn0ðoh ôp˜Ó1ðqh ðp2ðqh ðr"ðsh ðr#ðsh ðt!/ðuh ðt"ðuh ðv#ðwh ðv$ðwh ðx!/ðyh ðx"ðyh ðz .ð{h ðz!ð{h ð|*ð}h ð|
ô}h ðh rTc óbV^8„dQhR\R\R\R\R\R,/#)rOÚdog_nameÚdog_birth_dateÚ
owner_namer²r_Nrl)rQs"rRrSrSUs7÷)ñ)¤sð)¼Cð)ÌSð)Ô^að)ÔfjÐmqÕfqñ)rTcóN\V4p\V4p\V4pV'd V'gR#\P!VR4P4pT\^R7,p\P!RRTP44PR4;'gRp T R2p
RT R 2p T'gT
MT
R
T 2p R \P!4 R \P!\P 4P#R
4 RTP#R4 RTP#R4 RT
RT RT R2p
RRT R2R\$P&!T
P)R44P+R4/# \d\
P !RY14R#i;i)%Y-%m-%dz<[%s] onboarding birthday calendar skipped: invalid dogAge=%r)Údaysr/r0rRz 's BirthdayzGoodWalk reminder: z 's birthday.ú for zƒBEGIN:VCALENDAR
VERSION:2.0
PRODID:-//GoodWalk//Dog Birthday Reminder//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
BEGIN:VEVENT
UID:z@goodwalk.co.nz
DTSTAMP:z%Y%m%dT%H%M%SZz
DTSTART;VALUE=DATE:z%Y%m%dz
2026-07-04 10:00:16 +12:00
DTEND;VALUE=DATE:z
RRULE:FREQ=YEARLY
SUMMARY:z
2026-05-18 22:25:43 +12:00
DESCRIPTION:z
2026-07-04 10:00:16 +12:00
X-WR-CALNAME:z
END:VEVENT
END:VCALENDAR
Úfilenameú goodwalk-z
-birthday.icsÚcontentreÚascii)rrÚstrptimeÚdaterzr<r“rr3r4rr5r6rÚutcråÚbase64Ú b64encodeÚencoderÛ)r!r"r#Údog_name_cleanÚbirth_date_cleanÚowner_name_cleanÚ starts_onÚends_onÚ safe_nameÚsummaryÚ descriptionÚ
calendar_nameÚics_bodys&&&& rRÚ_birthday_ics_attachmentr<Uܘ'€NÜ ÓÜ 
Óç ×!1ÙðÜ×%Ð&6¸
ÓC×Jˆ ð
œ)¨Ô+€GÜ} c¨>×+?Ñ+?Ó+AÓB×ÓVÐQV€IØÐ   Ð,€GØÐ'7°|ÐD€Kß#3G¸G¸9ÀEÐJZÐI[Ð9\€Mð ô zŠz|ˆÜ—<§ ¡ Ó-×6Ð7GÓJØ'×Ó<Ø#×,¨XÓ8àØ"$Ø%ð'ð ð
ð( i  ˜{¨-Д6×# H§O¡O°GÓ$<Ó=×DÀWÓ ðøô9 ôÜŠÐUÐWaÔðúsµ%E>Å>"F$Æ#F$có0V^8„dQhR\R\/#r-©r
ry)rQs"rRrSrSs÷ ñ ”sð œsñ rTcó¨VfR#\V4pVPRR4PRR4PRR4PRR 4#)
Nr|Ú&amp;Ú&lt;Ú&gt;Ú
ú<br>)ryrr)Útexts& rRÚ _pdf_escaperIsJØ ‚}ÙÜ ˆu‹:€Dà S˜
‰WS˜
‰WS˜
‰WT˜
rTcó0V^8„dQhR\R\/#r.)rQs"rRrSrSs÷D ñD Ô$8ðD ¼SñD rTc óž a\P!4PR4PR4pVP;'g/p\ V\ 4'dVPR4MRpRRlo.p\ V\4'V'Vp\ V\ 4'gK\VPRR44pVPR 4;'g.pRpVF[p \ V \ 4'gK\V PR
R44p
VR V
R S!V PR
44 R2,
pK] V'gVPRV RV R24 EM¥RV3Rllp V !RVP4V !R\VP44,V !RVP4,V !RVP4,V !RVP 4,p V !RVP"4V !RVP$4,T !RVP&;'gR4,V !RVP(4,V !RVP*4,V !RVP,4,p
V !RVP.4V !R VP04,V !R!VP24,V !R"VP44,V !R#VP64,T !R$VP8R%8XdR&MR'4,T !R(VP:R%8XdR&MR'4,T !R)VP:R*8XdVP<'dR+MR4,T !R,VP>'dR+MR-4,T !R.VP@'dR+MR-4,T !R/VPB'dR+MR-4,T !R0VPD'dR1MR24,pVPR3V R4V
R5V R24RpVPF'd3R6VPF R7\VP4 R8\V4 R92pRPIV4V,pR:\VP4 R;\VP4 R<\VP"4 R=\V4 R>V R?2 #)@zPClean, full-width, black-and-white, Arial HTML for the printable onboarding PDF.rÕÚsectionsNcó0V^8„dQhR\R\/#r-r>)rQs"rRrSÚ/owner_onboarding_pdf_html.<locals>.__annotate__”s÷+œCð+¤Cñ+rTcó.\V\4'dWVUu.uF/p\V4P4'gK$\ V4NK1 ppV'dRP V4#R#\ V4P4pV'dV#R#uupi)z&mdash;)r€ryrIr´)ÚitemrÂrHs& rRÚ render_valueÚ/owner_onboarding_pdf_html.<locals>.render_value”stÜ eœT× "Ù38ÓN±5¨4¼CÀ»I¿O¹O×<MÔ&”[ Ö&±5ˆNß',4—99˜ ;°)Ð ˜!×)ˆßˆ* Ð*ùòOs !BÁBrZr|Úfieldsr™ú<tr><th>ú </th><td>rÓú
</td></tr>z!<section class='pdf-section'><h2>z%</h2><table class='pdf-table'><tbody>z</tbody></table></section>có<V^8„dQhR\R\R\/#r˜)rQs"rRrSrN·s&÷ [ñ [”sð [¤3ð [¬3ñ [rTcó4<R\V4 RS!V4 R2#)rTrUrV)rI)r™rQs&&€rRÚrowÚ&owner_onboarding_pdf_html.<locals>.row·s$ø€Øœk¨%Ó¹<ÈÓ;NÐ:OÈzÐ ZrTrrz Home accessrárrzTemperament / routinez
Medical notesrrrr r
r rir r
rrrfrrz
Not confirmedrzEmergency vet consentrrz
Not signedzS<section class='pdf-section'><h2>Owner Details</h2><table class='pdf-table'><tbody>zk</tbody></table></section><section class='pdf-section'><h2>Dog Details</h2><table class='pdf-table'><tbody>zf</tbody></table></section><section class='pdf-section'><h2>Safety</h2><table class='pdf-table'><tbody>zG<section class='pdf-section pdf-signature'><h2>Signature</h2><img src='z@' alt='Client signature'><div class='pdf-signed-line'>Signed by r†z</div></section>zk<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Goodwalk onboarding form &mdash; a1</title>
<style>
@page {
size: A4;
margin: 14mm 12mm 14mm 12mm;
}
* { box-sizing: border-box; }
html, body {
margin: 0;
padding: 0;
background: #ffffff;
color: #000000;
font-family: Arial, Helvetica, sans-serif;
font-size: 10.5pt;
line-height: 1.4;
}
.pdf-doc { width: 100%; }
.pdf-header {
width: 100%;
border-bottom: 1.5pt solid #000;
padding-bottom: 8pt;
margin-bottom: 14pt;
}
.pdf-header h1 {
font-size: 18pt;
font-weight: 700;
margin: 0 0 4pt 0;
letter-spacing: 0.5pt;
text-transform: uppercase;
}
.pdf-header .pdf-meta {
font-size: 9.5pt;
color: #000;
}
.pdf-section {
width: 100%;
margin: 0 0 14pt 0;
page-break-inside: avoid;
}
.pdf-section h2 {
font-size: 11pt;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.6pt;
margin: 0 0 6pt 0;
padding: 0 0 3pt 0;
border-bottom: 0.75pt solid #000;
}
table.pdf-table {
width: 100%;
border-collapse: collapse;
table-layout: fixed;
}
table.pdf-table th,
table.pdf-table td {
text-align: left;
vertical-align: top;
padding: 5pt 8pt;
border-bottom: 0.4pt solid #000;
word-wrap: break-word;
overflow-wrap: break-word;
}
table.pdf-table th {
width: 34%;
font-weight: 700;
background: #ffffff;
}
table.pdf-table td {
2026-05-18 22:25:43 +12:00
width: 66%;
font-weight: 400;
}
.pdf-signature img {
display: block;
max-width: 70%;
max-height: 60mm;
height: auto;
border: 0.5pt solid #000;
padding: 4pt;
margin: 4pt 0 6pt 0;
background: #fff;
2026-07-04 10:00:16 +12:00
}
2026-05-18 22:25:43 +12:00
.pdf-signed-line {
font-size: 9.5pt;
border-top: 0.4pt solid #000;
padding-top: 4pt;
2026-07-04 10:00:16 +12:00
margin-top: 4pt;
}
</style>
</head>
<body>
<div class="pdf-doc">
2026-05-18 22:25:43 +12:00
<header class="pdf-header">
<h1>Goodwalk Onboarding Form</h1>
<div class="pdf-meta">
<strong>z</strong> &middot; z &middot; Submitted z
</div>
</header>
2026-07-04 10:00:16 +12:00
z
</div>
</body>
</html>)%rÚsubmissionSnapshotr€rIr@ryrAr^ryr>r@rBrjrwrxrarcrbrdrerkrlrmrrrnrorpr´)r•rLÚsections_html_partsÚsectionrZrSÚ rows_htmlÚfieldr™rYÚ
owner_rowsÚdog_rowsÚ safety_rowsÚsignature_htmlÚ body_htmlrQs& @rRÚowner_onboarding_pdf_htmlreø€ä—<<“>×*Ð+AÓB×IÈ#ÓN€Là×&×,¨"€HÜ+5°hÄ×+EÒ+Eˆx|‰|˜'È4€Hõ&(Ðä(œD×!§hÛˆGܘg¤t×Ü § ¡ ¨G°RÓ 8Ó9ˆEØ—[‘[ Ó0¨bˆF؈IÛÜ! %¬×Ü# E§I¡I¨g°rÓ$:Ó;ØðØ ˜"Ù¯ © °'Ó(:Ó=ðõ ñ  ÷‰yØ#ר ˜"7Ø7@°kðBó# ÷2 [ð [ñ
˜Ÿ
2026-05-19 23:36:58 +12:00
Ó 'œ3˜tŸz™z
'˜4Ÿ:™:Ó
2026-07-04 10:00:16 +12:00
)˜TŸ\™\Ó
2026-05-19 23:36:58 +12:00
- ×!8Ñ!8Ó
 ñ
t—| '˜4Ÿ=™=Ó
/ 4§;¡;×#4Ð#4°"Ó
*˜d×
Ð)¨4×+;Ñ+;Ó
/ 4×#4Ñ#4Ó 
 ñ
 ˜dŸl™lÓ +˜tŸ}™}Ó
2026-07-04 10:00:16 +12:00
- §¡Ó
2026-05-19 23:36:58 +12:00
Ð% t×'@Ñ'@Ó
BñÐ# T×%?Ñ%?Ó
Añ
Ð3¸d×>[Ñ>[Ð_dÔ>d±UÐjnÓ 
pñ /¨D×,=Ñ,=ÀÔ,F¡5ÈDÓ

2026-07-04 10:00:16 +12:00
RñÐ.¸t×?PÑ?PÐTXÔ?XÐ]a÷^C÷^Cð^C± ðIKóLõ
2026-05-19 23:36:58 +12:00
LñÐ(¸×9Z×9ZÐ9Z©+Ð`oÓ
qñ×1K×1KÐ1K¡+ÐQ`Ó
bñÐ)¸$×:R×:RÐ:R©;ÐXgÓ
iñ-¨T×-?×-?Ð-?¡À\Ó
Sð ð ×aÐblÐamðn`Ø`hÐ_iðj[Ø[fÐZgðhBð
Cô
ð €NØ ××Ðð
à×06Ü6AÀ$Ç-Á-Ó6PÐ5QÐQUÔVaÐbnÓVoÐUpðqð
ð ðÐ,¨~Õ=€Ið,7°t·}±}Ó+EÐ*Fð^Gô|˜TŸ]™]Ó,Ð,?Ä ÈDÏLÉLÓ@YÐ?ZÐZnÔozð|HópIðoJðJð€KððKh ðh rTcó0V^8„dQhR\R\/#)rOÚhtmlr_)ryÚbytes)rQs"rRrSrSTs÷)œ3ð)¤5ñ)rTcó<^RIHpV!VR7P4#)r)ÚHTML)Ústring)Ú
weasyprintrjÚ write_pdf)rgrjs& rRÚ_render_pdf_syncrnTsÝÙ  × (rTTc óbV^8„dQhR\R\R\R\R\R,/#)rOrgÚ full_nameÚkindr²r_Nrl)rQs"rRrSrS_s7÷ ñ ¬Cð ¼Cð Äsð ÔX[ð Ô`dÐgkÕ`kñ rTc ƒóî"\P!RR\V4P44P R4;'gRp\
P !\V4GRjxL
p\P!RY2\T44RR T RT R
2R \P!T4PR 4/#LU \d&p\P!RY2TRR7Rp?R#Rp?ii;i5i)
r/r0rNz![%s] %s PDF generation failed: %sT©Úexc_infoz[%s] %s PDF generated: %d bytesr(r)z.pdfr*r+)r3r4rrrnrr<Úerrorrßr/r0)rgrprqr7Ú pdf_bytesrs&&&& rRÚ_signed_form_pdf_attachmentrw_éÜ} c¬8°IÓ+>×+DÑ+DÓ+FÓG×MÈcÓR×^ÐV^€IðÜ!×+Ô,<¸C×Cˆ ô
 ‡K‚KÐ1°:ÄSÈÃ^Ôi ˜v Q y Ð”6×# .×5°gÓ ðñ
DøÜ ôÜ Š Ð8¸*ÈCÐZ^ÕûðüsCA C5Á CÁ*CÁ+CÁ/AC5ÃCÃ C2Ã
C-Ã'C5Ã-C2Ã2C5có:V^8„dQhR\\,/#rv)rQs"rRrSrSps÷
ñ
œ$œs
rTcó6.p\\3FpT;'gRP4pV'dVP4R8XdK<VP4VUu0uFq3P4kK up9gKpVP V4 V#uupi)a=BCC recipients for any real email sent home to a client (welcome pack,
birthday, enquiry reply, onboarding confirmation, ...). The business owner is
always copied so they can see exactly what each client received; CLIENT_BCC
adds an optional extra inbox when configured. The OWNER_BCC placeholder is
treated as unset.r|zexample@example.com)r2r!r)ÚoutÚaddrÚxs rRÚ_client_bcc_listr~psxð €CÜœjÓØ
ZˆZ Ñ Ó ˆßA—G‘G“IÐ!6Ô Ø 7‰7‹9±Ó¨1ŸW™WžY±Ñ J‰JqŽMñ  €Jùò5sÁBcóHV^8„dQhR\R\R\R\/#)rOr^r™r_r)rQs"rRrSrSs(÷2ñ2œtð2¬Cð2¼Sð2ÄTñ2rTcƒóÂ"\'dAVPR.4pVPRR4p\P!RWV4RR/#Rp\ ^\
^,4p\ P!4p\P!\P!\PPV4\R7GRjxL
p\ P!4V,
R,p \V\ 4'dVPR4MRp
\P"!R Y!VPR4T\
Yš;'gR
4T;'g/u# VfQhVhL  \$Edap T p\ P!4T,
R,p \'T R R4;'g\'T R R4p \T \(4;'d$R
T u;8*;'dR8Mu;'dT R8gp
\P!RY!T\
T \+T 4P,Y¼RR7
T
'd \P"!RY!T 4Rp ? T\
8Xd Rp ? EK^T^,
,\.P0!^R4,p\P"!RY!T4\P2!T4GRjxL
Rp ? EKoRp ? ii;i5i)ÚtoÚsubjectz (no subject)u7[DEV] skipping email send — label=%s to=%s subject=%rrCzdev-modeN)Útimeoutrõz1[%s] %s sent to %s (attempt %d/%d, %.0fms, id=%s)zn/arÚcodervr´z?[%s] %s send failed (attempt %d/%d, %.0fms): %s: %s (status=%s)Trsz2[%s] %s: non-retryable status %s, aborting retriesgš™™™™™Ù?z[%s] retrying %s in %.2fs)r&r<r“Úranger0Úwait_forrìÚresendÚEmailsrÐr(r€rrUÚrandomÚuniformÚsleep)r^r™rrÚlast_excÚattemptrûÚresultrýÚemail_idrr(Ú
non_retryableÚbackoffs&&& rRÚ _send_emailrsFé߃xØ
[‰[˜˜
Ø—+‘+˜i¨ÓÜŠÐPÐRWÐ]dÔ!à!%€Hä˜ÔÕÜ—."ˆð$ )Ü"××!¤&§-¡-×"4Ñ"4°gÓ÷ˆFôŸ.š.Ó*¨WÕ4¸Õ<ˆJÜ+5°f¼d×+CÒ+Cv—zz ˆ KŠKØ 7§;¡;¨tÓ#4°gÔ?PØ×ô
ð
—<<˜ ñ3ðP Ò ÐÐ Ø
€NñMøôõˆHÜŸ.š.Ó*¨WÕÕ<ˆ˜S Ó6×T¼'À#ÀvÈtÓ:Tˆ˜6¤3Ó'×Q¨C°6×,?Ô,?¸CÔ,?×QÀFÈcÁMð
ô
NŠNØ 7Ô,=¸S“ ×" õ 
÷ Ü Ø vôöØÔؘW q)¬V¯^ª^¸A¸sÓ-CÕCˆGÜ KŠKÐ3°ZÈÔ —-’- Ó (ûð/ )üs‰A>KÂA E0Ã
E.ÃBE0ÅE0ÅE0Å!
KÅ.E0Å0 KÅ<AKÇKÇ)KÇ8AKÉKÉ KÉ%KÉ-AKË
K
Ë KËKËKËKcó$V^8„dQhR\/#rvrH)rQs"rRrSrSµs÷ñÔ(9ñrTcó\\P!4R,4p\R/RRbRRbRRbRRbR R
bR R bR
RbRRR.bRVR,
bRVR,
bRVR ,
bRVR!,
2026-07-04 10:00:16 +12:00
bRVbR^bR.R"ObRRbRRbp\V4V#)#rõr5r=r@zSarah Thompsonròzsarah.thompson@example.comrAz 021 555 0142rBÚMilorCz Grey LynnrÖzÉMilo is a 2-year-old cavoodle with good recall and a friendly nature. He loves other dogs, is comfortable off lead in safe areas, and we are looking for regular weekday pack walks while we are at work.rRz
2026-05-19 23:36:58 +12:00
Pack Walksz Puppy Visitsr*rLrMrNrOrTrSrPz=https://www.google.com/search?q=goodwalk+auckland+dog+walkingrQz2https://www.goodwalk.co.nz/book?service=pack-walksr¼iPø i(|iâ)Ú/z /pack-walksz /our-pricingz/book)rBrZ)Únow_msÚsamples rRÚ_build_startup_test_submissionr™µÜ
2026-07-04 10:00:16 +12:00
˜
2026-05-18 22:25:43 +12:00
$€Fä
òÙðáññð ñ
ð ñ ð
ñ
Kðð ÑðÐ 9ÖðÐ!;ÖðÐ 8Öð "Ð%>Ö?ð!ñ"ð#ñ$ð%ó&>ð'ñ(Qð)ñ*Bð+€Fô.˜ €MrTcóV^8„dQhRR/#)rQs"rRrSrSÓs÷RñR¨ñRrTcƒóJ"\'g\P!R4R#Rp\4pR\R\.R\ VP 4RRVP RVP R 2R
\VR R \ R 24/p\VR
VR7GRjxL
R#L5i)zBStartup test email skipped: OWNER_BCC is not set to a real addressNz startup-testÚfromrÚreply_toru*Startup preview — New GoodWalk lead — ú)rgz 127.0.0.1zStartup Preview (Ústartup_test_email©r™) r:r<r™r,ryr@rBrr)r˜r^s rRÚ_send_startup_test_emailr¢Óséß  Š Ðà€JÜ
-€Fà
Ø Ô”C˜Ÿ ÓÐÇÁÐ?PÐPRÐSY×SaÑSaÐRbÐbcÐ ˜F KÐ3DÄ[ÀMÐQRÐ1SÓ €Gô gÐ%9ÀjÔ
Q×QùsBB#ÂB!ÂB#cóV^8„dQhRR/#)rQs"rRrSrSçs÷lñl lrTcƒóæ"\P!\R4GRjxL
\P!R4R#L \
d#p\P !RT4Rp?R#Rp?ii;i5i)zImport WeasyPrint and run a trivial render to surface native-lib issues
(libpango/cairo/etc.) at boot rather than on the first PDF request.z<html><body>ok</body></html>Nu:Startup smoke: WeasyPrint OK — PDF attachments availableuNStartup smoke: WeasyPrint UNAVAILABLE — PDF attachments will be skipped (%s))rnr<rrus rRÚ_startup_smoke_pdfr¥çsZéðlÜ×ÒÔ 0Ð2PÓ Š Ð Røä ôlÜ Š ÐeÐgj×kûðlüs;A1A¢?£A½A1¿AÁ A.Á A)Á#A1Á)A.Á.A1cóV^8„dQhRR/#)rQs"rRrSrSñs÷IñI IrTcƒóT"\P!4'g\P!R4R#\P!4GRjxL
pVf\P!R4R#\P
!4GRjxL
VP
4;_uu_4GRjxL
pVPR4GRjxL
pRRR4GRjxL
X'd7VR,'d(VR,'d\P!R4R#\P!RV'd
VR,MRV'd
VR,MR4R#ELL•L‡ +GRjxL
2026-07-04 10:00:16 +12:00
'giLž;i \d#p\P!R T4Rp?R#Rp?ii;i5i)
2026-05-18 22:25:43 +12:00
z‡Force schema creation at boot and verify the new tables exist so the
activity log isn't silently empty if CREATE permission is missing.uNStartup smoke: postgres disabled — activity/submissions will NOT be recordedNuVStartup smoke: postgres pool unavailable — activity/submissions will NOT be recordedzSselect to_regclass('public.events') as ev, to_regclass('public.submissions') as subÚevr4u:Startup smoke: pg tables OK — events + submissions readyuRStartup smoke: pg tables MISSING (events=%s submissions=%s) — check CREATE permsz+Startup smoke: pg schema verify FAILED (%s)) r<r“Úget_poolÚ_ensure_schemaÚacquireÚfetchrowrßrur)ÚpoolÚconnrYrs rRÚ_startup_verify_schemar¯ñséô × Ò × Ò ÜŠÐðIÜ×(×(ˆØ Š<Ü NŠNÐ Ü×'×—<<—>—>”> Ÿ
Ø÷ˆ"—>÷ 3t—9”9  ¤Ü KŠKÐ LŠLÐmß&)˜˜¨tÇ3°S¸¶ZÈDö
Rò÷"—>—>>ûô ôIÜ Š ÐBÀC×HûðIüsè4F(·E8ÁEÁE8Á.F(Á0E8ÂEÂ E8Â)EÂ*E8Â-EÃEÃEÃ E8ÃEÃ E8ÃE8Ã.E8Ã=E8ÄF(ÄE8Ä.E8ÅE8ÅF(ÅE8ÅE8ÅE8ÅEÅE8ÅE5 Å"E%Å#
E5 Å.E5 Å0E8Å8 F%ÆF ÆF(Æ F%Æ%F(cóV^8„dQhRR/#)rQs"rRrSrS
2026-07-04 10:00:16 +12:00
s÷0Hñ0H 0HrTc
ƒóÀ"\4GRjxL
\4GRjxL
\4GRjxL
\P!4'Edw\ 4GRjxL
2026-05-18 22:25:43 +12:00
p\
V\4'dVs\4GRjxL
p\
V\4'dEVs \'d7\P\P!4P44\!4GRjxL
2026-07-04 10:00:16 +12:00
p\
2026-06-17 21:51:29 +12:00
V\4'dVs\%4GRjxL
pV'd\&P)V4\+4GRjxL
p\
2026-07-04 10:00:16 +12:00
V\4'dVs\.P0!R\3\4\3\4\3\"4\3\&4\3\,44\94GRjxL
\;4GRjxL
\<e\<P?4'd\@PB!\E44s\Fe\FP?4'd!\@PB!\I44s#R#R#ELdELUELFELEEELcEL7 \4d\.P6!R4Läi;i\4d\.P6!R4Lêi;i5i)Nz\Admin state refreshed from postgres: clients=%d emails=%d drafts=%d sessions=%d scheduled=%dz=Admin state refresh from postgres failed; using JSON snapshotzStartup test email failed)%r¥r€rxrr2r rrrˆrrrqr<rÚ_birthday_auto_taskÚdonerëÚ create_taskÚ_birthday_auto_sender_loopÚ_scheduled_taskÚ_scheduled_sender_loop)Ú
db_clientsÚ db_emailsÚ db_draftsÚ db_sessionsÚ db_scheduleds rRrWrW
séô Ó
×ÐÜ
Ó
"×
×Ò×Óð ^Ü<×<ˆ˜*¤d×+Ø#-Ð Ü:ˆ˜)¤S×)Ø"+ß“;Ü#× ×(9Ò(9Ó(;×(AÑ(AÓ(CÔ2×2ˆ˜)¤T×#Ü ;Ó =×=ˆÜ × Ô4Ü!=Ó!?×?ˆ˜,¬×-Ø$0Ð KŠKØÔ%¤s¬?Ó';¼SÄ»\Ì3ÔO_ÓK`ÔbeÔfwÓbxô
ô
)×(×Ò"Ô&9×&>Ñ&>×&@Ò&@Ü%×1Ô2LÓ2NÓÜÒ¤/×"6Ñ"6×"8Ò"8Ü!×-Ô.DÓ.FÓñ#9òWÚ 
@øôô ^Ü × Ò Ð  ^úñ )øÜ ô×ÒÐ6üs KI4K¢I7£K´I:µKÁ
J Á#I=Á$)J Â
2026-06-17 21:51:29 +12:00
JÂ'J Â6AJ Ã9JÃ:)J Ä#JÄ$ J Ä0"J ÅJ ÅA8J Ç
KÇJ3ÇKÇ
J7Ç+J5Ç,J7Ç0!KÈ?KÉ#KÉ7KÉ:KÉ=J ÊJ ÊJ ÊJ Ê J Ê !J0Ê-KÊ/J0Ê0KÊ5J7Ê7!KËKËKËKcóV^8„dQhRR/#)rQs"rRrSrS= s÷
2026-05-18 22:25:43 +12:00

2026-07-04 10:00:16 +12:00
(¨$ñ
(rTcƒóè"RFJp\4PV4pVfK"VP4VGRjxL
R\4V&KL R#L \PdL,i;i5i)N))ÚglobalsrŠÚcancelrëÚCancelledError)Ú task_nameÚtasks rRrXrX= seéã?ˆ Üy}‰}˜YÓØ Ô Ø K‰KŒMð
Ø
ð$(ŒGI ó@ñ
øÜ×
Ùð
üs= A2§A2¸A½A¾AÁA2ÁAÁA/Á,A2Á.A/Á/A2z/healthcó$V^8„dQhR\/#rv)rQs"rRrSrSJ s÷ñ”dñrTcƒó"RR/#5i)r(Úokr¼rTrRÚhealthrÇI séà  Ðùscó<V^8„dQhR\R\R\/#)rOr„r_r)rQs"rRrSrSN s!÷) ñ) œCð) ¤sð) ¬sñ) rTcó8R\ RV R\^<, R2#)a¿<!DOCTYPE html>
2026-05-18 22:25:43 +12:00
<html lang="en">
2026-05-19 23:36:58 +12:00
<head>
2026-07-04 10:00:16 +12:00
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
2026-05-18 22:25:43 +12:00
<title>Your Goodwalk login code</title>
2026-07-04 10:00:16 +12:00
</head>
2026-06-17 21:51:29 +12:00
<body style="margin:0;padding:0;background:#f2f2f0;">
<table width="100%" cellpadding="0" cellspacing="0" role="presentation" style="background:#f2f2f0;padding:40px 16px;">
<tr><td align="center">
<table width="480" cellpadding="0" cellspacing="0" role="presentation"
style="max-width:480px;width:100%;border-radius:16px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.08);">
<tr>
<td style="background:#213021;padding:32px 40px;text-align:center;">
<img src="aÊ" width="161" height="32" alt="Goodwalk" style="display:inline-block;max-width:161px;height:auto;border:0;">
</td>
</tr>
<tr>
<td style="background:#ffffff;padding:40px 40px 36px;text-align:center;">
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:13px;font-weight:700;letter-spacing:0.1em;text-transform:uppercase;color:#888;margin-bottom:16px;">Your login code</div>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:52px;font-weight:800;letter-spacing:0.18em;color:#213021;background:#f8f7f4;border-radius:14px;padding:20px 28px;display:inline-block;margin-bottom:24px;">aŽ</div>
2026-07-04 10:00:16 +12:00
<p style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:15px;color:#666;line-height:1.6;margin:0 0 8px;">
Enter this code on the Goodwalk onboarding page.
2026-06-17 21:51:29 +12:00
</p>
<p style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:13px;color:#aaa;margin:0;">
This code expires in aë minutes. If you didn&rsquo;t request this, you can safely ignore it.
</p>
2026-05-19 23:36:58 +12:00
</td>
</tr>
<tr>
2026-05-19 23:36:58 +12:00
<td style="background:#213021;padding:20px 40px;text-align:center;">
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:12px;color:#5a8a5a;">
2026-06-17 21:51:29 +12:00
Goodwalk &middot; Auckland, New Zealand
</div>
</td>
</tr>
</table>
</td></tr>
</table>
</body>
</html>)r.r)r„s&&rRÚ_auth_code_emailrÊN sEðô !Að BFðAGðG
%:¸RÕ$?Ð#@ðAð3( ð( rTcó0V^8„dQhR\R\/#r-r)rQs"rRrSrSz s÷ñœcð¤cñrTcóÀ\V4pV'gR#\P!V4pVP RVP R4 2# \
2026-07-04 10:00:16 +12:00
dTu#i;i)zTo be confirmedÚ z%b %Y)rrryÚdayrårzr|s& rRÚ_format_date_labelrÏz sYÜ
2026-05-19 23:36:58 +12:00
5‹/€Cß Ù ðÜ×Ó,ˆØ—*‘*˜Q˜vŸ¨wÓ9øÜ ôØŠ
ðús—5A
Á
AÁAz6-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serifzComplete onboardingúhttps://clients.goodwalk.co.nz/zinfo@goodwalk.co.nzz(022) 642 1011Ú
0226421011Ú
2026-05-19 23:36:58 +12:00
text_colorz#ffffffÚ
link_colorÚ
font_stackcóHV^8„dQhR\R\R\R\/#)rOr_r)rQs"rRrSrS s2÷ñäðôðôð ô
2026-07-04 10:00:16 +12:00
 ñ rTcóœ\P!4PpRV RV RV R\ RV R\ R\ RV R\
R2#) z“Shared email footer: a simple copyright notice plus the business contact
details. White text by default so it reads cleanly on the dark-green band.ú<div style="font-family:z&;font-size:12px;line-height:1.7;color:z
;">&copy; z Goodwalk<br><a href="mailto:z" style="color:z;text-decoration:none;">z</a> &middot; <a href="tel:z
2026-05-19 23:36:58 +12:00
</a></div>)rÚyearÚBUSINESS_EMAILÚBUSINESS_PHONE_TELÚBUSINESS_PHONE)s$$$ rRÚ_email_footer_htmlrÜ suô <Š<>× Ñ €Dà
" : ,Ð.TÐU_ÐT`ðaØðÜ*¨/¸*¸ÐE]Ô^lÐ]mðnä+¨?¸:¸,ÐF^Ô_mÐ^nðoð  ðrTcóHV^8„dQhR\R\R\R\/#)rOrHr!r_r)rQs"rRrSrS¤ s(÷ ñ ¤ð ´ð Äð Ìñ rTcó¾T;'gRpVPRV4PRV4PRV4PRV4PRV4#)zGSubstitute the personalisation tokens the owner can use in custom copy.úyour dogz {first_name}z {firstName}z
{dog_name}z {dogName}z{dog}©rr)rHr!rRs&&& rRÚ_apply_welcome_tokensrᤠsRà
×
Ð
j€Cà ^  
2026-07-04 10:00:16 +12:00
Ó +ß ˜sÓ #ß ˜cÓ "ß ˜ð rTcó<V^8„dQhR\R\R\/#)rOrHÚcolorr_r)rQs"rRrSrS° s!÷ñœcð¬#ð´#ñrTcóâaT;'gRPR4Uu.uF*q"P4'gKVP4NK, ppRPV3RlV44#uupi)z<Render owner body text as one or more email-safe paragraphs.r|ú
2026-05-19 23:36:58 +12:00
2026-07-04 10:00:16 +12:00
c 3óV<"TFpR\ RS R\V4 R2xK R#5i)z&<p style="margin:0 0 18px;font-family:z&;font-size:15px;line-height:1.7;color:ú;">ú</p>N)ÚWELCOME_FONT_STACKÚ _html_breaks)Úpararãs& €rRr…Ú&_welcome_paragraphs.<locals>.<genexpr>³ s?øéðñˆDð 1Ô1CÐ0DðE!Ø!&  s¬<¸Ó+=Ð*>¸ Dãùsƒ&))rr´)rHrÚpartss&f rRÚ_welcome_paragraphsrî° s^ø€à!%§ ¨× 2Ñ 2°6Ô :Ó HÑ :˜1¿g¹g¿iŒYˆQW‰WŽYÑ :€EÐ
7‰7ôñóó ðùò
Is
2026-05-19 23:36:58 +12:00
ŸA,»A,có0V^8„dQhR\R\/#)rOrHr_r)rQs"rRrSrSº s÷&”sð&œsñ&rTcó&VPRR4#)zXConvert single newlines within a paragraph to <br> (text is already trusted owner copy).rFrG)rHs&rRº sà <‰<˜˜ %rTrúmargin:0 0 16px;font-family:z.;font-size:15px;line-height:1.7;color:#4b584b;Úh1zmargin:0 0 12px;font-family:zU;font-size:26px;line-height:1.2;letter-spacing:-0.02em;font-weight:700;color:#171b20;Úh2zmargin:20px 0 10px;font-family:zV;font-size:20px;line-height:1.25;letter-spacing:-0.01em;font-weight:700;color:#171b20;Úh3zmargin:18px 0 8px;font-family:z>;font-size:16px;line-height:1.3;font-weight:700;color:#213021;Úulz"margin:0 0 16px;padding-left:22px;ÚolÚliúmargin:0 0 6px;font-family:z.;font-size:15px;line-height:1.6;color:#4b584b;Ústrongzfont-weight:700;color:#171b20;Úemzfont-style:italic;Úuztext-decoration:underline;r|z(color:#213021;text-decoration:underline;ÚdivcóÀaa]tRtRtoRtV3RlV3RlltV3RlRltV3RlRltV3R lR
ltV3R lR lt V3R
lRlt
Rt Rt Rt
2026-07-04 10:00:16 +12:00
V3RlRltRtVtV;t#)Ú_WelcomeBodySanitizeriÔ zàReduce the contenteditable HTML the owner produces to a small, email-safe
2026-05-19 23:36:58 +12:00
subset (paragraphs, bold/italic/underline, lists and http(s)/mailto links),
re-emitting every tag with our inline styles and dropping everything else.có<V^8„dQhRR/#)rQs"€rRrSÚ"_WelcomeBodySanitizer.__annotate__Ù sø€÷'˜'rTcóD<\SV`RR7.Vn.VnR#)T)Úconvert_charrefsN)ÚsuperrËÚ open_tags)Ú __class__s&€rRÚ_WelcomeBodySanitizer.__init__Ù s!ø€Ü
Ѩ$ÐÔ/Ø "ˆŒ
2026-07-04 10:00:16 +12:00
Ø$&ˆŽrTcó <V^8„dQhRS[/#rv©r%)rQs"€rRrSrÞ sø€÷EñE™4ñErTcó’\;QJd&RVP4F 'gK R# R#!RVP44#)c3ó2"TF
2026-05-18 22:25:43 +12:00
q\9xK R#5irV)Ú_WELCOME_BLOCK_TAGS©rs& rRr…Ú2_WelcomeBodySanitizer._in_block.<locals>.<genexpr>ß séÐD±^°Ô+³^ùsTF©Úanyr©s&rRÚ _in_blockÚ_WelcomeBodySanitizer._in_blockÞ s3ßD°T·^²^ÓDsŒsÐDŠsÐDˆD°T·^²^ÓDrTcó <V^8„dQhRS[/#rvr
)rQs"€rRrSrá sø€÷>™$ñ>rTcó’\;QJd&RVP4F 'gK R# R#!RVP44#)c3ó*"TF qR9xK R#5i)N)rs& rRr…Ú1_WelcomeBodySanitizer._in_list.<locals>.<genexpr>â séÐ=©n¨˜ Ö$«nùsTFrrs&rRÚ_in_listÚ_WelcomeBodySanitizer._in_listá s3ß=¨d¯nªnÓ=sŒsÐ=ŠsÐ=ˆ=¨d¯nªnÓ=rTcó$<V^8„dQhRS[RR/#©rOÚtagr_Nr)rQs"€rRrSrä sø€÷#™cð# #rTcóÈ\PVR4pVPPV'd
RV RV R2MRV R24VPPV4R#)r|rBú style="ú">rDN)Ú_WELCOME_BODY_STYLESrŠr)rÚstyles&& rRÚ
_emit_openÚ _WelcomeBodySanitizer._emit_openä sSÜ$רbÓØ
2026-05-19 23:36:58 +12:00
×Ñ¿˜A˜c˜U (¨5¨'°Ñ4ÀQÀsÀeÈ1À:Ô ×ј"rTcó$<V^8„dQhRS[RR/#rr)rQs"€rRrSré sø€÷ñ™sð tñrTcóÔWP9dR#VP'dDVPP4pVPPRV R24W!8XgKSR#R#)</rD)rr)rÚcurrents&& rRÚ _emit_closeÚ!_WelcomeBodySanitizer._emit_closeé sQØ —n ØnnˆnØ—n‘n×*ˆGØ J‰J× Ñ   7 )¨1˜ Ž~Ùñ rTcó<V^8„dQhRR/#)rQs"€rRrSrò sø€÷! !rTcóˆVP4'g,VP4'gVPR4R#R#R#)rN)rrr#rs&rRÚ_ensure_paragraphÚ'_WelcomeBodySanitizer._ensure_paragraphò s-Ø~‰~×Ò¨¯
©
2026-07-04 10:00:16 +12:00
¯ªØ O‰O˜CÖ ñ)8ÑrTcóh\PW4pVR8Xd.VP4VPP R4R#VR 9dVVP 4'd-R F&pW0P 9gKVPV4M VPV4R#VR8XdVPR4R#VR
9d$VP4VPV4R#VR8XRpVF(wrVVR8XgKV'gKVP4pK* \P!RV\P4'gR#VP4VPP R\V4 R \R, R
24VP P R4R#R#)ÚbrrGNr÷r|r|Úhrefz^(https?:|mailto:)ú <a href="z " style="r )r)r))Ú_WELCOME_TAG_ALIASESrŠr-rrr)r#r3ÚmatchÚ
IGNORECASEÚ _escape_attrr!)rÚattrsÚ candidater1r=s&&& rRÚhandle_starttagÚ%_WelcomeBodySanitizer.handle_starttagö saÜ"×& 0ˆØ $Œ;Ø × J‰J× Ñ ˜fÔ Ø Ð ~‰~×ÒÛ!> §N¡NÖ×Ôñ"?ð
O‰O˜CÔ Ù Ø $Œ;Ø O‰O˜DÔ Ø Ð × O‰O˜ Ù Ø #Œ:؈DÛ$‘ ؘ6–>§e¡eØ Ÿ;™;›=’Dñ—8’8Ð1°4¼¿¹×Ø × J‰J× Ñ   ¬,°tÓ*<Ð)=¸YÔG[Ð\_ÕG`ÐFaÐacÐ N‰N× !  ñ rTcód\PW4pVR9dVPV4R#R#)rN) rr|)r3r))rs&&rRÚ
2026-05-18 22:25:43 +12:00
handle_endtagÚ#_WelcomeBodySanitizer.handle_endtag
s/Ü"×& 0ˆØ Ð × Ñ ˜SÖ  VrTcóVP4'gVP4'gR#VP4VPP VP RR4P RR4P RR44R#)Nr@rArBrCrDrE)rr-rr)r•s&&rRÚ handle_dataÚ!_WelcomeBodySanitizer.handle_data
sbØz‰z|Š| D§N¡N×$4Ò$4Ù Ø ×ÑÔ Ø
2026-05-19 23:36:58 +12:00
×ÑØ L‰L˜˜gÓ &× .¨s°FÓ ;× CÀCÈÓ 
rTcó <V^8„dQhRS[/#rvr)rQs"€rRrSr&
sø€÷ññrTcó VP'd:VPPRVPP4 R24KKRP VP4p\
2026-07-04 10:00:16 +12:00
P !RRV4pVP!4#)r'rDr|z<p[^>]*>(?:\s|<br>|&nbsp;)*</p>)rrr´r3r4)rgs& rRÚ_WelcomeBodySanitizer.result&
seØnnˆnØ J‰J× Ñ   4§>¡>×#5Ñ#5Ó#7Ð"8¸Ð w‰wt—z"ˆävŠvÐ8¸"¸CˆØzŠzrT)r)rrr#r)r-r9r<r?Ú
2026-05-18 22:25:43 +12:00
__classcell__)rs@@rRrrÔ shù‡ñR÷
2026-07-04 10:00:16 +12:00
EðE÷
2026-05-18 22:25:43 +12:00
ð÷ òF

÷÷ðrTrcó0V^8„dQhR\R\/#©rOr;r_r)rQs"rRrSrS/
s÷ñ¤Sð¬SñrTcó¼T;'gRP4'gR#\4pVPV4VP4VP 4#)zIPublic entry point: parse and re-emit owner rich-text as email-safe HTML.r|)rÚfeedÚcloserŽ)r;Úparsers& rRÚ_sanitize_welcome_body_htmlrK/
sCà IˆI Ñ × Ò ÙÜ
$€FØ
2026-07-04 10:00:16 +12:00
‡KKÔØ
2026-05-18 22:25:43 +12:00
‡LL„NØ =‰=rTcó0V^8„dQhR\R\/#rFr)rQs"rRrSrS9
2026-07-04 10:00:16 +12:00
s÷
2026-05-18 22:25:43 +12:00
ñ
¬ð
´ñ
2026-07-04 10:00:16 +12:00
rTcóÜT;'gRP4'gR#\P!RRV\P\P,R7P4#)zRemove the old frontend-injected yellow tag block if it was saved into
2026-05-18 22:25:43 +12:00
bodyHtml before tagLabel became a first-class server-rendered field.r|zM^\s*<div[^>]*>\s*<span[^>]*background:\s*#f4e7a8;[^>]*>.*?</span>\s*</div>\s*©Úflags)r3r4r5ÚDOTALL)r;s&rRÚ_strip_legacy_welcome_tag_htmlrQ9
sOð
IˆI Ñ × Ò ÙÜ
6Š6Ø
Ø Üm‰mœbŸi™iÕ ÷
2026-07-04 10:00:16 +12:00
 eƒgð rTcó<V^8„dQhR\R\R\/#)rOr™r_r)rQs"rRrSrSF
2026-05-18 22:25:43 +12:00
s!÷ ñ œSð ¤sð ¬sñ rTcó$T;'gRP4pT;'gRP4pV'd V'gR#VPRR4PRR4PRR4pR\V4 R \ R
2026-07-04 10:00:16 +12:00
V R 2#) zAThe dark-green pill button used at the foot of the welcome email.r|r@rArBrCrDrEr2ú†" style="display:inline-block;background:#213021;color:#ffffff;text-decoration:none;border-radius:999px;padding:14px 20px;font-family:ú";font-size:15px;font-weight:700;">ú</a>)rrr6)r™Ú
2026-05-18 22:25:43 +12:00
safe_labels&& rRÚ_welcome_cta_htmlrXF
s‰à
[ˆ[b× Ñ Ó !€EØ 9ˆ9"×
Ñ
2026-07-04 10:00:16 +12:00
Ó
€Cß —cÙØ˜s GÓ,×4°S¸A×IÈ#ÈvÓV€Jà
2026-05-18 22:25:43 +12:00
”L Ó'Rä Ð
ÐÀ ÈDð RðrTÚheadingÚintroÚoutroÚ tag_labelÚ cta_labelÚcta_urlÚ show_detailsrdÚinclude_buttoncóÌV^8„dQhR\R\R\R\R\R\R\R\R \R
\R \R \R
2026-07-04 10:00:16 +12:00
\R\R\/#)rOÚ client_namer!Ú service_typeÚ
price_detailsÚ
start_daterYrZr[r\r]r^r_rdr`r_)ryr%)rQs"rRrSrST
2026-05-18 22:25:43 +12:00
÷{{ð{ð{ð{ð {
ð {ð{ ð{ ð{ð{ð{ð{ð{ð{ð{ ñ!{.rTc ó°VP4'dVP4^,MRpVP4'dRV 2MRp\V4p\\ V 44pV'ds\ VWá4p\ T;'gRP4Wá4pV
'd\
\\4MRpV'dRMRpRV RV RV 2p\VVR 7#\T;'gRP4T;'gRP4T;'gRP434'g2\ T;'gRP4Wá4p\RVR 7#\ T;'gRP4;'gR
T R T;'gR R
2VV4p\ T;'gRP4;'gRV R2VV4p\ T;'gRP4;'gRVV4p\VR4pRpV'dR\ R\V4 R2pRpV 'dG\RV4\RV4,\RVP4'dTMR4,pRpV'dRV R2pT ;'gRP4pT
;'gRP4pRpV'dVV'dN\V4pVP!RR4P!RR4P!RR4p R V R!\ R"V R#2pR$\ R%V R&2p!V! V V V V 2p\V4#)'rÚtherer'r|Ú16pxrÖz<div style="margin:z
0 22px;">rº)r\zHi z, we&rsquo;d love to get rßz started with Goodwalk.z'We&rsquo;ve set aside the details belowz\. When you&rsquo;re ready, complete your onboarding form and we&rsquo;ll take it from there.ztUse the same email address you originally used with Goodwalk. We&rsquo;ll send you a one-time code when you sign in.ú#4b584bz&<p style="margin:18px 0 0;font-family:z0;font-size:14px;line-height:1.7;color:#657365;">rèrÚPriceú
Start dateaZ
2026-07-04 10:00:16 +12:00
<table width="100%" cellpadding="0" cellspacing="0" role="presentation" style="background:#ffffff;border-radius:18px;border:1px solid rgba(33,48,33,0.08);margin-bottom:22px;">
2026-05-18 22:25:43 +12:00
<tr><td style="padding:22px 20px;">
<table width="100%" cellpadding="0" cellspacing="0" role="presentation">
2026-07-04 10:00:16 +12:00
zG
</table>
</td></tr>
</table>r@rArBrCrDrEr2rTrUrVz'<h1 style="margin:0 0 12px;font-family:zH;font-size:32px;line-height:1.05;letter-spacing:-0.03em;color:#171b20;">z</h1>)rrKrQrXÚWELCOME_CTA_DEFAULT_LABELÚWELCOME_CTA_DEFAULT_URLÚ_welcome_pack_shellrrr6rr)"rbr!rcrdrerYrZr[r\r]r^r_rdr`Údog_lineÚformatted_start_dateÚ
2026-05-18 22:25:43 +12:00
clean_bodyÚ badge_labelÚcta_htmlÚbody_top_marginÚ
content_innerÚ heading_textÚ
intro_textÚ
outro_textrÍÚ
outro_htmlÚ details_rowsÚ details_htmlr™Úsafe_urlrWÚ heading_htmls"&&&&&$$$$$$$$$ rRÚ_welcome_pack_email_htmlr~T
sˆð",7×+<Ñ+<×+>Ò+>×$ 'ÀG€JØ%-§^¡^×%5Ò%5x!¸2€HÜ-¨jÓô
-Ô-KÈIÓ-VÓW€JßÜ*¨:°zÓLˆ
ô,¨Y¯_¨_¸"×,CÑ,CÓ,EÀzÓ\ˆ ß\jÔ$Ô%>Ô@WÔXÐprˆ÷%0™&°SˆØ-¨oÐ->¸È ÐTZÐ[cÐZdÐeˆ
Ü" =¸
˜B×'¨%¯+¨+°2×)<Ñ)<Ó)>ÀÇÀÈ"×@SÑ@SÓ@UÐV× +¨Y¯_¨_¸"×,CÑ,CÓ,EÀzÓ\ˆ Ü" ÔˆÑÓ÷ fð fØ
 Ð5°h×6LÐ6LÀ*Ð5MÐMdÐ Øó €Lô ˆ"×ÑÓ÷
ð
à5°h°Zð@Pð
Pð Øó€Jôˆ"×ÑÓ÷
ð
ð
Eð Øó€Jô% Z°Ó;€JØ€Jßà4Ô5GÐ4HðI/Ü/;¸JÓ/GÐ.HÈð
Nð ð€Lßä ˜   ˜' 
˜
×@PÑ@P×@RÒ@RÑ(<ÐXZÓ
\ð ð
€Lßðð !ð ˆ ð_ˆ_˜"× %€EØ =ˆ=b×
Ñ
Ó
!€CØ€Hß Ü ÓØ—]‘] 3¨Ó¸fÓMÈcÐSYÓZˆ
à˜"Vä"Ð"DÀZÀLÐPTð
Vð ð 2Ô2DÐ1EðFCØCOÀ.ÐPUð Wðð$n Z L°°¸x¸jÈÈ ÐU€MÜ ˜}Ó -rTcó<V^8„dQhR\R\R\/#)rOrur\r_r)rQs"rRrSrSÒ
s!÷- ñ- ¤sð- ¼#ð- Äsñ- rTc óÂT;'gRP4pV'd"R\ R\P!V4 R2MRpR\ RV RV R\ 4 R 2 #)
u+The shared welcome-email chrome (logo header, optional header badge, rounded
card) wrapped around whatever message content is supplied. The badge text is
owner-editable via the "Badge" field; when it is left blank, no badge is shown.
This is the email's only tag — there is no second in-body pill.r|zw<div style="display:inline-block;background:#ffd100;border-radius:999px;padding:8px 14px;margin-bottom:4px;font-family:z_;font-size:12px;font-weight:700;color:#213021;letter-spacing:0.06em;text-transform:uppercase;">rº<!DOCTYPE html>
<html lang="en">
2026-07-04 10:00:16 +12:00
<head>
2026-05-18 22:25:43 +12:00
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Welcome to the pack</title>
</head>
<body style="margin:0;padding:0;background:#f2f2f0;">
<table width="100%" cellpadding="0" cellspacing="0" role="presentation" style="background:#f2f2f0;padding:28px 12px;">
<tr><td align="center">
<table width="560" cellpadding="0" cellspacing="0" role="presentation" style="max-width:560px;width:100%;border-radius:22px;overflow:hidden;box-shadow:0 10px 32px rgba(17,20,24,0.08);">
<tr>
<td style="background:#213021;padding:28px 24px;text-align:center;">
<img src="zæ" width="161" height="32" alt="Goodwalk" style="display:inline-block;max-width:161px;height:auto;border:0;">
</td>
</tr>
<tr>
<td style="background:#fbfaf7;padding:34px 24px 30px;">
z‡
</td>
</tr>
<tr>
<td style="background:#213021;padding:22px 24px;text-align:center;">
úW
</td>
</tr>
</table>
</td></tr>
</table>
</body>
</html>)rgÚescaper.)rur\rrs&$ rRrnrnÒ
sð
—?×+€K÷ ð  :Ü:LÐ9MðNZä ;Š;
$ 
ð
ð
ô !
ð
ˆ
Ø
ˆ
ô
 Ó
#ð1 ð rTcó0V^8„dQhR\R\/#r.)rQs"rRrSrS s÷] ñ] Ô.Bð] Äsñ] rTcóœVPP4'd"VPP4^,MRp\VP4pVP
Uu.uFCp\
V\4'gKVP4'gK3VP4NKE ppV'dRPVR,4MRp\V4^8”dVR\V4^,
R2,
pRpRpR \VR
R 7 R T R
V'dRV 2MR RVP RT;'gR RV RV R2#uupi)rrg:NrONzyour selected servicez + z morerÐa <div style="display:inline-block;background:#ffd100;border-radius:999px;padding:8px 14px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:12px;font-weight:700;color:#213021;letter-spacing:0.06em;text-transform:uppercase;">Submitted</div>aV<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Your onboarding has been submitted</title>
</head>
<body style="margin:0;padding:0;background:#f2f2f0;">
<table width="100%" cellpadding="0" cellspacing="0" role="presentation" style="background:#f2f2f0;padding:28px 12px;">
<tr><td align="center">
<table width="560" cellpadding="0" cellspacing="0" role="presentation" style="max-width:560px;width:100%;border-radius:22px;overflow:hidden;box-shadow:0 10px 32px rgba(17,20,24,0.08);">
z*Your onboarding details are safely with usrýa
<tr>
2026-07-04 10:00:16 +12:00
<td style="background:#fbfaf7;padding:34px 24px 30px;">
2026-05-18 22:25:43 +12:00
<h1 style="margin:0 0 12px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:32px;line-height:1.05;letter-spacing:-0.03em;color:#171b20;">
Thanks, zù. Your onboarding is complete.
</h1>
<p style="margin:0 0 20px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:15px;line-height:1.7;color:#4b584b;">
We&rsquo;ve received your detailsr'r|a5 and they&rsquo;re now on file with Goodwalk.
You can sign back in any time to review what you submitted.
</p>
2026-07-04 10:00:16 +12:00
<table width="100%" cellpadding="0" cellspacing="0" role="presentation" style="background:#ffffff;border-radius:18px;border:1px solid rgba(33,48,33,0.08);margin-bottom:22px;">
2026-05-18 22:25:43 +12:00
<tr><td style="padding:22px 20px;">
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:11px;font-weight:700;letter-spacing:0.1em;color:#888;text-transform:uppercase;margin-bottom:16px;">
Snapshot
</div>
<div style="display:grid;gap:14px;">
<div>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:12px;font-weight:700;color:#7b867b;text-transform:uppercase;letter-spacing:0.08em;margin-bottom:4px;">Owner</div>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:18px;font-weight:700;color:#171b20;">a§</div>
2026-07-04 10:00:16 +12:00
</div>
2026-05-18 22:25:43 +12:00
<div>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:12px;font-weight:700;color:#7b867b;text-transform:uppercase;letter-spacing:0.08em;margin-bottom:4px;">Dog</div>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:18px;font-weight:700;color:#171b20;">zDetails submitteda¬</div>
</div>
<div>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:12px;font-weight:700;color:#7b867b;text-transform:uppercase;letter-spacing:0.08em;margin-bottom:4px;">Services</div>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:16px;line-height:1.5;color:#425042;">a</div>
</div>
</div>
</td></tr>
</table>
<table width="100%" cellpadding="0" cellspacing="0" role="presentation" style="border-left:3px solid #ffd100;margin-bottom:24px;">
<tr>
<td style="padding:4px 0 4px 20px;">
2026-07-04 10:00:16 +12:00
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:13px;font-weight:700;color:#213021;margin-bottom:6px;">
What happens next?
</div>
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:14px;color:#666;line-height:1.65;">
2026-05-18 22:25:43 +12:00
We&rsquo;ll review your submission and come back to you if we need anything clarified.
2026-07-04 10:00:16 +12:00
If you need to check your details again, use the button below to sign back in with a one-time code.
2026-05-18 22:25:43 +12:00
</div>
</td>
</tr>
</table>
2026-07-04 10:00:16 +12:00
<a href="aò" style="display:inline-block;background:#213021;color:#ffffff;text-decoration:none;border-radius:999px;padding:14px 20px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:15px;font-weight:700;">
2026-05-18 22:25:43 +12:00
Review your submission
</a>
2026-07-04 10:00:16 +12:00
<p style="margin:18px 0 0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:14px;line-height:1.7;color:#657365;">
2026-05-19 23:36:58 +12:00
Your submitted form is read-only after completion. If anything needs changing, just reply to this email or contact us directly.
2026-07-04 10:00:16 +12:00
</p>
2026-05-18 22:25:43 +12:00
</td>
2026-07-04 10:00:16 +12:00
</tr>
2026-06-17 21:51:29 +12:00
<tr>
2026-07-04 10:00:16 +12:00
<td style="background:#213021;padding:24px 48px;text-align:center;">
<div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:12px;color:#5a8a5a;line-height:1.6;">
2026-06-17 21:51:29 +12:00
Goodwalk &middot; Auckland, New Zealand
</div>
2026-07-04 10:00:16 +12:00
</td>
2026-06-17 21:51:29 +12:00
</tr>
2026-07-04 10:00:16 +12:00
</table>
</td></tr>
2026-06-17 21:51:29 +12:00
</table>
</body>
2026-07-04 10:00:16 +12:00
</html>) r@rrr>rjr€ryr´)r•r!rWÚ
service_namesÚservice_summaryÚonboarding_urlr·s& rRÚ#_onboarding_confirmation_email_htmlrˆ sØ-1¯]©]×-@Ñ-@×-BÒ-B×& qÖ€JܘŸ Ó%€HØ48×4GÒ4GÓxÑ4G¨Ì:ÐV]Ô_b×Kc”_Ðho×huÑhu×hw”_W—]]_Ñ4G€MÐxß6Cd—ii 
¨bÕ 1Ô2ÐI`€OÜ
ˆ=Ó˜AÔØ˜S¤ ]Ó!3°aÕ!7Ð 8¸Ð>ˆà6€Nð jðð  ô
2026-05-19 23:36:58 +12:00
 Ð6bÔ cÐeð"#0÷GO°%¸°zÑ0BÐTVÐ/Wð XSðTX÷TañTaðSbðbSðT\÷TsðTsð`sðStðtSðTcðSdðdð(&ðuN ðN ùòysÁ'E ÂE ÂE có<V^8„dQhR\R\R\/#)rOrbr!r_r)rQs"rRrSrSb s!÷- ñ- ¤cð- ´- ¼Sñ- rTc óÐVP4'dVP4^,MRpVP4;'gRpR\ RV RV RV R\4 R2 #) rrg<!DOCTYPE html>
2026-06-17 21:51:29 +12:00
<html lang="en">
<head>
<meta charset="utf-8">
2026-05-19 23:36:58 +12:00
<meta name="viewport" content="width=device-width,initial-scale=1">
2026-06-17 21:51:29 +12:00
<title>Happy birthday from Goodwalk</title>
</head>
<body style="margin:0;padding:0;background:#f2f2f0;">
2026-05-19 23:36:58 +12:00
<table width="100%" cellpadding="0" cellspacing="0" role="presentation" style="background:#f2f2f0;padding:28px 12px;">
2026-06-17 21:51:29 +12:00
<tr><td align="center">
2026-07-04 10:00:16 +12:00
<table width="560" cellpadding="0" cellspacing="0" role="presentation" style="max-width:560px;width:100%;border-radius:22px;overflow:hidden;box-shadow:0 10px 32px rgba(17,20,24,0.08);">
<tr>
<td style="background:#213021;padding:28px 24px;text-align:center;">
2026-05-18 22:25:43 +12:00
<img src="aæ" width="161" height="32" alt="Goodwalk" style="display:inline-block;max-width:161px;height:auto;border:0;">
2026-06-17 21:51:29 +12:00
</td>
2026-05-19 23:36:58 +12:00
</tr>
<tr>
<td style="background:#fbfaf7;padding:34px 24px 30px;">
<div style="display:inline-block;background:#ffd100;border-radius:999px;padding:8px 14px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:12px;font-weight:700;color:#213021;letter-spacing:0.06em;text-transform:uppercase;">
2026-06-17 21:51:29 +12:00
Happy birthday
</div>
<h1 style="margin:18px 0 12px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:32px;line-height:1.05;letter-spacing:-0.03em;color:#171b20;">
Happy birthday to z¾.
2026-07-04 10:00:16 +12:00
</h1>
2026-05-18 22:25:43 +12:00
<p style="margin:0 0 18px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:15px;line-height:1.7;color:#4b584b;">
2026-06-17 21:51:29 +12:00
Hi zE, sending a little birthday love from all of us at Goodwalk. We hope az has a very good day.
2026-07-04 10:00:16 +12:00
</p>
2026-05-18 22:25:43 +12:00
<p style="margin:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:15px;line-height:1.7;color:#4b584b;">
Aless and the Goodwalk pack
2026-07-04 10:00:16 +12:00
</p>
2026-06-17 21:51:29 +12:00
</td>
</tr>
<tr>
<td style="background:#213021;padding:22px 24px;text-align:center;">
r)rr.)rbr!r2s&& rRÚ_birthday_email_htmlrb sˆØ+6×+<Ñ+<×+>Ò+>×$ 'ÀG€JØ—^%×€Nð
ô !!ð"0Ð 0ð1ðÐbÐcqÐbrð s
ô Ó
#ðE) ð) rTcó>V^8„dQhR\R\R,/#)rOr"ÚtodayNrt)rQs"rRrSrS s÷ñ¬Cð¼À4½ñrTcó\V4pV'gR#\P!VR4P4pT;'g\P
!4P4pTP pTPTR7pYd8dT^,
pTPTR7pT#T# \dR#i;i \dTPT^^R7pKZi;i \dTPT^^R7pT#i;i)Nr%))ÚmonthrÎ)rrr,r-rzrr)r"rr;rHÚ
today_dateÚ target_yearr8s&& rRÚ_upcoming_birthday_dater sÜ
2026-07-04 10:00:16 +12:00

2026-06-17 21:51:29 +12:00
"€Cß ÙðÜ×& s¨JÓ7×>ˆ
ð×)œ8Ÿ<š<>×1€JØ—//€Kà
2026-07-04 10:00:16 +12:00
ð Ø"× Ð<ˆ ð ÔØˆ ð NØ"× Ð<ˆ Ј9Ðøô- ôÚðûôô à"× À1È"ÐMˆ ð ûôô NØ"× À1È"ÐM‰Ià Ðð Nús5—%B0Á7CÂC(Â0 B?Â>B?ÃC%Ã$C%Ã(D Ä
2026-06-17 21:51:29 +12:00
D cójV^8„dQhR\\,R,R\\,/#)rOÚ requestedNr_)rQs"rRrSrS² s'÷

$¬4´­9°tÕ+;ð
ÄSÅ ñ
$rTcóò\Uu0uFBq'gK VP4'gK$VP4P4kKD pp.pT;'g.FUp\V4P4P4pV'gK4WR9gK<WS9gKDVP V4KW V'dV#\
P!4P4pV'dV.#.#uupirV)r$rryr2)r”r{ÚallowedÚresolvedr;Úowners& rRÚ_resolve_preview_recipientsr™² Ý0?Ó¨Ã4Ô#ÈDÏJÉJÏLÔ#ˆtz‰z‹|×€GЀH؈˜BŠˆÜC“Ó ×(ˆß ‰5%¨%Ö*?Ø O‰O˜ ÷ØˆÜ × Ò Ó × '€E߈Eˆ# Ð#ùòZs‰ C4C4¯"C4có¼V^8„dQhR\R\R\R\R,R\R,R\R\\,R,R \R
R/ #) rOrImark_auto_yearÚpreviewÚpreview_recipientsrr_)ryr%)rQs"rRrSrS¿ ss÷,, ð,
ð,ð,
$Jð ,
˜$•Jð , ð
,œS  ,ð,
ñ,7rTc
ƒó¢"\VPRR44P4p\W4p V 'g\ RRR7h\V PRR44P4p
V'd \ V4MV.p T;'gRP4;'gRT
;'gR 2pV'dRT;'gT R V 2pR
\ R V R \R
2026-07-04 10:00:16 +12:00
VR\WŠ4/p \4p
V
'd
V'gWÜR&\YÅ'dRMRVR7GRjxL
2026-06-17 21:51:29 +12:00
V'dR#\P!4PRR7p\V4pVFApVPR4V PR48XgK*VVR&Ve\V4VR&M RV/p\VV4GRjxL
R#L5i)r@r|rvz(This client does not have a dog on file.r
r=zHappy birthday z
from Goodwalkú
[PREVIEW for ú] rœrrrrgÚbccÚbirthday_email_previewÚbirthday_emailr¡Nr§rCrFrGrN)ryrjr r™r,r7rr~rrrTrn)rIrrrrbrRr!Ú
recipientsr^Úsent_atrNrPÚprofile_updates&&&&&&&& rRÚ _send_birthday_email_for_profiler§¿ éôg—k‘k *¨bÓ2×:€KÜ
˜
,€Cß Ü¨Ð4^Ô3—77˜6 '×/€HßDKÔ,Ð-?Ô@ÐRWÐQX€JØ}ˆ}˜"×%×X¨?¸8×;VÐ;VÀÐ:WÐ)X€Gߨ! +×"6Ð"6°Ð!7°r¸'¸ÐCˆà
Ø ˆjØ”HØÔ$ [Ó €Gô Ó
€Cß
—7Øä
Ñ%=ÐN^ÐkuÔ
ÙälŠln×&° Ð:€GÜ ˜ %€DÛˆØ 8‰8D>˜SŸW™W T *Ø.5ˆ Ò)Ü47¸Ó4GÐ ñ ð ˜d^€NÜ
2026-07-04 10:00:16 +12:00
  
2026-05-19 23:36:58 +12:00
6×wñ7ùsUBGÂGÂ,
GÂ7 GÃ GÃ>GÄ
2026-07-04 10:00:16 +12:00
GÄ+G Ä, GÄ8AGÆ.GÇG
ÇGÇ
2026-05-19 23:36:58 +12:00
GcóV^8„dQhRR/#)rQs"rRrSrSî s÷dñd¨dñdrTc
ƒó"\P!4P4pVPVP3p\ \ P44EFhwr#VPR4'gK\V4EF9pVPR4'gK\\VPRR444pV'dVPVP3V8wdKh\VPRR44P4pV\VP48XdK­R\P!4P R, 2p\#W#V\VPRR44VPR7GR jxL
2026-07-04 10:00:16 +12:00
\$P&!R
WrVPR R44EK< EKk R #L8 \(d&p\$P*!R YxR
R7R p?EKrR p?ii;i5i)rErAr|rGzbirthday-auto-ºNéNrC)rIrNz.[%s] auto birthday email sent: email=%s dog=%sr=z#[%s] auto birthday email failed: %sTrs)rr-rrTrryr5r6r7r<rru) rÚtoday_month_dayròrRÚupcomingÚlast_sent_yearr²rs rRÚ_run_birthday_auto_sender_oncer¯î s˜éÜ LŠL‹N× Ñ Ó !€EØ—{‘{ E§I¡IÐ.€OäÔ8‰ˆØ{‰{Ð ä$ W×-ˆCØ—7‘7Ðä.¬s°3·7±7¸;ÈÓ3KÓ/LÓMˆHß §¡°· ± ÐÔä  §¡Ð)DÀbÓ!IÓRˆNؤ U§Z¡Z£Ôà)¬$¯*ª*«,×*:Ñ*:¸2Õ*>Ð)?Ð@ˆ
dÜ6°uÀzÔZ]Ð^a×^eÑ^eÐfjÐlnÓ^oÓZpðBG÷BLñBLôM÷MðMÜ ÐLÈjÐad×ahÑahÐioÐqsÓat×9ñ$Møäô
dÜ ÐBÀJÐ^b×cûð
düsBEG?Å5G ÆG
Æ,G Æ> G?Ç
G Ç G<ÇG7Ç0G?Ç7G<Ç<G?cóV^8„dQhRR/#)rQs"rRrSrS
s÷=¨$ñ=rTcƒóú"\4GRjxL
\P !\4GRjxL
K8L( \Pdh\d\P
!R4L^i;iLD5i)TNz Birthday auto sender loop failed)rr<rr rTrR
shéØ
ð AÜ2×
mŠmÔ<×
3øÜ× Ø Üô AÜ × Ò Ð  Aúá<ùóAA;
=;=A;´A9µA;»=½A6ÁA6Á3A;Á5A6Á6A;z^[^\s@]+@[^\s@]+\.[^\s@]+$z/auth/request-codecó$V^8„dQhR\/#)rQs"rRrSrS s÷AñA¤WñArTc
ƒó"\VPR\P!4PR,4p\ V4pVP
4GRjxL
p\P!VPR4;'gR4p\TP!R
R 44P#4P%4p\&;_uu_4GRjxL
\)Y!4RRR4GRjxL
T'd\*P-T4'g(\P!R TTTT4\RR
R 7hT\.9dY\P0!RYT4\&;_uu_4GRjxL
\3Y!R4RRR4GRjxL
\RRR 7h\4P6!4p\&;_uu_4GRjxL
\8P;T\=44pT'd'Yg^,,
2026-05-19 23:36:58 +12:00
R8”dTP?4K.\AT4\Bd\RRR 7hTPET4\\FPH!R4R,4pRTR\4P4!4\J,R^/\LT&RRR4GRjxL
\P0!RY4\N'd\P!RTX4M-\QR\RRT.RRR \UTX4/R!TR"7GRjxL
2026-07-04 10:00:16 +12:00
\VPX!R#YTR$R%7GRjxL
2026-05-19 23:36:58 +12:00
R$R&/#E\\P3d/\P!RTTTR,4\RRR 7hi;iEL¸EL  +GRjxL
'giEL¸;iEL<EL# +GRjxL
2026-07-04 10:00:16 +12:00
'giEL;;iEL
EL, +GRjxL
2026-06-17 21:51:29 +12:00
'giELD;iLÂ5i)'r²r1Nrez{}z1[%s] auth: invalid json payload ip=%s raw_body=%rºNiôNrvzInvalid request payload.r
2026-07-04 10:00:16 +12:00
r|zB[%s] auth: invalid email payload ip=%s body=%r normalized_email=%rz#Please enter a valid email address.z![%s] auth: unknown email=%s ip=%sÚ
unknown_emailru‡We don’t have your email on file. Please use the address you used when enquiring with Goodwalk, or contact us at info@goodwalk.co.nz.ir´z8Too many code requests. Please wait before trying again.i »
i †r„rz#[%s] auth: code issued for email=%sz[DEV] auth code for %s: %srœrrzYour Goodwalk login codergÚauth_code_emailr¡Úauth_code_requestedrÆ©Ú
event_typer²Ú actor_emailr±r(T)-rUr5r6r7rrmrÚUnicodeDecodeErrorÚJSONDecodeErrorr<r“r ryrrÚ _EMAIL_REr4rrr¿rrÚ randbelowrr‰r&rr,Ú record_event) rÚraw_bodyrÕÚrequestsr„s & rRÚauth_request_coderà é䘟¨ ´d·j²j³l×6FÑ6FÀrÕ6JÓK€JÜ Ó €BØ—\‘\“^×#€Hð PÜzŠz˜(Ÿ/™/¨'Ó2×:°dÓ;ˆô
2026-05-18 22:25:43 +12:00
˜  &× .× 6€EçzŽzܘ œ Ÿ¨×ŠØ Ø Ø Ø ô 
2026-07-04 10:00:16 +12:00
ô¨Ð4YÔ ”OÔ Š ÐÈBÔ—:–:Ü  °Ô —:äØð]ô
ð
ô
2026-05-18 22:25:43 +12:00
.Š.Ó
€CßzŽzÜ!×,¨U´E³GÓߘ3¨!¥Õ,¨tÔ × Ñ Ö Ü ˆx‹=Ô ¨CÐ8rÔ ˜Ôä”7×$ VÓ,¨vÕ6ˆØ!'¨¨|¼T¿YºY»[ÔK`Õ=`ÐblÐnoÐ pŒ÷ ‡K‚KÐ5°zÔƒxÜŠÐ3°U¸DÕØ
2026-07-04 10:00:16 +12:00
”Z ¨ w° Ð;UÐW]Ô_oÐpuÐw{Ó_|Ð 
2026-05-18 22:25:43 +12:00
÷
ð
ô ×
Ò
ذRÀô ÷ðð
2026-07-04 10:00:16 +12:00
$ˆò}$øô
¤× 4Ñ 4Ð PÜŠØ Ø Ø T
ô ¨Ð4NÔPú÷zzzú÷—:—:—:ú÷zzzúñ 
ñ ùs=AO?ÁMÁO?Á"'MÂ
2026-05-18 22:25:43 +12:00
MÂA O?ÃNÃO?Ã NÃ* O?Ã5NÃ6 O?ÄO?ÄAO?Å9N5Å:O?Å=
2026-07-04 10:00:16 +12:00
N;Æ
O?ÆN8Æ8O?ÇOÇO?Ç&OÇ9B+OÊ$ O?Ê/OÊ0A(O?ÌO;Ì!O?Ì:O=Ì; O?ÍA NÎO?ÎO?ÎN2 ÎN!Î
2026-05-18 22:25:43 +12:00
N2 Î*N2 Î,
2026-07-04 10:00:16 +12:00
O?Î8O?Î;O ÏOÏ
O Ï
O Ï
2026-05-18 22:25:43 +12:00
O?ÏO?ÏO8 Ï$O'Ï%
2026-07-04 10:00:16 +12:00
O8 Ï0O8 Ï2
2026-05-18 22:25:43 +12:00
O?Ï=O?z/auth/verify-codecó$V^8„dQhR\/#)rQs"rRrSrS^ s÷++8¤Gñ+8rTc
2026-07-04 10:00:16 +12:00
ƒóð"\VPR\P!4PR,4p\ V4pVP
4GRjxL
2026-05-18 22:25:43 +12:00
p\VPRR44P4P4p\VPRR44P4p\;_uu_4GRjxL
\W!4\PV4pV'g\W!R4\RRR 7h\ P !4VR
,8”d0\P#VR4\W!R 4\RR R 7hVR
2026-07-04 10:00:16 +12:00
;;,^,
uu&VR
,\$8”d0\P#VR4\W!R4\RRR 7hVR,V8wdH\'^\$VR
2026-06-17 21:51:29 +12:00
,,
4p\W!R4\RRT RV^8wdRMR R2R 7h\P#VR4\(P*!^ 4pRVR
\ P !4\,,/\.V&RRR4GRjxL
\14GRjxL
2026-07-04 10:00:16 +12:00
\2P4!RW4\6P8!RWVRR7GRjxL
RRRXRV/#ELrEL] +GRjxL
'giLt;iLiL25i)r1Nròr|r„Úno_pending_codervz7No code found for this email. Please request a new one.r
Ú expired_codez0Your code has expired. Please request a new one.rÚmax_attempts_exceededz7Too many incorrect attempts. Please request a new code.Ú
wrong_codezIncorrect code. z attemptrÇz remaining.z'[%s] auth: session created for email=%sÚ
auth_loginrÆTr)rUr5r6r7rrmryrrr‰r rrrrÚ
token_urlsaferr<) rr„rr¸rs & rRÚauth_verify_coderÌ] s`é䘟¨ ´d·j²j³l×6FÑ6FÀrÕ6JÓK€JÜ Ó €BØ× €DÜ ˜  &× .× 6€EÜ ˆtx‰x˜ Ó ,€DçzŽzܘ ×$ çÜ  Ð1BÔ ¨CÐ8qÔ 9Š9‹;˜ Õ × Ñ ˜u dÔ  °Ô ¨CÐ8jÔ 
טqÕ ÓØ  Ô!7Ô × Ñ ˜u dÔ  Ð1HÔ ¨CÐ8qÔ 6?˜ ˜5¸À
Õ8KÕLˆ  °Ô ¨CÐ:JÈ9È+ÐU]ÐenÐrsÔesÑ^aÐy{Ð]|ð}Hð9IôJð
2026-06-17 21:51:29 +12:00
Jä×ј5 ×% )ˆØ#*¨E°<ÄÇÂÃÔOgÕAgÐ"hÔ˜Ñ÷9zô<
'×
2026-07-04 10:00:16 +12:00
‡K9¸
×
Ò
ØØ°RÀô ÷ðð
 ¨°Ð 7òQ ÷zzzúñ<ùs€AK6ÁKÁA6K6ÃKÃK6ÃFKÉ+ K6É6KÉ7K6ÊK2Ê 8K6ËK4Ë
K6ËK6ËK6ËK/ ËKË
2026-05-18 22:25:43 +12:00
K/ Ë(K/ Ë* K6Ë4K6z /auth/verifycó$V^8„dQhR\/#)rQs"rRrSrS s÷ ñ œwñ rTcƒóÜ"\V4GRjxL
2026-07-04 10:00:16 +12:00
p\PV/4p\PV/4pRRRVRVRVRV\9R\
R\
2026-05-18 22:25:43 +12:00
\4/#LX5i) NrÆTròrÚcpAdminÚ
ownerEmailÚ
previewEmails)rrˆr$r2)rrs& rRÚ auth_verifyrÒŒ spéäÓ1× 1€EÜ×" 5¨"Ó-€GÜ K‰K˜˜ "€Eà ˆdØØØ5œOÑ”kØœ¤Ó ðñ
2026-07-04 10:00:16 +12:00
2ùsA,A*AA,z /auth/logoutcó$V^8„dQhR\/#)rQs"rRrSrS s÷
ñ
œwñ
rTcƒó*"VPPRR4pVPR4P4pRpV'dy\;_uu_4GRjxL
\
P
VR4p\V\4'dVPR4MRpRRR4GRjxL
\4GRjxL
\P!RV\V4RR7GRjxL
RR/#L”LG +GRjxL
'giL^;iLSL*5i) r r|r NròÚ auth_logoutrÆ)r(T)
rrrrr€r)rrrÚlogged_out_emailr[s& rRœ éà—/‘/×% o°rÓ:€KØ × $ YÓ 7€EØÐß ß—:–:Ü'×+¨E°4Ó8ˆHÜ8BÀ8ÌT×8RÒ8R˜xŸ|™|¨GÔ4ÐX\Ð ÷—:ô
×
Ò
Ø Ø°Ó)9À$ô ÷ðð
$ˆ÷—:—:”:úñùsmADÁC/ÁDÁAC3 DÂ)C1Â*DÂ;DÂ<*DÃ&DÃ' DÃ1DÃ3D Ã9C<Ã:
D ÄD Ä DÄDz/auth/save-draftcó$V^8„dQhR\/#)rQs"rRrSrS® s÷ñ¤7ñrTcƒóÜ"\V4GRjxL
pVP4GRjxL
p\VPRR44P 4pVPR/4pVR 9d\ RRR7h\
V\4'g\ RRR7h\;_uu_4GRjxL
\PV/4pWEV&\\4pRRR4GRjxL
2026-06-17 21:51:29 +12:00
\P!\X4GRjxL
\RV4GRjxL
\P !R W4R
2026-07-04 10:00:16 +12:00
R /#EL1ELL•L^ +GRjxL
'giLu;iLYLG5i)
2026-06-17 21:51:29 +12:00
formr|r•rvz(form must be 'onboarding' or 'contract'.r
2026-07-04 10:00:16 +12:00
zdata must be an object.r¯zDraft saved: email=%s form=%srÆT)Ú
onboardingÚcontract)rrmryr r€rrˆr<)rr•Ú user_draftsrÈs& rRÚauth_save_draftrÝ­ séäÓ 1€Eà× €DÜ ˆtx‰x˜ Ó $× ,€DØ 8‰8F˜BÓ €Dà ШÐ4^Ô dœD× ¨Ð4MÔzŽzÜ×°Ó Ø Üœ“=ˆ÷
×
Ò
Ô-¨xÓ
8×
˜Ó
2×
‡KÔ $ˆò'
÷zzŒzúñ
2ùsŒE,EE,©EªBE,Â2EÂ3E,Â6*E à E,Ã+E
Ã,"E,ÄE(ÄE,Ä"E*Ä# E,ÅE,ÅE,Å
E,Å E% ÅEÅ
E% ÅE% Å E,Å*E,r4rCr=zGeneral updater9z6Clean Goodwalk branding for everyday news and updates.Úkickerz
From GoodwalkÚ banner_emojiuðŸ¾Úaccentz#ffd100Ú accent_textz#213021Úpage_bgz#f3f0e5Úcard_bgz#fbfaf7Ú
heading_colorz#171b20Ú
body_colorriÚ muted_colorz#6b766bÚband_bgÚ band_textÚband_decorationu$🾠· 🾠· 🾠· 🾠· ðŸ¾Ú footer_bgÚ footer_textÚ highlight_bgz#fff8d6Úhighlight_borderÚhighlight_textÚ ornament_topÚornament_bottomÚdefault_subjectzA note from GoodwalkÚdefault_headingzHello from the packÚdefault_sub_headingz*A quick update from your dog walking team.Ú default_bodyzÍThank you for being part of our community. Every wag and woof matters to us, and we have a small update to share.
2026-06-17 21:51:29 +12:00
2026-07-04 10:00:16 +12:00
We're always here if you need to chat about walks, training, or anything else dog-related.Údefault_highlightÚdefault_sign_offzAless & the Goodwalk packÚdefault_footer_noteugoodwalk.co.nz · Auckland, NZÚ christmasÚ Christmasz5Deep green and red festive styling with snow accents.zSeason's greetingsu🎄z#c0392bz#e8dccbz#fbf6ecz#0d3b1ez#3a4a3az#0d4d2au>℠· 🎄 · ℠· 🎠· ℠· 🦌 · ℠· ⭠· â„z#ffe8d6z#fff0eaz#7a1d12uOâ„ â„ â„ â„ â„ â„ â„ â„ â„ â„ â„ â„ â„ â„ â„ â„ â„ â„ â„ â„u$🎄 ⭠🎠🦌 ℠🎠⭠🎄u+Merry Christmas from the Goodwalk pack 🎄z"Wishing you a very woofy Christmasu<From our pack to yours — thank you for an incredible year.a'It's been a year full of muddy paws, sunny walks, and very good dogs. From all of us at Goodwalk, we wish you and your pup a warm, joyful Christmas.
We'll be taking a short break over the holidays and will be back in full swing for the new year. Looking forward to many more adventures in 2026.u?🎠Holiday schedule: walks pause from 24 Dec, resuming 6 Jan.z'Wishing you a warm and joyful ChristmasÚeasterÚEasterz2Soft pastel styling with floral and bunny accents.z Happy EasteruðŸ°z#d8a8dez#3a2a4az#fdf3f8z#5a4a5az#8a7a8az#f5d6e5z#5a2a6bu4🌷 · 🰠· 🌸 · 🥚 · 🣠· 🌷 · 🌸z#e7c9f0z#fff0fau1🌷 🌸 🌷 🌸 🌷 🌸 🌷 🌸 🌷 🌸u🥚 🰠🌸 🣠🥚 ðŸ°u%Hop on into Easter with Goodwalk ðŸ°zA happy, hoppy Easter to youz+Spring is in the air and tails are wagging.aWishing you and your pup a beautiful Easter weekend. May your walks be sunny, your eggs uneaten by curious snouts, and your treats plentiful.
A little reminder: chocolate is not for dogs, no matter how sweetly they ask. We'll be sticking to the good stuff on our walks.uT🣠Keep chocolate well out of reach — even small amounts can be harmful to dogs.zHappy Easter from all of usÚ halloweenÚ Halloweenz&Dark purple and orange spooky styling.zTrick or treatu🎃z#ff7518z#1a0d1fz#2b1838z#ffe8d0z#d8c8d8z#9a8aaaz#0a0410u<🎃 · 👻 · 🕷 · 🦇 · 🌙 · 🕸 · 🎃 · 👻z#4a2b66u1🦇 🕸 🦇 🕸 🦇 🕸 🦇 🕸 🦇 🕸u"🎃 👻 🕷 🌙 🦇 🕸 🎃uSpooky season at Goodwalk 🎃zIt's Howl-oweenz$Costumes optional. Treats mandatory.uúSpooky season is upon us. We'll be out walking with extra vigilance — fireworks, doorbell mayhem, and rogue chocolate are all on our radar.
If your pup is nervous around fireworks or doorbells, let us know and we'll factor it into walks this week.u_🫠Reminder: chocolate, raisins, and xylitol are all toxic to dogs. Keep the treat bowl high.zStay spooky out thereÚpromozSale / promotional offerz@Bright yellow promotional styling with a clear discount callout.z
Limited offeru🦴z#fffaebz#fffdf5u2★ · SPECIAL OFFER · ★ · LIMITED TIME · ★z#fff3a0u;★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★u🦴 ★ 🾠★ 🦴 ★ ðŸ¾u%A little something from Goodwalk 🦴zA special offer for our packzBecause regulars are family.zÊWe're running a small thank-you offer for our existing clients. As a regular, you're first in line.
2026-06-17 21:51:29 +12:00
2026-07-04 10:00:16 +12:00
Reply to this email or hit the button below to take it up. Offer is limited and won't be around long.u?20% off your next week of walks · Use code PACKLOVE at bookinguLimited time — be quickr•zSystem (clean sans-serif)Ústackú<-apple-system,BlinkMacSystemFont,'Segoe UI',Arial,sans-serifÚlinkÚ
heading_stackzGeorgia,'Times New Roman',serifÚlorazLora (warm serif)z&'Lora',Georgia,'Times New Roman',serifz\https://fonts.googleapis.com/css2?family=Lora:ital,wght@0,400;0,600;0,700;1,400&display=swapÚplayfairz"Playfair Display (editorial serif)zyhttps://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;700;900&family=Source+Sans+3:wght@400;600&display=swapz2'Playfair Display',Georgia,'Times New Roman',serifÚ merriweatherzMerriweather (readable serif)z.'Merriweather',Georgia,'Times New Roman',serifzOhttps://fonts.googleapis.com/css2?family=Merriweather:wght@400;700&display=swapÚcrimsonzCrimson Text (classic serif)z.'Crimson Text',Georgia,'Times New Roman',serifzdhttps://fonts.googleapis.com/css2?family=Crimson+Text:ital,wght@0,400;0,600;0,700;1,400&display=swapÚinterzInter (modern sans)zD'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Arial,sans-serifzPhttps://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swapÚ
2026-06-17 21:51:29 +12:00
montserratzMontserrat (geometric sans)zI'Montserrat',-apple-system,BlinkMacSystemFont,'Segoe UI',Arial,sans-serifzUhttps://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700&display=swapÚopensanszOpen Sans (friendly sans)zH'Open Sans',-apple-system,BlinkMacSystemFont,'Segoe UI',Arial,sans-serifzahttps://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,400;0,600;0,700;1,400&display=swapc
2026-07-04 10:00:16 +12:00
óTV^8„dQhR\R\R\R\R\/#)rOrdÚ accent_colorr_r)rQs"rRrSrS 
s1÷$
ñ$
2026-06-17 21:51:29 +12:00
¤ð$
´ð$
Ä#ð$
ÔUXð$
2026-07-04 10:00:16 +12:00
Ô]`ñ$
2026-06-17 21:51:29 +12:00
rTcóŽa
2026-07-04 10:00:16 +12:00
a ^RIo RV RV R2pRV RV R2pRV RV R2pTpRV R 2o
2026-06-17 21:51:29 +12:00
TpS P!R
R V4pVPR R
4pVPRR4PRR4pRV 3Rllp V !RWH4pV !RWh4pV !RWx4pV !RWX4pS P!RV
3RlVS PR7pV#)zQApply email-safe inline styles to common HTML tags in user-provided body content.Nrñú&;font-size:16px;line-height:1.7;color:Ú;røz1margin:0 0 16px 0;padding:0 0 0 22px;font-family:ú;color:zcolor:z;text-decoration:underline;z <div\b[^>]*>z<p>rºrGz<br/>z<br />cóHV^8„dQhR\R\R\R\/#)rOrr"rHr_r)rQs"rRrSÚ&_style_body_html.<locals>.__annotate__±
s(÷
2026-07-04 10:00:16 +12:00
ñ
”Sð
2026-06-17 21:51:29 +12:00
¤ð
2026-07-04 10:00:16 +12:00
¬Cð
´
rTcóZ<aaSP!RS R2VV3RlVSPR7#)rBz (\s[^>]*)?>cóL<RS VP^4;'gR RS R2#)rBr|rr )Úgroup)r"rs&€€rRÚ<lambda>Ú3_style_body_html.<locals>._inject.<locals>.<lambda>´
s)ø€˜˜#˜˜qŸw™w q›z×/¨Rи%¸ÀÑDrTrN)r4r5)rr"rHr3sff&€rRÚ_injectÚ!_style_body_html.<locals>._inject±
s-ú€ØvŠvØ Ø—-‘-ô 
ð
rTrz
<a(\s[^>]*?)>cóž<RVP^4P49dRVP^4 RS R2#VP^4#)zstyle=z<arr )rr)Úa_styles&€rRrÚ"_style_body_html.<locals>.<lambda>¿
sJø€¸HÈAÏGÉGÐTUËJ×L\ÑL\ÓL^Ô<^Bq—ww˜q“zl )¨G¨9°CÐnÐde×dkÑdkÐlmÓdnÐnrTrN)r3r4rrr5) rdr Ú base_p_styleÚ
base_li_styleÚ
base_ul_styleÚ
base_ol_stylerÇrrr3s &&&& @@rRÚ_style_body_htmlr  
s ù€ã
à1°*°Ð=cÐdnÐcoÐopÐq€LØ1°*°Ð=cÐdnÐcoÐopÐq€MØ
À|ÐSZÐ[eÐZfÐfgÐh€MØ!€MØ|nÐ$?Ð@€Gð €AØ
Šˆ  qÓ)€AØ (˜#€AØ &˜"×*¨8°WÓ=€A÷
ð
ñ %€AÙ'€AÙ'€AÙ'€AØ
ŠØÜ Øm‰mô  €Að
€HrTc
óTV^8„dQhR\R\R\R\R\/#)rOÚ body_textrÔr r_r)rQs"rRrSrSÇ
s1÷ñœSð¬cð¼sðÔRUðÔZ]ñrTcóJaaV'dVP4'gR#RV9dRV9d\VSSV4#VPR4Uu.uF*qDP4'gKVP4NK, ppRPVV3RlV44#uupi)zÑConvert user body input to email-safe HTML.
If the input already looks like HTML (contains a tag), we treat it as HTML and inline-style it.
Otherwise we split on blank lines and wrap each paragraph in a <p>.
r|rBrDc3ó<<"TFpRS RS RV R2xK R#5i)z&<p style="margin:0 0 16px;font-family:r
Nr¼)s& €€rRr…Ú _body_to_html.<locals>.<genexpr>Ô
s4øéðáˆDð ° Ð<bÐcmÐbnÐnqÐrvÐqwÐw{Õùsƒ)r rr´)r"r rs&ff& rRÚ
_body_to_htmlr&Ç
ù€÷ ˜IŸO™O×à
ˆiÔ˜C   ¨:°zÀ<ÓPà )§¡°Ô 7Ó EÑ 7˜1¿7¹7¿9ŒYˆQW‰WŽYÑ 7€EÐ
7‰7õáóó ðùò
Fs ÁB Á.B có0V^8„dQhR\R\/#r-r)rQs"rRrSrSÚ
s÷pñpœðp¤ñprTcóšT;'gRPRR4PRR4PRR4PRR4#) r|r@rAÚ"z&quot;rBrCrDrErs&rRr6r6Ú
sEØ KˆK Ñ   gÓ 6°s¸HÓ E× MÈcÐSYÓ Z× bÐcfÐhnÓ orTc ó`V^8„dQhR\R\R\R\R\R\/#)rOr™ÚbgrÒr_r)rQs"rRrSrSÞ
s<÷ ñ œsð ¬ð ´#ð Ä3ð ÔTWð ô^añ rTcóLVP4'dVP4'gR#\VP44pVP4PRR4PRR4PRR4pRV RV R V R
V R V R V R
V RV RV R2#)r|r@rArBrCrDrE
<table role="presentation" cellpadding="0" cellspacing="0" border="0" style="margin:22px 0 6px;">
<tr><td align="left">
<!--[if mso]>
<v:roundrect xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="urn:schemas-microsoft-com:office:word" href="z\" style="height:48px;v-text-anchor:middle;width:240px;" arcsize="50%" stroke="f" fillcolor="z4">
<w:anchorlock/>
<center style="color:zV;font-family:Arial,sans-serif;font-size:14px;font-weight:bold;letter-spacing:0.04em;">zV</center>
</v:roundrect>
<![endif]-->
<!--[if !mso]><!-- -->
<a href="zO" style="display:inline-block;padding:14px 28px;border-radius:999px;background:rz
;font-family:zZ;font-size:14px;font-weight:700;text-decoration:none;letter-spacing:0.04em;mso-hide:all;">z/</a>
<!--<![endif]-->
</td></tr>
</table>)r6rr)r™r+r|rWs&&&&& rRÚ_bulletproof_buttonr-Þ
Ø ;‰;=Š= § ¡ § ¢ ÙܘCŸI™I›KÓ(€HØ—+‘+“-ß‘7˜3 Ó©°°fÓ)=¿g¹gÀcÈ6Ó>RððpðqyÐoyðzVðWYðVZðZà&˜<Ð'}ðIð~JðJðˆfÐgiÐfjÐjqÐr|Ðq}ð~KðLVðKWðWqðr|ðq}ð} ð
2026-05-18 22:25:43 +12:00
ð
2026-07-04 10:00:16 +12:00
 rTcóœV^8„dQhR\R\R\R\R\R\R\R\R \R
\R \/ #) rOÚ template_idrYr]r^Ú sub_headingrîÚsign_offÚ footer_noteÚfont_idr_r)rQs"rRrSrSô
2026-05-18 22:25:43 +12:00
÷e ñe Üðe ä
ðe ô ðe ôð e ô
ð e ô ð
2026-07-04 10:00:16 +12:00
e ôðe ôðe ôðe ôðe ô ñe rTc
óx\PV\R,4p
2026-05-18 22:25:43 +12:00
\PV \R,4p V R,p V R,p
2026-07-04 10:00:16 +12:00
V R,pV
R,pV
R,pV
2026-05-18 22:25:43 +12:00
R,pV
2026-07-04 10:00:16 +12:00
R,pV
R ,pV
R
2026-05-18 22:25:43 +12:00
,pV
2026-07-04 10:00:16 +12:00
R ,pV
R ,pV
R
,pV
R,pV
R,pV
R,pV
R,pV
R,pV
R,pV
R,pV
R,pV
R,p V
R,p!T;'g
V
R,P4p"T;'g
V
R,P4p#T;'gV
PRR4P4p$T;'g
V
R,P4p%T;'g
V
R,P4p&T;'g
V
R,P4p'\ V'V VV4p(RV R V R!V( R"2p)Rp*V&'dR#V R$V R%V R&V R'V& R(2 p*\ W4VVV 4p+Rp,V#'d
R)V
R*V R+V# R,2p,Rp-V'd
R-V R.V R/V R02p-Rp.V'd
R-V R1V R/V R02p.R2T R3T R4T R5V!'d
2026-06-17 21:51:29 +12:00
V!R6,MR V R72
2026-07-04 10:00:16 +12:00
p/Rp0V'dR8V R92p0RP
2026-06-17 21:51:29 +12:00
.R:NV0 NR;NV" NR<NV NR=NV NR>NT#;'gT" NR?NV NR@NV NRANV NRBNV NRCNV NRDNV NREN\ NRFNV- NRGNV NRHNV/ NRINV
2026-07-04 10:00:16 +12:00
NRJNV NRKNV" NRLNV, NRMNV) NRMNV* NRMNV+ NRMNV$'d;RNV ,RO,V,RP,V,RQ,V$,RR,MR NRSNV. NRTNV NRUNV NRVNV NRWNV NRQNT;'gRX NRYNV%'dRZV%,R",MR NRMN\VVV R[7 NR\N4#)]r4r•rÿrrr|r×rz";font-size:16px;line-height:1.7;">rº
2026-06-17 21:51:29 +12:00
<table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%" style="margin:8px 0 18px;">
<tr><td style="background:z;border-left:4px solid zK;padding:14px 18px;border-radius:8px;">
2026-07-04 10:00:16 +12:00
<p style="margin:0;font-family:z';font-size:14px;line-height:1.55;color:z;font-weight:600;">
z
2026-06-17 21:51:29 +12:00
</p>
2026-07-04 10:00:16 +12:00
</td></tr>
</table>z'
<p style="margin:0 0 22px;font-family:z8;font-style:italic;font-size:16px;line-height:1.5;color:z;">
z
</p>z-
<tr>
<td align="center" style="background:z\;padding:18px 24px 0;font-family:Arial,sans-serif;font-size:13px;letter-spacing:0.4em;color:z;line-height:1;">
z
</td>
</tr>z\;padding:0 24px 22px;font-family:Arial,sans-serif;font-size:15px;letter-spacing:0.4em;color:z}
<table role="presentation" cellpadding="0" cellspacing="0" border="0" style="margin:0 0 18px;">
<tr><td style="background:z2;border-radius:999px;padding:8px 16px;font-family:z&;font-size:11px;font-weight:700;color:z7;letter-spacing:0.12em;text-transform:uppercase;">
z &nbsp; z
</td></tr>
</table>z<!--[if !mso]><!--><link href="z3" rel="stylesheet" type="text/css"><!--<![endif]-->a(<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="x-apple-disable-message-reformatting">
<meta name="format-detection" content="telephone=no,address=no,email=no,date=no">
<!--[if mso]>
<xml><o:OfficeDocumentSettings><o:PixelsPerInch>96</o:PixelsPerInch><o:AllowPNG/></o:OfficeDocumentSettings></xml>
<![endif]-->
<title>z<</title>
</head>
<body style="margin:0;padding:0;background:z£;width:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;">
<div style="display:none;max-height:0;overflow:hidden;font-size:1px;line-height:1px;color:z
;opacity:0;">zn</div>
<table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%" style="background:zÁ;">
<tr><td align="center" style="padding:24px 12px;">
<table role="presentation" cellpadding="0" cellspacing="0" border="0" width="600" style="max-width:600px;width:100%;background:zd;border-radius:18px;overflow:hidden;">
<tr>
2026-06-17 21:51:29 +12:00
<td align="center" style="background:z;padding:14px 20px;font-family:z,;font-size:13px;letter-spacing:0.18em;color:z ;font-weight:700;">
2026-07-04 10:00:16 +12:00
z
</td>
</tr>
2026-06-17 21:51:29 +12:00
<tr>
2026-07-04 10:00:16 +12:00
<td align="center" style="background:#213021;padding:22px 24px;">
<img src="z¯" width="161" height="32" alt="Goodwalk" style="display:block;max-width:161px;height:auto;border:0;outline:none;text-decoration:none;">
2026-06-17 21:51:29 +12:00
</td>
</tr>
2026-07-04 10:00:16 +12:00
z/
<tr>
<td style="background:z&;padding:30px 30px 8px;">
z4
2026-06-17 21:51:29 +12:00
<h1 style="margin:0 0 14px;font-family:z=;font-size:32px;line-height:1.1;letter-spacing:-0.02em;color:z";font-weight:700;">
z
2026-07-04 10:00:16 +12:00
</h1>
2026-06-17 21:51:29 +12:00
z&<p style="margin:24px 0 0;font-family:z&;font-size:14px;line-height:1.6;color:z&;">With love,<br><strong style="color:rçz
2026-07-04 10:00:16 +12:00
</strong></p>z(
</td>
</tr>
z>
<tr>
<td align="center" style="background:z$;padding:22px 24px 18px;font-family:z&;font-size:12px;line-height:1.6;color:zX;">
<div style="font-size:14px;letter-spacing:0.3em;margin-bottom:8px;color:u🾠· 🾠· ðŸ¾z</div>
z1<div style="font-weight:600;margin-bottom:10px;">)zY
</td>
</tr>
</table>
2026-05-18 22:25:43 +12:00
</td></tr>
2026-07-04 10:00:16 +12:00
</table>
2026-06-17 21:51:29 +12:00
</body>
</html>) ÚMESSAGE_TEMPLATESrŠÚ
MESSAGE_FONTSrŒr&r-r´r.)1r/rYr]r^r0r1r2r3ÚtmplÚfontrÔÚheading_font_stackÚ font_linkràÚfooter_text_colorrìÚhighlight_text_colorrïÚemojiÚshÚsoÚfnÚhlr"Úbody_html_innerrdÚhighlight_htmlrsÚsub_heading_htmlÚornament_top_htmlÚornament_bottom_htmlÚ kicker_htmlÚfont_link_htmls1&&&&&&&&&& rRÚ_render_message_htmlrJô
sqô × Ñ  Ô.?À Õ.JÓ K€DÜ × Ñ ˜W¤m°HÕ&=Ó >€DØg•€JؘoÕØV• €IØ
(^€FØ%€KØ9o€GØ9o€GؘÕ)€MØ#€JØ%€KØ9o€GØ!€IØÐ-€OØ!€IؘؘÕ'€LØÐØÐ 0ÕØ˜Õ'€LØÐ-€OØ
(^€FØ Õ €Eà × +Ð ++×4€AØ
×
2026-07-04 10:00:16 +12:00
4˜Ð4× ;Ñ ;Ó =€BØ
×
2026-05-19 23:36:58 +12:00
6d—h1°2Ó6× =Ñ =Ó ?€BØ
×
2026-06-17 21:51:29 +12:00
2026-07-04 10:00:16 +12:00
4˜Ð4× ;Ñ ;Ó =€BØ
2026-06-17 21:51:29 +12:00
×
2026-07-04 10:00:16 +12:00
5˜DÐ!4Õ5× <Ñ <Ó >€BØ×-˜˜-×6€Iä# I¨z¸:ÀvÓN€Oà
2026-06-17 21:51:29 +12:00
" : ,¨g°j°\ÐAcØ Ð
2026-05-18 22:25:43 +12:00
Ø
ð ðð €Nß ðà)˜NÐ*AÐBRÐASðT$Ø$. <Ð/VÐWkÐVlðmØ €dð ð  ˆô# 9°v¸{ÈJÓW€HàÐß ð 'Ø'9Ð&:Ð:rÐs~Ðrð@Ø€$ððÐð
2026-07-04 10:00:16 +12:00
Ðßð!(à(/ 1MðNTðMUðUØ€Nðð ÐðÐßð$(à(/ 1MðNTðMUðUØÐðð Ððà#˜HÐ$VÐWaÐVbðcIðJUðIVðVß"€eˆ¨Ð+¨F¨8ð4 ð €Kð€Nßà-¨i¨[Ð8kÐ  ÷? ó? ðð? ðÐð? ð
ð? ð ˆð? ð
2026-06-17 21:51:29 +12:00
? ð-4¨9ð? ð5]ð? ð^eÐ\eð? ðfsð? ðtv×szÐszÐyzÐr{ð? ð|hð? ðipÐgpð? ðqFð? ð$GNðFOð%? ð$O0ð%? ð*18¨yð+? ð*9Xð+? ð*YcÐWcð+? ð*dPð+? ð*QZðP[ð+? ð*[
2026-07-04 10:00:16 +12:00
ð+? ð,Ð ð-? ð,ð-? ô8 jð9? ð8! ð9? ð@
2026-06-17 21:51:29 +12:00
ÐðA? ð@!ðA? ðF")  ðG? ðF*
ðG? ðHˆMðI? ðH4ðI? ðJ5GÐ3GðK? ðJHEðK? ðJFSðETðK? ðJTðK? ðLˆcðM? ðL
2026-07-04 10:00:16 +12:00
ðM? ðPÐ ðQ? ðP
2026-06-17 21:51:29 +12:00
ðQ? ðRˆKðS? ðR
2026-07-04 10:00:16 +12:00
ðS? ðTÐ ðU? ðT
2026-06-17 21:51:29 +12:00
ðU? ðVˆJðW? ðV
2026-07-04 10:00:16 +12:00
ðW? ÷X\^Ð6¸ÕCÐFnÕnÐq|Õ@hõhðkxõxð{@õ@ðCEõEðHWöWðdfð
2026-06-17 21:51:29 +12:00
gðY? ðXg ðY? ð`
Ðða? ð`0ða? ðf1:¨{ðg? ðf;_ðg? ðf`jÐ^jðg? ðfkQðg? ðfRcðQdðg? ðfdUðg? ðhVgÐTgði? ðhhkði? ðhl{÷lUðlUðUðkVði? ðhV
ði? ÷jWYÐAÀBÕÖQÐ^`Ð aðk? ðjb
ðk? ôl Ð+<ÐIZÐgqÔ
sðm? ðl tôm? ð? rTz/owner/message-templatescó$V^8„dQhR\/#)rQs"rRrSrSs÷@ñ@¬7ñ@rTcƒó"\V4GRjxL
\P4Uu.uFzpRVR,RVR,RVR,RVR,RVR,RVR,R VR
2026-07-04 10:00:16 +12:00
,R VR ,R
2026-06-17 21:51:29 +12:00
VR,RVR,RVPRR4RVR,/ NK| pp\P4Uu.uF)pRVR,RVR,RVR,RVR,/NK+ ppRRRVRV/#Lëuupiuupi5i)NrCr=r9Ú bannerEmojirßÚdefaultSubjectrñÚdefaultHeadingròÚdefaultSubHeadingróÚ defaultBodyrôÚdefaultHighlightrõÚdefaultSignOffrör|ÚdefaultFooterNoter÷rrÿTÚ templatesÚfonts)rr5rr6)rrrUÚfrVs& rRÚowner_message_templatesrXœs5éä
˜
'×#×ñ,ˆAð
!D•'Ø Af•IØ ˜1˜ •kØ ˜1˜^Õ ˜aÐ 1Õ ˜aÐ 1Õ  Ð#8Õ!9Ø ˜1˜  Ð"5Õ 6Ø ˜aŸe™eÐ$6¸Ó  Ð#8Õ!9ó
2026-07-04 10:00:16 +12:00
2026-06-17 21:51:29 +12:00
ñðô&×
á'ˆ
ˆqw˜  &¥ ¨6°1°Vµ9¸gÀqÈÅzÓ
ð
ð
  Y°¸Ð ?ñ-(ùòùò"
2026-07-04 10:00:16 +12:00
ùs-D C=D ¬BC?Â,D Ã/DÃ3 D Ã?
2026-06-17 21:51:29 +12:00
D z/owner/render-messagecó0V^8„dQhR\R\/#©rOr•r)rHr
)rQs"rRrSrS¸s÷&Ô%9ð&ÄGñ&rTc
ƒóv"\V4GRjxL
VP\9d\RRR7h\ VPVP
VP VPVPVPVPVPVPVPR7
pRRRV/#L¥5i)NrvúUnknown template.r
2026-07-04 10:00:16 +12:00
©r0r1r2r3Trg)rÚ
templateIdr5r rJrYÚctaLabelÚctaUrlÚ
subHeadingÚ
highlightTextÚsignOffÚ
footerNoteÚfontId)r•rrgs&& rRÚowner_render_messagerf·séä
2026-05-18 22:25:43 +12:00
˜
2026-07-04 10:00:16 +12:00
'× Ô¨Ð4GÔ Ø Ø Ø ‰ Ø
Ø Ø—O‘OØ×Ø—O‘OØ ô €Dð
 Ð (ùsB9B7B&B9z/owner/render-welcome-packcó0V^8„dQhR\R\/#rZ©rMr
)rQs"rRrSrSÌs÷&Ô*Að&ÌGñ&rTcƒóN"\V4GRjxL
\VP4P4P 4p\
P
2026-05-19 23:36:58 +12:00
V/4p\VP
2026-07-04 10:00:16 +12:00
RR44P4p\VP
RR44P4p\V4p\VV\VP4\VP4\VP4\VR,4\VR,4\VR,4\VR,4\VR ,4\VR
,4\VR ,4\VR ,4\VR
2026-05-19 23:36:58 +12:00
,4R7pRRRV/#EL5i)z;Render the welcome pack email as HTML for in-modal preview.Nr@r|r>rYrZr[ÚtagLabelr_r`Ú showDetailsÚbodyHtmlÚ
2026-05-18 22:25:43 +12:00
includeButton© rYrZr[r\r]r^r_rdr`Trg)rryrÚ_welcome_custom_fieldsr~rÚ serviceTypeÚ priceDetailsÚ startDater%)r•rr#r!Úcustomrgs&& rRÚowner_render_welcome_packrtËsMéô ˜wÓ
'× 
2026-07-04 10:00:16 +12:00
‹O× #× +€EÜ×" 5¨"Ó-€GÜW—[[ ¨RÓ1×9€JÜ7—;;˜y¨"Ó.×6€Hä
2026-06-17 21:51:29 +12:00
# 
)€FÜ ØÜ××Ó ÜF˜&˜•/Ó&˜•/Óf˜f˜F˜˜& Õf˜˜F ?Õ €Dð
$˜ Ð %ò1(ùsF%F"FF%z/owner/render-birthday-emailcó0V^8„dQhR\R\/#rZ©r?r
)rQs"rRrSrSês÷&Ô,@ð&Ì7ñ&rTcƒó"\V4GRjxL
\VP4P4P 4p\
P
V/4pV'g\RRR7h\VP
RR44P4p\W0P4pV'g\RRR7h\VP
RR44P4p\WF4pR R
R V/#Lí5i) z7Render the birthday email as HTML for in-modal preview.Nr…úClient profile not found.r
2026-07-04 10:00:16 +12:00
r@r|úDog not found.r=Trg) rryrr rjrDr)r•rr#rRr!rgs&& rRÚowner_render_birthday_emailrzééô ˜wÓ
'× 
2026-06-17 21:51:29 +12:00
‹O× #× +€EÜ×" 5¨"Ó-€Gß Ü¨Ð4OÔW—[‘[ ¨RÓ1×9€JÜ
˜G§Z¡ZÓ
0€Cß Ü¨Ð4DÔ3—77˜6 '×/€HÜ  
Ó 5€DØ  Ð (ùsDC?C.Dz/owner/send-messagecó0V^8„dQhR\R\/#rZ)rLr
)rQs"rRrSrSýs#÷EAñEAÔ#5ðEAÄñEArTcƒó "\VPR\P!4PR,4p\ V4GRjxL
pVP \9d\RRR7h\VP4pV'g\RRR7h\VP4pVP;'g.Uu.uFKp\V4P4'gK$\V4P4P!4NKM ppV'gV'g\RRR7h\#VP VP$VP&VP(VP*VP,VP.VP0VP2VP4R7
2026-07-04 10:00:16 +12:00
pV'dm\7VP8;'g.Uu.uFp\V4NK up4p R \:R
2026-06-17 21:51:29 +12:00
V R \<R R
V 2RV/p
\?V
RVR7GRjxL
2026-07-04 10:00:16 +12:00
RRRR/#R \:R
2026-06-17 21:51:29 +12:00
\FP!4P!4.RVR \<R VRV/p
\?V
RVR7GRjxL
\BPH!RY P \KT44\LPN!RY#\QT4RRTP R TR \KT4R!T/R"7GRjxL
2026-07-04 10:00:16 +12:00
RRR \KT4/#EL«uupiuupi\@d0p \BPD!RY+RR7\RRTRR/R7hRp ? ii;i\@d0p \BPD!RY+RR7\RRTRR/R7hRp ? ii;iLž5i)#r²r1Nrvr\r
zPlease enter a subject.z%Please choose at least one recipient.r]rrrz
2026-06-17 21:51:29 +12:00
[PREVIEW] rgÚbulk_message_previewr¡z$[%s] bulk message preview failed: %sTrséözThe preview could not be sent.rÆÚ bulk_messagez[%s] bulk message failed: %szThe message could not be sent.z1[%s] bulk message sent: template=%s recipients=%dÚowner_message_sentr^ÚrecipientCountr¤©r(r))rUr5r6r7rr^r5r rrr%ryrrJrYr_r`rarbrcrdrer™ÚpreviewRecipientsr,r7rrr<rur2r) r•rr‚Ú
is_previewr„Úrecipient_emailsrgrr^rs && rRÚowner_send_messager†üs3é䘟¨ ´d·j²j³l×6FÑ6FÀrÕ6JÓK€JÜ,¨WÓ5€Kà Ô¨Ð4GÔt—|‘|Ó$€Gß Ü¨Ð4MÔd—l#€JØ9=¿¹×9NÐ9NÈBÐ9NÓbÑ9N°1ÔSVÐWXÓSY×S_ÑS_×SaÔ˜AŸ ×.Ñ9NÐРרÐ4[Ô Ø Ø Ø ‰ Ø
Ø Ø—O‘OØ×Ø—O‘OØ ô €D÷Ü8È4×KaÑKa×KgÐKgÐegÐKgÓ9iÑKgÀQ¼#¸a¾&ÑKgÑ9iÓà ”JØ Ð œØ ˜ G 9Ð  
ˆð AܘgÐ-CÐPZÔ[× d˜I  
Ø Œ{× Ò Ó"×
2026-07-04 10:00:16 +12:00
ÐØ”HØð
€Gð}ܘÀJÔO×
 ‡KCÀZ×Q`ÑQ`ÔbeÐfvÓbwÔ
2026-05-19 23:36:58 +12:00
×
2026-07-04 10:00:16 +12:00
Ò
ؼ7À7Ó;KÐTXà ˜$Ÿ/™/Ø  œcÐ"2Ó Ð
ô ÷ ð ð
(¬#Ð.>Ó*?Ð @òG6ùòcùò$:jñ
\øÜô AÜ LŠLÐÐ[_Õ ¨C¸ÀzÐS\Ð^~Ð8ôAð
Aûð Aúñ PøÜ ô}Ü Š Ð3°ZÈtÕ¨°\À:ÈyÐZzÐ4{Ô|ûð}úñ
2026-05-18 22:25:43 +12:00
ùsÃA
2026-07-04 10:00:16 +12:00
NÁ K7Á
A7NÃNÃ
!K:Ã0+K:ÄNÄ-B%NÇNÇK?Ç,NÈ LÈLÈLÈ!>NÉ MÉ1MÉ2MÉ6A-NË#NË$NË:
NÌLÌ MÌ*L;Ì;MÍNÍMÍ M?Í*M:Í:M?Í?Nz/owner/client-enquirycó$V^8„dQhR\/#)rQs"rRrSrSFs÷@ñ@¬ñ@rTcƒód"\V4GRjxL
VPPR4;'gRP4P 4pV'g\ RRR7h\ PV4pV'g\ RRR7h\VPR4\4'dVPR4MRpV'R VPR
2026-05-19 23:36:58 +12:00
R4R VPR R4R VPR R4RTR
2026-07-04 10:00:16 +12:00
VPR
R4RVPRR4RVPRR4R\VPR4\4'dVPR.4M.RRRRRR/ p\P!V4GRjxL
2026-06-17 21:51:29 +12:00
pRRRVRV/#EL5i)Nròr|rvúEmail is required.r
r…r†Ú lastEnquiryÚ submittedAtÚ
lastEnquiryAtr5r@rArBr>rCrRrPrQenquiryrS) rÚ query_paramsrŠrr r€Úget_submission_journey)rrrSs& rRÚowner_client_enquiryrEswéä
˜
'×
×
!×
% 
.×
4°"× =× E€Eß Ü¨Ð4HÔ×" )€Gß Ü¨Ð4GÔHÜ,6°w·{±{À=Ó7QÔSW×,XÒ,Xˆgk‰k˜(Ð^b€Gß ð
˜7Ÿ;™; ¸Ó ˜7Ÿ;™; }°bÓ ˜Ÿ  J°Ó  W—[[ ¨"Ó w—{{ 9¨bÓ ˜Ÿ  J°Ó ´zÀ'Ç+Á+ÈjÓBYÔ[_×7`Ò7`˜Ÿ  J°Ô3ÐfhØ  ˜Ø  
ˆô"×3°EÓ:×:€GØ $˜  7¨I°wÐ ?ò9(ñ6;ùs:F0F+%F0¸&F0Á)F0Â A F0ÃCF0ÆF.Æ
F0Æ.F0z/owner/client-onboarding-viewcó$V^8„dQhR\/#)rQs"rRrSrSgs÷LñL´ñLrTcƒóÌ"\V4GRjxL
pVPPR4;'gRP4P 4pV'g\ RRR7h\ PV4pVf\ RRR7h\PV/4p\P!R V\V4R
R V/R 7GRjxL
R
R
RVRVRV/#L5i)u Read-only snapshot of a single client's onboarding view, used by the
Control Panel "view as client" feature.
Returns the same ``{email, profile, draft}`` shape the client receives from
``/auth/verify`` so the owner can render an exact replica of what the client
sees. This endpoint performs NO writes to client data and never mints a
client session — it is purely a read. Any submit from the impersonation
run-through is routed to ``/owner/onboarding-preview-submit`` instead, which
2026-07-04 10:00:16 +12:00
also never touches the real client.Nròr|rvr‰r
r…r†Úowner_client_viewrÆr©r(rTrñr) rrr rˆr)rrs& rRÚowner_client_onboarding_viewr•féô-¨WÓ5€KØ
×
!×
2026-05-04 20:32:24 +12:00
2026-05-19 23:36:58 +12:00
% 
.×
4°"× =× E€Eß Ü¨Ð4HÔ×" )€GØÜ¨Ð4GÔ K‰K˜˜ "€EÜ
×
2026-05-04 20:32:24 +12:00
Ò
ØÜ  ØØ˜%Ð ô  ÷ðð
2026-05-19 23:36:58 +12:00
 ¨ °7¸GÀUÐ ùs-C$C %C$¸&C$ÁA2C$ÃC"ÃC$Ã"C$z /owner/onboarding-preview-submitcó0V^8„dQhR\R\/#rZ©rGr
)rQs"rRrSrSs÷>Lñ>LÔ0Dð>LÌwñ>LrTc ƒó>"\V4GRjxL
2026-06-17 21:51:29 +12:00
p\VPR\P!4P
R,4p\
V4p\VPPRR44pVPPR4;'gRP4P4pV'd\PV4'g\RRR 7h\!V4\#WV4pR
\$RV.R \&R R
VP( RVP* R2RV/p.p \-VP*VP.VP(V4p
V
'dV P1V
4\2'dD\5V4p \7W°P(RV4GRjxL
2026-05-19 23:36:58 +12:00
p V 'dV P1V 4V 'dW˜R&\9VRVR7GRjxL
2026-05-04 20:32:24 +12:00
\<P@!RY2TPBT4\DPF!RY2TRR\ITPB4RT/R 7GRjxL
2026-05-19 23:36:58 +12:00
RRRTRT/#ELFLn \:d0p
\<P>!RY=RR7\RRTRR/R 7hRp
2026-05-18 22:25:43 +12:00
?
ii;iLP5i)!uOwner-only "impersonation preview" submit.
2026-05-19 23:36:58 +12:00
The owner can walk a client's onboarding all the way to the end. This
endpoint renders the onboarding result exactly like a real submission but
sends it ONLY to the owner-supplied preview address (``?to=...``). It never
writes to the client profile, never emails the client, never registers the
address and records no submission — so a full run-through has zero effect on
the real client. Skips honeypot/timing/rate-limit checks (owner is trusted
and authenticated).Nr²r1ú
user-agentr|rrvz*A valid preview email address is required.r
2026-06-17 21:51:29 +12:00
rru%[PREVIEW] Onboarding run-through — ržrgÚ attachmentsÚowner_onboarding_preview_emailr¡z([%s] onboarding preview email failed: %sTrsr~z=The preview could not be delivered. Please try again shortly.u=[%s] onboarding preview sent by owner=%s for client=%s → %sÚowner_onboarding_previewrÆrÚ
preview_tor)%rrUr5r6r7rrrrr4r rzrr,r7r@r>r<rBÚ!ONBOARDING_PDF_ATTACHMENT_ENABLEDrerwrrr<rury)r•rr”rÚ
owner_htmlÚpreview_payloadršÚbirthday_attachmentÚpdf_htmlÚpdf_attachmentrs&& rRÚowner_onboarding_preview_submitr¤ƒsOéô-¨WÓ5€KܘŸ¨ ´d·j²j³l×6FÑ6FÀrÕ6JÓK€JÜ Ó €BܘŸ×+¨L¸>€Gà×&×*¨4Ó0×6°B×G€Jß œYŸ_™_¨ZרÐ4`Ô$ °'Ó:€Jà
Ø ˆzˆlØ”HØÐ:¸4¿=¹=¸ÈDÏLÉLÈ>ÐYZÐ
ð €Oð!€KÜ2°4·<±<ÀÇÁÈdÏmÉmÐ]gÓߨ×ÑÐ,¨TÓ2ˆÜ:¸8Ç]Á]ÐT`ÐblÓß Ø × Ñ ˜~Ô Ø)4˜
Ñ

2026-05-19 23:36:58 +12:00
ܘ/Ð1QÐ^hÔ ‡K‚KØ §¡¨Zôô ×
2026-07-04 10:00:16 +12:00
Ò
2026-05-19 23:36:58 +12:00
ظ2ÀdØœ#˜dŸj™j›/¨<¸Ð ÷ðð
2026-07-04 10:00:16 +12:00
$˜  j°,À
Ð Kòi6ñ2nñ jøÜ ô
Ü Š ÐÐ[_ÕØà˜jØÐô
2026-07-04 10:00:16 +12:00
ð
ûð
úñùs„JIB7JÃ
JÃ%B&JÆ %JÆ1IÆ2 JÆ>JÇJÇIÇ-IÇ.IÇ2AJÉ
2026-07-04 10:00:16 +12:00
JÉ
JÉJÉIÉ JÉ)*JÊJÊJz/owner/activitycó$V^8„dQhR\/#)rQs"rRrSrSÆs÷*¤'ñ*rTcƒó8"\V4GRjxL
VPp\VPRR44pVPR4;'gVPR4pV'd \V4MRp\ VPRR44;'gRp\ VPRR44;'gRp\ P!VVVVR7GRjxL
pR R
R V/#\d^dpLÃi;i \dRpLi;iL25i) limitÚ100ÚbeforeIdÚ before_idÚ eventTyper|Ú
actorEmail)events)rrzrÚ list_events)rÚqpr§Ú
before_id_intrºr­s& rRÚowner_activityr±Åséä
˜
2026-07-04 10:00:16 +12:00
'×× Ñ €BðÜB—F‘F˜7 EÓ+ˆð"×9 b§f¡f¨[Ó&9€Iðß*3œ˜¸ˆ
ô˜"Ÿ&™& ¨bÓ2×:°d€Jܘ2Ÿ6™6 Ó4×<¸€KÜ×ØØØô ÷€Fð
$˜  )ñ'(øô ôØŠðûô
ôØŠ
ðúñùóyDC0D£C2¾DÁDÁ)DÁ1
DÁ>!DÂ $DÃ DÃ%DÃ& DÃ2
DÃ?DÄDÄDÄ
DÄDÄDÄDz/owner/resend-overviewcó$V^8„dQhR\/#)rQs"rRrSrSÞs÷;ñ;¬ñ;rTcƒó>"\V4GRjxL
VPp\VPRR44p\ ^\
2026-07-04 10:00:16 +12:00
^dV44p\P!\PPRV/4GRjxL
p\P!\PPRV/4GRjxL
p\'T\(4'dTPR .4M.p\'T\(4'dTPR .4M.p.pTp \'T \(4'gKTP+R T PR 4R
\'T PR
4\4'dT PR
4M.RT PR4RT PR4RT PR4RT PR4RT PR4/4 .p
Tp \'T \(4'gK\-T PR4;'gR4p RT 9dKHT
P+R T PR 4RT PR4RT RT PR4RT PR4RT PR4/4 RRRTR T
RT/#E\d^2pEL…i;iEL>EL \dCp\P!RTRR7\!RRRR \#T4P$/R
7hRp?ii;i5i)!Nr§Ú50z owner_resend_overview failed: %sTrsr~z)Could not load Resend activity right now.Ú
error_typer
r•rCrÚ createdAtÚ
created_atrÚ lastEventÚ
2026-07-04 10:00:16 +12:00
last_eventÚ scheduledAtÚ scheduled_atÚendpointr|z/emailsrøÚresponseStatusÚresponse_statusÚ userAgentÚ
user_agentrÆrˆÚlogs)rrzrÚminrër‡rˆÚLogsrr<r“r r€ry) rÚ
emails_resultÚ logs_resultrÚ
email_rowsÚlog_rowsrˆrPs & rRÚowner_resend_overviewrÉÝs´éä
˜
'×× Ñ €BðÜB—F‘F˜7 DÓô
”3s˜E“?Ó #€Eð 
Ü%×/´·
±
×0BÑ0BÀWÈeÐDTÓU×Uˆ
Ü#×-¬f¯k©k×.>Ñ.>ÀÈ%Ð@PÓQ×Qˆ ô3=¸]ÌD×2QÒ2Q×" 6¨2Ô.ÐWY€JÜ.8¸Äd×.KÒ.Kˆ{˜v *ÐQS€Hà#%€Fۈܘ$¤× Ø
2026-07-04 10:00:16 +12:00
Ø $—(‘(˜4“.Ø ¤J¨t¯x©x¸«~¼t×$DÒ$D$—((˜4”.È"Ø D—HH˜ ˜Ÿ ,Ó t—x‘x  Ó ˜Ÿ ,Ó ˜4Ÿ8™8 NÓ
ö ñð"$€Dۈܘ$¤× Üt—x‘x 
Ó1¨rÓØ ˜HÔ Ø Ø $—(‘(˜4“.Ø ˜Ÿ ,Ó ˜Ø d—h‘h˜ ˜dŸh™hÐ'8Ó ˜Ÿ 

ö ñ
ð
ˆVe ð ðòm(øô ôØðúò
VÚQøÜ ô
ÜŠÐ9¸3ÈÕØàМd 3›i×ô
2026-07-04 10:00:16 +12:00
ð
ûð
üsLJ0L£J3¾LÁ4K
 KÂ
8K
ÃK
ÃK
ÃE!LÈ)BLÊ3
KËLËKËLËK
2026-07-04 10:00:16 +12:00
Ë
K
Ë
LË=LÌLÌLz/owner/submissionscó$V^8„dQhR\/#)rQs"rRrSrSs÷-¤Wñ-rTcƒó8"\V4GRjxL
VPp\VPRR44pVPR4;'gVPR4pV'd \V4MRp\ VPRR44;'gRp\ VPRR44;'gRp\ P!VVVVR7GRjxL
pR R
R V/#\d^dpLÃi;i \dRpLi;iL25i) Nr§rqr|)rq submissions)rrzrÚlist_submissions)rrqÚ email_filterÚrowss& rRÚowner_submissionsrÐséä
˜
'×× Ñ €BðÜB—F‘F˜7 EÓ+ˆð"×9 b§f¡f¨[Ó&9€Iðß*3œ˜¸ˆ
2026-07-04 10:00:16 +12:00
ô B—FF˜6  '× /¨4€DܘBŸF™F 7¨BÓ8°D€LÜרØ
Øô ÷ €Dð
$˜
  ,ñ'(øô ôØŠðûô
ôØŠ
ðúñ ùr²z/owner/pending-onboardingcó$V^8„dQhR\/#)rQs"rRrSrS5s÷++4¬Gñ+4rTcƒóªa"\V4GRjxL
RRlo.p\P4EF|wr#V\P!4P 48XdK0VP
R4'dKI\V4'gK\TPRTRVP
RR4RVP
2026-07-04 10:00:16 +12:00
RR4RVP
2026-06-17 21:51:29 +12:00
RR4R VP
R R4R
VP
R
R4R VP
R R4R \V4R
\VP
R
4\4'dVP
R
.4M.RVP
RR4RVP
2026-07-04 10:00:16 +12:00
RR4R\VP
R4\4'dVP
2026-05-19 23:36:58 +12:00
R/4M// 4EK VPV3RlR7RRRV/#EL¾5i)Ncó0V^8„dQhR\R\/#r-©r
)rQs"rRrSÚ.owner_pending_onboarding.<locals>.__annotate__8ó÷ñœsð¤uñrTcó°\V\4'd V'g^#\P!V4P 4# \
d^#i;i©r©r€ryrryÚ timestamprzrs&rRÚ_sort_timestampÚ1owner_pending_onboarding.<locals>._sort_timestamp8óEܘ×%¯UÙð Ü×)¨%Ó0× <øÜô Úð úó¢#AÁ AÁAr@r|rAr^r>r@rBrNrRÚwelcomePackSentAtÚwelcomePackOffercóœ<VPRR4R8gS!VPR44)VPRR4P43#)r|r@©r©rPs&€rRrÚ*owner_pending_onboarding.<locals>.<lambda>YsGø€Ø H‰HÐ(¨"Ó Ñ
˜TŸX™X 
H‰HZ Ó $× 
rT©clients)rr2rr+rTr€Úsort)rÚpending_clientsròs& @rRÚowner_pending_onboardingré4øéä
˜
2026-05-19 23:36:58 +12:00
'×ð-/€OÜ*×2‰ˆØ ”K×'× Ø ;‰;Ð Ü# G× à×ÑØ  ˜Ÿ  J°Ó W—[[ ¨"Ó w—{{ 9¨bÓ w—{‘{ 9¨bÓ ˜Ÿ  J°Ó g—k‘k (¨BÓ Ô%  ´zÀ'Ç+Á+ÈjÓBYÔ[_×7`Ò7`˜Ÿ  J°Ô3ÐfhØ ˜WŸ[™[¨¸"Ó  §¡Ð-@À"Ó!EØ ÄzÐRY×R]ÑR]Ð^pÓRqÔsw×GxÒGx § ¡ Ð,>ÀÔ CðAð
÷
2026-06-17 21:51:29 +12:00
ñ3ð.×Ñô
ðôð
$˜   3òU(ùsƒGG“A&GÁ:EGz/owner/completed-onboardingcó$V^8„dQhR\/#)rQs"rRrSrSds÷@ñ@¬gñ@rTcƒóa
"\V4GRjxL
RRlo
\^\VPP RR444p\
2026-06-17 21:51:29 +12:00
^\^\VPP RR4444p.p\P4EF>wrEV\P!4P48XdK0VP R4'gKI\V4'gK\TPRTR VP R R
4R VP R R
2026-05-19 23:36:58 +12:00
4R VP R R
4R
VP R
R
4RVP RR
4RVP RR
4R\V4RVP RR
4R\;QJd%R\V44F 'gK RM RM!R\V444/
2026-06-17 21:51:29 +12:00
4EKA VP!V
3RlR7\#V4p\^Wb,^,
V,4p\
W4pV^,
2026-05-19 23:36:58 +12:00
V,pW,p RRRW8V RRVRVRVRV//#ELD \
d^pELi;i \
d^
2026-06-17 21:51:29 +12:00
pELöi;i5i)Ncó0V^8„dQhR\R\/#r-)rQs"rRrSÚ0owner_completed_onboarding.<locals>.__annotate__grTcó°\V\4'd V'g^#\P!V4P 4# \
2026-05-19 23:36:58 +12:00
d^#i;irs&rRÚ3owner_completed_onboarding.<locals>._sort_timestampgrQÚ1Ú page_sizeÚ10r¢r@r|rAr^r>r@rBrNÚhasBirthdayInvitec 3ój"TF)p\\VPRR444xK+ R#5i)rAr|N)rry)rRs& rRr…Ú-owner_completed_onboarding.<locals>.<genexpr>s+éÐ$sÑXrÐQT¤X¬c°#·'±'¸+ÀrÓ2JÓ.K×%LÐ%LÓXrùs13TFcót<S!VPR44)VPRR4P43#)r@r|s&€rRrÚ,owner_completed_onboarding.<locals>.<lambda>s4ø€Ù
˜TŸX™XÐ&=Ó
H‰HZ Ó $× 
rTÚ
paginationÚpageSizeÚtotalÚ
totalPages)rrrzr2rr+rTr) rrQÚcompleted_clientsròÚ total_pagesÚstartÚendrÛs & @rRÚowner_completed_onboardingrcsWøéä
2026-06-17 21:51:29 +12:00
˜
2026-07-04 10:00:16 +12:00
'×ðÜ1”c˜'×.×2°6¸ðܘœC ¤3 w×';Ñ';×'?Ñ'?À ÈTÓ'RÓ#SÓUˆ ð/1ÐÜ2‰ˆØ ”K×'× Ø{‰{Ð Ü# G× à× Ñ Ø  ˜Ÿ  J°Ó W—[[ ¨"Ó w—{{ 9¨bÓ w—{‘{ 9¨bÓ ˜Ÿ  J°Ó g—k‘k (¨BÓ Ô%  # W§[¡[Ð1HÈ"Ó%MØ §£Ñ$sÔXiÐjqÔXrÓ$s§§¢Ñ$sÔXiÐjqÔXrÓ$sÓ!sð "
2026-06-17 21:51:29 +12:00
÷ ñ3ð*×Ñô
ðôô
Ð "€EÜa˜+¨aÕ/°IÕ>€KÜ ˆ !€DØ
AX˜Õ "€EØ
Õ
€Cð
ˆdØÐ$¨3ÐØ  ˜ Ø  ˜+ð 
ð ð òm(øô ôØðûô ôØ‹ ðüs_ƒJI
2026-07-04 10:00:16 +12:00
Jž/IÁ9I-ÂAJÃ$CJÆ8BJÉ
I*É&JÉ)I*É*JÉ-
2026-05-19 23:36:58 +12:00
I>É:JÉ=I>É>Jz/owner/all-clientscó$V^8„dQhR\/#)rQs"rRrSrS¨s÷@ñ@¤Wñ@rTcƒó|a "\V4GRjxL
RRlo \^\VPP RR444p\
^\^\VPP RR4444p.p\P4EFywrEV\P!4P48XdK0\VP R4\4'dVP R4MRpTPRTR VP R R
4R VP R R
4R VP R R
4R
VP R
R
4RVP RR
4RVP RR
4R\V4RVP R4'dRMRRT;'g RRRR
RR
2026-05-19 23:36:58 +12:00
RR
/RVP RR
4;'g-VP RR
4;'gVP RR
4RVP RR
4/ 4EK| VP!V 3RlR7\#V4p\^Wr,^,
V,4p\
W4pV^,
V,p W,p
RR R!W9V
2026-05-19 23:36:58 +12:00
R"RVR#VR$VR%V//#EL \
2026-06-17 21:51:29 +12:00
d^pELWi;i \
d^ pEL1i;i5i)&Ncó0V^8„dQhR\R\/#r-)rQs"rRrSÚ'owner_all_clients.<locals>.__annotate__«rTcó°\V\4'd V'g^#\P!V4P 4# \
d^#i;irs&rRÚ*owner_all_clients.<locals>._sort_timestamp«rQÚ12r'r@r|rAr^r>r@rBrNr(Ú completedrÚactiver»Ú changedAtÚ changedByÚlastActivityAtr£cóš<VPR4R8gS!VPR44)VPRR4P43#)r(rr r@r|s&€rRrÚ#owner_all_clients.<locals>.<lambda>ÒsEø€Ø H‰H  
2026-05-18 22:25:43 +12:00
˜TŸX™XÐ&6Ó
2026-06-17 21:51:29 +12:00
H‰HZ Ó $× 
rTTræ)rrrzr2rr€rT) rrQr'rÿs & @rRÚowner_all_clientsr§s´øéä
˜
2026-07-04 10:00:16 +12:00
'×ðÜ1”c˜'×.×2°6¸ðܘœC ¤3 w×';Ñ';×'?Ñ'?À ÈTÓ'RÓ#SÓUˆ ð%'€GÜ*×0×2‰ˆØ ”K×'× ä0:¸7¿;¹;À{Ó;SÔUY×0ZÒ0ZG—KK  Ô,Ð`dˆ ØØ  ˜Ÿ  J°Ó W—[[ ¨"Ó w—{{ 9¨bÓ w—{‘{ 9¨bÓ ˜Ÿ  J°Ó g—k‘k (¨BÓ Ô%   W§[¡[Ð1F×%GÒ%GkÈYØ ˜×j ¸8ÀRÈÐVXÐZeÐgiÐ&jØ ˜gŸk™kÐ*AÀ2ÓSðSÈ'Ï+É+ÐVeÐgiÓJj÷SðSÐnu×nyÑnyð{NðPRóoSØ  §¡Ð-@À"Ó!Eð

÷
ñ 3ð( ‡L
2026-06-17 21:51:29 +12:00
ðôô
2026-07-04 10:00:16 +12:00
‹L€EÜa˜+¨aÕ/°IÕ>€KÜ ˆ !€DØ
AX˜Õ "€EØ
2026-06-17 21:51:29 +12:00
Õ
2026-05-04 20:32:24 +12:00
€Cð
ˆdØÐØ  ˜ Ø  ˜+ð 
ð ð òm(øô ôØðûô ôØ‹ ðüsdƒJ<J
2026-06-17 21:51:29 +12:00
J<ž/JÁ9J(ÂD&J<Æ.#J<ÇJ<Ç,B&J<Ê
J%Ê!J<Ê$J%Ê%J<Ê(
2026-07-04 10:00:16 +12:00
J9Ê5J<Ê8J9Ê9J<z/owner/client-directorycó$V^8„dQhR\/#)rQs"rRrSrSìs÷,¬'ñ,rTcƒóà"\V4GRjxL
.p\P4EF!wr#V\P!4P 48XdK0\
VPR4\4'dVPR4MRpTPRTRVPRR4RVPRR4RVPRR4RVPRR4RVPRR4R VPR R4R
\V4R VPR 4'dR
MRRT;'g R RRRRRRR//
4EK$ VPRR7RRRV/#ELZ5i)Nr'r@r|rAr^r>r@rBrNr(rrr r
r có‚VPRR4P4VPRR4P43#)r@r|©rPs&rRrÚ(owner_client_directory.<locals>.<lambda>s2 4§8¡8¨J¸Ó#;×#AÑ#AÓ#CÀTÇXÁXÈgÐWYÓEZ×E`ÑE`ÓEbÑ"crTTræ) rr2rr€rT)rr's& rRÚowner_client_directoryrësNéä
˜
'×'à$&€GÜ*×0×2‰ˆØ ”K×'× Ü0:¸7¿;¹;À{Ó;SÔUY×0ZÒ0ZG—KK  Ô,Ð`dˆ ØØ  ˜Ÿ  J°Ó W—[[ ¨"Ó w—{{ 9¨bÓ w—{‘{ 9¨bÓ ˜Ÿ  J°Ó g—k‘k (¨BÓ Ô%   W§[¡[Ð1F×%GÒ%GkÈYØ ˜×j ¸8ÀRÈÐVXÐZeÐgiÐ&jð 
÷ ñ 3ð" ‡Lc€LÔ $˜   +ò+(ùsE.E+D*E.Ä=/E.z/owner/client-profilecó0V^8„dQhR\R\/#rZ)rAr
)rQs"rRrSrSs÷=ñ=Ô%8ð=Ä7ñ=rTcƒó¾"\VPR\P!4PR,4p\ V4GRjxL
p\
VP4P4p\
VP4P4p\
VP4P4p\
VP4P4p\
VP4P4p\
VP4P4p \
VP4P4P4p
\
VP 4P4P4p V'g\#RRR7hV'g\#RRR7h\%V
V RVRVR V R
VR VR V/4GRjxL
p \&P(!R
VV\+V4RRV
RV RVR
VR VR V/R7GRjxL
RRRRT RV P-RR4RV P-RR4R V P-R R4R
2026-06-17 21:51:29 +12:00
V P-R
2026-07-04 10:00:16 +12:00
R4R V P-R R4R V P-R R4R\/V 4RV P-RR4R\1V P-R4\24'dV P-R/4/
/#//
/#EL‰EL
2026-06-17 21:51:29 +12:00
LÖ5i)r1NrvúPlease enter the owner name.r
2026-07-04 10:00:16 +12:00
úPlease enter the dog name.r@rAr^r>r@rBÚowner_client_profile_updatedrÆÚ
previousEmailròrTrr|rN)rUr5r6r7rryr@r>r@rBrAr^rÚ nextEmailr r•rrTr€)
2026-06-17 21:51:29 +12:00
r•rrpr!Ú dog_breedÚdog_agerAr^Ú
2026-07-04 10:00:16 +12:00
current_emailr€s