many segments and focus on them individually. So, the product-market fit will be a continuum of discovering a repeatable sales process for each segment. - Product-Market Fit
model ❌ Started with individual facility managers (B2C) ❌ Kicking off a service marketplace on top of mobile app ❌ Trying to expand to Spain ❌ Mistakes
Bring more customers > Reduce support load ? Quality of life - for customers, for me (DX) @ Fast track % Critical bugs ☀ 10 minute features or fixes B Friday (dedicated 2~3h) C Fix exceptions / bugs D Bump dependancies E Pay tech depth
(~2-4h) • Keep company in sync and make decisions • Set goal for next week • Required for everybody • Share company CORE and HEALTH metrics • Share progress of product and support • Support shares common issues • Discussion on major issues • What surprises we encountered • What are the biggest blockers we are facing • sometime brainstorm
N Bulletin board ; Notifications O Taxation E Contacts P Omni search Q Reporting R Printing S Bookkeeping T Voting U Financials V Homebook W Debtors X Bulk operations ⚙ Messaging Z Calendar [ Funds \ ePay / EasyPay ] Bank imports ^ Invoicing _ Warranty Issues ` Technicians D Individual accounts a Business accounts M Audit logs / Archiving b Trials c Demo d I18n G e f Marketing site g
track active and archived apartments separately counter_culture :building, column_name: -> { _1.active? ? :apartments_count : :archived_apartments_count } # can do this for the whole account counter_culture %i(building account), column_name: -> { _1.building.active? && _1.active? ? :apartments_count : :arch # can track a sum of a columns counter_culture :building, column_name: :unpaid_taxes_amount, delta_magnitude: -> { _1.unpaid_taxes_amount } counter_culture :building, column_name: :deposit_amount, delta_magnitude: -> { _1.deposit_amount } end
user.admin? || account.member?(user) end end # generates ApplicationPolicy.can_access_account?(user, account) # can be accessed as ApplicationPolicy.can?(user, :access, account) ApplicationPolicy.authorize!(user, :access, account) # raise KittyPolicy::AccessDenied
template: 'system/unauthorized' end end class_methods do def require_account_feature(feature_name) self.required_account_feature = feature_name end end private def find_record(scope, id = :none, authorize: :view) record = scope.find(id == :none ? params[:id] : id) ApplicationPolicy.authorize!(current_user, authorize, record) if self.class.required_account_feature.present? Accounts.feature_available!(record, self.class.required_account_feature) end
scope.find(id == :none ? params[:id] : id) ApplicationPolicy.authorize!(current_user, authorize, record) if self.class.required_account_feature.present? Accounts.feature_available!(record, self.class.required_account_feature) end record end end
record.respond_to?(:account) record.account elsif record.respond_to?(:building) record.building.account else raise "Can't find account for #{record.class}##{record.id}" end end def feature_available?(record, feature_name) account_of(record).features.available?(feature_name) end def feature_available!(record, feature_name) return if feature_available?(record, feature_name) raise FeatureUnavailable.new(record, feature_name) end end