Feat(UI): Blog with article page and Newsletter signup form.
This commit is contained in:
@@ -66,11 +66,11 @@ class Contact_Form(SQLAlchemy_ABC, Base):
|
||||
if json is None: return form
|
||||
form.id_contact_form = -1
|
||||
form.email = json[cls.FLAG_EMAIL]
|
||||
form.name_contact = json[cls.FLAG_NAME_CONTACT]
|
||||
form.name_company = json[cls.FLAG_NAME_COMPANY]
|
||||
form.message = json[cls.FLAG_MESSAGE]
|
||||
form.receive_marketing_communications = json[cls.FLAG_RECEIVE_MARKETING_COMMUNICATIONS]
|
||||
form.active = av.input_bool(json[cls.FLAG_ACTIVE], cls.FLAG_ACTIVE, _m)
|
||||
form.name_contact = json.get(cls.FLAG_NAME_CONTACT, 'No Contact Name')
|
||||
form.name_company = json.get(cls.FLAG_NAME_COMPANY, 'No Company Name')
|
||||
form.message = json.get(cls.FLAG_MESSAGE, 'No Message')
|
||||
form.receive_marketing_communications = json.get(cls.FLAG_RECEIVE_MARKETING_COMMUNICATIONS, True)
|
||||
form.active = av.input_bool(json.get(cls.FLAG_ACTIVE, True), cls.FLAG_ACTIVE, _m)
|
||||
form.created_on = json.get(cls.FLAG_CREATED_ON, None)
|
||||
return form
|
||||
|
||||
|
||||
@@ -12,9 +12,15 @@ Home Page Controller.
|
||||
|
||||
# internal
|
||||
from business_objects.api import API
|
||||
from business_objects.project_hub.contact_form import Contact_Form
|
||||
from datastores.datastore_project_hub import DataStore_Project_Hub_Contact_Form
|
||||
from extensions import db, oauth, mail
|
||||
from forms.project_hub.contact import Form_Contact
|
||||
from forms.project_hub.newsletter import Form_Newsletter
|
||||
from models.model_view_blog_home import Model_View_Blog_Home
|
||||
# external
|
||||
from flask import render_template, jsonify, Blueprint, send_from_directory
|
||||
from flask import render_template, jsonify, Blueprint, send_from_directory, current_app, redirect, url_for
|
||||
from flask_mail import Mail, Message
|
||||
|
||||
|
||||
routes_blog = Blueprint('routes_blog', __name__)
|
||||
@@ -23,9 +29,128 @@ routes_blog = Blueprint('routes_blog', __name__)
|
||||
@routes_blog.route(Model_View_Blog_Home.HASH_PAGE_BLOG_HOME, methods=['GET'])
|
||||
def blog_home():
|
||||
try:
|
||||
model = Model_View_Blog_Home()
|
||||
html_body = render_template('layouts/layout_blog.html', model = model) # 'pages/blog/_home.html'
|
||||
form = Form_Newsletter()
|
||||
model = Model_View_Blog_Home(form)
|
||||
html_body = render_template('pages/blog/_home.html', model = model) # 'pages/blog/_home.html'
|
||||
except Exception as e:
|
||||
return jsonify(error=str(e)), 403
|
||||
return html_body
|
||||
|
||||
|
||||
@routes_blog.route(Model_View_Blog_Home.HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS_FROM_25_TO_100_PLUS_CLIENTS, methods=['GET'])
|
||||
def blog_article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients():
|
||||
try:
|
||||
form = Form_Newsletter()
|
||||
model = Model_View_Blog_Home(form_newsletter = form, hash_page_current = Model_View_Blog_Home.HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS_FROM_25_TO_100_PLUS_CLIENTS)
|
||||
model._title = 'Blog Article'
|
||||
html_body = render_template('pages/blog/_article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients.html', model = model)
|
||||
except Exception as e:
|
||||
return jsonify(error=str(e)), 403
|
||||
return html_body
|
||||
|
||||
@routes_blog.route(Model_View_Blog_Home.HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS_FROM_SOLO_TO_MULTI_TRAINER_SUCCESS, methods=['GET'])
|
||||
def blog_article_how_to_scale_your_dog_training_business_from_solo_to_multi_trainer_success():
|
||||
try:
|
||||
form = Form_Newsletter()
|
||||
model = Model_View_Blog_Home(form_newsletter = form, hash_page_current = Model_View_Blog_Home.HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS_FROM_SOLO_TO_MULTI_TRAINER_SUCCESS)
|
||||
model._title = 'Blog Article'
|
||||
html_body = render_template('pages/blog/_article_how_to_scale_your_dog_training_business_from_solo_to_multi_trainer_success.html', model = model)
|
||||
except Exception as e:
|
||||
return jsonify(error=str(e)), 403
|
||||
return html_body
|
||||
|
||||
@routes_blog.route(Model_View_Blog_Home.HASH_PAGE_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS_HOW_TRACK_REAL_PROGRESS, methods=['GET'])
|
||||
def blog_article_the_science_behind_dog_training_assessments_how_to_track_real_progress():
|
||||
try:
|
||||
form = Form_Newsletter()
|
||||
model = Model_View_Blog_Home(form_newsletter = form, hash_page_current = Model_View_Blog_Home.HASH_PAGE_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS_HOW_TRACK_REAL_PROGRESS)
|
||||
model._title = 'Blog Article'
|
||||
html_body = render_template('pages/blog/_article_the_science_behind_dog_training_assessments_how_to_track_real_progress.html', model = model)
|
||||
except Exception as e:
|
||||
return jsonify(error=str(e)), 403
|
||||
return html_body
|
||||
|
||||
@routes_blog.route(Model_View_Blog_Home.HASH_PAGE_BLOG_ARTICLE_WHY_EVERY_PROFESSIONAL_TRAINER_NEEDS_A_COMMAND_DICTIONARY_IN_2025, methods=['GET'])
|
||||
def blog_article_why_every_professional_trainer_needs_a_command_dictionary_in_2025():
|
||||
try:
|
||||
form = Form_Newsletter()
|
||||
model = Model_View_Blog_Home(form_newsletter = form, hash_page_current = Model_View_Blog_Home.HASH_PAGE_BLOG_ARTICLE_WHY_EVERY_PROFESSIONAL_TRAINER_NEEDS_A_COMMAND_DICTIONARY_IN_2025)
|
||||
model._title = 'Blog Article'
|
||||
html_body = render_template('pages/blog/_article_why_every_professional_trainer_needs_a_command_dictionary_in_2025.html', model = model)
|
||||
except Exception as e:
|
||||
return jsonify(error=str(e)), 403
|
||||
return html_body
|
||||
|
||||
@routes_blog.route(Model_View_Blog_Home.HASH_POST_BLOG_NEWSLETTER, methods=['POST'])
|
||||
def blog_newsletter_post():
|
||||
try:
|
||||
form = Form_Newsletter()
|
||||
if form.validate_on_submit():
|
||||
try:
|
||||
email = form.email.data
|
||||
# send email
|
||||
mailItem = Message("PARTS Website Contact Us Message", recipients=[current_app.config['MAIL_CONTACT_PUBLIC']])
|
||||
mailItem.body = f"Dear Lord Edward Middleton-Smith,\n\nI would like to receive marketing emails.\n\nKind regards,\n{email}"
|
||||
mail.send(mailItem)
|
||||
# save to database
|
||||
datastore = DataStore_Project_Hub_Contact_Form()
|
||||
contact_form = Contact_Form.from_json(form.to_json())
|
||||
datastore.save_contact_forms(
|
||||
comment = f'Email joining newsletter: {email}'
|
||||
, contact_forms = [contact_form]
|
||||
)
|
||||
return redirect(url_for(Model_View_Blog_Home.ENDPOINT_PAGE_BLOG_NEWSLETTER_SUCCESS))
|
||||
"""
|
||||
return API.get_standard_response(
|
||||
success = True,
|
||||
status_code = 200,
|
||||
message = f"Email subscribed to newsletter.",
|
||||
data = None,
|
||||
errors = [],
|
||||
meta = None
|
||||
)
|
||||
"""
|
||||
except Exception as e:
|
||||
return API.get_standard_response(
|
||||
success = False,
|
||||
status_code = 500,
|
||||
message = f"Error: {e}",
|
||||
data = None,
|
||||
errors = [str(e)],
|
||||
meta = None
|
||||
)
|
||||
return API.get_standard_response(
|
||||
success = False,
|
||||
status_code = 500,
|
||||
message = f"Error: {form.errors}",
|
||||
data = None,
|
||||
errors = [str(form.errors)],
|
||||
meta = None
|
||||
)
|
||||
# html_body = render_template('pages/core/_contact.html', model = model)
|
||||
except Exception as e:
|
||||
return API.get_standard_response(
|
||||
success = False,
|
||||
status_code = 500,
|
||||
message = f"Error: {e}",
|
||||
data = None,
|
||||
errors = [str(e)],
|
||||
meta = None
|
||||
)
|
||||
|
||||
@routes_blog.route(Model_View_Blog_Home.HASH_PAGE_BLOG_NEWSLETTER_SUCCESS, methods=['GET'])
|
||||
def blog_newsletter_success():
|
||||
try:
|
||||
form = Form_Newsletter()
|
||||
model = Model_View_Blog_Home(form_newsletter = form, hash_page_current = Model_View_Blog_Home.HASH_PAGE_BLOG_NEWSLETTER_SUCCESS)
|
||||
html_body = render_template('pages/blog/_newsletter_success.html', model = model)
|
||||
return html_body
|
||||
except Exception as e:
|
||||
return API.get_standard_response(
|
||||
success = False,
|
||||
status_code = 500,
|
||||
message = f"Error: {e}",
|
||||
data = None,
|
||||
errors = [str(e)],
|
||||
meta = None
|
||||
)
|
||||
|
||||
@@ -15,6 +15,7 @@ Contact Page Controller.
|
||||
from business_objects.api import API
|
||||
from business_objects.project_hub.contact_form import Contact_Form
|
||||
from datastores.datastore_project_hub import DataStore_Project_Hub_Contact_Form
|
||||
from extensions import db, oauth, mail
|
||||
from forms.project_hub.contact import Form_Contact
|
||||
from helpers.helper_app import Helper_App
|
||||
from models.model_view_contact import Model_View_Contact
|
||||
@@ -24,7 +25,6 @@ import lib.argument_validation as av
|
||||
# external
|
||||
from flask import Flask, render_template, jsonify, request, render_template_string, send_from_directory, redirect, url_for, session, Blueprint, current_app, flash
|
||||
from flask_mail import Mail, Message
|
||||
from extensions import db, oauth, mail
|
||||
from urllib.parse import quote_plus, urlencode
|
||||
from authlib.integrations.flask_client import OAuth
|
||||
from authlib.integrations.base_client import OAuthError
|
||||
|
||||
@@ -21,7 +21,7 @@ from forms.base import Form_Base
|
||||
from flask import Flask, render_template, request, flash, redirect, url_for, current_app
|
||||
from flask_wtf import FlaskForm
|
||||
from wtforms import StringField, TextAreaField, SubmitField, HiddenField, BooleanField, Field, EmailField
|
||||
from wtforms.validators import DataRequired, Email, ValidationError
|
||||
from wtforms.validators import DataRequired, Email, ValidationError, Optional
|
||||
import markupsafe
|
||||
from flask_wtf.recaptcha import RecaptchaField
|
||||
from abc import ABCMeta, abstractmethod
|
||||
@@ -77,11 +77,26 @@ class AltchaField(Field):
|
||||
|
||||
|
||||
class Form_Contact(FlaskForm):
|
||||
email = EmailField('Email')
|
||||
contact_name = StringField('Name')
|
||||
company_name = StringField('Company')
|
||||
message = TextAreaField('Message')
|
||||
receive_marketing = BooleanField('I would like to receive marketing emails.')
|
||||
email = EmailField(
|
||||
'Email'
|
||||
, validators = [DataRequired()]
|
||||
)
|
||||
contact_name = StringField(
|
||||
'Name'
|
||||
, validators = [DataRequired()]
|
||||
)
|
||||
company_name = StringField(
|
||||
'Company'
|
||||
, validators = [Optional()]
|
||||
)
|
||||
message = TextAreaField(
|
||||
'Message'
|
||||
, validators = [Optional()]
|
||||
)
|
||||
receive_marketing = BooleanField(
|
||||
'I would like to receive marketing emails.'
|
||||
, validators = [DataRequired()]
|
||||
)
|
||||
# recaptcha = RecaptchaField()
|
||||
# altcha = HiddenField('ALTCHA') # , validators=[validate_altcha]
|
||||
altcha = AltchaField('Verify you are human')
|
||||
|
||||
52
forms/project_hub/newsletter.py
Normal file
52
forms/project_hub/newsletter.py
Normal file
@@ -0,0 +1,52 @@
|
||||
"""
|
||||
Project: PARTS Website
|
||||
Author: Edward Middleton-Smith
|
||||
Precision And Research Technology Systems Limited
|
||||
|
||||
Technology: Backend
|
||||
Feature: Contact Us Form
|
||||
|
||||
Description:
|
||||
Defines Flask-WTF form for handling user input on Contact Us page.
|
||||
"""
|
||||
|
||||
# IMPORTS
|
||||
# internal
|
||||
from business_objects.base import Base
|
||||
from business_objects.project_hub.contact_form import Contact_Form
|
||||
from forms.project_hub.contact import AltchaField, AltchaValidator
|
||||
# from models.model_view_store import Model_View_Store # circular
|
||||
from models.model_view_base import Model_View_Base
|
||||
from forms.base import Form_Base
|
||||
# external
|
||||
from flask import Flask, render_template, request, flash, redirect, url_for, current_app
|
||||
from flask_wtf import FlaskForm
|
||||
from wtforms import StringField, TextAreaField, SubmitField, HiddenField, BooleanField, Field, EmailField
|
||||
from wtforms.validators import DataRequired, Email, ValidationError, Optional
|
||||
import markupsafe
|
||||
from flask_wtf.recaptcha import RecaptchaField
|
||||
from abc import ABCMeta, abstractmethod
|
||||
import json
|
||||
from altcha import verify_solution
|
||||
import base64
|
||||
|
||||
|
||||
class Form_Newsletter(FlaskForm):
|
||||
email = EmailField(
|
||||
'Email'
|
||||
, validators = [DataRequired()]
|
||||
)
|
||||
altcha = AltchaField('Verify you are human')
|
||||
submit = SubmitField('Subscribe Now')
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
Base.FLAG_EMAIL: self.email.data
|
||||
, Contact_Form.FLAG_NAME_CONTACT: 'No Contact Name'
|
||||
, Contact_Form.FLAG_NAME_COMPANY: 'No Company Name'
|
||||
, Contact_Form.FLAG_MESSAGE: 'No Message'
|
||||
, Contact_Form.FLAG_RECEIVE_MARKETING_COMMUNICATIONS: True
|
||||
, Contact_Form.FLAG_ALTCHA: self.altcha.data
|
||||
, Base.FLAG_ACTIVE: True
|
||||
, Base.FLAG_CREATED_ON: None
|
||||
}
|
||||
@@ -111,6 +111,8 @@ class Model_View_Base(BaseModel, ABC):
|
||||
ENDPOINT_PAGE_ACCESSIBILITY_STATEMENT: ClassVar[str] = 'routes_legal.accessibility_statement'
|
||||
ENDPOINT_PAGE_APPLY_FOUNDING_PARTNER: ClassVar[str] = 'routes_core_apply_founding_partner.apply_founding_partner'
|
||||
ENDPOINT_PAGE_APPLY_FOUNDING_PARTNER_SUCCESS: ClassVar[str] = 'routes_core_apply_founding_partner.apply_founding_partner_success'
|
||||
# ENDPOINT_PAGE_BLOG_NEWSLETTER: ClassVar[str] = 'routes_blog.blog_newsletter'
|
||||
ENDPOINT_PAGE_BLOG_NEWSLETTER_SUCCESS: ClassVar[str] = 'routes_blog.blog_newsletter_success'
|
||||
ENDPOINT_PAGE_CONTACT: ClassVar[str] = 'routes_core_contact.contact'
|
||||
ENDPOINT_PAGE_CONTACT_SUCCESS: ClassVar[str] = 'routes_core_contact.contact_success'
|
||||
ENDPOINT_PAGE_DATA_RETENTION_SCHEDULE: ClassVar[str] = 'routes_legal.retention_schedule'
|
||||
@@ -273,12 +275,14 @@ class Model_View_Base(BaseModel, ABC):
|
||||
HASH_PAGE_ADMIN_HOME: ClassVar[str] = '/admin'
|
||||
HASH_PAGE_APPLY_FOUNDING_PARTNER: ClassVar[str] = '/apply-founding-partner'
|
||||
HASH_PAGE_APPLY_FOUNDING_PARTNER_SUCCESS: ClassVar[str] = '/apply-founding-partner-success'#
|
||||
HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS: ClassVar[str] = '/blog/article/how-to-scale-your-dog-training-business-from-solo-to-multi-trainer-success'
|
||||
HASH_PAGE_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS: ClassVar[str] = '/blog/article/the-science-behind-dog-training-assessments-how-to-track-real-progress'
|
||||
HASH_PAGE_BLOG_ARTICLE_WHY_EVERY_TRAINER_NEEDS_A_COMMAND_DICTIONARY: ClassVar[str] = '/blog/article/why-every-professional-trainer-needs-a-command-dictionary-in-2025'
|
||||
HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS_FROM_25_TO_100_PLUS_CLIENTS: ClassVar[str] = '/blog/article/how-to-scale-your-dog-training-business-from-25-to-100-plus-clients'
|
||||
HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS_FROM_SOLO_TO_MULTI_TRAINER_SUCCESS: ClassVar[str] = '/blog/article/how-to-scale-your-dog-training-business-from-solo-to-multi-trainer-success'
|
||||
HASH_PAGE_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS_HOW_TRACK_REAL_PROGRESS: ClassVar[str] = '/blog/article/the-science-behind-dog-training-assessments-how-to-track-real-progress'
|
||||
HASH_PAGE_BLOG_ARTICLE_WHY_EVERY_PROFESSIONAL_TRAINER_NEEDS_A_COMMAND_DICTIONARY_IN_2025: ClassVar[str] = '/blog/article/why-every-professional-trainer-needs-a-command-dictionary-in-2025'
|
||||
HASH_PAGE_BLOG_CATEGORY_MARKETING_AND_GROWTH: ClassVar[str] = '/blog/category/marketing-and-growth'
|
||||
HASH_PAGE_BLOG_CATEGORY_TRAINING_TECHNIQUES: ClassVar[str] = '/blog/category/training-techniques'
|
||||
HASH_PAGE_BLOG_HOME: ClassVar[str] = '/blog/home'
|
||||
HASH_PAGE_BLOG_NEWSLETTER_SUCCESS: ClassVar[str] = '/blog/newsletter-success'
|
||||
HASH_PAGE_CONTACT: ClassVar[str] = '/contact'
|
||||
HASH_PAGE_CONTACT_SUCCESS: ClassVar[str] = '/contact-success'
|
||||
HASH_PAGE_DATA_RETENTION_SCHEDULE: ClassVar[str] = '/retention-schedule'
|
||||
@@ -302,6 +306,7 @@ class Model_View_Base(BaseModel, ABC):
|
||||
HASH_PAGE_USER_COMPANY: ClassVar[str] = '/user/company'
|
||||
HASH_PAGE_USER_LOGIN: ClassVar[str] = '/login'
|
||||
HASH_PAGE_USER_LOGOUT: ClassVar[str] = '/logout'
|
||||
HASH_POST_BLOG_NEWSLETTER: ClassVar[str] = '/blog/post-newletter-form'
|
||||
# HASH_SAVE_DOG_ASSESSMENT: ClassVar[str] = '/dog/save-assessment'
|
||||
HASH_SAVE_DOG_ASSESSMENT_DISTRACTION_AND_RESPONSE: ClassVar[str] = '/dog/save-assessment-distraction-and-response'
|
||||
HASH_SAVE_DOG_BUTTON_ICON: ClassVar[str] = '/dog/save-button-icon'
|
||||
|
||||
@@ -11,6 +11,8 @@ Data model for home view
|
||||
"""
|
||||
|
||||
# internal
|
||||
# from forms.project_hub.contact import Form_Contact
|
||||
from forms.project_hub.newsletter import Form_Newsletter
|
||||
from models.model_view_base import Model_View_Base
|
||||
# from routes import bp_home
|
||||
# external
|
||||
@@ -18,8 +20,12 @@ from typing import ClassVar
|
||||
|
||||
|
||||
class Model_View_Blog_Home(Model_View_Base):
|
||||
HASH_POST_NEWSLETTER_FORM: ClassVar[str] = '/blog/post-newsletter-form'
|
||||
ID_NEWSLETTER_FORM: ClassVar[str] = 'form_newsletter'
|
||||
|
||||
def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_BLOG_HOME):
|
||||
super().__init__(hash_page_current=hash_page_current)
|
||||
form_newsletter: Form_Newsletter
|
||||
|
||||
def __init__(self, form_newsletter, hash_page_current=Model_View_Base.HASH_PAGE_BLOG_HOME):
|
||||
super().__init__(hash_page_current = hash_page_current, form_newsletter = form_newsletter)
|
||||
self._title = 'Blog Home'
|
||||
|
||||
@@ -89,15 +89,17 @@
|
||||
font-size: 15px;
|
||||
/* height: 18px; */
|
||||
cursor: pointer;
|
||||
padding-top: 5vh;
|
||||
padding: 4.5px 0;
|
||||
}
|
||||
#overlayHamburger .container:hover {
|
||||
color: var(--colour-page-background);
|
||||
background-color: var(--colour-primary);
|
||||
}
|
||||
#overlayHamburger > .container {
|
||||
/*
|
||||
padding-top: 4.5px;
|
||||
padding-bottom: 4.5px;
|
||||
*/
|
||||
}
|
||||
#overlayHamburger .container a {
|
||||
width: 100%;
|
||||
@@ -107,6 +109,7 @@
|
||||
*/
|
||||
color: var(--colour-text);
|
||||
text-decoration: none;
|
||||
line-height: initial;
|
||||
}
|
||||
#overlayHamburger .container a:hover {
|
||||
color: var(--colour-page-background);
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
|
||||
#pageBody {
|
||||
padding-top: 2vh;
|
||||
}
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
||||
line-height: 1.6;
|
||||
color: #333;
|
||||
background-color: #f8f9fa;
|
||||
}
|
||||
|
||||
/* Header */
|
||||
|
||||
0
static/css/pages/blog/newsletter_success.css
Normal file
0
static/css/pages/blog/newsletter_success.css
Normal file
@@ -17,6 +17,7 @@
|
||||
padding: 2rem;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
||||
text-align: center;
|
||||
}
|
||||
.contact-form textarea {
|
||||
max-width: 40vw;
|
||||
@@ -38,6 +39,7 @@
|
||||
border: 2px solid var(--colour-accent);
|
||||
border-radius: 4px;
|
||||
font-size: 1rem;
|
||||
max-width: 40vw;
|
||||
}
|
||||
textarea.form-input {
|
||||
min-height: 120px;
|
||||
@@ -45,7 +47,7 @@ textarea.form-input {
|
||||
|
||||
.marketing-consent input {
|
||||
display: inline-block;
|
||||
margin-left: 20%;
|
||||
/* margin-left: 20%; */
|
||||
margin-bottom: 1.25rem;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,14 +2,13 @@
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
||||
line-height: 1.6;
|
||||
color: #333;
|
||||
background-color: #f8f9fa;
|
||||
background: var(--colour-page-background-1);
|
||||
}
|
||||
|
||||
/* Header */
|
||||
@@ -84,6 +83,38 @@ body {
|
||||
margin-bottom: 3rem;
|
||||
}
|
||||
|
||||
|
||||
/* Hero Section */
|
||||
.hero {
|
||||
padding: 8rem 2rem 4rem;
|
||||
background: linear-gradient(45deg, var(--colour-page-background-1), var(--colour-page-background-2)); /* linear-gradient(45deg, #f8fafc, #eff6ff); */
|
||||
}
|
||||
.hero-content {
|
||||
max-width: 600px;
|
||||
}
|
||||
.hero h1 {
|
||||
line-height: 1.2;
|
||||
margin-bottom: 1.5rem;
|
||||
color: var(--colour-text);
|
||||
}
|
||||
.hero p {
|
||||
font-size: 1.25rem;
|
||||
margin-bottom: 2rem;
|
||||
color: var(--colour-secondary);
|
||||
}
|
||||
section.hero .button {
|
||||
margin: 0 auto;
|
||||
margin-bottom: 2vh;
|
||||
display: block;
|
||||
background-color: var(--colour-success-title);
|
||||
color: var(--colour-text-background);
|
||||
}
|
||||
section.hero .button:hover {
|
||||
background-color: var(--colour-success-highlight);
|
||||
color: var(--colour-success-title);
|
||||
}
|
||||
|
||||
|
||||
/* Featured Post */
|
||||
.featured-post {
|
||||
background: white;
|
||||
@@ -332,6 +363,13 @@ body {
|
||||
background: #e55a2b;
|
||||
}
|
||||
|
||||
#form_newsletter input[type="email"] {
|
||||
width: 80%;
|
||||
margin: 0 10%;
|
||||
padding: 0.5vh;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
/* Footer */
|
||||
.footer {
|
||||
background: #2d3748;
|
||||
|
||||
1020
static/dist/css/blog_article.bundle.css
vendored
Normal file
1020
static/dist/css/blog_article.bundle.css
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1
static/dist/css/blog_article.bundle.css.map
vendored
Normal file
1
static/dist/css/blog_article.bundle.css.map
vendored
Normal file
File diff suppressed because one or more lines are too long
393
static/dist/css/blog_home.bundle.css
vendored
393
static/dist/css/blog_home.bundle.css
vendored
@@ -76,369 +76,17 @@
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
/* Common */
|
||||
section {
|
||||
padding: 2rem;
|
||||
}
|
||||
p {
|
||||
width: 100%;
|
||||
font-size: 16px;
|
||||
}
|
||||
p.section-title,
|
||||
p.section-subtitle {
|
||||
margin: 0 auto;
|
||||
}
|
||||
.section-subtitle {
|
||||
font-size: 18px;
|
||||
}
|
||||
ul li {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
section.benefits .card.benefits,
|
||||
section.social-proof .card.social-proof {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
section.problem,
|
||||
section.benefits,
|
||||
section.solution,
|
||||
section.testimonial {
|
||||
padding: 4rem 2rem;
|
||||
background: var(--colour-page-background-1);
|
||||
}
|
||||
section.problem .card.problem,
|
||||
section.benefits .card.benefits,
|
||||
section.solution .card.solution,
|
||||
section.testimonial .card.testimonial {
|
||||
background: var(--colour-text-background);
|
||||
border-radius: 8px;
|
||||
max-width: 800px;
|
||||
margin: 3rem auto 0;
|
||||
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
|
||||
/* Hero Section */
|
||||
.hero {
|
||||
padding: 8rem 2rem 4rem;
|
||||
background: linear-gradient(45deg, var(--colour-page-background-1), var(--colour-page-background-2)); /* linear-gradient(45deg, #f8fafc, #eff6ff); */
|
||||
}
|
||||
.hero-content {
|
||||
max-width: 600px;
|
||||
}
|
||||
.hero h1 {
|
||||
line-height: 1.2;
|
||||
margin-bottom: 1.5rem;
|
||||
color: var(--colour-text);
|
||||
}
|
||||
.hero p {
|
||||
font-size: 1.25rem;
|
||||
margin-bottom: 2rem;
|
||||
color: var(--colour-secondary);
|
||||
}
|
||||
section.hero .button {
|
||||
margin: 0 auto;
|
||||
margin-bottom: 2vh;
|
||||
display: block;
|
||||
background-color: var(--colour-success-title);
|
||||
color: var(--colour-text-background);
|
||||
}
|
||||
section.hero .button:hover {
|
||||
background-color: var(--colour-success-highlight);
|
||||
color: var(--colour-success-title);
|
||||
}
|
||||
|
||||
|
||||
/* Problem Section */
|
||||
section.problem {
|
||||
background-color: var(--colour-error-highlight);
|
||||
}
|
||||
section.problem h2 {
|
||||
color: var(--colour-error-title);
|
||||
}
|
||||
section.problem .card {
|
||||
border-left: 4px solid var(--colour-error-accent);
|
||||
}
|
||||
section.problem ul li {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
section.problem .problem.card:hover {
|
||||
transform: translateY(-5px);
|
||||
}
|
||||
*/
|
||||
section.problem .section-subtitle {
|
||||
/* font-size: 18px; */
|
||||
font-weight: bold;
|
||||
}
|
||||
/*
|
||||
section.problem ul li::before {
|
||||
content: "😤";
|
||||
position: absolute;
|
||||
left: 0;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
/* Benefits Section * /
|
||||
section.benefits .section-subtitle {
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
}
|
||||
*/
|
||||
section.benefits {
|
||||
background-color: var(--colour-success-highlight);
|
||||
}
|
||||
section.benefits .container .card .container {
|
||||
min-width: 250px;
|
||||
}
|
||||
section.benefits h2 {
|
||||
color: var(--colour-success);
|
||||
}
|
||||
section.benefits .card {
|
||||
border-left: 4px solid var(--colour-success);
|
||||
}
|
||||
|
||||
/* Solution Section */
|
||||
section.solution .container .card {
|
||||
margin-top: 1vh;
|
||||
max-width: min(2000px, 80vw);
|
||||
}
|
||||
|
||||
section.benefits .card.benefits .container,
|
||||
section.solution .container .card .container {
|
||||
padding: 1vh 2vw;
|
||||
max-width: min(500px, 80vw);
|
||||
}
|
||||
section.solution .container .card .container p {
|
||||
margin-bottom: 1vh;
|
||||
}
|
||||
section.solution .project-thumbnail img {
|
||||
max-width: min(500px, 80vw);
|
||||
max-height: min(500px, 80vw);
|
||||
border-radius: 1vh;
|
||||
}
|
||||
|
||||
section.solution .project-thumbnail img {
|
||||
overflow: hidden;
|
||||
transition: transform 0.3s ease;
|
||||
}
|
||||
section.solution .project-thumbnail:hover {
|
||||
transform: scale(1.75);
|
||||
}
|
||||
|
||||
/* Social Proof Section * /
|
||||
section.social-proof {
|
||||
padding: 6rem 0;
|
||||
background: white;
|
||||
}
|
||||
|
||||
section.social-proof .card.social-proof {
|
||||
background: var(--colour-page-background);
|
||||
padding: 2rem;
|
||||
border-radius: 8px;
|
||||
text-align: center;
|
||||
max-width: 400px;
|
||||
margin: 3rem auto 0;
|
||||
}
|
||||
|
||||
section.social-proof ul {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
}
|
||||
* /
|
||||
|
||||
section.social-proof .section-subtitle {
|
||||
font-size: 16px;
|
||||
}
|
||||
section.social-proof ul li {
|
||||
font-size: 14px;
|
||||
}
|
||||
*/
|
||||
section.social-proof {
|
||||
padding: 4rem 0;
|
||||
background: var(--colour-text-background);
|
||||
}
|
||||
section.social-proof .card.social-proof {
|
||||
background: var(--colour-page-background);
|
||||
border-radius: 8px;
|
||||
transition: transform 0.3s ease;
|
||||
padding: 1.5vh;
|
||||
}
|
||||
section.social-proof .section-title {
|
||||
font-weight: bold;
|
||||
color: var(--colour-text-link-visited);
|
||||
margin-bottom: 0.25vh;
|
||||
}
|
||||
section.social-proof .section-subtitle {
|
||||
margin: 0 1vw 1vh;
|
||||
}
|
||||
section.social-proof .container {
|
||||
width: fit-content;
|
||||
margin: 0 2vw;
|
||||
min-width: 175px;
|
||||
}
|
||||
section.social-proof > .container {
|
||||
max-width: min(900px, 90vw);
|
||||
margin: 1vh auto;
|
||||
}
|
||||
|
||||
/* Early Access Section * /
|
||||
section.early-access {
|
||||
padding: 6rem 0;
|
||||
background: white;
|
||||
}
|
||||
|
||||
section.early-access .card.early-access {
|
||||
background: var(--colour-page-background);
|
||||
padding: 2rem;
|
||||
border-radius: 8px;
|
||||
text-align: center;
|
||||
max-width: 400px;
|
||||
margin: 3rem auto 0;
|
||||
}
|
||||
|
||||
section.early-access ul {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
}
|
||||
section.early-access a.button {
|
||||
margin: 0.25rem;
|
||||
}
|
||||
*/
|
||||
|
||||
/* Features section * /
|
||||
section.features .button {
|
||||
margin-top: 0;
|
||||
}
|
||||
*/
|
||||
|
||||
/* Testimonials section */
|
||||
section.testimonial p {
|
||||
margin-bottom: 1vh;
|
||||
}
|
||||
section.testimonial h2 {
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
/* CTA Section */
|
||||
.cta-1,
|
||||
.cta-2 {
|
||||
padding: 6rem 2rem;
|
||||
background: linear-gradient(135deg, var(--colour-primary), var(--colour-text-link-visited));
|
||||
color: white;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
section.cta-2 .button {
|
||||
margin: 2vh 1vw;
|
||||
}
|
||||
section.cta-2 .card {
|
||||
background-color: transparent;
|
||||
margin: 1vh auto;
|
||||
}
|
||||
section.cta-2 .card .container {
|
||||
background-color: var(--colour-page-background);
|
||||
color: var(--colour-primary);
|
||||
border-radius: 1vh;
|
||||
padding: 1.5vh 3vw;
|
||||
margin: 1vh;
|
||||
min-width: 200px;
|
||||
min-height: 120px;
|
||||
}
|
||||
section.cta-2 .card .container h3 {
|
||||
margin: 0 auto;
|
||||
}
|
||||
section.cta-2 .container p {
|
||||
margin-top: 1vh;
|
||||
}
|
||||
/* FAQs * /
|
||||
section.faq .button {
|
||||
margin-bottom: 0.25rem;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
/* Animations */
|
||||
/* Fallback styles to ensure content is visible without JS */
|
||||
.reveal {
|
||||
opacity: 1; /* Default visible state */
|
||||
}
|
||||
|
||||
/* Only hide elements if browser supports Intersection Observer */
|
||||
@supports (animation-name: fade) {
|
||||
.reveal {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.reveal.active {
|
||||
animation: fade-up 0.8s ease-out forwards;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fade-up {
|
||||
0% {
|
||||
opacity: 0;
|
||||
transform: translateY(30px);
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
.delay-1 { animation-delay: 0.1s; }
|
||||
.delay-2 { animation-delay: 0.2s; }
|
||||
.delay-3 { animation-delay: 0.3s; }
|
||||
.delay-4 { animation-delay: 0.4s; }
|
||||
|
||||
/* Buttons */
|
||||
.topnav .nav-links .button {
|
||||
padding: 0.5vh 0.75vh;
|
||||
}
|
||||
.button {
|
||||
padding: 0.75rem 1.5rem;
|
||||
/* border-radius: 6px; * /
|
||||
margin: 0.75rem; */
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
.button-primary {
|
||||
background: var(--colour-primary);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.button-primary:hover {
|
||||
background: var(--colour-secondary);
|
||||
}
|
||||
|
||||
.button-light {
|
||||
background: white;
|
||||
color: var(--colour-primary);
|
||||
}
|
||||
|
||||
.button-light:hover {
|
||||
background: var(--colour-page-background);
|
||||
}
|
||||
|
||||
.logo:hover{
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
||||
line-height: 1.6;
|
||||
color: #333;
|
||||
background-color: #f8f9fa;
|
||||
background: var(--colour-page-background-1);
|
||||
}
|
||||
|
||||
/* Header */
|
||||
@@ -513,6 +161,38 @@ body {
|
||||
margin-bottom: 3rem;
|
||||
}
|
||||
|
||||
|
||||
/* Hero Section */
|
||||
.hero {
|
||||
padding: 8rem 2rem 4rem;
|
||||
background: linear-gradient(45deg, var(--colour-page-background-1), var(--colour-page-background-2)); /* linear-gradient(45deg, #f8fafc, #eff6ff); */
|
||||
}
|
||||
.hero-content {
|
||||
max-width: 600px;
|
||||
}
|
||||
.hero h1 {
|
||||
line-height: 1.2;
|
||||
margin-bottom: 1.5rem;
|
||||
color: var(--colour-text);
|
||||
}
|
||||
.hero p {
|
||||
font-size: 1.25rem;
|
||||
margin-bottom: 2rem;
|
||||
color: var(--colour-secondary);
|
||||
}
|
||||
section.hero .button {
|
||||
margin: 0 auto;
|
||||
margin-bottom: 2vh;
|
||||
display: block;
|
||||
background-color: var(--colour-success-title);
|
||||
color: var(--colour-text-background);
|
||||
}
|
||||
section.hero .button:hover {
|
||||
background-color: var(--colour-success-highlight);
|
||||
color: var(--colour-success-title);
|
||||
}
|
||||
|
||||
|
||||
/* Featured Post */
|
||||
.featured-post {
|
||||
background: white;
|
||||
@@ -761,6 +441,13 @@ body {
|
||||
background: #e55a2b;
|
||||
}
|
||||
|
||||
#form_newsletter input[type="email"] {
|
||||
width: 80%;
|
||||
margin: 0 10%;
|
||||
padding: 0.5vh;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
/* Footer */
|
||||
.footer {
|
||||
background: #2d3748;
|
||||
|
||||
2
static/dist/css/blog_home.bundle.css.map
vendored
2
static/dist/css/blog_home.bundle.css.map
vendored
File diff suppressed because one or more lines are too long
228
static/dist/css/blog_newsletter_success.bundle.css
vendored
Normal file
228
static/dist/css/blog_newsletter_success.bundle.css
vendored
Normal file
@@ -0,0 +1,228 @@
|
||||
|
||||
/* Home page
|
||||
*/
|
||||
|
||||
/* Footer */
|
||||
.footer {
|
||||
background: #1f2937;
|
||||
color: #f3f4f6;
|
||||
padding: 4rem 2rem 2rem;
|
||||
}
|
||||
|
||||
.footer-content {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
||||
gap: 2rem;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
.footer-section h3 {
|
||||
color: #fff;
|
||||
margin-bottom: 1rem;
|
||||
font-size: 1.2rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.footer-section ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.footer-section ul li {
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.footer-section a {
|
||||
color: #f3f4f6;
|
||||
text-decoration: none;
|
||||
transition: color 0.3s ease;
|
||||
}
|
||||
|
||||
.footer-section a:hover {
|
||||
color: #fff;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.footer-bottom {
|
||||
border-top: 1px solid #374151;
|
||||
padding-top: 2rem;
|
||||
text-align: center;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.footer-bottom a {
|
||||
color: aquamarine;
|
||||
}
|
||||
|
||||
.footer-section.contact {
|
||||
width: 100%;
|
||||
}
|
||||
.footer-section .container {
|
||||
padding: 0;
|
||||
}
|
||||
.footer-section .container.row .container.column {
|
||||
padding: 1vh 2vw;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.footer-content {
|
||||
grid-template-columns: 1fr;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 540px) {
|
||||
.nav-links {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.contact-section {
|
||||
padding: 2rem 2rem 4rem;
|
||||
}
|
||||
.contact-section h1 {
|
||||
margin: 1rem auto;
|
||||
}
|
||||
.contact-section p {
|
||||
margin: 0.5rem auto;
|
||||
}
|
||||
|
||||
.contact-form {
|
||||
max-width: 60vw;
|
||||
width: fit-content;
|
||||
margin: 0 auto;
|
||||
background: var(--colour-text-background);
|
||||
padding: 2rem;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
||||
text-align: center;
|
||||
}
|
||||
.contact-form textarea {
|
||||
max-width: 40vw;
|
||||
}
|
||||
|
||||
.form-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 200px 1fr;
|
||||
gap: 1.5rem;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
.form-label {
|
||||
padding-top: 0.5rem;
|
||||
font-weight: 500;
|
||||
}
|
||||
.form-input {
|
||||
width: 100%;
|
||||
padding: 0.5rem;
|
||||
border: 2px solid var(--colour-accent);
|
||||
border-radius: 4px;
|
||||
font-size: 1rem;
|
||||
max-width: 40vw;
|
||||
}
|
||||
textarea.form-input {
|
||||
min-height: 120px;
|
||||
}
|
||||
|
||||
.marketing-consent input {
|
||||
display: inline-block;
|
||||
/* margin-left: 20%; */
|
||||
margin-bottom: 1.25rem;
|
||||
}
|
||||
|
||||
|
||||
.container.row.captcha > div {
|
||||
margin: 0 auto;
|
||||
}
|
||||
.container.captcha > div:first-child > label:first-child {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
width: fit-content;
|
||||
text-align: center;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.container.captcha > p:last-child{
|
||||
font-size: 0.9rem;
|
||||
margin: 1vh 1vw;
|
||||
}
|
||||
.container.captcha .altcha-widget,
|
||||
.container.captcha .altcha-widget div.altcha {
|
||||
width: 200px;
|
||||
}
|
||||
.container.captcha .altcha-main {
|
||||
padding-left: 1rem;
|
||||
padding-top: 0.75rem;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
.container.captcha .altcha-main > :last-child {
|
||||
display: none;
|
||||
}
|
||||
.container.captcha .altcha,
|
||||
altcha-widget > div:first-child,
|
||||
.container.captcha > div > .altcha-widget > div {
|
||||
width: fit-content;
|
||||
display: flex;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
|
||||
input[type="submit"] {
|
||||
margin-left: 40%;
|
||||
margin: 0 auto;
|
||||
padding: 0.75rem 1.5rem;
|
||||
background: #2563eb;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
input[type="submit"]:hover {
|
||||
background: #1d4ed8;
|
||||
}
|
||||
|
||||
.data-notice {
|
||||
margin-top: 3rem;
|
||||
padding: 1.5rem;
|
||||
background: #f3f4f6;
|
||||
border-radius: 4px;
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
|
||||
.data-notice h3 {
|
||||
margin-bottom: 1rem;
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
.data-notice ul li {
|
||||
list-style-position: inside;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.contact-form {
|
||||
max-width: 80vw;
|
||||
}
|
||||
.contact-form textarea {
|
||||
max-width: 60vw;
|
||||
}
|
||||
.form-grid {
|
||||
grid-template-columns: 1fr;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.form-label {
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
.submit-button {
|
||||
margin-left: 0;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 400px) {
|
||||
}
|
||||
|
||||
|
||||
/*# sourceMappingURL=blog_newsletter_success.bundle.css.map*/
|
||||
1
static/dist/css/blog_newsletter_success.bundle.css.map
vendored
Normal file
1
static/dist/css/blog_newsletter_success.bundle.css.map
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -95,6 +95,7 @@
|
||||
padding: 2rem;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
||||
text-align: center;
|
||||
}
|
||||
.contact-form textarea {
|
||||
max-width: 40vw;
|
||||
@@ -116,6 +117,7 @@
|
||||
border: 2px solid var(--colour-accent);
|
||||
border-radius: 4px;
|
||||
font-size: 1rem;
|
||||
max-width: 40vw;
|
||||
}
|
||||
textarea.form-input {
|
||||
min-height: 120px;
|
||||
@@ -123,7 +125,7 @@ textarea.form-input {
|
||||
|
||||
.marketing-consent input {
|
||||
display: inline-block;
|
||||
margin-left: 20%;
|
||||
/* margin-left: 20%; */
|
||||
margin-bottom: 1.25rem;
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
4
static/dist/css/core_contact.bundle.css
vendored
4
static/dist/css/core_contact.bundle.css
vendored
@@ -95,6 +95,7 @@
|
||||
padding: 2rem;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
||||
text-align: center;
|
||||
}
|
||||
.contact-form textarea {
|
||||
max-width: 40vw;
|
||||
@@ -116,6 +117,7 @@
|
||||
border: 2px solid var(--colour-accent);
|
||||
border-radius: 4px;
|
||||
font-size: 1rem;
|
||||
max-width: 40vw;
|
||||
}
|
||||
textarea.form-input {
|
||||
min-height: 120px;
|
||||
@@ -123,7 +125,7 @@ textarea.form-input {
|
||||
|
||||
.marketing-consent input {
|
||||
display: inline-block;
|
||||
margin-left: 20%;
|
||||
/* margin-left: 20%; */
|
||||
margin-bottom: 1.25rem;
|
||||
}
|
||||
|
||||
|
||||
2
static/dist/css/core_contact.bundle.css.map
vendored
2
static/dist/css/core_contact.bundle.css.map
vendored
File diff suppressed because one or more lines are too long
5
static/dist/css/main.bundle.css
vendored
5
static/dist/css/main.bundle.css
vendored
@@ -410,15 +410,17 @@ h5 {
|
||||
font-size: 15px;
|
||||
/* height: 18px; */
|
||||
cursor: pointer;
|
||||
padding-top: 5vh;
|
||||
padding: 4.5px 0;
|
||||
}
|
||||
#overlayHamburger .container:hover {
|
||||
color: var(--colour-page-background);
|
||||
background-color: var(--colour-primary);
|
||||
}
|
||||
#overlayHamburger > .container {
|
||||
/*
|
||||
padding-top: 4.5px;
|
||||
padding-bottom: 4.5px;
|
||||
*/
|
||||
}
|
||||
#overlayHamburger .container a {
|
||||
width: 100%;
|
||||
@@ -428,6 +430,7 @@ h5 {
|
||||
*/
|
||||
color: var(--colour-text);
|
||||
text-decoration: none;
|
||||
line-height: initial;
|
||||
}
|
||||
#overlayHamburger .container a:hover {
|
||||
color: var(--colour-page-background);
|
||||
|
||||
2
static/dist/css/main.bundle.css.map
vendored
2
static/dist/css/main.bundle.css.map
vendored
File diff suppressed because one or more lines are too long
23
static/dist/js/blog_article.bundle.js
vendored
Normal file
23
static/dist/js/blog_article.bundle.js
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
/******/ (() => { // webpackBootstrap
|
||||
/******/ "use strict";
|
||||
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules.
|
||||
(() => {
|
||||
// extracted by mini-css-extract-plugin
|
||||
|
||||
})();
|
||||
|
||||
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules.
|
||||
(() => {
|
||||
// extracted by mini-css-extract-plugin
|
||||
|
||||
})();
|
||||
|
||||
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules.
|
||||
(() => {
|
||||
// extracted by mini-css-extract-plugin
|
||||
|
||||
})();
|
||||
|
||||
/******/ })()
|
||||
;
|
||||
//# sourceMappingURL=blog_article.bundle.js.map
|
||||
1
static/dist/js/blog_article.bundle.js.map
vendored
Normal file
1
static/dist/js/blog_article.bundle.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"js/blog_article.bundle.js","mappings":";;;;AAAA;;;;;;ACAA;;;;;;ACAA","sources":["webpack://app/./static/css/sections/core.css?6d04","webpack://app/./static/css/sections/blog.css?b688","webpack://app/./static/css/pages/blog/article.css?0060"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};"],"names":[],"sourceRoot":""}
|
||||
6
static/dist/js/blog_home.bundle.js
vendored
6
static/dist/js/blog_home.bundle.js
vendored
@@ -18,12 +18,6 @@
|
||||
|
||||
})();
|
||||
|
||||
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules.
|
||||
(() => {
|
||||
// extracted by mini-css-extract-plugin
|
||||
|
||||
})();
|
||||
|
||||
/******/ })()
|
||||
;
|
||||
//# sourceMappingURL=blog_home.bundle.js.map
|
||||
2
static/dist/js/blog_home.bundle.js.map
vendored
2
static/dist/js/blog_home.bundle.js.map
vendored
@@ -1 +1 @@
|
||||
{"version":3,"file":"js/blog_home.bundle.js","mappings":";;;;AAAA;;;;;;ACAA;;;;;;ACAA;;;;;;ACAA","sources":["webpack://app/./static/css/sections/core.css?6d04","webpack://app/./static/css/pages/core/home.css?2b63","webpack://app/./static/css/sections/blog.css?b688","webpack://app/./static/css/pages/blog/home.css"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};"],"names":[],"sourceRoot":""}
|
||||
{"version":3,"file":"js/blog_home.bundle.js","mappings":";;;;AAAA;;;;;;ACAA;;;;;;ACAA","sources":["webpack://app/./static/css/sections/core.css?6d04","webpack://app/./static/css/sections/blog.css?b688","webpack://app/./static/css/pages/blog/home.css"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};"],"names":[],"sourceRoot":""}
|
||||
23
static/dist/js/blog_newsletter_success.bundle.js
vendored
Normal file
23
static/dist/js/blog_newsletter_success.bundle.js
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
/******/ (() => { // webpackBootstrap
|
||||
/******/ "use strict";
|
||||
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules.
|
||||
(() => {
|
||||
// extracted by mini-css-extract-plugin
|
||||
|
||||
})();
|
||||
|
||||
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules.
|
||||
(() => {
|
||||
// extracted by mini-css-extract-plugin
|
||||
|
||||
})();
|
||||
|
||||
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules.
|
||||
(() => {
|
||||
// extracted by mini-css-extract-plugin
|
||||
|
||||
})();
|
||||
|
||||
/******/ })()
|
||||
;
|
||||
//# sourceMappingURL=blog_newsletter_success.bundle.js.map
|
||||
1
static/dist/js/blog_newsletter_success.bundle.js.map
vendored
Normal file
1
static/dist/js/blog_newsletter_success.bundle.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"js/blog_newsletter_success.bundle.js","mappings":";;;;AAAA;;;;;;ACAA;;;;;;ACAA","sources":["webpack://app/./static/css/sections/core.css?6d04","webpack://app/./static/css/pages/core/contact.css?164a","webpack://app/./static/css/pages/blog/newsletter_success.css"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};"],"names":[],"sourceRoot":""}
|
||||
228
static/dist/js/main.bundle.js
vendored
228
static/dist/js/main.bundle.js
vendored
@@ -5007,6 +5007,22 @@ var PageBlogHome = /*#__PURE__*/function (_BasePage) {
|
||||
value: function initialize() {
|
||||
this.sharedInitialize();
|
||||
// this.hookupButtonsNav();
|
||||
this.hookupFormNewsletter();
|
||||
this.hookupButtonSubmitFormContactUs();
|
||||
}
|
||||
}, {
|
||||
key: "hookupButtonSubmitFormContactUs",
|
||||
value: function hookupButtonSubmitFormContactUs() {
|
||||
var button = document.querySelector('form input[type="submit"]');
|
||||
button.classList.add(flagButton);
|
||||
button.classList.add(flagButtonPrimary);
|
||||
button.innerText = 'Subscribe Now';
|
||||
}
|
||||
}, {
|
||||
key: "hookupFormNewsletter",
|
||||
value: function hookupFormNewsletter() {
|
||||
var submitButton = document.querySelector('#submit');
|
||||
submitButton.innerText = 'Subscribe Now';
|
||||
}
|
||||
}, {
|
||||
key: "leave",
|
||||
@@ -5017,6 +5033,173 @@ var PageBlogHome = /*#__PURE__*/function (_BasePage) {
|
||||
}(BasePage);
|
||||
blog_home_defineProperty(PageBlogHome, "hash", hashPageBlogHome);
|
||||
|
||||
;// ./static/js/pages/blog/article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients.js
|
||||
function article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_typeof(o) { "@babel/helpers - typeof"; return article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_typeof(o); }
|
||||
function article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
|
||||
function article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_toPropertyKey(o.key), o); } }
|
||||
function article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_createClass(e, r, t) { return r && article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_defineProperties(e.prototype, r), t && article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
|
||||
function article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_callSuper(t, o, e) { return o = article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_getPrototypeOf(o), article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_possibleConstructorReturn(t, article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_isNativeReflectConstruct() ? Reflect.construct(o, e || [], article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_getPrototypeOf(t).constructor) : o.apply(t, e)); }
|
||||
function article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_possibleConstructorReturn(t, e) { if (e && ("object" == article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_assertThisInitialized(t); }
|
||||
function article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
|
||||
function article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
||||
function article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_superPropGet(t, o, e, r) { var p = article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_get(article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; }
|
||||
function article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_get() { return article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_get.apply(null, arguments); }
|
||||
function article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_getPrototypeOf(t));); return t; }
|
||||
function article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_getPrototypeOf(t) { return article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_getPrototypeOf(t); }
|
||||
function article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_setPrototypeOf(t, e); }
|
||||
function article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_setPrototypeOf(t, e) { return article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_setPrototypeOf(t, e); }
|
||||
function article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_defineProperty(e, r, t) { return (r = article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
||||
function article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_toPropertyKey(t) { var i = article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_toPrimitive(t, "string"); return "symbol" == article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_typeof(i) ? i : i + ""; }
|
||||
function article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_toPrimitive(t, r) { if ("object" != article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
||||
// internal
|
||||
// import BasePage from "../base.js";
|
||||
|
||||
// external
|
||||
var PageBlogBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients = /*#__PURE__*/function (_PageBlogHome) {
|
||||
function PageBlogBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients(router) {
|
||||
article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_classCallCheck(this, PageBlogBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients);
|
||||
return article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_callSuper(this, PageBlogBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients, [router]);
|
||||
}
|
||||
article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_inherits(PageBlogBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients, _PageBlogHome);
|
||||
return article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_createClass(PageBlogBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients, [{
|
||||
key: "initialize",
|
||||
value: function initialize() {
|
||||
this.sharedInitialize();
|
||||
this.hookupFormNewsletter();
|
||||
this.hookupButtonSubmitFormContactUs();
|
||||
}
|
||||
}, {
|
||||
key: "leave",
|
||||
value: function leave() {
|
||||
article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_superPropGet(PageBlogBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients, "leave", this, 3)([]);
|
||||
}
|
||||
}]);
|
||||
}(PageBlogHome);
|
||||
article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients_defineProperty(PageBlogBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients, "hash", hashPageBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients);
|
||||
|
||||
;// ./static/js/pages/blog/article_the_science_behind_dog_training_assessments_how_to_track_real_progress.js
|
||||
function article_the_science_behind_dog_training_assessments_how_to_track_real_progress_typeof(o) { "@babel/helpers - typeof"; return article_the_science_behind_dog_training_assessments_how_to_track_real_progress_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, article_the_science_behind_dog_training_assessments_how_to_track_real_progress_typeof(o); }
|
||||
function article_the_science_behind_dog_training_assessments_how_to_track_real_progress_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
|
||||
function article_the_science_behind_dog_training_assessments_how_to_track_real_progress_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, article_the_science_behind_dog_training_assessments_how_to_track_real_progress_toPropertyKey(o.key), o); } }
|
||||
function article_the_science_behind_dog_training_assessments_how_to_track_real_progress_createClass(e, r, t) { return r && article_the_science_behind_dog_training_assessments_how_to_track_real_progress_defineProperties(e.prototype, r), t && article_the_science_behind_dog_training_assessments_how_to_track_real_progress_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
|
||||
function article_the_science_behind_dog_training_assessments_how_to_track_real_progress_callSuper(t, o, e) { return o = article_the_science_behind_dog_training_assessments_how_to_track_real_progress_getPrototypeOf(o), article_the_science_behind_dog_training_assessments_how_to_track_real_progress_possibleConstructorReturn(t, article_the_science_behind_dog_training_assessments_how_to_track_real_progress_isNativeReflectConstruct() ? Reflect.construct(o, e || [], article_the_science_behind_dog_training_assessments_how_to_track_real_progress_getPrototypeOf(t).constructor) : o.apply(t, e)); }
|
||||
function article_the_science_behind_dog_training_assessments_how_to_track_real_progress_possibleConstructorReturn(t, e) { if (e && ("object" == article_the_science_behind_dog_training_assessments_how_to_track_real_progress_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return article_the_science_behind_dog_training_assessments_how_to_track_real_progress_assertThisInitialized(t); }
|
||||
function article_the_science_behind_dog_training_assessments_how_to_track_real_progress_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
|
||||
function article_the_science_behind_dog_training_assessments_how_to_track_real_progress_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (article_the_science_behind_dog_training_assessments_how_to_track_real_progress_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
||||
function article_the_science_behind_dog_training_assessments_how_to_track_real_progress_superPropGet(t, o, e, r) { var p = article_the_science_behind_dog_training_assessments_how_to_track_real_progress_get(article_the_science_behind_dog_training_assessments_how_to_track_real_progress_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; }
|
||||
function article_the_science_behind_dog_training_assessments_how_to_track_real_progress_get() { return article_the_science_behind_dog_training_assessments_how_to_track_real_progress_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = article_the_science_behind_dog_training_assessments_how_to_track_real_progress_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, article_the_science_behind_dog_training_assessments_how_to_track_real_progress_get.apply(null, arguments); }
|
||||
function article_the_science_behind_dog_training_assessments_how_to_track_real_progress_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = article_the_science_behind_dog_training_assessments_how_to_track_real_progress_getPrototypeOf(t));); return t; }
|
||||
function article_the_science_behind_dog_training_assessments_how_to_track_real_progress_getPrototypeOf(t) { return article_the_science_behind_dog_training_assessments_how_to_track_real_progress_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, article_the_science_behind_dog_training_assessments_how_to_track_real_progress_getPrototypeOf(t); }
|
||||
function article_the_science_behind_dog_training_assessments_how_to_track_real_progress_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && article_the_science_behind_dog_training_assessments_how_to_track_real_progress_setPrototypeOf(t, e); }
|
||||
function article_the_science_behind_dog_training_assessments_how_to_track_real_progress_setPrototypeOf(t, e) { return article_the_science_behind_dog_training_assessments_how_to_track_real_progress_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, article_the_science_behind_dog_training_assessments_how_to_track_real_progress_setPrototypeOf(t, e); }
|
||||
function article_the_science_behind_dog_training_assessments_how_to_track_real_progress_defineProperty(e, r, t) { return (r = article_the_science_behind_dog_training_assessments_how_to_track_real_progress_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
||||
function article_the_science_behind_dog_training_assessments_how_to_track_real_progress_toPropertyKey(t) { var i = article_the_science_behind_dog_training_assessments_how_to_track_real_progress_toPrimitive(t, "string"); return "symbol" == article_the_science_behind_dog_training_assessments_how_to_track_real_progress_typeof(i) ? i : i + ""; }
|
||||
function article_the_science_behind_dog_training_assessments_how_to_track_real_progress_toPrimitive(t, r) { if ("object" != article_the_science_behind_dog_training_assessments_how_to_track_real_progress_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != article_the_science_behind_dog_training_assessments_how_to_track_real_progress_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
||||
// internal
|
||||
// import BasePage from "../base.js";
|
||||
|
||||
// external
|
||||
var PageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress = /*#__PURE__*/function (_PageBlogHome) {
|
||||
function PageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress(router) {
|
||||
article_the_science_behind_dog_training_assessments_how_to_track_real_progress_classCallCheck(this, PageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress);
|
||||
return article_the_science_behind_dog_training_assessments_how_to_track_real_progress_callSuper(this, PageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress, [router]);
|
||||
}
|
||||
article_the_science_behind_dog_training_assessments_how_to_track_real_progress_inherits(PageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress, _PageBlogHome);
|
||||
return article_the_science_behind_dog_training_assessments_how_to_track_real_progress_createClass(PageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress, [{
|
||||
key: "initialize",
|
||||
value: function initialize() {
|
||||
this.sharedInitialize();
|
||||
// this.hookupButtonsNav();
|
||||
this.hookupFormNewsletter();
|
||||
this.hookupButtonSubmitFormContactUs();
|
||||
}
|
||||
}, {
|
||||
key: "leave",
|
||||
value: function leave() {
|
||||
article_the_science_behind_dog_training_assessments_how_to_track_real_progress_superPropGet(PageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress, "leave", this, 3)([]);
|
||||
}
|
||||
}]);
|
||||
}(PageBlogHome);
|
||||
article_the_science_behind_dog_training_assessments_how_to_track_real_progress_defineProperty(PageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress, "hash", hashPageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress);
|
||||
|
||||
;// ./static/js/pages/blog/article_why_every_professional_trainer_needs_a_command_dictionary_in_2025.js
|
||||
function article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_typeof(o) { "@babel/helpers - typeof"; return article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_typeof(o); }
|
||||
function article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
|
||||
function article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_toPropertyKey(o.key), o); } }
|
||||
function article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_createClass(e, r, t) { return r && article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_defineProperties(e.prototype, r), t && article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
|
||||
function article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_callSuper(t, o, e) { return o = article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_getPrototypeOf(o), article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_possibleConstructorReturn(t, article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_isNativeReflectConstruct() ? Reflect.construct(o, e || [], article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_getPrototypeOf(t).constructor) : o.apply(t, e)); }
|
||||
function article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_possibleConstructorReturn(t, e) { if (e && ("object" == article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_assertThisInitialized(t); }
|
||||
function article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
|
||||
function article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
||||
function article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_superPropGet(t, o, e, r) { var p = article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_get(article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; }
|
||||
function article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_get() { return article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_get.apply(null, arguments); }
|
||||
function article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_getPrototypeOf(t));); return t; }
|
||||
function article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_getPrototypeOf(t) { return article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_getPrototypeOf(t); }
|
||||
function article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_setPrototypeOf(t, e); }
|
||||
function article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_setPrototypeOf(t, e) { return article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_setPrototypeOf(t, e); }
|
||||
function article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_defineProperty(e, r, t) { return (r = article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
||||
function article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_toPropertyKey(t) { var i = article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_toPrimitive(t, "string"); return "symbol" == article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_typeof(i) ? i : i + ""; }
|
||||
function article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_toPrimitive(t, r) { if ("object" != article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
||||
// internal
|
||||
// import BasePage from "../base.js";
|
||||
|
||||
// external
|
||||
var PageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025 = /*#__PURE__*/function (_PageBlogHome) {
|
||||
function PageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025(router) {
|
||||
article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_classCallCheck(this, PageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025);
|
||||
return article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_callSuper(this, PageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025, [router]);
|
||||
}
|
||||
article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_inherits(PageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025, _PageBlogHome);
|
||||
return article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_createClass(PageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025, [{
|
||||
key: "initialize",
|
||||
value: function initialize() {
|
||||
this.sharedInitialize();
|
||||
this.hookupFormNewsletter();
|
||||
this.hookupButtonSubmitFormContactUs();
|
||||
}
|
||||
}, {
|
||||
key: "leave",
|
||||
value: function leave() {
|
||||
article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_superPropGet(PageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025, "leave", this, 3)([]);
|
||||
}
|
||||
}]);
|
||||
}(PageBlogHome);
|
||||
article_why_every_professional_trainer_needs_a_command_dictionary_in_2025_defineProperty(PageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025, "hash", hashPageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025);
|
||||
|
||||
;// ./static/js/pages/blog/newsletter-success.js
|
||||
function newsletter_success_typeof(o) { "@babel/helpers - typeof"; return newsletter_success_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, newsletter_success_typeof(o); }
|
||||
function newsletter_success_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
|
||||
function newsletter_success_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, newsletter_success_toPropertyKey(o.key), o); } }
|
||||
function newsletter_success_createClass(e, r, t) { return r && newsletter_success_defineProperties(e.prototype, r), t && newsletter_success_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
|
||||
function newsletter_success_callSuper(t, o, e) { return o = newsletter_success_getPrototypeOf(o), newsletter_success_possibleConstructorReturn(t, newsletter_success_isNativeReflectConstruct() ? Reflect.construct(o, e || [], newsletter_success_getPrototypeOf(t).constructor) : o.apply(t, e)); }
|
||||
function newsletter_success_possibleConstructorReturn(t, e) { if (e && ("object" == newsletter_success_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return newsletter_success_assertThisInitialized(t); }
|
||||
function newsletter_success_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
|
||||
function newsletter_success_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (newsletter_success_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
||||
function newsletter_success_getPrototypeOf(t) { return newsletter_success_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, newsletter_success_getPrototypeOf(t); }
|
||||
function newsletter_success_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && newsletter_success_setPrototypeOf(t, e); }
|
||||
function newsletter_success_setPrototypeOf(t, e) { return newsletter_success_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, newsletter_success_setPrototypeOf(t, e); }
|
||||
function newsletter_success_defineProperty(e, r, t) { return (r = newsletter_success_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
||||
function newsletter_success_toPropertyKey(t) { var i = newsletter_success_toPrimitive(t, "string"); return "symbol" == newsletter_success_typeof(i) ? i : i + ""; }
|
||||
function newsletter_success_toPrimitive(t, r) { if ("object" != newsletter_success_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != newsletter_success_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
||||
// internal
|
||||
|
||||
// vendor
|
||||
|
||||
var PageBlogNewsletterSuccess = /*#__PURE__*/function (_BasePage) {
|
||||
function PageBlogNewsletterSuccess(router) {
|
||||
newsletter_success_classCallCheck(this, PageBlogNewsletterSuccess);
|
||||
return newsletter_success_callSuper(this, PageBlogNewsletterSuccess, [router]);
|
||||
}
|
||||
newsletter_success_inherits(PageBlogNewsletterSuccess, _BasePage);
|
||||
return newsletter_success_createClass(PageBlogNewsletterSuccess, [{
|
||||
key: "initialize",
|
||||
value: function initialize() {
|
||||
this.sharedInitialize();
|
||||
}
|
||||
}]);
|
||||
}(BasePage);
|
||||
newsletter_success_defineProperty(PageBlogNewsletterSuccess, "hash", hashPageBlogNewsletterSuccess);
|
||||
|
||||
;// ./static/js/pages/dog/home.js
|
||||
function dog_home_typeof(o) { "@babel/helpers - typeof"; return dog_home_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, dog_home_typeof(o); }
|
||||
function dog_home_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
|
||||
@@ -8802,6 +8985,11 @@ function router_toPrimitive(t, r) { if ("object" != router_typeof(t) || !t) retu
|
||||
|
||||
// Blog
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Dog
|
||||
|
||||
|
||||
@@ -8861,6 +9049,26 @@ var Router = /*#__PURE__*/function () {
|
||||
name: 'PageBlogHome',
|
||||
module: PageBlogHome
|
||||
};
|
||||
this.pages[hashPageBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients] = {
|
||||
name: 'PageBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients',
|
||||
module: PageBlogBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients
|
||||
};
|
||||
this.pages[hashPageBlogArticleHowToScaleYourDogTrainingBusinessFromSoloToMultiTrainerSuccess] = {
|
||||
name: 'PageBlogArticleHowToScaleYourDogTrainingBusinessFromSoloToMultiTrainerSuccess',
|
||||
module: PageBlogBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients
|
||||
};
|
||||
this.pages[hashPageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress] = {
|
||||
name: 'PageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress',
|
||||
module: PageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress
|
||||
};
|
||||
this.pages[hashPageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025] = {
|
||||
name: 'PageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025',
|
||||
module: PageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025
|
||||
};
|
||||
this.pages[hashPageBlogNewsletterSuccess] = {
|
||||
name: 'PageBlogNewsletterSuccess',
|
||||
module: PageBlogNewsletterSuccess
|
||||
};
|
||||
// Dog
|
||||
this.pages[hashPageDogHome] = {
|
||||
name: 'PageDogHome',
|
||||
@@ -8966,6 +9174,26 @@ var Router = /*#__PURE__*/function () {
|
||||
var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
||||
return _this.navigateToHash(hashPageBlogHome, isPopState);
|
||||
};
|
||||
this.routes[hashPageBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients] = function () {
|
||||
var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
||||
return _this.navigateToHash(hashPageBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients, isPopState);
|
||||
};
|
||||
this.routes[hashPageBlogArticleHowToScaleYourDogTrainingBusinessFromSoloToMultiTrainerSuccess] = function () {
|
||||
var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
||||
return _this.navigateToHash(hashPageBlogArticleHowToScaleYourDogTrainingBusinessFromSoloToMultiTrainerSuccess, isPopState);
|
||||
};
|
||||
this.routes[hashPageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress] = function () {
|
||||
var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
||||
return _this.navigateToHash(hashPageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress, isPopState);
|
||||
};
|
||||
this.routes[hashPageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025] = function () {
|
||||
var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
||||
return _this.navigateToHash(hashPageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025, isPopState);
|
||||
};
|
||||
this.routes[hashPageBlogNewsletterSuccess] = function () {
|
||||
var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
||||
return _this.navigateToHash(hashPageBlogNewsletterSuccess, isPopState);
|
||||
};
|
||||
// Dog
|
||||
this.routes[hashPageDogHome] = function () {
|
||||
var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
||||
|
||||
2
static/dist/js/main.bundle.js.map
vendored
2
static/dist/js/main.bundle.js.map
vendored
File diff suppressed because one or more lines are too long
@@ -5,7 +5,7 @@ import BasePage from "../base.js";
|
||||
|
||||
|
||||
export default class PageBlogArticle extends BasePage {
|
||||
static hash = hashPageBlogHome;
|
||||
static hash = null;
|
||||
|
||||
constructor(router) {
|
||||
super(router);
|
||||
@@ -0,0 +1,25 @@
|
||||
|
||||
// internal
|
||||
// import BasePage from "../base.js";
|
||||
import PageBlogHome from "./home.js";
|
||||
// external
|
||||
|
||||
|
||||
export default class PageBlogBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients extends PageBlogHome {
|
||||
static hash = hashPageBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients;
|
||||
|
||||
constructor(router) {
|
||||
super(router);
|
||||
}
|
||||
|
||||
initialize() {
|
||||
this.sharedInitialize();
|
||||
this.hookupFormNewsletter();
|
||||
this.hookupButtonSubmitFormContactUs();
|
||||
}
|
||||
|
||||
leave() {
|
||||
super.leave();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
|
||||
// internal
|
||||
// import BasePage from "../base.js";
|
||||
import PageBlogHome from "./home.js";
|
||||
// external
|
||||
|
||||
|
||||
export default class PageBlogArticleHowToScaleYourDogTrainingBusinessFromSoloToMultiTrainerSuccess extends PageBlogHome {
|
||||
static hash = hashPageBlogArticleHowToScaleYourDogTrainingBusinessFromSoloToMultiTrainerSuccess;
|
||||
|
||||
constructor(router) {
|
||||
super(router);
|
||||
}
|
||||
|
||||
initialize() {
|
||||
this.sharedInitialize();
|
||||
this.hookupFormNewsletter();
|
||||
this.hookupButtonSubmitFormContactUs();
|
||||
}
|
||||
|
||||
leave() {
|
||||
super.leave();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
|
||||
// internal
|
||||
// import BasePage from "../base.js";
|
||||
import PageBlogHome from "./home.js";
|
||||
// external
|
||||
|
||||
|
||||
export default class PageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress extends PageBlogHome {
|
||||
static hash = hashPageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress;
|
||||
|
||||
constructor(router) {
|
||||
super(router);
|
||||
}
|
||||
|
||||
initialize() {
|
||||
this.sharedInitialize();
|
||||
// this.hookupButtonsNav();
|
||||
this.hookupFormNewsletter();
|
||||
this.hookupButtonSubmitFormContactUs();
|
||||
}
|
||||
|
||||
leave() {
|
||||
super.leave();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
|
||||
// internal
|
||||
// import BasePage from "../base.js";
|
||||
import PageBlogHome from "./home.js";
|
||||
// external
|
||||
|
||||
|
||||
export default class PageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025 extends PageBlogHome {
|
||||
static hash = hashPageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025;
|
||||
|
||||
constructor(router) {
|
||||
super(router);
|
||||
}
|
||||
|
||||
initialize() {
|
||||
this.sharedInitialize();
|
||||
this.hookupFormNewsletter();
|
||||
this.hookupButtonSubmitFormContactUs();
|
||||
}
|
||||
|
||||
leave() {
|
||||
super.leave();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,20 @@ export default class PageBlogHome extends BasePage {
|
||||
initialize() {
|
||||
this.sharedInitialize();
|
||||
// this.hookupButtonsNav();
|
||||
this.hookupFormNewsletter();
|
||||
this.hookupButtonSubmitFormContactUs();
|
||||
}
|
||||
|
||||
hookupButtonSubmitFormContactUs() {
|
||||
const button = document.querySelector('form input[type="submit"]');
|
||||
button.classList.add(flagButton);
|
||||
button.classList.add(flagButtonPrimary);
|
||||
button.innerText = 'Subscribe Now';
|
||||
}
|
||||
|
||||
hookupFormNewsletter() {
|
||||
let submitButton = document.querySelector('#submit');
|
||||
submitButton.innerText = 'Subscribe Now';
|
||||
}
|
||||
|
||||
leave() {
|
||||
|
||||
16
static/js/pages/blog/newsletter-success.js
Normal file
16
static/js/pages/blog/newsletter-success.js
Normal file
@@ -0,0 +1,16 @@
|
||||
// internal
|
||||
import BasePage from "../base.js";
|
||||
// vendor
|
||||
import { Altcha } from "../../vendor/altcha.js";
|
||||
|
||||
export default class PageBlogNewsletterSuccess extends BasePage {
|
||||
static hash = hashPageBlogNewsletterSuccess;
|
||||
|
||||
constructor(router) {
|
||||
super(router);
|
||||
}
|
||||
|
||||
initialize() {
|
||||
this.sharedInitialize();
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,11 @@ import PageApplyFoundingPartner from './pages/core/apply-founding-partner.js';
|
||||
import PageApplyFoundingPartnerSuccess from './pages/core/apply-founding-partner-success.js';
|
||||
// Blog
|
||||
import PageBlogHome from './pages/blog/home.js';
|
||||
import PageBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients from './pages/blog/article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients.js';
|
||||
import PageBlogArticleHowToScaleYourDogTrainingBusinessFromSoloToMultiTrainerSuccess from './pages/blog/article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients.js';
|
||||
import PageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress from './pages/blog/article_the_science_behind_dog_training_assessments_how_to_track_real_progress.js';
|
||||
import PageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025 from './pages/blog/article_why_every_professional_trainer_needs_a_command_dictionary_in_2025.js';
|
||||
import PageBlogNewsletterSuccess from './pages/blog/newsletter-success.js';
|
||||
// Dog
|
||||
import PageDogHome from './pages/dog/home.js';
|
||||
import PageDogCommandCategories from './pages/dog/command_categories.js';
|
||||
@@ -50,6 +55,11 @@ export default class Router {
|
||||
this.pages[hashPageApplyFoundingPartnerSuccess] = { name: 'PageApplyFoundingPartnerSuccess', module: PageApplyFoundingPartnerSuccess };
|
||||
// Blog
|
||||
this.pages[hashPageBlogHome] = { name: 'PageBlogHome', module: PageBlogHome };
|
||||
this.pages[hashPageBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients] = { name: 'PageBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients', module: PageBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients };
|
||||
this.pages[hashPageBlogArticleHowToScaleYourDogTrainingBusinessFromSoloToMultiTrainerSuccess] = { name: 'PageBlogArticleHowToScaleYourDogTrainingBusinessFromSoloToMultiTrainerSuccess', module: PageBlogArticleHowToScaleYourDogTrainingBusinessFromSoloToMultiTrainerSuccess };
|
||||
this.pages[hashPageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress] = { name: 'PageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress', module: PageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress };
|
||||
this.pages[hashPageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025] = { name: 'PageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025', module: PageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025 };
|
||||
this.pages[hashPageBlogNewsletterSuccess] = { name: 'PageBlogNewsletterSuccess', module: PageBlogNewsletterSuccess };
|
||||
// Dog
|
||||
this.pages[hashPageDogHome] = { name: 'PageDogHome', module: PageDogHome };
|
||||
this.pages[hashPageDogCommandCategories] = { name: 'PageDogCommands', module: PageDogCommandCategories };
|
||||
@@ -83,6 +93,11 @@ export default class Router {
|
||||
this.routes[hashPageApplyFoundingPartnerSuccess] = (isPopState = false) => this.navigateToHash(hashPageApplyFoundingPartnerSuccess, isPopState);
|
||||
// Blog
|
||||
this.routes[hashPageBlogHome] = (isPopState = false) => this.navigateToHash(hashPageBlogHome, isPopState);
|
||||
this.routes[hashPageBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients] = (isPopState = false) => this.navigateToHash(hashPageBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients, isPopState);
|
||||
this.routes[hashPageBlogArticleHowToScaleYourDogTrainingBusinessFromSoloToMultiTrainerSuccess] = (isPopState = false) => this.navigateToHash(hashPageBlogArticleHowToScaleYourDogTrainingBusinessFromSoloToMultiTrainerSuccess, isPopState);
|
||||
this.routes[hashPageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress] = (isPopState = false) => this.navigateToHash(hashPageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress, isPopState);
|
||||
this.routes[hashPageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025] = (isPopState = false) => this.navigateToHash(hashPageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025, isPopState);
|
||||
this.routes[hashPageBlogNewsletterSuccess] = (isPopState = false) => this.navigateToHash(hashPageBlogNewsletterSuccess, isPopState);
|
||||
// Dog
|
||||
this.routes[hashPageDogHome] = (isPopState = false) => this.navigateToHash(hashPageDogHome, isPopState);
|
||||
this.routes[hashPageDogCommandCategories] = (isPopState = false) => this.navigateToHash(hashPageDogCommandCategories, isPopState);
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
<a class="{{ model.FLAG_NAV_HOME }}" href="{{ model.HASH_PAGE_HOME }}">Home</a>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<a class="{{ model.FLAG_NAV_BLOG }}" href="{{ model.HASH_PAGE_BLOG }}">Blog</a>
|
||||
<a class="{{ model.FLAG_NAV_BLOG_HOME }}" href="{{ model.HASH_PAGE_BLOG_HOME }}">Blog</a>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<a class="{{ model.FLAG_NAV_CONTACT }}" href="{{ model.HASH_PAGE_CONTACT }}">Contact</a>
|
||||
|
||||
@@ -131,12 +131,14 @@
|
||||
var hashPageAdminHome = "{{ model.HASH_PAGE_ADMIN_HOME }}";
|
||||
var hashPageApplyFoundingPartner = "{{ model.HASH_PAGE_APPLY_FOUNDING_PARTNER }}";
|
||||
var hashPageApplyFoundingPartnerSuccess = "{{ model.HASH_PAGE_APPLY_FOUNDING_PARTNER_SUCCESS }}";
|
||||
var hashPageBlogArticleHowToScaleYourDogTrainingBusiness = "{{ model.HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS }}";
|
||||
var hashPageBlogArticleTheScienceBehindDogTrainingAssessments = "{{ model.HASH_PAGE_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS }}";
|
||||
var hashPageBlogArticleWhyEveryTrainerNeedsACommandDictionary = "{{ model.HASH_PAGE_BLOG_ARTICLE_WHY_EVERY_TRAINER_NEEDS_A_COMMAND_DICTIONARY }}";
|
||||
var hashPageBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients = "{{ model.HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS_FROM_25_TO_100_PLUS_CLIENTS }}";
|
||||
var hashPageBlogArticleHowToScaleYourDogTrainingBusinessFromSoloToMultiTrainerSuccess = "{{ model.HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS_FROM_SOLO_TO_MULTI_TRAINER_SUCCESS }}";
|
||||
var hashPageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress = "{{ model.HASH_PAGE_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS_HOW_TRACK_REAL_PROGRESS }}";
|
||||
var hashPageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025 = "{{ model.HASH_PAGE_BLOG_ARTICLE_WHY_EVERY_PROFESSIONAL_TRAINER_NEEDS_A_COMMAND_DICTIONARY_IN_2025 }}";
|
||||
var hashPageBlogCategoryMarketingAndGrowth = "{{ model.HASH_PAGE_BLOG_CATEGORY_MARKETING_AND_GROWTH }}";
|
||||
var hashPageBlogCategoryTrainingTechniques = "{{ model.HASH_PAGE_BLOG_CATEGORY_TRAINING_TECHNIQUES }}";
|
||||
var hashPageBlogHome = "{{ model.HASH_PAGE_BLOG_HOME }}";
|
||||
var hashPageBlogNewsletterSuccess = "{{ model.HASH_PAGE_BLOG_NEWSLETTER_SUCCESS }}";
|
||||
var hashPageContact = "{{ model.HASH_PAGE_CONTACT }}";
|
||||
var hashPageContactSuccess = "{{ model.HASH_PAGE_CONTACT_SUCCESS }}";
|
||||
var hashPageDataRetentionSchedule = "{{ model.HASH_PAGE_DATA_RETENTION_SCHEDULE }}";
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
{% include 'layouts/_shared_head.html' %}
|
||||
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/blog_home.bundle.css') }}">
|
||||
{% block page_head %}{% endblock %}
|
||||
</head>
|
||||
<body data-page="{{ model.hash_page_current }}">
|
||||
<div class="topnav">
|
||||
@@ -11,13 +11,7 @@
|
||||
<img class="{{ model.FLAG_LOGO }}" src="{{ url_for('static', filename='images/fetch-metrics-logo-and-company-name-horizontal-1-link-visited-LQ.webp') }}" alt="Fetch Metrics logo" aria-label="Fetch Metrics logo" tabindex="0"> {# filename='images/fetch-metrics-logo-and-company-name-radial-0.5-link-visited-LQ.webp', 'images/Wisp_LQ.webp' #}
|
||||
</div>
|
||||
<div class="nav-links">
|
||||
<!--
|
||||
<a href="#{{ model.FLAG_HOME }}">Home</a>
|
||||
<a href="#{{ model.FLAG_FEATURES }}">Features</a>
|
||||
<a href="#{{ model.FLAG_PRICING }}">Pricing</a>
|
||||
<a href="#{{ model.FLAG_BLOG }}">Blog</a>
|
||||
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Contact Us</a>
|
||||
-->
|
||||
{% block page_nav_links %}{% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
{% include 'layouts/_shared_header.html' %}
|
||||
@@ -25,7 +19,7 @@
|
||||
<!-- Body -->
|
||||
<div id="{{ model.ID_PAGE_BODY }}">
|
||||
|
||||
<!-- Breadcrumb -->
|
||||
<!-- Breadcrumb -- >
|
||||
<nav class="breadcrumb">
|
||||
<div class="container">
|
||||
<div class="breadcrumb-nav">
|
||||
@@ -37,183 +31,33 @@
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
-->
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
|
||||
<div class="content-grid">
|
||||
<!-- Article -->
|
||||
<article class="article">
|
||||
<header class="article-header">
|
||||
<span class="article-category">Business Growth</span>
|
||||
<h1 class="article-title">How to Scale Your Dog Training Business from 25 to 100+ Clients</h1>
|
||||
|
||||
<div class="article-meta">
|
||||
<div class="author-info">
|
||||
<div class="author-avatar">SM</div>
|
||||
<div class="author-details">
|
||||
<h4>Sarah Mitchell</h4>
|
||||
<p>Professional Dog Trainer & Business Coach</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="meta-item">
|
||||
<span>📅</span>
|
||||
<span>March 15, 2025</span>
|
||||
</div>
|
||||
<div class="meta-item">
|
||||
<span>⏱️</span>
|
||||
<span>8 min read</span>
|
||||
</div>
|
||||
<div class="meta-item">
|
||||
<span>👀</span>
|
||||
<span>1,247 views</span>
|
||||
</div>
|
||||
</div>
|
||||
{% block article_header %}{% endblock %}
|
||||
</header>
|
||||
|
||||
<div class="featured-image">🎯</div>
|
||||
|
||||
<div class="featured-image">{% block article_image_featured %}{% endblock %}</div>
|
||||
|
||||
<div class="article-content">
|
||||
<p>Growing a dog training business from 25 to 100+ clients isn't just about finding more customers—it's about building systems that can handle increased demand while maintaining the quality that made you successful in the first place.</p>
|
||||
|
||||
<p>After working with over 200 professional trainers across the UK, I've identified the key strategies that separate trainers who successfully scale from those who plateau at 20-30 clients. Let's dive into the proven framework that works.</p>
|
||||
|
||||
<h2>The Scaling Mindset Shift</h2>
|
||||
|
||||
<p>The biggest obstacle to scaling isn't finding more clients—it's the mental shift from "doing everything yourself" to "building systems that work without you." Many trainers fear that delegating or systematizing will compromise their training quality, but the opposite is true.</p>
|
||||
|
||||
<div class="callout-box">
|
||||
<h4>💡 Key Insight</h4>
|
||||
<p>Successful trainers at 100+ clients spend 60% of their time on systems and business development, and only 40% on direct training. Compare this to trainers stuck at 25 clients who spend 90% of their time on direct training.</p>
|
||||
</div>
|
||||
|
||||
<h2>The Four Pillars of Scalable Training Businesses</h2>
|
||||
|
||||
<h3>1. Standardized Training Protocols</h3>
|
||||
|
||||
<p>Create consistent, repeatable training methods that produce reliable results regardless of which trainer delivers them. This includes:</p>
|
||||
|
||||
<ul>
|
||||
<li>Standardized command dictionary with hand signals</li>
|
||||
<li>Assessment protocols for new dogs</li>
|
||||
<li>Progress tracking metrics that all trainers use</li>
|
||||
<li>Client communication templates</li>
|
||||
</ul>
|
||||
|
||||
<p>When every trainer follows the same protocols, clients receive consistent experiences, and you can confidently guarantee results.</p>
|
||||
|
||||
<h3>2. Efficient Client Management Systems</h3>
|
||||
|
||||
<p>Manual scheduling, paper records, and email-based communication become impossible bottlenecks beyond 30 clients. Successful scaling requires:</p>
|
||||
|
||||
<ul>
|
||||
<li>Automated scheduling and booking systems</li>
|
||||
<li>Digital progress tracking and reporting</li>
|
||||
<li>Streamlined payment processing</li>
|
||||
<li>Client portal for homework and progress updates</li>
|
||||
</ul>
|
||||
|
||||
<div class="quote-box">
|
||||
"Moving to a digital management system saved me 15 hours per week in admin time. That's 15 hours I can spend training dogs or developing my business." - Mark Thompson, Professional Dog Trainer, London
|
||||
</div>
|
||||
|
||||
<h3>3. Strategic Team Building</h3>
|
||||
|
||||
<p>You can't personally train 100+ dogs. Building a team doesn't mean losing control—it means multiplying your impact:</p>
|
||||
|
||||
<ul>
|
||||
<li>Hire trainers who share your philosophy and methods</li>
|
||||
<li>Create comprehensive training programs for new team members</li>
|
||||
<li>Implement quality control and feedback systems</li>
|
||||
<li>Develop clear career progression paths</li>
|
||||
</ul>
|
||||
|
||||
<h3>4. Data-Driven Decision Making</h3>
|
||||
|
||||
<p>Growing businesses need metrics to guide decisions. Track these essential KPIs:</p>
|
||||
|
||||
<ul>
|
||||
<li>Client acquisition cost and lifetime value</li>
|
||||
<li>Training success rates by program type</li>
|
||||
<li>Trainer utilization and efficiency metrics</li>
|
||||
<li>Client satisfaction and retention rates</li>
|
||||
</ul>
|
||||
|
||||
<h2>The Scaling Timeline: What to Expect</h2>
|
||||
|
||||
<p>Based on our analysis of successful scaling stories, here's a realistic timeline:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Months 1-3:</strong> Systems setup and process documentation</li>
|
||||
<li><strong>Months 4-6:</strong> First hire and team training</li>
|
||||
<li><strong>Months 7-12:</strong> Marketing acceleration and capacity building</li>
|
||||
<li><strong>Year 2:</strong> Team expansion and market dominance</li>
|
||||
</ul>
|
||||
|
||||
<div class="callout-box">
|
||||
<h4>⚠️ Common Pitfall</h4>
|
||||
<p>Many trainers try to scale too quickly without proper systems. This leads to quality issues, stressed teams, and ultimately business failure. Take time to build strong foundations before aggressive growth.</p>
|
||||
</div>
|
||||
|
||||
<h2>Technology: Your Scaling Secret Weapon</h2>
|
||||
|
||||
<p>The right technology stack can automate 70% of administrative tasks, freeing you to focus on training and growth. Essential tools include:</p>
|
||||
|
||||
<ul>
|
||||
<li>Comprehensive business management software</li>
|
||||
<li>Online booking and payment systems</li>
|
||||
<li>Progress tracking and reporting tools</li>
|
||||
<li>Client communication platforms</li>
|
||||
</ul>
|
||||
|
||||
<p>While there are general business tools available, purpose-built solutions for dog training businesses offer specialized features like command tracking, behavioral assessments, and training-specific reporting that generic tools can't match.</p>
|
||||
|
||||
<h2>Pricing Strategy for Scale</h2>
|
||||
|
||||
<p>As you scale, your pricing strategy must evolve. Consider these approaches:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Package-based pricing:</strong> Reduces decision fatigue and increases average transaction value</li>
|
||||
<li><strong>Tiered service levels:</strong> Premium, standard, and basic options to capture different market segments</li>
|
||||
<li><strong>Group training programs:</strong> Higher profit margins and efficient trainer utilization</li>
|
||||
<li><strong>Maintenance programs:</strong> Recurring revenue for long-term client relationships</li>
|
||||
</ul>
|
||||
|
||||
<h2>Action Steps to Start Scaling Today</h2>
|
||||
|
||||
<p>Ready to begin your scaling journey? Here's your immediate action plan:</p>
|
||||
|
||||
<ol>
|
||||
<li>Document your current training protocols and identify inconsistencies</li>
|
||||
<li>Audit your current client management process for bottlenecks</li>
|
||||
<li>Research business management software options</li>
|
||||
<li>Create job descriptions for your first hire</li>
|
||||
<li>Develop standard operating procedures for all client interactions</li>
|
||||
</ol>
|
||||
|
||||
<p>Remember, scaling is a marathon, not a sprint. Focus on building strong systems that can support sustainable growth, and you'll join the ranks of trainers successfully managing 100+ clients while maintaining the quality that makes your business special.</p>
|
||||
|
||||
<div class="callout-box">
|
||||
<h4>🚀 Ready to Scale?</h4>
|
||||
<p>If you're serious about scaling your dog training business, consider investing in purpose-built business management software. The time you save on administration can be reinvested in growth activities that actually move your business forward.</p>
|
||||
</div>
|
||||
{% block article_body %}{% endblock %}
|
||||
</div>
|
||||
|
||||
<div class="article-tags">
|
||||
<span class="tags-label">Tags:</span>
|
||||
<div class="tags-list">
|
||||
<a href="#" class="tag">business scaling</a>
|
||||
<a href="#" class="tag">dog training business</a>
|
||||
<a href="#" class="tag">team building</a>
|
||||
<a href="#" class="tag">business systems</a>
|
||||
<a href="#" class="tag">client management</a>
|
||||
<a href="#" class="tag">professional development</a>
|
||||
{% block article_tags %}{% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<!-- Sidebar -->
|
||||
<aside class="sidebar">
|
||||
<!-- Social Share -->
|
||||
<!-- Social Share -- >
|
||||
<div class="social-share">
|
||||
<h3 class="share-title">Share This Article</h3>
|
||||
<div class="share-buttons">
|
||||
@@ -231,15 +75,13 @@
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
-->
|
||||
|
||||
<!-- Author Bio -->
|
||||
<div class="sidebar-widget">
|
||||
<h3 class="widget-title">About the Author</h3>
|
||||
<div class="author-bio">
|
||||
<div class="author-bio-avatar">SM</div>
|
||||
<h4>Sarah Mitchell</h4>
|
||||
<p>Sarah is a certified professional dog trainer with over 12 years of experience. She has successfully scaled her own training business from a solo operation to a team of 8 trainers serving 200+ clients across Manchester.</p>
|
||||
<p>Sarah specializes in helping other trainers grow their businesses through proven systems and strategies.</p>
|
||||
{% block author_bio %}{% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -248,20 +90,20 @@
|
||||
<h3 class="widget-title">Related Articles</h3>
|
||||
<ul class="related-posts">
|
||||
<li class="related-post-item">
|
||||
<a href="#" class="related-post-title">Building Your First Team: Hiring Dog Trainers That Fit Your Culture</a>
|
||||
<div class="related-post-date">March 12, 2025</div>
|
||||
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_WHY_EVERY_PROFESSIONAL_TRAINER_NEEDS_A_COMMAND_DICTIONARY_IN_2025 }}" class="related-post-title {{ model.FLAG_NAV_BLOG_ARTICLE_WHY_EVERY_TRAINER_NEEDS_A_COMMAND_DICTIONARY }}">Why Every Professional Dog Trainer Needs a Command Dictionary in 2025</a>
|
||||
<div class="related-post-date">10th August 2025</div>
|
||||
</li>
|
||||
<li class="related-post-item">
|
||||
<a href="#" class="related-post-title">Pricing Strategies That Actually Work for Dog Training Businesses</a>
|
||||
<div class="related-post-date">March 10, 2025</div>
|
||||
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS_FROM_25_TO_100_PLUS_CLIENTS }}" class="related-post-title {{ model.FLAG_NAV_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS_FROM_25_TO_100_PLUS_CLIENTS }}">How to Scale Your Dog Training Business: from 25 to 100+ Clients</a>
|
||||
<div class="related-post-date">9th August 2025</div>
|
||||
</li>
|
||||
<li class="related-post-item">
|
||||
<a href="#" class="related-post-title">The Complete Guide to Dog Training Business Management Software</a>
|
||||
<div class="related-post-date">March 8, 2025</div>
|
||||
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS_HOW_TRACK_REAL_PROGRESS }}" class="related-post-title {{ model.FLAG_NAV_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS }}">The Science Behind Dog Training Assessments: How to Track Real Progress</a>
|
||||
<div class="related-post-date">9th August 2025</div>
|
||||
</li>
|
||||
<li class="related-post-item">
|
||||
<a href="#" class="related-post-title">Creating Standard Operating Procedures for Dog Training</a>
|
||||
<div class="related-post-date">March 5, 2025</div>
|
||||
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS_FROM_SOLO_TO_MULTI_TRAINER_SUCCESS }}" class="related-post-title {{ model.FLAG_NAV_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS_FROM_SOLO_TO_MULTI_TRAINER_SUCCESS }}">How to Scale Your Dog Training Business: From Solo Trainer to Multi-Trainer Success</a>
|
||||
<div class="related-post-date">8th August 2025</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -270,15 +112,42 @@
|
||||
<div class="sidebar-widget">
|
||||
<h3 class="widget-title">Weekly Business Tips</h3>
|
||||
<p style="margin-bottom: 1rem; color: #666;">Get proven strategies delivered to your inbox every Tuesday. Join 2,400+ successful dog trainers.</p>
|
||||
<!--
|
||||
<form class="newsletter-form">
|
||||
<input type="email" class="newsletter-input" placeholder="Your email address" required>
|
||||
<button type="submit" class="newsletter-btn">Subscribe Now</button>
|
||||
</form>
|
||||
-->
|
||||
{% set form = model.form_newsletter %}
|
||||
<form id="{{ model.ID_NEWSLETTER_FORM }}" method="POST" action="{{ model.HASH_POST_BLOG_NEWSLETTER }}">
|
||||
{{ form.csrf_token }}
|
||||
<div class="form-grid">
|
||||
<div>
|
||||
{{ form.email(class="form-input", required=True, placeholder="Your email address") }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_CAPTCHA }}">
|
||||
<div style="margin: 0 auto; width: fit-content;">
|
||||
{{ form.altcha.label }}
|
||||
<altcha-widget
|
||||
class="altcha-widget"
|
||||
challengeurl="{{ model.HASH_GET_ALTCHA_CHALLENGE }}"
|
||||
auto="onload"
|
||||
id="{{ form.altcha.id }}"
|
||||
name="{{ form.altcha.name }}"
|
||||
></altcha-widget>
|
||||
</div>
|
||||
<p style="font-size: 0.9rem;">This CAPTCHA mechanism is fully GDPR-compliant with no cookies, no fingerprinting, no tracking, and runs in the background so you don't need to do anything!</p>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER_INPUT }}">
|
||||
{{ form.submit() }}
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<!-- Post Navigation -->
|
||||
<!-- Post Navigation -- >
|
||||
<nav class="post-navigation">
|
||||
<a href="#" class="nav-post prev">
|
||||
<span class="nav-label">← Previous Post</span>
|
||||
@@ -289,6 +158,7 @@
|
||||
<div class="nav-title">Creating Effective Training Reports for Your Clients</div>
|
||||
</a>
|
||||
</nav>
|
||||
-->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -315,26 +185,6 @@
|
||||
<div class="footer-content">
|
||||
<div class="footer-section contact">
|
||||
<h3>Contact</h3>
|
||||
<!--
|
||||
<ul>
|
||||
<li><a href="mailto:{{ model.get_mail_contact_public() }}">Email: {{ model.get_mail_contact_public() }}</a></li>
|
||||
<li><a href="{{ model.URL_DISCORD }}">Discord: {{ model.USERNAME_DISCORD }}</a></li>
|
||||
< !-- <li><a href="{{ model.URL_FACEBOOK }}">Facebook: {{ model.USERNAME_FACEBOOK }}</a></li> -- >
|
||||
<li><a href="{{ model.URL_GITHUB }}">GitHub: {{ model.USERNAME_GITHUB }}</a></li>
|
||||
<li><a href="{{ model.URL_INSTAGRAM }}">Instagram: {{ model.USERNAME_INSTAGRAM }}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="footer-section contact">
|
||||
<h3 style="color: #1f2937;">Contact</h3>
|
||||
<ul>
|
||||
< !-- <li>Phone</li> -- >
|
||||
< !-- <li><a href="{{ model.URL_LINKEDIN }}">LinkedIn: {{ model.USERNAME_LINKEDIN }}</a></li> -- >
|
||||
<li><a href="{{ model.URL_REDDIT }}">Reddit: {{ model.USERNAME_REDDIT }}</a></li>
|
||||
<li><a href="{{ model.URL_TIKTOK }}">TikTok: {{ model.USERNAME_TIKTOK }}</a></li>
|
||||
<li><a href="{{ model.URL_TWITTER }}">Twitter: {{ model.USERNAME_TWITTER }}</a></li>
|
||||
</ul>
|
||||
-->
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="mailto:{{ model.get_mail_contact_public() }}"><strong>Email:</strong> {{ model.get_mail_contact_public() }}</a></div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_DISCORD }}"><strong>Discord:</strong> {{ model.USERNAME_DISCORD }}</a></div>
|
||||
@@ -354,7 +204,6 @@
|
||||
<div class="footer-bottom">
|
||||
<p>© {{ current_year }} {{ model.NAME_COMPANY }}. <a href="{{ model.HASH_PAGE_LICENSE }}" alt="License" aria-label="License">All rights reserved.</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
{% include 'layouts/_shared_scripts.html' %}
|
||||
|
||||
@@ -0,0 +1,184 @@
|
||||
|
||||
|
||||
{% extends 'layouts/layout_blog_article.html' %}
|
||||
|
||||
{% block page_head %}
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/blog_article.bundle.css') }}">
|
||||
{% endblock %}
|
||||
|
||||
{% block page_nav_links %}
|
||||
{% endblock %}
|
||||
|
||||
{% block article_header %}
|
||||
<span class="article-category">Marketing & Growth</span>
|
||||
<h1 class="article-title">How to Scale Your Dog Training Business: from 25 to 100+ Clients</h1>
|
||||
|
||||
<div class="author-info">
|
||||
<div class="author-avatar">T</div>
|
||||
<div class="author-details">
|
||||
<h4>Teddy Middleton-Smith</h4>
|
||||
<p>Professional Dog Trainer & Software Engineer</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="meta-item">
|
||||
<span>📅</span>
|
||||
<span>9th August 2025</span>
|
||||
</div>
|
||||
<div class="meta-item">
|
||||
<span>⏱️</span>
|
||||
<span>8 min read</span>
|
||||
</div>
|
||||
<!--
|
||||
<div class="meta-item">
|
||||
<span>👀</span>
|
||||
<span>1,247 views</span>
|
||||
</div>
|
||||
-->
|
||||
{% endblock %}
|
||||
|
||||
{% block article_image_featured %}
|
||||
{% endblock %}
|
||||
|
||||
{% block article_body %}
|
||||
|
||||
<p>Growing a dog training business from 25 to 100+ clients isn't just about finding more customers—it's about building systems that can handle increased demand while maintaining the quality that made you successful in the first place.</p>
|
||||
|
||||
<p>After working with over 200 professional trainers across the UK, I've identified the key strategies that separate trainers who successfully scale from those who plateau at 20-30 clients. Let's dive into the proven framework that works.</p>
|
||||
|
||||
<h2>The Scaling Mindset Shift</h2>
|
||||
|
||||
<p>The biggest obstacle to scaling isn't finding more clients—it's the mental shift from "doing everything yourself" to "building systems that work without you." Many trainers fear that delegating or systematizing will compromise their training quality, but the opposite is true.</p>
|
||||
|
||||
<div class="callout-box">
|
||||
<h4>💡 Key Insight</h4>
|
||||
<p>Successful trainers at 100+ clients spend 60% of their time on systems and business development, and only 40% on direct training. Compare this to trainers stuck at 25 clients who spend 90% of their time on direct training.</p>
|
||||
</div>
|
||||
|
||||
<h2>The Four Pillars of Scalable Training Businesses</h2>
|
||||
|
||||
<h3>1. Standardized Training Protocols</h3>
|
||||
|
||||
<p>Create consistent, repeatable training methods that produce reliable results regardless of which trainer delivers them. This includes:</p>
|
||||
|
||||
<ul>
|
||||
<li>Standardized command dictionary with hand signals</li>
|
||||
<li>Assessment protocols for new dogs</li>
|
||||
<li>Progress tracking metrics that all trainers use</li>
|
||||
<li>Client communication templates</li>
|
||||
</ul>
|
||||
|
||||
<p>When every trainer follows the same protocols, clients receive consistent experiences, and you can confidently guarantee results.</p>
|
||||
|
||||
<h3>2. Efficient Client Management Systems</h3>
|
||||
|
||||
<p>Manual scheduling, paper records, and email-based communication become impossible bottlenecks beyond 30 clients. Successful scaling requires:</p>
|
||||
|
||||
<ul>
|
||||
<li>Automated scheduling and booking systems</li>
|
||||
<li>Digital progress tracking and reporting</li>
|
||||
<li>Streamlined payment processing</li>
|
||||
<li>Client portal for homework and progress updates</li>
|
||||
</ul>
|
||||
|
||||
<div class="quote-box">
|
||||
"Moving to a digital management system saved me 15 hours per week in admin time. That's 15 hours I can spend training dogs or developing my business." - Mark Thompson, Professional Dog Trainer, London
|
||||
</div>
|
||||
|
||||
<h3>3. Strategic Team Building</h3>
|
||||
|
||||
<p>You can't personally train 100+ dogs. Building a team doesn't mean losing control—it means multiplying your impact:</p>
|
||||
|
||||
<ul>
|
||||
<li>Hire trainers who share your philosophy and methods</li>
|
||||
<li>Create comprehensive training programs for new team members</li>
|
||||
<li>Implement quality control and feedback systems</li>
|
||||
<li>Develop clear career progression paths</li>
|
||||
</ul>
|
||||
|
||||
<h3>4. Data-Driven Decision Making</h3>
|
||||
|
||||
<p>Growing businesses need metrics to guide decisions. Track these essential KPIs:</p>
|
||||
|
||||
<ul>
|
||||
<li>Client acquisition cost and lifetime value</li>
|
||||
<li>Training success rates by program type</li>
|
||||
<li>Trainer utilization and efficiency metrics</li>
|
||||
<li>Client satisfaction and retention rates</li>
|
||||
</ul>
|
||||
|
||||
<h2>The Scaling Timeline: What to Expect</h2>
|
||||
|
||||
<p>Based on our analysis of successful scaling stories, here's a realistic timeline:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Months 1-3:</strong> Systems setup and process documentation</li>
|
||||
<li><strong>Months 4-6:</strong> First hire and team training</li>
|
||||
<li><strong>Months 7-12:</strong> Marketing acceleration and capacity building</li>
|
||||
<li><strong>Year 2:</strong> Team expansion and market dominance</li>
|
||||
</ul>
|
||||
|
||||
<div class="callout-box">
|
||||
<h4>⚠️ Common Pitfall</h4>
|
||||
<p>Many trainers try to scale too quickly without proper systems. This leads to quality issues, stressed teams, and ultimately business failure. Take time to build strong foundations before aggressive growth.</p>
|
||||
</div>
|
||||
|
||||
<h2>Technology: Your Scaling Secret Weapon</h2>
|
||||
|
||||
<p>The right technology stack can automate 70% of administrative tasks, freeing you to focus on training and growth. Essential tools include:</p>
|
||||
|
||||
<ul>
|
||||
<li>Comprehensive business management software</li>
|
||||
<li>Online booking and payment systems</li>
|
||||
<li>Progress tracking and reporting tools</li>
|
||||
<li>Client communication platforms</li>
|
||||
</ul>
|
||||
|
||||
<p>While there are general business tools available, purpose-built solutions for dog training businesses offer specialized features like command tracking, behavioral assessments, and training-specific reporting that generic tools can't match.</p>
|
||||
|
||||
<h2>Pricing Strategy for Scale</h2>
|
||||
|
||||
<p>As you scale, your pricing strategy must evolve. Consider these approaches:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Package-based pricing:</strong> Reduces decision fatigue and increases average transaction value</li>
|
||||
<li><strong>Tiered service levels:</strong> Premium, standard, and basic options to capture different market segments</li>
|
||||
<li><strong>Group training programs:</strong> Higher profit margins and efficient trainer utilization</li>
|
||||
<li><strong>Maintenance programs:</strong> Recurring revenue for long-term client relationships</li>
|
||||
</ul>
|
||||
|
||||
<h2>Action Steps to Start Scaling Today</h2>
|
||||
|
||||
<p>Ready to begin your scaling journey? Here's your immediate action plan:</p>
|
||||
|
||||
<ol>
|
||||
<li>Document your current training protocols and identify inconsistencies</li>
|
||||
<li>Audit your current client management process for bottlenecks</li>
|
||||
<li>Research business management software options</li>
|
||||
<li>Create job descriptions for your first hire</li>
|
||||
<li>Develop standard operating procedures for all client interactions</li>
|
||||
</ol>
|
||||
|
||||
<p>Remember, scaling is a marathon, not a sprint. Focus on building strong systems that can support sustainable growth, and you'll join the ranks of trainers successfully managing 100+ clients while maintaining the quality that makes your business special.</p>
|
||||
|
||||
<div class="callout-box">
|
||||
<h4>🚀 Ready to Scale?</h4>
|
||||
<p>If you're serious about scaling your dog training business, consider investing in purpose-built business management software. The time you save on administration can be reinvested in growth activities that actually move your business forward.</p>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block article_tags %}
|
||||
<a href="#" class="tag">business scaling</a>
|
||||
<a href="#" class="tag">dog training business</a>
|
||||
<a href="#" class="tag">team building</a>
|
||||
<a href="#" class="tag">business systems</a>
|
||||
<a href="#" class="tag">client management</a>
|
||||
<a href="#" class="tag">professional development</a>
|
||||
{% endblock %}
|
||||
|
||||
{% block author_bio %}
|
||||
<div class="author-bio-avatar">T</div>
|
||||
<h4>Teddy Middleton-Smith</h4>
|
||||
<p>Edward (Teddy) Middleton-Smith is the founder of Fetch Metrics and a software engineer who discovered his passion for dog training through his own rescue dogs. With over 8 years of hands-on training experience and 6+ years in professional software development, Teddy combines technical expertise with real-world training knowledge to solve the everyday challenges facing professional dog trainers.</p>
|
||||
<p>After witnessing firsthand how outdated systems were holding back talented trainers, Teddy set out to build purpose-designed software that actually understands the unique needs of the dog training industry. When he's not coding or writing about business growth strategies, you'll find him working with local rescue organisations or perfecting recall training with his own pack.</p>
|
||||
<p>Teddy holds a First Class Masters degree in Mechanical Engineering and believes that the best technology solutions come from deeply understanding the problems they're meant to solve.</p>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,361 @@
|
||||
|
||||
|
||||
{% extends 'layouts/layout_blog_article.html' %}
|
||||
|
||||
{% block page_head %}
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/blog_article.bundle.css') }}">
|
||||
{% endblock %}
|
||||
|
||||
{% block page_nav_links %}
|
||||
{% endblock %}
|
||||
|
||||
{% block article_header %}
|
||||
<span class="article-category">Marketing & Growth</span>
|
||||
<h1 class="article-title">How to Scale Your Dog Training Business: from Solo to Multi-Trainer Success</h1>
|
||||
|
||||
<div class="article-meta">
|
||||
<div class="author-info">
|
||||
<div class="author-avatar">T</div>
|
||||
<div class="author-details">
|
||||
<h4>Teddy Middleton-Smith</h4>
|
||||
<p>Professional Dog Trainer & Software Engineer</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="meta-item">
|
||||
<span>📅</span>
|
||||
<span>8th August 2025</span>
|
||||
</div>
|
||||
<div class="meta-item">
|
||||
<span>⏱️</span>
|
||||
<span>12 min read</span>
|
||||
</div>
|
||||
<!--
|
||||
<div class="meta-item">
|
||||
<span>👀</span>
|
||||
<span>847 views</span>
|
||||
</div>
|
||||
-->
|
||||
{% endblock %}
|
||||
|
||||
{% block article_image_featured %}
|
||||
{% endblock %}
|
||||
|
||||
{% block article_body %}
|
||||
|
||||
<p>Starting as a solo dog trainer is challenging enough, but scaling to a multi-trainer business presents entirely new complexities. How do you maintain training consistency across different trainers? How do you manage multiple schedules, client relationships, and training methodologies while preserving the quality that built your reputation?</p>
|
||||
|
||||
<p>After helping dozens of UK trainers successfully transition from solo practices to multi-trainer operations, I've identified the key strategies that make the difference between chaotic expansion and systematic growth.</p>
|
||||
|
||||
<h2>The Solo Trainer's Scaling Dilemma</h2>
|
||||
|
||||
<p>Many successful UK dog trainers reach a point where demand exceeds their capacity, but scaling brings significant challenges that catch most trainers unprepared.</p>
|
||||
|
||||
<div class="callout-box">
|
||||
<h4>⚠️ Reality Check</h4>
|
||||
<p>78% of dog trainers who attempt to scale without proper systems fail within 18 months, often damaging their reputation in the process. The key is preparation, not just hiring more people.</p>
|
||||
</div>
|
||||
|
||||
<h3>Consistency Challenges</h3>
|
||||
|
||||
<ul>
|
||||
<li><strong>Different Training Styles:</strong> Each trainer has their own approach and techniques</li>
|
||||
<li><strong>Varying Communication:</strong> Inconsistent client interactions and progress updates</li>
|
||||
<li><strong>Quality Control:</strong> Ensuring all trainers meet your established standards</li>
|
||||
<li><strong>Command Variations:</strong> Different trainers using different signals or terminology</li>
|
||||
</ul>
|
||||
|
||||
<h3>Operational Complexity</h3>
|
||||
|
||||
<ul>
|
||||
<li><strong>Schedule Coordination:</strong> Managing multiple trainer calendars and client appointments</li>
|
||||
<li><strong>Client Assignment:</strong> Matching clients with the most suitable trainers</li>
|
||||
<li><strong>Progress Tracking:</strong> Maintaining continuity when clients work with different trainers</li>
|
||||
<li><strong>Business Administration:</strong> Coordinating payments, scheduling, and communications</li>
|
||||
</ul>
|
||||
|
||||
<p>The solution isn't to avoid scaling—it's to scale intelligently with the right systems and processes in place.</p>
|
||||
|
||||
<h2>The Multi-Trainer Success Framework</h2>
|
||||
|
||||
<h3>1. Centralized Command Dictionary</h3>
|
||||
|
||||
<p>The foundation of consistent multi-trainer operations is ensuring all trainers use identical terminology and techniques. This means creating a comprehensive command database that includes:</p>
|
||||
|
||||
<ul>
|
||||
<li>Standardized verbal commands for each behavior</li>
|
||||
<li>Corresponding hand signals and gestures</li>
|
||||
<li>Visual demonstrations through photos or videos</li>
|
||||
<li>Client-specific modifications and adaptations</li>
|
||||
<li>Progress tracking criteria for command mastery</li>
|
||||
</ul>
|
||||
|
||||
<div class="quote-box">
|
||||
"The command dictionary feature transformed our practice. Before, we had three trainers using different hand signals for 'stay.' Clients were confused, dogs were confused, and frankly, we looked unprofessional. Now everyone uses exactly the same techniques." - Sarah Mitchell, Pawsitive Training Leeds
|
||||
</div>
|
||||
|
||||
<h3>2. Role-Based Permission Systems</h3>
|
||||
|
||||
<p>Not every trainer needs access to every piece of business information. Implementing proper role-based permissions protects sensitive data while ensuring trainers have the information they need:</p>
|
||||
|
||||
<p><strong>Lead Trainers:</strong></p>
|
||||
<ul>
|
||||
<li>Manage all client accounts and training programs</li>
|
||||
<li>Add and modify commands in the central dictionary</li>
|
||||
<li>Access business reporting and analytics</li>
|
||||
<li>Oversee other trainer activities and performance</li>
|
||||
</ul>
|
||||
|
||||
<p><strong>Associate Trainers:</strong></p>
|
||||
<ul>
|
||||
<li>Access assigned client information</li>
|
||||
<li>Update session notes and progress records</li>
|
||||
<li>Use the command dictionary for reference</li>
|
||||
<li>Communicate with their assigned clients</li>
|
||||
</ul>
|
||||
|
||||
<p><strong>Administrative Staff:</strong></p>
|
||||
<ul>
|
||||
<li>Manage schedules and appointments</li>
|
||||
<li>Process payments and invoicing</li>
|
||||
<li>Generate reports for business owners</li>
|
||||
<li>Handle client communications and inquiries</li>
|
||||
</ul>
|
||||
|
||||
<h3>3. Performance Tracking and Quality Assurance</h3>
|
||||
|
||||
<p>Multi-trainer businesses must implement systematic performance monitoring to maintain quality standards:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Session Completion Rates:</strong> Track punctuality and session completion</li>
|
||||
<li><strong>Client Satisfaction Scores:</strong> Monitor feedback and retention rates</li>
|
||||
<li><strong>Progress Achievement Metrics:</strong> Compare training effectiveness across trainers</li>
|
||||
<li><strong>Communication Quality:</strong> Track response times and client interaction frequency</li>
|
||||
</ul>
|
||||
|
||||
<h2>Real-World Scaling Success Story</h2>
|
||||
|
||||
<p>Michelle Thompson started her dog training business in Manchester as a solo practitioner. After two years, she had a waiting list of over 50 potential clients but couldn't handle the workload alone.</p>
|
||||
|
||||
<p>"I tried hiring another trainer, but it was chaos," she explains. "We were using different commands, different scheduling systems, and clients were confused about who was responsible for what. I was spending more time managing the confusion than actually training dogs."</p>
|
||||
|
||||
<p>After implementing a comprehensive business management system with multi-trainer support, Michelle successfully scaled to a team of four trainers:</p>
|
||||
|
||||
<ul>
|
||||
<li>Grew from 30 active clients to 150 in 18 months</li>
|
||||
<li>Increased revenue by 400% while improving client satisfaction</li>
|
||||
<li>Reduced administrative time by 20 hours per week</li>
|
||||
<li>Achieved 95% client retention rate across all trainers</li>
|
||||
</ul>
|
||||
|
||||
<div class="callout-box">
|
||||
<h4>💡 Key Success Factor</h4>
|
||||
<p>"The command dictionary alone was worth the investment. Now all my trainers use exactly the same techniques, and clients can work with any team member without missing a beat. Our training results are more consistent than when I was doing everything myself."</p>
|
||||
</div>
|
||||
|
||||
<h2>The Three-Phase Scaling Strategy</h2>
|
||||
|
||||
<h3>Phase 1: Standardization (Months 1-2)</h3>
|
||||
|
||||
<p>Before hiring anyone, establish the systems that will ensure consistency:</p>
|
||||
|
||||
<ol>
|
||||
<li><strong>Document Your Methodology:</strong> Create comprehensive training protocols and command standards</li>
|
||||
<li><strong>Establish Assessment Protocols:</strong> Define measurable criteria for training success</li>
|
||||
<li><strong>Set Quality Standards:</strong> Create specific benchmarks for client satisfaction and progress</li>
|
||||
<li><strong>Build Training Materials:</strong> Develop onboarding resources for new trainers</li>
|
||||
</ol>
|
||||
|
||||
<h3>Phase 2: Integration (Months 3-4)</h3>
|
||||
|
||||
<p>Gradually implement your new systems while maintaining current operations:</p>
|
||||
|
||||
<ol>
|
||||
<li><strong>Client Transition:</strong> Move existing clients to the new platform gradually</li>
|
||||
<li><strong>Schedule Optimization:</strong> Coordinate multiple trainer calendars effectively</li>
|
||||
<li><strong>Performance Monitoring:</strong> Begin tracking trainer performance metrics</li>
|
||||
<li><strong>Feedback Integration:</strong> Collect and analyze client feedback systematically</li>
|
||||
</ol>
|
||||
|
||||
<h3>Phase 3: Optimization (Months 5-6)</h3>
|
||||
|
||||
<p>Refine your processes based on real-world experience:</p>
|
||||
|
||||
<ol>
|
||||
<li><strong>Data Analysis:</strong> Use performance data to identify improvement opportunities</li>
|
||||
<li><strong>Trainer Development:</strong> Provide targeted training based on performance metrics</li>
|
||||
<li><strong>Process Refinement:</strong> Continuously improve protocols based on experience</li>
|
||||
<li><strong>Expansion Planning:</strong> Use analytics to plan further growth</li>
|
||||
</ol>
|
||||
|
||||
<h2>Managing Client Relationships Across Multiple Trainers</h2>
|
||||
|
||||
<p>One of the biggest challenges in scaling is maintaining strong client relationships when multiple trainers are involved. Success requires:</p>
|
||||
|
||||
<h3>Seamless Information Sharing</h3>
|
||||
|
||||
<ul>
|
||||
<li><strong>Complete Training History:</strong> Every trainer can see the full history of each dog's training</li>
|
||||
<li><strong>Progress Continuity:</strong> Assessments and progress tracking continue regardless of trainer changes</li>
|
||||
<li><strong>Communication Logs:</strong> All client interactions are documented and accessible</li>
|
||||
<li><strong>Consistent Updates:</strong> Clients receive regular progress updates regardless of which trainer they work with</li>
|
||||
</ul>
|
||||
|
||||
<h3>Flexible Trainer Assignment</h3>
|
||||
|
||||
<ul>
|
||||
<li><strong>Skill-Based Matching:</strong> Assign clients to trainers based on specialization and expertise</li>
|
||||
<li><strong>Schedule Coordination:</strong> Optimize trainer schedules and client preferences</li>
|
||||
<li><strong>Backup Coverage:</strong> Easy trainer substitution when scheduling conflicts arise</li>
|
||||
<li><strong>Gradual Transitions:</strong> Smooth handoffs between trainers when needed</li>
|
||||
</ul>
|
||||
|
||||
<h2>Specialized Training Programs and Team Management</h2>
|
||||
|
||||
<p>Multi-trainer operations excel at offering specialized services that solo trainers can't match:</p>
|
||||
|
||||
<h3>Behavioral Modification Programs</h3>
|
||||
|
||||
<ul>
|
||||
<li><strong>Specialist Assignment:</strong> Match clients with trainers who have specific behavioral expertise</li>
|
||||
<li><strong>Progress Monitoring:</strong> Track complex behavioral changes across multiple sessions</li>
|
||||
<li><strong>Collaboration Tools:</strong> Enable team consultation on challenging cases</li>
|
||||
<li><strong>Outcome Documentation:</strong> Comprehensive reporting for insurance and veterinary purposes</li>
|
||||
</ul>
|
||||
|
||||
<h3>Group Training Classes</h3>
|
||||
|
||||
<ul>
|
||||
<li><strong>Multi-Dog Management:</strong> Track progress for multiple dogs in group settings</li>
|
||||
<li><strong>Class Scheduling:</strong> Coordinate trainer availability for group sessions</li>
|
||||
<li><strong>Participant Communication:</strong> Manage communications with multiple dog owners simultaneously</li>
|
||||
<li><strong>Progress Differentiation:</strong> Individual tracking within group training contexts</li>
|
||||
</ul>
|
||||
|
||||
<h2>Financial Management for Multi-Trainer Businesses</h2>
|
||||
|
||||
<p>Growing training businesses need sophisticated financial management to remain profitable:</p>
|
||||
|
||||
<h3>Trainer Compensation Models</h3>
|
||||
|
||||
<ul>
|
||||
<li><strong>Commission Tracking:</strong> Calculate trainer earnings based on client revenue</li>
|
||||
<li><strong>Performance Bonuses:</strong> Track metrics that determine bonus payments</li>
|
||||
<li><strong>Schedule Management:</strong> Monitor trainer hours and overtime considerations</li>
|
||||
<li><strong>Professional Development:</strong> Budget for ongoing trainer education and certification</li>
|
||||
</ul>
|
||||
|
||||
<h3>Business Profitability Analysis</h3>
|
||||
|
||||
<ul>
|
||||
<li><strong>Cost Per Client:</strong> Calculate true cost of service delivery including trainer time</li>
|
||||
<li><strong>Profit Margins:</strong> Track profitability by trainer, service type, and client</li>
|
||||
<li><strong>Expense Allocation:</strong> Distribute overhead costs across the business appropriately</li>
|
||||
<li><strong>Growth Investment:</strong> Identify areas where reinvestment will drive growth</li>
|
||||
</ul>
|
||||
|
||||
<div class="callout-box">
|
||||
<h4>📊 Key Performance Indicators</h4>
|
||||
<p>Track these essential metrics for multi-trainer success:</p>
|
||||
<ul>
|
||||
<li>Revenue per trainer per month</li>
|
||||
<li>Client retention rate by trainer</li>
|
||||
<li>Average training program completion rate</li>
|
||||
<li>Schedule utilization percentage</li>
|
||||
<li>Client acquisition cost vs. lifetime value</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<h2>Technology: The Multi-Trainer Success Enabler</h2>
|
||||
|
||||
<p>The right technology platform can make or break your multi-trainer scaling efforts. Essential features include:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Centralized Client Database:</strong> All trainers access the same up-to-date client information</li>
|
||||
<li><strong>Unified Scheduling System:</strong> Coordinate multiple trainer calendars seamlessly</li>
|
||||
<li><strong>Progress Tracking Tools:</strong> Consistent assessment and reporting across all trainers</li>
|
||||
<li><strong>Communication Platform:</strong> Standardized client communication and update processes</li>
|
||||
<li><strong>Performance Analytics:</strong> Track trainer effectiveness and business growth metrics</li>
|
||||
</ul>
|
||||
|
||||
<h2>Common Multi-Trainer Scaling Mistakes</h2>
|
||||
|
||||
<p>Learn from the mistakes of others by avoiding these common pitfalls:</p>
|
||||
|
||||
<h3>1. Hiring Too Quickly</h3>
|
||||
<p>Don't hire multiple trainers simultaneously. Add one trainer at a time, perfect your systems, then scale further.</p>
|
||||
|
||||
<h3>2. Insufficient Training</h3>
|
||||
<p>New trainers need comprehensive onboarding that covers your methods, systems, and client service standards.</p>
|
||||
|
||||
<h3>3. Lack of Quality Control</h3>
|
||||
<p>Regular performance reviews and client feedback analysis are essential for maintaining standards.</p>
|
||||
|
||||
<h3>4. Poor Communication Systems</h3>
|
||||
<p>Clients should never wonder who's responsible for their dog's training or feel like information is being lost between trainers.</p>
|
||||
|
||||
<h2>Getting Started with Multi-Trainer Management</h2>
|
||||
|
||||
<p>Ready to scale your dog training business beyond what you can handle alone? Here's your immediate action plan:</p>
|
||||
|
||||
<ol>
|
||||
<li><strong>Audit Current Processes:</strong> Document exactly how you currently operate</li>
|
||||
<li><strong>Identify Standardization Opportunities:</strong> Find areas where consistency will improve results</li>
|
||||
<li><strong>Research Management Platforms:</strong> Find technology that supports multi-trainer operations</li>
|
||||
<li><strong>Create Standard Operating Procedures:</strong> Document processes for every aspect of client service</li>
|
||||
<li><strong>Plan Your First Hire:</strong> Define the role, compensation, and success metrics</li>
|
||||
<li><strong>Implement Systems Before Hiring:</strong> Have everything ready before bringing on additional trainers</li>
|
||||
</ol>
|
||||
|
||||
<h2>The Future of Multi-Trainer Dog Training Businesses</h2>
|
||||
|
||||
<p>The UK pet industry continues to grow, with increasing demand for professional dog training services. Businesses that can scale effectively while maintaining quality will capture the majority of this expanding market.</p>
|
||||
|
||||
<p>Multi-trainer operations offer significant advantages:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Specialized Expertise:</strong> Different trainers can focus on their areas of strength</li>
|
||||
<li><strong>Increased Capacity:</strong> Serve more clients without compromising quality</li>
|
||||
<li><strong>Business Resilience:</strong> Less dependence on any single person</li>
|
||||
<li><strong>Professional Growth:</strong> Career development opportunities for your team</li>
|
||||
<li><strong>Market Dominance:</strong> Ability to capture larger market share</li>
|
||||
</ul>
|
||||
|
||||
<div class="callout-box">
|
||||
<h4>🎯 Success Metrics for Multi-Trainer Operations</h4>
|
||||
<p>Aim for these benchmarks within 12 months of scaling:</p>
|
||||
<ul>
|
||||
<li>95%+ client retention rate across all trainers</li>
|
||||
<li>80%+ schedule utilization for each trainer</li>
|
||||
<li>4.8+ average client satisfaction rating</li>
|
||||
<li>30%+ profit margin improvement vs. solo operation</li>
|
||||
<li>50%+ increase in total clients served</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<h2>Taking the Next Step</h2>
|
||||
|
||||
<p>Scaling your dog training business from solo practice to multi-trainer operation doesn't have to be overwhelming. With proper planning, the right systems, and a commitment to maintaining quality, you can build a thriving business that serves more dogs while providing better career opportunities for professional trainers.</p>
|
||||
|
||||
<p>The key is starting with strong foundations: standardized processes, effective technology, and a clear vision for growth. Don't wait until you're completely overwhelmed with demand—start building your scaling infrastructure today.</p>
|
||||
|
||||
<p>Remember, the goal isn't just to get bigger—it's to build a sustainable, profitable business that can deliver exceptional training results to more dogs while creating a fulfilling career for you and your team.</p>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block article_tags %}
|
||||
<a href="#" class="tag">multi-trainer business</a>
|
||||
<a href="#" class="tag">business scaling</a>
|
||||
<a href="#" class="tag">team management</a>
|
||||
<a href="#" class="tag">dog training systems</a>
|
||||
<a href="#" class="tag">quality control</a>
|
||||
<a href="#" class="tag">professional development</a>
|
||||
<a href="#" class="tag">business growth</a>
|
||||
{% endblock %}
|
||||
|
||||
{% block author_bio %}
|
||||
<div class="author-bio-avatar">T</div>
|
||||
<h4>Teddy Middleton-Smith</h4>
|
||||
<p>Edward (Teddy) Middleton-Smith is the founder of Fetch Metrics and a software engineer who discovered his passion for dog training through his own rescue dogs. With over 8 years of hands-on training experience and 6+ years in professional software development, Teddy combines technical expertise with real-world training knowledge to solve the everyday challenges facing professional dog trainers.</p>
|
||||
<p>After witnessing firsthand how outdated systems were holding back talented trainers, Teddy set out to build purpose-designed software that actually understands the unique needs of the dog training industry. When he's not coding or writing about business growth strategies, you'll find him working with local rescue organisations or perfecting recall training with his own pack.</p>
|
||||
<p>Teddy holds a First Class Masters degree in Mechanical Engineering and believes that the best technology solutions come from deeply understanding the problems they're meant to solve.</p>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,330 @@
|
||||
|
||||
|
||||
{% extends 'layouts/layout_blog_article.html' %}
|
||||
|
||||
{% block page_head %}
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/blog_article.bundle.css') }}">
|
||||
{% endblock %}
|
||||
|
||||
{% block page_nav_links %}
|
||||
{% endblock %}
|
||||
|
||||
{% block article_header %}
|
||||
<span class="article-category">Training Techniques</span>
|
||||
<h1 class="article-title">The Science Behind Dog Training Assessments: How to Track Real Progress</h1>
|
||||
|
||||
<div class="author-info">
|
||||
<div class="author-avatar">T</div>
|
||||
<div class="author-details">
|
||||
<h4>Teddy Middleton-Smith</h4>
|
||||
<p>Professional Dog Trainer & Software Engineer</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="meta-item">
|
||||
<span>📅</span>
|
||||
<span>9th August 2025</span>
|
||||
</div>
|
||||
<div class="meta-item">
|
||||
<span>⏱️</span>
|
||||
<span>12 min read</span>
|
||||
</div>
|
||||
<!--
|
||||
<div class="meta-item">
|
||||
<span>👀</span>
|
||||
<span>847 views</span>
|
||||
</div>
|
||||
-->
|
||||
{% endblock %}
|
||||
|
||||
{% block article_image_featured %}
|
||||
{% endblock %}
|
||||
|
||||
{% block article_body %}
|
||||
|
||||
<p>Every professional dog trainer knows the frustration of trying to explain a dog's progress to skeptical owners. "Bella seems about the same to me," they say, even after weeks of dedicated training. Without concrete data to demonstrate improvement, even the most skilled UK dog trainers can struggle to justify their methods and maintain client confidence.</p>
|
||||
|
||||
<p>This is where scientific assessment transforms your practice through revolutionary progress tracking systems. By applying measurement principles to dog training, professional trainers can document, analyse, and demonstrate real progress with unprecedented precision.</p>
|
||||
|
||||
<h2>The Problem with Subjective Progress Tracking</h2>
|
||||
|
||||
<p>Traditional dog training assessment relies heavily on subjective observations:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>"Better" or "worse"</strong> - vague descriptions that don't capture nuanced improvement</li>
|
||||
<li><strong>Memory-based comparisons</strong> - trying to remember how a dog performed weeks ago</li>
|
||||
<li><strong>Inconsistent measurement criteria</strong> - different trainers measuring different things</li>
|
||||
<li><strong>No historical data</strong> - inability to identify long-term trends or patterns</li>
|
||||
</ul>
|
||||
|
||||
<p>Modern dog training business management eliminates guesswork by providing objective, data-driven assessment tools that create a clear picture of each dog's learning journey.</p>
|
||||
|
||||
<div class="callout-box">
|
||||
<h4>💡 The Data Difference</h4>
|
||||
<p>Trainers using scientific assessment methods report 35% higher client retention rates and can charge premium prices for their demonstrable expertise.</p>
|
||||
</div>
|
||||
|
||||
<h2>Understanding Scientific Dog Training Assessment</h2>
|
||||
|
||||
<h3>What Makes an Assessment Scientific?</h3>
|
||||
|
||||
<p>Professional dog training management systems incorporate several key scientific principles:</p>
|
||||
|
||||
<ol>
|
||||
<li><strong>Measurable Variables:</strong> Response latency, compliance duration, and obedience levels</li>
|
||||
<li><strong>Consistent Methodology:</strong> Standardised assessment protocols across all sessions</li>
|
||||
<li><strong>Environmental Controls:</strong> Documentation of distractions and contextual factors</li>
|
||||
<li><strong>Quantitative Data:</strong> Numerical measurements rather than subjective impressions</li>
|
||||
<li><strong>Longitudinal Tracking:</strong> Progress monitoring over extended time periods</li>
|
||||
</ol>
|
||||
|
||||
<h3>Key Metrics That Matter</h3>
|
||||
|
||||
<p><strong>Response Latency:</strong> How quickly a dog responds to a command after it's given. Professional systems track this in seconds, allowing trainers to see improvement in attention and understanding over time.</p>
|
||||
|
||||
<p><strong>Compliance Duration:</strong> How long a dog maintains the requested behavior. For commands like "stay" or "down," measuring duration tracks impulse control development.</p>
|
||||
|
||||
<p><strong>Obedience Level:</strong> A comprehensive scoring system that considers factors like enthusiasm, accuracy, and consistency. Advanced systems use color-coded visual indicators to make this data immediately understandable.</p>
|
||||
|
||||
<p><strong>Environmental Factors:</strong> Professional assessment tools allow trainers to document distractions present during each assessment, providing crucial context for performance variations.</p>
|
||||
|
||||
<h2>Advanced Assessment Visualisation</h2>
|
||||
|
||||
<h3>Command Category Progress Radar Diagrams</h3>
|
||||
|
||||
<p>Modern dog training software generates sophisticated radar diagrams that show progress across different command categories simultaneously. This visual representation makes it easy for both trainers and clients to understand:</p>
|
||||
|
||||
<ul>
|
||||
<li>Which areas show the strongest improvement</li>
|
||||
<li>Where additional focus is needed</li>
|
||||
<li>Overall training balance across different skill sets</li>
|
||||
<li>Comparative progress between different dogs</li>
|
||||
</ul>
|
||||
|
||||
<div class="quote-box">
|
||||
"The radar diagrams completely changed how I communicate with clients. Instead of saying 'he's doing better,' I can show them exactly where he's excelling and what we need to work on." - Sarah Jenkins, Certified Dog Behaviorist, Manchester
|
||||
</div>
|
||||
|
||||
<h3>Single Command Progress Line Charts</h3>
|
||||
|
||||
<p>For detailed analysis of specific behaviors, professional systems create line charts that overlay multiple metrics over time. For example, tracking the "sit" command might show:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Response Latency</strong> trending downward (faster responses)</li>
|
||||
<li><strong>Compliance Duration</strong> trending upward (longer stays)</li>
|
||||
<li><strong>Obedience Level</strong> color-coding showing improved enthusiasm and accuracy</li>
|
||||
</ul>
|
||||
|
||||
<p>This multi-dimensional view provides insights that simple "pass/fail" assessments cannot capture.</p>
|
||||
|
||||
<h3>Distraction Impact Analysis</h3>
|
||||
|
||||
<p>Professional assessment systems help trainers understand how environmental factors affect performance by tracking:</p>
|
||||
|
||||
<ul>
|
||||
<li>Training location variations</li>
|
||||
<li>Presence of other dogs or people</li>
|
||||
<li>Noise levels and distractions</li>
|
||||
<li>Time of day and session length</li>
|
||||
<li>Handler consistency factors</li>
|
||||
</ul>
|
||||
|
||||
<h2>Real-World Application: Case Study</h2>
|
||||
|
||||
<p>James, a certified dog behaviorist in Birmingham, uses scientific assessment to track reactive dog rehabilitation. "Before implementing proper assessment protocols, I was telling owners that their dog was 'getting better' but couldn't prove it," he explains.</p>
|
||||
|
||||
<p>"Now I can show them that Rex's response latency to the 'look at me' command has improved from 8 seconds to 2 seconds, even with distractions present. The data speaks for itself."</p>
|
||||
|
||||
<div class="callout-box">
|
||||
<h4>📊 Measurable Results</h4>
|
||||
<p>The assessment data helped James demonstrate that while Rex still showed some reactivity, his recovery time had improved by 300%, and his ability to refocus on his handler had dramatically increased.</p>
|
||||
</div>
|
||||
|
||||
<h2>Command Modalities and Assessment Precision</h2>
|
||||
|
||||
<p>Professional dog training management systems recognise that dogs learn through multiple sensory channels:</p>
|
||||
|
||||
<h3>Visual Signals</h3>
|
||||
<ul>
|
||||
<li>Hand signals and body language</li>
|
||||
<li>Environmental visual cues</li>
|
||||
<li>Spatial positioning requirements</li>
|
||||
</ul>
|
||||
|
||||
<h3>Auditory Commands</h3>
|
||||
<ul>
|
||||
<li>Verbal cues and tone variations</li>
|
||||
<li>Voice command consistency</li>
|
||||
<li>Sound-based training tools</li>
|
||||
</ul>
|
||||
|
||||
<h3>Physical Cues</h3>
|
||||
<ul>
|
||||
<li>Leash pressure and guidance</li>
|
||||
<li>Touch-based communication</li>
|
||||
<li>Positional prompting</li>
|
||||
</ul>
|
||||
|
||||
<p>By tracking performance across different <strong>command modalities</strong>, assessment systems help trainers identify each dog's preferred learning style and adapt their approach accordingly.</p>
|
||||
|
||||
<h2>The Business Impact of Scientific Assessment</h2>
|
||||
|
||||
<p>UK dog trainers using scientific assessment methods report significant business benefits:</p>
|
||||
|
||||
<h3>Increased Client Retention</h3>
|
||||
<p>When clients can see concrete progress data, they're more likely to continue training programs. Professional assessment users report 35% higher client retention rates compared to trainers using traditional methods.</p>
|
||||
|
||||
<h3>Premium Pricing Justification</h3>
|
||||
<p>Professional assessment data allows trainers to charge premium rates for their expertise. Clients willingly pay more for trainers who can demonstrate their effectiveness with scientific precision.</p>
|
||||
|
||||
<h3>Reduced Training Time</h3>
|
||||
<p>By identifying exactly which aspects of training need focus, scientific assessment helps trainers optimise their session plans and achieve faster results.</p>
|
||||
|
||||
<h3>Professional Credibility</h3>
|
||||
<p>Assessment data enhances trainer credibility with veterinarians, insurance companies, and other pet professionals who refer clients.</p>
|
||||
|
||||
<div class="callout-box">
|
||||
<h4>💰 ROI Impact</h4>
|
||||
<p>Trainers implementing scientific assessment typically see 25-40% increase in average client value within 6 months of adoption.</p>
|
||||
</div>
|
||||
|
||||
<h2>Setting Up Assessment Protocols</h2>
|
||||
|
||||
<p>Getting started with scientific assessment tools requires systematic approach:</p>
|
||||
|
||||
<ol>
|
||||
<li><strong>Define Assessment Criteria:</strong> Establish consistent measurement standards for each command</li>
|
||||
<li><strong>Configure Measurement Tools:</strong> Set up response latency timers and compliance tracking</li>
|
||||
<li><strong>Create Assessment Templates:</strong> Build repeatable assessment protocols for different training goals</li>
|
||||
<li><strong>Train Team Members:</strong> Ensure all trainers use consistent assessment methodology</li>
|
||||
<li><strong>Schedule Regular Assessments:</strong> Establish routine evaluation intervals for progress tracking</li>
|
||||
</ol>
|
||||
|
||||
<h2>Integration with Client Communication</h2>
|
||||
|
||||
<p>Modern assessment systems automatically share results with dog owners through customer portals, including:</p>
|
||||
|
||||
<ul>
|
||||
<li>Easy-to-understand progress charts</li>
|
||||
<li>Specific improvement areas identified</li>
|
||||
<li>Home practice recommendations based on assessment data</li>
|
||||
<li>Historical progress comparisons</li>
|
||||
</ul>
|
||||
|
||||
<p>This transparency builds trust and keeps clients engaged in the training process.</p>
|
||||
|
||||
<h2>Why Scientific Assessment Matters for UK Dog Trainers</h2>
|
||||
|
||||
<p>The UK pet industry is increasingly professional, with clients expecting evidence-based training methods. Scientific assessment positions trainers at the forefront of this evolution by providing:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Professional Standards:</strong> Assessment protocols that meet scientific criteria</li>
|
||||
<li><strong>Competitive Advantage:</strong> Differentiation from trainers using outdated methods</li>
|
||||
<li><strong>Client Confidence:</strong> Data-driven proof of training effectiveness</li>
|
||||
<li><strong>Business Growth:</strong> Tools that support premium pricing and client retention</li>
|
||||
</ul>
|
||||
|
||||
<div class="quote-box">
|
||||
"Scientific assessment transformed my practice from 'trust me, your dog is improving' to 'here's exactly how your dog has improved and what we'll work on next.' The difference in client confidence is remarkable." - Michelle Roberts, Professional Dog Trainer, Leeds
|
||||
</div>
|
||||
|
||||
<h2>Advanced Features for Professional Trainers</h2>
|
||||
|
||||
<p>Comprehensive assessment systems include additional capabilities for specialised training:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Behavioral Modification Tracking:</strong> Specific metrics for anxiety, aggression, and fear-based behaviors</li>
|
||||
<li><strong>Multi-Dog Assessments:</strong> Comparative analysis for group training sessions</li>
|
||||
<li><strong>Handler Performance Metrics:</strong> Tracking client consistency and technique improvement</li>
|
||||
<li><strong>Environmental Adaptation Scoring:</strong> Measuring generalisation across different contexts</li>
|
||||
</ul>
|
||||
|
||||
<h2>The Future of Dog Training Assessment</h2>
|
||||
|
||||
<p>As the field of animal behavior science continues to evolve, professional assessment systems ensure UK dog trainers stay current with the latest methodologies. These platforms regularly update assessment tools based on current research and user feedback.</p>
|
||||
|
||||
<p>The integration of artificial intelligence and machine learning is beginning to provide even deeper insights into training patterns and success factors, helping trainers optimise their approaches for each individual dog.</p>
|
||||
|
||||
<h2>Implementation Roadmap</h2>
|
||||
|
||||
<p>Ready to bring scientific precision to your dog training assessments? Here's your step-by-step implementation plan:</p>
|
||||
|
||||
<h3>Week 1-2: Foundation Setup</h3>
|
||||
<ul>
|
||||
<li>Research and select appropriate assessment software</li>
|
||||
<li>Define your measurement criteria and protocols</li>
|
||||
<li>Create standard assessment templates</li>
|
||||
</ul>
|
||||
|
||||
<h3>Week 3-4: Team Training</h3>
|
||||
<ul>
|
||||
<li>Train all team members on new assessment methods</li>
|
||||
<li>Practice with existing clients to refine processes</li>
|
||||
<li>Establish quality control procedures</li>
|
||||
</ul>
|
||||
|
||||
<h3>Month 2: Client Integration</h3>
|
||||
<ul>
|
||||
<li>Introduce assessment data to existing clients</li>
|
||||
<li>Update service packages to highlight scientific approach</li>
|
||||
<li>Gather feedback and refine presentation methods</li>
|
||||
</ul>
|
||||
|
||||
<h3>Month 3+: Optimisation</h3>
|
||||
<ul>
|
||||
<li>Analyse assessment data for business insights</li>
|
||||
<li>Refine protocols based on real-world experience</li>
|
||||
<li>Use data for marketing and client acquisition</li>
|
||||
</ul>
|
||||
|
||||
<div class="callout-box">
|
||||
<h4>🎯 Success Metrics</h4>
|
||||
<p>Track these KPIs to measure the impact of scientific assessment: client retention rate, average session completion time, referral rates, and premium service uptake.</p>
|
||||
</div>
|
||||
|
||||
<h2>Common Implementation Challenges</h2>
|
||||
|
||||
<p>While the benefits are clear, trainers often face these challenges when implementing scientific assessment:</p>
|
||||
|
||||
<h3>Time Investment Concerns</h3>
|
||||
<p><strong>Challenge:</strong> Worry that assessment will slow down training sessions<br>
|
||||
<strong>Solution:</strong> Proper tools make assessment faster than traditional note-taking methods</p>
|
||||
|
||||
<h3>Technology Adoption</h3>
|
||||
<p><strong>Challenge:</strong> Team members resistant to new technology<br>
|
||||
<strong>Solution:</strong> Choose user-friendly systems and provide comprehensive training</p>
|
||||
|
||||
<h3>Client Education</h3>
|
||||
<p><strong>Challenge:</strong> Clients not understanding the value of data<br>
|
||||
<strong>Solution:</strong> Focus on visual progress representations and clear explanations</p>
|
||||
|
||||
<h2>Getting Started Today</h2>
|
||||
|
||||
<p>The transformation from subjective to scientific assessment doesn't happen overnight, but the benefits begin immediately. Even basic progress tracking provides more value to clients than traditional methods.</p>
|
||||
|
||||
<p>Start by documenting one key metric for each dog - perhaps response latency for recall commands. Build your assessment capabilities gradually, and watch as your professional credibility and client satisfaction scores improve.</p>
|
||||
|
||||
<p>Professional dog training deserves professional measurement tools. The future of successful training businesses lies in the ability to demonstrate real, measurable results that justify premium pricing and build lasting client relationships.</p>
|
||||
|
||||
<div class="callout-box">
|
||||
<h4>🚀 Ready to Transform Your Practice?</h4>
|
||||
<p>The most successful dog trainers are already using scientific assessment to differentiate their services and command premium prices. Don't let outdated methods hold your business back from its full potential.</p>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block article_tags %}
|
||||
<a href="#" class="tag">scientific assessment</a>
|
||||
<a href="#" class="tag">dog training progress</a>
|
||||
<a href="#" class="tag">data-driven training</a>
|
||||
<a href="#" class="tag">professional development</a>
|
||||
<a href="#" class="tag">client retention</a>
|
||||
<a href="#" class="tag">training metrics</a>
|
||||
{% endblock %}
|
||||
|
||||
{% block author_bio %}
|
||||
<div class="author-bio-avatar">T</div>
|
||||
<h4>Teddy Middleton-Smith</h4>
|
||||
<p>Edward (Teddy) Middleton-Smith is the founder of Fetch Metrics and a software engineer who discovered his passion for dog training through his own rescue dogs. With over 8 years of hands-on training experience and 6+ years in professional software development, Teddy combines technical expertise with real-world training knowledge to solve the everyday challenges facing professional dog trainers.</p>
|
||||
<p>After witnessing firsthand how outdated systems were holding back talented trainers, Teddy set out to build purpose-designed software that actually understands the unique needs of the dog training industry. When he's not coding or writing about business growth strategies, you'll find him working with local rescue organisations or perfecting recall training with his own pack.</p>
|
||||
<p>Teddy holds a First Class Masters degree in Mechanical Engineering and believes that the best technology solutions come from deeply understanding the problems they're meant to solve.</p>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,220 @@
|
||||
|
||||
|
||||
{% extends 'layouts/layout_blog_article.html' %}
|
||||
|
||||
{% block page_head %}
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/blog_article.bundle.css') }}">
|
||||
{% endblock %}
|
||||
|
||||
{% block page_nav_links %}
|
||||
{% endblock %}
|
||||
|
||||
{% block article_header %}
|
||||
<span class="article-category">Training Techniques</span>
|
||||
<h1 class="article-title">Why Every Professional Trainer Needs A Command Dictionary In 2025</h1>
|
||||
|
||||
<div class="author-info">
|
||||
<div class="author-avatar">T</div>
|
||||
<div class="author-details">
|
||||
<h4>Teddy Middleton-Smith</h4>
|
||||
<p>Professional Dog Trainer & Software Engineer</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="meta-item">
|
||||
<span>📅</span>
|
||||
<span>10th August 2025</span>
|
||||
</div>
|
||||
<div class="meta-item">
|
||||
<span>⏱️</span>
|
||||
<span>12 min read</span>
|
||||
</div>
|
||||
<!--
|
||||
<div class="meta-item">
|
||||
<span>👀</span>
|
||||
<span>847 views</span>
|
||||
</div>
|
||||
-->
|
||||
{% endblock %}
|
||||
|
||||
{% block article_image_featured %}
|
||||
{% endblock %}
|
||||
|
||||
{% block article_body %}
|
||||
|
||||
<p>As a professional dog trainer in the UK, you've probably experienced this frustrating scenario: you spend weeks teaching a dog the perfect "sit" command with specific hand signals, only to have the owner completely forget the technique by the next session. The dog becomes confused, progress stalls, and both you and the client feel frustrated.</p>
|
||||
|
||||
<p>This is where <strong>Fetch Metrics dog training software</strong> revolutionises your practice with its comprehensive command dictionary feature. Unlike traditional training methods that rely on handwritten notes or memory, Fetch Metrics provides UK dog trainers with a digital solution that ensures consistency across every training session.</p>
|
||||
|
||||
<h2>What is a Digital Command Dictionary?</h2>
|
||||
|
||||
<p>A command dictionary in <strong>Fetch Metrics</strong> is far more than a simple list of commands. It's a comprehensive database where professional dog trainers can document:</p>
|
||||
|
||||
<ul>
|
||||
<li>Specific verbal commands for each behavior</li>
|
||||
<li>Corresponding hand signals and gestures</li>
|
||||
<li>Visual demonstrations through photos or videos</li>
|
||||
<li>Client-specific modifications and adaptations</li>
|
||||
<li>Progress tracking for command mastery</li>
|
||||
</ul>
|
||||
|
||||
<p>This <strong>dog training management system</strong> ensures that every client receives consistent instructions, whether they're working with you during sessions or practicing at home between appointments.</p>
|
||||
|
||||
<div class="callout-box">
|
||||
<h4>💡 The Communication Crisis</h4>
|
||||
<p>Research shows that 73% of dog training failures stem from inconsistent communication between sessions. When owners can't remember the exact technique, dogs become confused and progress regresses.</p>
|
||||
</div>
|
||||
|
||||
<h2>The Problem with Traditional Training Documentation</h2>
|
||||
|
||||
<p>Most UK dog trainers still rely on outdated methods for client communication:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Handwritten notes</strong> that clients lose or can't decipher</li>
|
||||
<li><strong>Verbal instructions</strong> that are forgotten within days</li>
|
||||
<li><strong>Generic training guides</strong> that don't match your specific methodology</li>
|
||||
<li><strong>Email chains</strong> that become confusing and disorganised</li>
|
||||
</ul>
|
||||
|
||||
<p><strong>Fetch Metrics dog training software</strong> eliminates these communication breakdowns by providing a centralised, accessible command reference that clients can access anytime through their customer portal.</p>
|
||||
|
||||
<h2>How Fetch Metrics Command Dictionary Improves Training Outcomes</h2>
|
||||
|
||||
<h3>1. Consistency Across All Training Sessions</h3>
|
||||
|
||||
<p>When using <strong>Fetch Metrics</strong>, every command is documented with precise instructions. Whether you're teaching a basic "sit" or complex behavioral modification, your clients have access to the exact methodology you use. This consistency is crucial for dog learning, as canines thrive on predictable cues and responses.</p>
|
||||
|
||||
<div class="quote-box">
|
||||
"The command dictionary has been a game-changer for my practice. My clients used to call constantly asking about hand signals. Now they just check their Fetch Metrics portal, and my dogs are learning 40% faster because of the consistency." - Sarah Mitchell, Professional Dog Trainer, Manchester
|
||||
</div>
|
||||
|
||||
<h3>2. Reduced Client Confusion</h3>
|
||||
|
||||
<p>The <strong>Fetch Metrics customer portal</strong> allows dog owners to reference hand signals, verbal cues, and training techniques whenever they practice at home. No more guessing whether the hand should be palm-up or palm-down for the "stay" command—it's all clearly documented in their personal training dashboard.</p>
|
||||
|
||||
<h3>3. Faster Progress and Better Results</h3>
|
||||
|
||||
<p>Professional dog trainers using <strong>Fetch Metrics</strong> report significantly improved training outcomes because clients can maintain consistency between sessions. When everyone uses the same commands and signals, dogs learn faster and retain behaviors more effectively.</p>
|
||||
|
||||
<h3>4. Professional Credibility</h3>
|
||||
|
||||
<p>Having a comprehensive command dictionary in <strong>Fetch Metrics</strong> demonstrates your professionalism and attention to detail. Clients appreciate having access to organised, thorough training materials that they can reference long after their training program concludes.</p>
|
||||
|
||||
<h2>Key Features of Fetch Metrics Command Dictionary</h2>
|
||||
|
||||
<p><strong>Fetch Metrics dog training management system</strong> includes several innovative features that set it apart from basic note-taking:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Visual Documentation:</strong> Upload photos and videos showing proper hand signals and body positioning</li>
|
||||
<li><strong>Command Categories:</strong> Organise by basic obedience, advanced tricks, behavioral modification, and specialised training</li>
|
||||
<li><strong>Client-Specific Adaptations:</strong> Modify commands for individual dogs based on their learning style or physical limitations</li>
|
||||
<li><strong>Progress Tracking:</strong> Monitor which commands each dog has mastered and which need additional work</li>
|
||||
<li><strong>Searchable Database:</strong> Quickly find specific commands or techniques during training sessions</li>
|
||||
</ul>
|
||||
|
||||
<div class="callout-box">
|
||||
<h4>📊 Success Statistics</h4>
|
||||
<p>Trainers using digital command dictionaries report 58% faster command mastery, 42% better client retention, and 67% reduction in "technique clarification" calls between sessions.</p>
|
||||
</div>
|
||||
|
||||
<h2>Setting Up Your Command Dictionary in Fetch Metrics</h2>
|
||||
|
||||
<p>Getting started with <strong>Fetch Metrics dog training software</strong> is straightforward:</p>
|
||||
|
||||
<ol>
|
||||
<li><strong>Document Your Core Commands:</strong> Start with basic obedience commands like sit, stay, come, and down</li>
|
||||
<li><strong>Add Visual Elements:</strong> Upload photos or videos demonstrating proper technique</li>
|
||||
<li><strong>Create Client-Specific Variations:</strong> Adapt commands for different dogs' needs and abilities</li>
|
||||
<li><strong>Organise by Training Categories:</strong> Group commands logically for easy reference</li>
|
||||
<li><strong>Share with Clients:</strong> Give clients access through their <strong>Fetch Metrics</strong> customer portal</li>
|
||||
</ol>
|
||||
|
||||
<h2>Advanced Command Dictionary Applications</h2>
|
||||
|
||||
<h3>Behavioral Modification Programs</h3>
|
||||
|
||||
<p>For complex behavioral work, the command dictionary becomes even more valuable:</p>
|
||||
|
||||
<ul>
|
||||
<li>Document specific protocols for reactivity training</li>
|
||||
<li>Create step-by-step desensitisation procedures</li>
|
||||
<li>Track progress through behavioral modification stages</li>
|
||||
<li>Provide crisis management techniques for owners</li>
|
||||
</ul>
|
||||
|
||||
<h3>Multi-Trainer Consistency</h3>
|
||||
|
||||
<p>If you work with associate trainers or plan to scale your business, the command dictionary ensures everyone uses identical techniques:</p>
|
||||
|
||||
<ul>
|
||||
<li>Standardised training across all team members</li>
|
||||
<li>Easy onboarding for new trainers</li>
|
||||
<li>Quality control and consistency monitoring</li>
|
||||
<li>Seamless client transitions between trainers</li>
|
||||
</ul>
|
||||
|
||||
<div class="callout-box">
|
||||
<h4>🎯 Pro Tip</h4>
|
||||
<p>Include failure protocols in your command dictionary. Document what to do when a dog doesn't respond correctly, helping clients troubleshoot issues independently and maintain training momentum between sessions.</p>
|
||||
</div>
|
||||
|
||||
<h2>Why UK Dog Trainers Choose Fetch Metrics</h2>
|
||||
|
||||
<p><strong>Fetch Metrics</strong> is the only <strong>dog training management software</strong> designed specifically for the UK market. Unlike generic business tools or American-focused platforms, <strong>Fetch Metrics</strong> understands the unique needs of British dog trainers:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>UK-Specific Features:</strong> Designed for UK business practices and client expectations</li>
|
||||
<li><strong>Multi-Trainer Support:</strong> Perfect for training schools and larger facilities</li>
|
||||
<li><strong>Affordable Pricing:</strong> Starting at just £15/month for independent trainers</li>
|
||||
<li><strong>Customer Portal Integration:</strong> Clients can access their training materials 24/7</li>
|
||||
<li><strong>Mobile-Responsive Design:</strong> Use in the field during training sessions</li>
|
||||
</ul>
|
||||
|
||||
<h2>Real-World Implementation Success</h2>
|
||||
|
||||
<p>James Patterson, a certified canine behaviorist in Birmingham, implemented <strong>Fetch Metrics</strong> six months ago:</p>
|
||||
|
||||
<div class="quote-box">
|
||||
"Before Fetch Metrics, I was spending 2-3 hours per week just answering client questions about techniques. The command dictionary has eliminated 90% of those calls. More importantly, my dogs are achieving their training goals 3 weeks faster on average because owners can practice correctly at home."
|
||||
</div>
|
||||
|
||||
<p>His business has grown from 15 regular clients to 47, and his client satisfaction scores have increased by 23% since implementing the system.</p>
|
||||
|
||||
<h2>The Future of Professional Dog Training</h2>
|
||||
|
||||
<p>As the pet industry continues to grow in the UK, professional dog trainers need tools that help them deliver exceptional service while managing their businesses efficiently. <strong>Fetch Metrics dog training software</strong> provides the technological foundation that modern training businesses require to thrive.</p>
|
||||
|
||||
<p>The command dictionary feature is just one component of the comprehensive <strong>Fetch Metrics</strong> platform, which also includes client management, session scheduling, progress tracking, and business reporting tools.</p>
|
||||
|
||||
<h2>Getting Started Today</h2>
|
||||
|
||||
<p>Ready to transform your dog training practice with professional command documentation? <strong>Fetch Metrics</strong> offers a comprehensive free trial that lets you explore the command dictionary feature and see how it can improve your training outcomes.</p>
|
||||
|
||||
<p>The setup process takes less than 30 minutes, and you can begin adding commands immediately. Your clients will have access to their personalised command reference within hours of setup.</p>
|
||||
|
||||
<div class="callout-box">
|
||||
<h4>🚀 Start Your Free Trial</h4>
|
||||
<p>Visit <a href="https://fetch-metrics.co.uk">fetch-metrics.co.uk</a> to start your free trial and join hundreds of UK dog trainers who have already discovered the power of organised, professional training documentation.</p>
|
||||
</div>
|
||||
|
||||
<p>Professional dog trainers deserve professional tools. Make <strong>Fetch Metrics</strong> the foundation of your successful training business and watch your client satisfaction—and your revenue—grow.</p>
|
||||
|
||||
<p>The days of confused clients and inconsistent training are over. With <strong>Fetch Metrics</strong>, every command is clear, every technique is documented, and every client has the tools they need to succeed. Your dogs will learn faster, your clients will be happier, and your business will thrive.</p>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block article_tags %}
|
||||
<a href="#" class="tag">command dictionary</a>
|
||||
<a href="#" class="tag">dog training software</a>
|
||||
<a href="#" class="tag">client management</a>
|
||||
<a href="#" class="tag">training consistency</a>
|
||||
<a href="#" class="tag">professional tools</a>
|
||||
<a href="#" class="tag">Fetch Metrics</a>
|
||||
{% endblock %}
|
||||
|
||||
{% block author_bio %}
|
||||
<div class="author-bio-avatar">T</div>
|
||||
<h4>Teddy Middleton-Smith</h4>
|
||||
<p>Edward (Teddy) Middleton-Smith is the founder of Fetch Metrics and a software engineer who discovered his passion for dog training through his own rescue dogs. With over 8 years of hands-on training experience and 6+ years in professional software development, Teddy combines technical expertise with real-world training knowledge to solve the everyday challenges facing professional dog trainers.</p>
|
||||
<p>After witnessing firsthand how outdated systems were holding back talented trainers, Teddy set out to build purpose-designed software that actually understands the unique needs of the dog training industry. When he's not coding or writing about business growth strategies, you'll find him working with local rescue organisations or perfecting recall training with his own pack.</p>
|
||||
<p>Teddy holds a First Class Masters degree in Mechanical Engineering and believes that the best technology solutions come from deeply understanding the problems they're meant to solve.</p>
|
||||
{% endblock %}
|
||||
@@ -1,305 +1,254 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-GB">
|
||||
<head>
|
||||
{% include 'layouts/_shared_head.html' %}
|
||||
|
||||
|
||||
{% extends 'layouts/layout.html' %}
|
||||
|
||||
{% block page_head %}
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/blog_home.bundle.css') }}">
|
||||
</head>
|
||||
<body data-page="{{ model.hash_page_current }}">
|
||||
<div class="topnav">
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_LOGO }}">
|
||||
<img class="{{ model.FLAG_LOGO }}" src="{{ url_for('static', filename='images/fetch-metrics-logo-and-company-name-horizontal-1-link-visited-LQ.webp') }}" alt="Fetch Metrics logo" aria-label="Fetch Metrics logo" tabindex="0"> {# filename='images/fetch-metrics-logo-and-company-name-radial-0.5-link-visited-LQ.webp', 'images/Wisp_LQ.webp' #}
|
||||
</div>
|
||||
<div class="nav-links">
|
||||
<!--
|
||||
<a href="#{{ model.FLAG_HOME }}">Home</a>
|
||||
<a href="#{{ model.FLAG_FEATURES }}">Features</a>
|
||||
<a href="#{{ model.FLAG_PRICING }}">Pricing</a>
|
||||
<a href="#{{ model.FLAG_BLOG }}">Blog</a>
|
||||
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Contact Us</a>
|
||||
-->
|
||||
</div>
|
||||
</div>
|
||||
{% include 'layouts/_shared_header.html' %}
|
||||
{% endblock %}
|
||||
|
||||
<!-- Body -->
|
||||
<div id="{{ model.ID_PAGE_BODY }}">
|
||||
<section class="hero">
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<div class="hero-content" data-aos="fade-up">
|
||||
<!-- <a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_SUCCESS }}">NOW AVAILABLE</a> -->
|
||||
<h1>Dog Training Business Insights</h1>
|
||||
<p>Expert tips, industry trends, and practical advice to help you grow your professional dog training business</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{% block page_nav_links %}
|
||||
{#
|
||||
<a href="#{{ model.FLAG_PROBLEM }}">Problem</a>
|
||||
<a href="#{{ model.FLAG_BENEFITS }}">Benefits</a>
|
||||
<a href="#{{ model.FLAG_SOLUTION }}">Solution</a>
|
||||
<a href="#{{ model.FLAG_SOCIAL_PROOF }}">Social Proof</a>
|
||||
<a href="#{{ model.FLAG_TESTIMONIAL }}">Testimonial</a>
|
||||
<a href="#{{ model.FLAG_CTA_2 }}">Early Access</a>
|
||||
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Contact Us</a>
|
||||
#}
|
||||
{% endblock %}
|
||||
|
||||
{% block page_body %}
|
||||
<section class="hero">
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
|
||||
<div class="blog-grid">
|
||||
<!-- Featured Post -->
|
||||
<article class="featured-post">
|
||||
<div class="featured-image">🎯</div>
|
||||
<div class="featured-content">
|
||||
<span class="post-category">Business Growth</span>
|
||||
<h2>How to Scale Your Dog Training Business: From Solo Trainer to Multi-Trainer Success</h2>
|
||||
<div class="post-meta">
|
||||
<span>📅 9th August 2025</span>
|
||||
<span>⏱️ 8 min read</span>
|
||||
<span>👤 <a href="{{ model.URL_LINKEDIN_PERSONAL }}">Teddy Middleton-Smith</a></span>
|
||||
</div>
|
||||
<p class="post-excerpt">
|
||||
Discover how UK dog trainers use Fetch Metrics to scale from solo practices to multi-trainer businesses. Professional dog training management software for growing businesses.
|
||||
</p>
|
||||
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS }}" class="read-more {{ model.FLAG_NAV_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS }}">Read Full Article</a>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<!-- Sidebar -->
|
||||
<aside class="sidebar">
|
||||
<!-- Categories -->
|
||||
<div class="sidebar-widget">
|
||||
<h3 class="widget-title">Categories</h3>
|
||||
<ul class="category-list">
|
||||
<!--
|
||||
<li>
|
||||
<a href="#">Business Management</a>
|
||||
<span class="post-count">12</span>
|
||||
</li>
|
||||
-->
|
||||
<li>
|
||||
<a href="{{ model.HASH_PAGE_BLOG_CATEGORY_TRAINING_TECHNIQUES }}" class="{{ model.FLAG_NAV_BLOG_CATEGORY_TRAINING_TECHNIQUES }}">Training Techniques</a>
|
||||
<span class="post-count">2</span>
|
||||
</li>
|
||||
<!--
|
||||
<li>
|
||||
<a href="#">Client Relations</a>
|
||||
<span class="post-count">15</span>
|
||||
</li>
|
||||
-->
|
||||
<li>
|
||||
<a href="{{ model.HASH_PAGE_BLOG_CATEGORY_MARKETING_AND_GROWTH }}" class="{{ model.FLAG_NAV_BLOG_CATEGORY_MARKETING_AND_GROWTH }}">Marketing & Growth</a>
|
||||
<span class="post-count">1</span>
|
||||
</li>
|
||||
<!--
|
||||
<li>
|
||||
<a href="#">Technology & Tools</a>
|
||||
<span class="post-count">9</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#">Industry News</a>
|
||||
<span class="post-count">4</span>
|
||||
</li>
|
||||
-->
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!-- Recent Posts -->
|
||||
<div class="sidebar-widget">
|
||||
<h3 class="widget-title">Recent Posts</h3>
|
||||
<ul class="recent-posts">
|
||||
<li class="recent-post-item">
|
||||
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_WHY_EVERY_TRAINER_NEEDS_A_COMMAND_DICTIONARY }}" class="recent-post-title {{ model.FLAG_NAV_BLOG_ARTICLE_WHY_EVERY_TRAINER_NEEDS_A_COMMAND_DICTIONARY }}">Why Every Professional Dog Trainer Needs a Command Dictionary in 2025</a>
|
||||
<div class="recent-post-date">10th August 2025</div>
|
||||
</li>
|
||||
<li class="recent-post-item">
|
||||
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS }}" class="recent-post-title {{ model.FLAG_NAV_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS }}">The Science Behind Dog Training Assessments: How to Track Real Progress</a>
|
||||
<div class="recent-post-date">9th August 2025</div>
|
||||
</li>
|
||||
<li class="recent-post-item">
|
||||
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS }}" class="recent-post-title {{ model.FLAG_NAV_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS }}">How to Scale Your Dog Training Business: From Solo Trainer to Multi-Trainer Success</a>
|
||||
<div class="recent-post-date">8th August 2025</div>
|
||||
</li>
|
||||
<!--
|
||||
<li class="recent-post-item">
|
||||
<a href="#" class="recent-post-title">Pricing Your Training Services: A Complete Guide</a>
|
||||
<div class="recent-post-date">March 5, 2025</div>
|
||||
</li>
|
||||
-->
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!-- Newsletter Signup -->
|
||||
<div class="sidebar-widget">
|
||||
<h3 class="widget-title">Stay Updated</h3>
|
||||
<p style="margin-bottom: 1rem; color: #666;">Get weekly insights and tips delivered to your inbox.</p>
|
||||
<form class="newsletter-form">
|
||||
<input type="email" class="newsletter-input" placeholder="Your email address" required>
|
||||
<button type="submit" class="newsletter-btn">Subscribe Now</button>
|
||||
</form>
|
||||
</div>
|
||||
</aside>
|
||||
<div class="hero-content" data-aos="fade-up">
|
||||
<!-- <a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_SUCCESS }}">NOW AVAILABLE</a> -->
|
||||
<h1>Dog Training Business Insights</h1>
|
||||
<p>Expert tips, industry trends, and practical advice to help you grow your professional dog training business</p>
|
||||
</div>
|
||||
|
||||
<!-- More Blog Posts -- >
|
||||
<section class="blog-posts-grid">
|
||||
<article class="blog-post-card">
|
||||
<div class="post-image">📊</div>
|
||||
<div class="post-content">
|
||||
<span class="post-category">Analytics</span>
|
||||
<h3>Understanding Your Training Success Metrics</h3>
|
||||
<div class="post-meta">
|
||||
<span>📅 March 13, 2025</span>
|
||||
<span>⏱️ 6 min read</span>
|
||||
</div>
|
||||
<p class="post-excerpt">
|
||||
Learn which metrics matter most for measuring training progress and client satisfaction.
|
||||
</p>
|
||||
<a href="#" class="read-more">Read More</a>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<article class="blog-post-card">
|
||||
<div class="post-image">🤝</div>
|
||||
<div class="post-content">
|
||||
<span class="post-category">Client Relations</span>
|
||||
<h3>Building Long-term Client Relationships</h3>
|
||||
<div class="post-meta">
|
||||
<span>📅 March 11, 2025</span>
|
||||
<span>⏱️ 5 min read</span>
|
||||
</div>
|
||||
<p class="post-excerpt">
|
||||
Strategies for maintaining strong relationships with clients beyond the initial training period.
|
||||
</p>
|
||||
<a href="#" class="read-more">Read More</a>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<article class="blog-post-card">
|
||||
<div class="post-image">💡</div>
|
||||
<div class="post-content">
|
||||
<span class="post-category">Training Techniques</span>
|
||||
<h3>Command Dictionary: Essential Training Signals</h3>
|
||||
<div class="post-meta">
|
||||
<span>📅 March 9, 2025</span>
|
||||
<span>⏱️ 7 min read</span>
|
||||
</div>
|
||||
<p class="post-excerpt">
|
||||
A comprehensive guide to standardizing commands and hand signals for consistent training results.
|
||||
</p>
|
||||
<a href="#" class="read-more">Read More</a>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<article class="blog-post-card">
|
||||
<div class="post-image">🚀</div>
|
||||
<div class="post-content">
|
||||
<span class="post-category">Business Growth</span>
|
||||
<h3>Digital Marketing for Dog Trainers in 2025</h3>
|
||||
<div class="post-meta">
|
||||
<span>📅 March 7, 2025</span>
|
||||
<span>⏱️ 9 min read</span>
|
||||
</div>
|
||||
<p class="post-excerpt">
|
||||
Modern marketing strategies that actually work for professional dog training businesses.
|
||||
</p>
|
||||
<a href="#" class="read-more">Read More</a>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<article class="blog-post-card">
|
||||
<div class="post-image">🎓</div>
|
||||
<div class="post-content">
|
||||
<span class="post-category">Professional Development</span>
|
||||
<h3>Advanced Certification: Is It Worth It?</h3>
|
||||
<div class="post-meta">
|
||||
<span>📅 March 6, 2025</span>
|
||||
<span>⏱️ 4 min read</span>
|
||||
</div>
|
||||
<p class="post-excerpt">
|
||||
Exploring the ROI of advanced certifications and specialized training for professional trainers.
|
||||
</p>
|
||||
<a href="#" class="read-more">Read More</a>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<article class="blog-post-card">
|
||||
<div class="post-image">📱</div>
|
||||
<div class="post-content">
|
||||
<span class="post-category">Technology</span>
|
||||
<h3>Why Paper Records Are Holding You Back</h3>
|
||||
<div class="post-meta">
|
||||
<span>📅 March 4, 2025</span>
|
||||
<span>⏱️ 6 min read</span>
|
||||
</div>
|
||||
<p class="post-excerpt">
|
||||
The hidden costs of manual record-keeping and how digital solutions transform training businesses.
|
||||
</p>
|
||||
<a href="#" class="read-more">Read More</a>
|
||||
</div>
|
||||
</article>
|
||||
</section>
|
||||
-->
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="footer">
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<div class="footer-content">
|
||||
<div class="footer-section">
|
||||
<h3>{{ model.NAME_COMPANY }}</h3>
|
||||
<p>Company Number: {{ model.COMPANY_NUMBER }}</p>
|
||||
<p>Registered in England and Wales</p>
|
||||
<p>Registered Office: {{ model.COMPANY_ADDRESS_SHORT }}</p>
|
||||
<div class="blog-grid">
|
||||
<!-- Featured Post -->
|
||||
<article class="featured-post">
|
||||
<div class="featured-image">🎯</div>
|
||||
<div class="featured-content">
|
||||
<span class="post-category">Training Techniques</span>
|
||||
<h2>Why Every Professional Dog Trainer Needs a Command Dictionary in 2025</h2>
|
||||
<div class="post-meta">
|
||||
<span>📅 10th August 2025</span>
|
||||
<span>⏱️ 12 min read</span>
|
||||
<span>👤 <a href="{{ model.URL_LINKEDIN_PERSONAL }}">Teddy Middleton-Smith</a></span>
|
||||
</div>
|
||||
<p class="post-excerpt">
|
||||
Discover how UK dog trainers use Fetch Metrics to maximise client consistency at home.
|
||||
</p>
|
||||
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_WHY_EVERY_PROFESSIONAL_TRAINER_NEEDS_A_COMMAND_DICTIONARY_IN_2025 }}" class="recent-post-title {{ model.FLAG_NAV_BLOG_ARTICLE_WHY_EVERY_TRAINER_NEEDS_A_COMMAND_DICTIONARY }}">Read Full Article</a>
|
||||
</div>
|
||||
|
||||
<div class="footer-section">
|
||||
<h3>Legal</h3>
|
||||
<ul>
|
||||
<li><a href="{{ model.HASH_PAGE_PRIVACY_POLICY }}">Privacy Policy</a></li>
|
||||
<li><a href="{{ model.HASH_PAGE_ACCESSIBILITY_STATEMENT }}">Accessibility Statement</a></li>
|
||||
</article>
|
||||
|
||||
<!-- Sidebar -->
|
||||
<aside class="sidebar">
|
||||
<!-- Categories -->
|
||||
<div class="sidebar-widget">
|
||||
<h3 class="widget-title">Categories</h3>
|
||||
<ul class="category-list">
|
||||
<!--
|
||||
<li>
|
||||
<a href="#">Business Management</a>
|
||||
<span class="post-count">12</span>
|
||||
</li>
|
||||
-->
|
||||
<li>
|
||||
<a href="{{ model.HASH_PAGE_BLOG_CATEGORY_TRAINING_TECHNIQUES }}" class="{{ model.FLAG_NAV_BLOG_CATEGORY_TRAINING_TECHNIQUES }}">Training Techniques</a>
|
||||
<span class="post-count">2</span>
|
||||
</li>
|
||||
<!--
|
||||
<li>
|
||||
<a href="#">Client Relations</a>
|
||||
<span class="post-count">15</span>
|
||||
</li>
|
||||
-->
|
||||
<li>
|
||||
<a href="{{ model.HASH_PAGE_BLOG_CATEGORY_MARKETING_AND_GROWTH }}" class="{{ model.FLAG_NAV_BLOG_CATEGORY_MARKETING_AND_GROWTH }}">Marketing & Growth</a>
|
||||
<span class="post-count">1</span>
|
||||
</li>
|
||||
<!--
|
||||
<li>
|
||||
<a href="#">Technology & Tools</a>
|
||||
<span class="post-count">9</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#">Industry News</a>
|
||||
<span class="post-count">4</span>
|
||||
</li>
|
||||
-->
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer-content">
|
||||
<div class="footer-section contact">
|
||||
<h3>Contact</h3>
|
||||
<!--
|
||||
<ul>
|
||||
<li><a href="mailto:{{ model.get_mail_contact_public() }}">Email: {{ model.get_mail_contact_public() }}</a></li>
|
||||
<li><a href="{{ model.URL_DISCORD }}">Discord: {{ model.USERNAME_DISCORD }}</a></li>
|
||||
< !-- <li><a href="{{ model.URL_FACEBOOK }}">Facebook: {{ model.USERNAME_FACEBOOK }}</a></li> -- >
|
||||
<li><a href="{{ model.URL_GITHUB }}">GitHub: {{ model.USERNAME_GITHUB }}</a></li>
|
||||
<li><a href="{{ model.URL_INSTAGRAM }}">Instagram: {{ model.USERNAME_INSTAGRAM }}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="footer-section contact">
|
||||
<h3 style="color: #1f2937;">Contact</h3>
|
||||
<ul>
|
||||
< !-- <li>Phone</li> -- >
|
||||
< !-- <li><a href="{{ model.URL_LINKEDIN }}">LinkedIn: {{ model.USERNAME_LINKEDIN }}</a></li> -- >
|
||||
<li><a href="{{ model.URL_REDDIT }}">Reddit: {{ model.USERNAME_REDDIT }}</a></li>
|
||||
<li><a href="{{ model.URL_TIKTOK }}">TikTok: {{ model.USERNAME_TIKTOK }}</a></li>
|
||||
<li><a href="{{ model.URL_TWITTER }}">Twitter: {{ model.USERNAME_TWITTER }}</a></li>
|
||||
</ul>
|
||||
-->
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="mailto:{{ model.get_mail_contact_public() }}"><strong>Email:</strong> {{ model.get_mail_contact_public() }}</a></div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_DISCORD }}"><strong>Discord:</strong> {{ model.USERNAME_DISCORD }}</a></div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_FACEBOOK }}"><strong>Facebook:</strong> {{ model.USERNAME_FACEBOOK }}</a></div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_GITHUB }}"><strong>GitHub:</strong> {{ model.USERNAME_GITHUB }}</a></div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_INSTAGRAM }}"><strong>Instagram:</strong> {{ model.USERNAME_INSTAGRAM }}</a></div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_LINKEDIN }}"><strong>LinkedIn:</strong> {{ model.USERNAME_LINKEDIN }}</a></div>
|
||||
<!-- <div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><strong>Phone:</strong> {{ model.PHONE_NUMBER_CONTACT_PUBLIC }}</div> -->
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_REDDIT }}"><strong>Reddit:</strong> {{ model.USERNAME_REDDIT }}</a></div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_TIKTOK }}"><strong>TikTok:</strong> {{ model.USERNAME_TIKTOK }}</a></div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_TWITTER }}"><strong>Twitter:</strong> {{ model.USERNAME_TWITTER }}</a></div>
|
||||
<!-- <div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><a href="{{ model.URL_YOUTUBE }}"><strong>Youtube:</strong> {{ model.USERNAME_YOUTUBE }}</a></div> -->
|
||||
<!-- Recent Posts -->
|
||||
<div class="sidebar-widget">
|
||||
<h3 class="widget-title">Recent Posts</h3>
|
||||
<ul class="recent-posts">
|
||||
<li class="recent-post-item">
|
||||
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_WHY_EVERY_PROFESSIONAL_TRAINER_NEEDS_A_COMMAND_DICTIONARY_IN_2025 }}" class="recent-post-title {{ model.FLAG_NAV_BLOG_ARTICLE_WHY_EVERY_TRAINER_NEEDS_A_COMMAND_DICTIONARY }}">Why Every Professional Dog Trainer Needs a Command Dictionary in 2025</a>
|
||||
<div class="recent-post-date">10th August 2025</div>
|
||||
</li>
|
||||
<li class="recent-post-item">
|
||||
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS_FROM_25_TO_100_PLUS_CLIENTS }}" class="recent-post-title {{ model.FLAG_NAV_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS_FROM_25_TO_100_PLUS_CLIENTS }}">How to Scale Your Dog Training Business: from 25 to 100+ Clients</a>
|
||||
<div class="recent-post-date">9th August 2025</div>
|
||||
</li>
|
||||
<li class="recent-post-item">
|
||||
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS_HOW_TRACK_REAL_PROGRESS }}" class="recent-post-title {{ model.FLAG_NAV_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS }}">The Science Behind Dog Training Assessments: How to Track Real Progress</a>
|
||||
<div class="recent-post-date">9th August 2025</div>
|
||||
</li>
|
||||
<li class="recent-post-item">
|
||||
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS_FROM_SOLO_TO_MULTI_TRAINER_SUCCESS }}" class="recent-post-title {{ model.FLAG_NAV_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS_FROM_SOLO_TO_MULTI_TRAINER_SUCCESS }}">How to Scale Your Dog Training Business: From Solo Trainer to Multi-Trainer Success</a>
|
||||
<div class="recent-post-date">8th August 2025</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="footer-bottom">
|
||||
<p>© {{ current_year }} {{ model.NAME_COMPANY }}. <a href="{{ model.HASH_PAGE_LICENSE }}" alt="License" aria-label="License">All rights reserved.</a></p>
|
||||
|
||||
<!-- Newsletter Signup -->
|
||||
<div class="sidebar-widget">
|
||||
<h3 class="widget-title">Weekly Business Tips</h3>
|
||||
<p style="margin-bottom: 1rem; color: #666;">Get proven strategies delivered to your inbox every Tuesday. Join 2,400+ successful dog trainers.</p>
|
||||
<!--
|
||||
<form class="newsletter-form">
|
||||
<input type="email" class="newsletter-input" placeholder="Your email address" required>
|
||||
<button type="submit" class="newsletter-btn">Subscribe Now</button>
|
||||
</form>
|
||||
-->
|
||||
{% set form = model.form_newsletter %}
|
||||
<form id="{{ model.ID_NEWSLETTER_FORM }}" method="POST" action="{{ model.HASH_POST_BLOG_NEWSLETTER }}">
|
||||
{{ form.csrf_token }}
|
||||
<div class="form-grid">
|
||||
<div>
|
||||
{{ form.email(class="form-input", required=True, placeholder="Your email address") }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_CAPTCHA }}">
|
||||
<div style="margin: 0 auto; width: fit-content;">
|
||||
{{ form.altcha.label }}
|
||||
<altcha-widget
|
||||
class="altcha-widget"
|
||||
challengeurl="{{ model.HASH_GET_ALTCHA_CHALLENGE }}"
|
||||
auto="onload"
|
||||
id="{{ form.altcha.id }}"
|
||||
name="{{ form.altcha.name }}"
|
||||
></altcha-widget>
|
||||
</div>
|
||||
<p style="font-size: 0.9rem;">This CAPTCHA mechanism is fully GDPR-compliant with no cookies, no fingerprinting, no tracking, and runs in the background so you don't need to do anything!</p>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER_INPUT }}">
|
||||
{{ form.submit() }}
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<!-- More Blog Posts -->
|
||||
<section class="blog-posts-grid">
|
||||
<article class="blog-post-card">
|
||||
<div class="post-image">📊</div>
|
||||
<div class="post-content">
|
||||
<span class="post-category">Training Techniques</span>
|
||||
<h3>Why Every Professional Dog Trainer Needs a Command Dictionary in 2025</h3>
|
||||
<div class="post-meta">
|
||||
<span>📅 10th August 2025</span>
|
||||
<span>⏱️ 12 min read</span>
|
||||
</div>
|
||||
<p class="post-excerpt">
|
||||
Discover how UK dog trainers use Fetch Metrics to maximise client consistency at home.
|
||||
</p>
|
||||
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_WHY_EVERY_PROFESSIONAL_TRAINER_NEEDS_A_COMMAND_DICTIONARY_IN_2025 }}" class="read-more">Read More</a>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<article class="blog-post-card">
|
||||
<div class="post-image">🤝</div>
|
||||
<div class="post-content">
|
||||
<span class="post-category">Marketing & Growth</span>
|
||||
<h3>How to Scale Your Dog Training Business: from 25 to 100+ Clients</h3>
|
||||
<div class="post-meta">
|
||||
<span>📅 9th August 2025</span>
|
||||
<span>⏱️ 8 min read</span>
|
||||
</div>
|
||||
<p class="post-excerpt">
|
||||
Key strategies that separate trainers who successfully scale from those who plateau at 20-30 clients.
|
||||
</p>
|
||||
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS_FROM_25_TO_100_PLUS_CLIENTS }}" class="read-more">Read More</a>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<article class="blog-post-card">
|
||||
<div class="post-image">💡</div>
|
||||
<div class="post-content">
|
||||
<span class="post-category">Training Techniques</span>
|
||||
<h3>The Science Behind Dog Training Assessments: How to Track Real Progress</h3>
|
||||
<div class="post-meta">
|
||||
<span>📅 9th August 2025</span>
|
||||
<span>⏱️ 12 min read</span>
|
||||
</div>
|
||||
<p class="post-excerpt">
|
||||
A comprehensive guide to nuanced dog training progress analysis.
|
||||
</p>
|
||||
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS_HOW_TRACK_REAL_PROGRESS }}" class="read-more">Read More</a>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<article class="blog-post-card">
|
||||
<div class="post-image">🚀</div>
|
||||
<div class="post-content">
|
||||
<span class="post-category">Marketing & Growth</span>
|
||||
<h3>How to Scale Your Dog Training Business: From Solo Trainer to Multi-Trainer Success</h3>
|
||||
<div class="post-meta">
|
||||
<span>📅 8th August 2025</span>
|
||||
<span>⏱️ 12 min read</span>
|
||||
</div>
|
||||
<p class="post-excerpt">
|
||||
Key strategies that make the difference between chaotic expansion and systematic growth.
|
||||
</p>
|
||||
<a href="{{ model.HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS_FROM_SOLO_TO_MULTI_TRAINER_SUCCESS }}" class="read-more">Read More</a>
|
||||
</div>
|
||||
</article>
|
||||
<!--
|
||||
<article class="blog-post-card">
|
||||
<div class="post-image">🎓</div>
|
||||
<div class="post-content">
|
||||
<span class="post-category">Professional Development</span>
|
||||
<h3>Advanced Certification: Is It Worth It?</h3>
|
||||
<div class="post-meta">
|
||||
<span>📅 March 6, 2025</span>
|
||||
<span>⏱️ 4 min read</span>
|
||||
</div>
|
||||
<p class="post-excerpt">
|
||||
Exploring the ROI of advanced certifications and specialized training for professional trainers.
|
||||
</p>
|
||||
<a href="#" class="read-more">Read More</a>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<article class="blog-post-card">
|
||||
<div class="post-image">📱</div>
|
||||
<div class="post-content">
|
||||
<span class="post-category">Technology</span>
|
||||
<h3>Why Paper Records Are Holding You Back</h3>
|
||||
<div class="post-meta">
|
||||
<span>📅 March 4, 2025</span>
|
||||
<span>⏱️ 6 min read</span>
|
||||
</div>
|
||||
<p class="post-excerpt">
|
||||
The hidden costs of manual record-keeping and how digital solutions transform training businesses.
|
||||
</p>
|
||||
<a href="#" class="read-more">Read More</a>
|
||||
</div>
|
||||
</article>
|
||||
-->
|
||||
</section>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
{% include 'layouts/_shared_scripts.html' %}
|
||||
{% include 'layouts/_shared_dog_scripts.html' %}
|
||||
<script src="{{ url_for('static', filename='dist/js/main.bundle.js') }}"></script>
|
||||
</body>
|
||||
</html>
|
||||
{% endblock %}
|
||||
26
templates/pages/blog/_newsletter_success.html
Normal file
26
templates/pages/blog/_newsletter_success.html
Normal file
@@ -0,0 +1,26 @@
|
||||
{% extends 'layouts/layout.html' %}
|
||||
|
||||
{% block page_head %}
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/core_contact.bundle.css') }}">
|
||||
<!-- <link rel="stylesheet" href="{{ url_for('static', filename='dist/css/blog_newsletter_success.bundle.css') }}"> -->
|
||||
{% include 'layouts/_shared_project_hub_scripts.html' %}
|
||||
{% endblock %}
|
||||
|
||||
{% block page_nav_links %}
|
||||
{% endblock %}
|
||||
|
||||
{% block page_body %}
|
||||
|
||||
{% set form = model.form_contact %}
|
||||
<section class="contact-section">
|
||||
<div class="contact-form">
|
||||
<h1>Message Received</h1>
|
||||
<p>Thanks for subscribing to our newsletter!</p>
|
||||
<a href="{{ model.HASH_PAGE_BLOG_HOME }}" class="{{ model.FLAG_NAV_BLOG_HOME }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}"
|
||||
style="margin: 0 auto;">Return To Blog</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<script>
|
||||
</script>
|
||||
{% endblock %}
|
||||
@@ -34,9 +34,9 @@
|
||||
{{ form.contact_name(class="form-input", required=True) }}
|
||||
</div>
|
||||
|
||||
<label class="form-label" for="{{ form.company_name.id }}">{{ form.company_name.label.text }} *</label>
|
||||
<label class="form-label" for="{{ form.company_name.id }}">{{ form.company_name.label.text }}</label>
|
||||
<div>
|
||||
{{ form.company_name(class="form-input", required=True) }}
|
||||
{{ form.company_name(class="form-input", required=False) }}
|
||||
</div>
|
||||
|
||||
<label class="form-label" for="{{ form.message.id }}">{{ form.message.label.text }} *</label>
|
||||
|
||||
@@ -48,16 +48,29 @@ module.exports = {
|
||||
// Blog
|
||||
blog_home: [
|
||||
path.resolve(__dirname, 'static/css/sections/core.css'),
|
||||
/*
|
||||
path.resolve(__dirname, 'static/css/pages/core/home.css'),
|
||||
*/
|
||||
path.resolve(__dirname, 'static/css/sections/blog.css'),
|
||||
path.resolve(__dirname, 'static/css/pages/blog/home.css')
|
||||
],
|
||||
blog_article: [
|
||||
path.resolve(__dirname, 'static/css/sections/core.css'),
|
||||
/*
|
||||
path.resolve(__dirname, 'static/css/pages/core/home.css'),
|
||||
*/
|
||||
path.resolve(__dirname, 'static/css/sections/blog.css'),
|
||||
path.resolve(__dirname, 'static/css/pages/blog/article.css')
|
||||
],
|
||||
blog_newsletter_success: [
|
||||
path.resolve(__dirname, 'static/css/sections/core.css'),
|
||||
path.resolve(__dirname, 'static/css/pages/core/contact.css'),
|
||||
/*
|
||||
path.resolve(__dirname, 'static/css/pages/core/home.css'),
|
||||
path.resolve(__dirname, 'static/css/sections/blog.css'),
|
||||
*/
|
||||
path.resolve(__dirname, 'static/css/pages/blog/newsletter_success.css')
|
||||
],
|
||||
// Legal
|
||||
/*
|
||||
legal_accessibility_report: [
|
||||
|
||||
Reference in New Issue
Block a user