44 KiB
AgMission BigQuery Analytics Mapping
Comprehensive Mapping of Analytics Questions to BigQuery Parameters
Overview
This document maps specific analytics questions from the AgMission role-based analytics framework to their corresponding BigQuery queries and parameters. It identifies which parameters are already available in the current GA4 events interface and specifies how to collect any missing parameters.
This document is based on:
- Unified Event Reference:
/client/AgMission-GA4-Complete-Reference.csv - Interface Definition:
/src/app/shared/types/ga4-events.interface.ts - Implementation Status: Focus on E-commerce subscription tracking with correct package names
Table of Contents
- Available Parameters Inventory
- Event Structure Reference
- Role-Based Analytics Mapping
- E-commerce Analytics
- Missing Parameters Analysis
- Implementation Recommendations
Available Parameters Inventory
Current GA4 Event Parameters (From Interface)
Base Context (Available on All Events)
user_id- User identifiersession_id- Session identifieruser_role- User role (admin, applicator, office_admin, client, officer, pilot, inspector, aircraft)subscription_tier- Subscription tier level (string: "1", "2", "3", "4", "5", "addon", "unknown")app_version- Application versionplatform- Platform type (web)
Job Management Parameters
job_type- Type of job (spraying, seeding, fertilizing, harvesting, soil_testing)field_size_acres- Field size in acrescrop_type- Crop typeequipment_type- Equipment usedpriority- Job priority (low, medium, high, urgent)client_id- Client identifierweather_dependency- Weather dependency booleancreation_method- Job creation method (manual, template, duplicate)estimated_duration_hours- Expected job duration in hoursjob_status- Job status (new, ready, downloaded, sprayed, archived, invoiced)efficiency_score- Job efficiency scoreassignee_id- Assigned user IDassignee_role- Assigned user role (pilot, applicator, officer, admin)assignment_method- Assignment method (manual, auto, bulk)assignment_lead_time_hours- Lead time in hoursfields_modified- List of fields changed in updateschange_magnitude- Magnitude of changes (minor, major)edit_session_duration- Time spent editing in minutessave_method- How update was saved (manual, auto_save)deletion_reason- Reason for job deletiondeletion_method- How deletion was triggeredtime_since_creation- Time between creation and deletionold_status- Previous status before changenew_status- New status after changestatus_change_reason- Reason for status changecompletion_time- Time to complete job
Job List Operation Parameters
view_type- Type of list view (table, grid, map, calendar)total_jobs- Total jobs availabledisplayed_jobs- Number of jobs shownsort_by- Sort criteriafilter_count- Number of active filtersload_time_ms- List load timeclient_filter_applied- Whether client filter is activereload_interval- Auto-reload intervalfilter_type- Type of filter appliedfilter_value- Value of applied filterresults_before- Results count before filterresults_after- Results count after filterfilter_effectiveness- Filter effectiveness percentagedate_filter_type- Type of date filtercustom_date_range- Custom date rangeselection_method- Method used to select jobposition_in_list- Position of job in listaction_type- Type of bulk actionjob_count- Number of jobs affectedjob_ids- List of job IDs affectedexecution_time- Time to execute actionsuccess_rate- Success rate of action
File Management Parameters
file_type- File type (field_boundary, prescription_map, application_report, soil_map)file_size_mb- File size in MBrelated_job_id- Related job identifierupload_source- Upload source (manual, drag_drop, bulk)processing_time_seconds- Processing timevalidation_status- Validation status (passed, failed, warning)data_quality_score- Data quality scoreautomation_enabled- Automation statuserror_type- Error type for failed uploadserror_message- Error messageretry_attempted- Whether retry was attempteddeletion_reason- File deletion reasonfile_age_days- File age in daysconfirmation_required- Whether confirmation was requireddownload_method- Download methodfile_format- File format (original, converted)download_source- Download source
Library Upload Parameters
upload_type- Type of library upload (field_areas, boundary_data, geographic_data)file_count- Number of files uploadedtotal_areas_uploaded- Total areas uploadedduplicate_areas_found- Number of duplicates foundfailed_files- Number of failed filesfile_types- Array of file typestotal_file_size_mb- Total file sizeprocessing_method- Processing method (bulk, individual)
Report Parameters
report_type- Type of report (job_summary, financial_analysis, field_report, performance_dashboard)report_id- Report identifierdate_range_days- Date range in daysjobs_included- Number of jobs includedgeneration_time_seconds- Report generation timedata_completeness- Data completeness percentageview_duration_seconds- View durationpages_viewed- Number of pages viewedengagement_quality- Engagement quality (low, medium, high)export_format- Export format (pdf, excel, csv)render_duration_ms- Render durationdata_size_mb- Data sizecomplexity_score- Report complexity scoredesign_session_duration- Design session durationmodifications_made- Number of modificationsscroll_depth- Scroll depth percentage
Invoice Management Parameters
invoice_id- Invoice identifierclient_id- Client identifiertotal_amount- Invoice amountcurrency- Currency type (USD, CAD, EUR)job_count- Number of jobs in invoicecreation_method- Creation method (manual, auto_generated, template, recurring)due_date_days- Due date in dayspayment_terms- Payment termsfields_modified- List of modified fieldsamount_change- Amount changeprevious_status- Previous invoice statuscurrent_status- Current invoice statusmodification_type- Type of modificationinvoice_status- Invoice status (new, draft, open, paid, void, uncollectible)deletion_reason- Deletion reasondays_since_creation- Days since creationhad_payments- Whether invoice had paymentsold_status- Previous statusnew_status- New statusstatus_change_reason- Status change reasondays_in_previous_status- Days in previous statuspayment_amount- Payment amountpayment_method- Payment method (cash, check, credit_card, bank_transfer, other)payment_date- Payment dateremaining_balance- Remaining balancepayment_reference- Payment referencedays_to_payment- Days to paymenttotal_invoices- Total number of invoicesdisplayed_invoices- Number of displayed invoicesdate_range_applied- Whether date range filter appliedstatus_filter_applied- Whether status filter appliedmultiple_filters_active- Whether multiple filters activeinvoice_amount- Invoice amounttotal_amount_affected- Total amount affected by bulk actionview_source- View source (list, direct_link, search, navigation)export_method- Export method (single, bulk)file_size_kb- Export file sizeincludes_job_details- Whether export includes job detailssettings_modified- List of modified settingsautomation_enabled- Whether automation enabledpayment_terms_changed- Whether payment terms changedbilling_preferences_updated- Whether billing preferences updateditem_id- Item identifieritem_type- Item type (service, material, equipment, labor)unit_type- Unit type (per_acre, per_hour, flat_rate, per_unit)base_rate- Base rateaffects_existing_invoices- Whether affects existing invoices
Authentication Parameters
method- Login/signup method (email, google, microsoft, sso)last_login_days_ago- Days since last loginsession_duration_minutes- Session durationlogout_method- Logout method (manual, timeout, forced)page_location- Page location at logoutsignup_method- Signup methoduser_type- User type (client, applicator, admin, office_admin)source- Signup source (landing_page, referral, advertisement, direct)invitation_code- Invitation codecompany_name- Company namesignup_duration_minutes- Signup durationprofile_completed- Whether profile completedverification_required- Whether verification requiredemail_address_hash- Hashed email addressrequest_method- Request method for password/email actionsuser_exists- Whether user existsreset_token_age_minutes- Reset token agesuccess- Whether action was successfulfailure_reason- Failure reasonverification_token_age_minutes- Verification token age
Error Tracking Parameters
error_type- Error type (network_error, server_error, client_error, timeout, unknown_error)http_status_code- HTTP status codeerror_message- Error messagerequest_method- Request method (GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS)request_url- Request URLrequest_endpoint- Request endpointresponse_time_ms- Response timeaffected_feature- Affected feature
Session & Performance Parameters
entry_page- Entry pagereferrer- Referrer URLpage_title- Page titleload_time_ms- Page load timeconnection_type- Connection type (wifi, cellular, ethernet, unknown)device_type- Device type (desktop, mobile, tablet)api_endpoint- API endpointresponse_time_ms- API response timepayload_size- Payload sizecache_hit- Whether cache hit
E-commerce Parameters
subscription_type- AgMission package name (e.g., "AgMission Essentials 1", "AgMission Enterprise 3")subscription_duration- Duration (monthly, quarterly, annual)subscription_price- Subscription priceprevious_subscription_type- Previous subscription typepayment_method- Payment method (credit_card, bank_transfer, paypal, invoice)billing_frequency- Billing frequency (monthly, quarterly, annual)promo_code- Promotional codediscount_amount- Discount amountsubscription_start_date- Start dateauto_renewal- Auto renewal settingupgrade_from- Upgrade from packageupgrade_to- Upgrade to packagetrial_conversion- Whether trial conversionsubscription_value- Subscription valueuser_tenure_days- User tenure in daysservice_type- Service category (essential, enterprise, addon)is_trial- Whether trial subscription
Event Structure Reference
Event Categories and Names (From Unified Reference)
Job Management Events
job_created- User creates a new agricultural jobjob_updated- User modifies an existing jobjob_deleted- User removes a job from systemjob_assigned- Job assigned to pilot or operatorjob_status_changed- Job status transitions
Job List Operations
job_list_viewed- User accesses the jobs list interfacejob_list_filtered- User applies filters to narrow job resultsjob_selected- User clicks/selects a specific jobjob_bulk_action- User performs action on multiple jobs
File Management Events
file_upload_started- User initiates file uploadfile_upload_completed- File upload completes successfullyfile_upload_failed- File upload failsfile_deleted- User deletes a filefile_downloaded- User downloads a file
Library Upload Events
library_upload_started- User starts library uploadlibrary_upload_completed- Library upload completes
Report Events
report_generated- System generates a reportreport_viewed- User views a reportreport_exported- User exports a reportreport_filtered- User applies filters to reportreport_rendered- Report rendering completesreport_design_mode_entered- User enters design modereport_view_duration- Report view duration tracking
Invoice Management Events
invoice_created- User creates new invoiceinvoice_updated- User modifies existing invoiceinvoice_deleted- User deletes invoiceinvoice_status_changed- Invoice status transitionsinvoice_payment_logged- Payment logged for invoice
Invoice List Operations
invoice_list_viewed- User accesses invoice listinvoice_list_filtered- User filters invoice listinvoice_selected- User selects specific invoiceinvoice_bulk_action- User performs bulk action on invoicesinvoice_viewed- User views invoice detailsinvoice_exported- User exports invoice
Invoice Settings & Configuration
customer_invoice_settings_updated- Customer invoice settings changedinvoice_costing_item_managed- Invoice costing item managed
Authentication Events
login- User logs into systemlogout- User logs out of systemsignup- User signs up for accountsignup_completed- User completes signup processpassword_reset_requested- User requests password resetpassword_reset_completed- User completes password resetemail_verification_requested- User requests email verificationemail_verification_completed- User completes email verification
Error Tracking Events
http_error- HTTP error occurs
Session & Performance Events
session_start- User session startsslow_page_load- Page loads slowlyapi_response_slow- API response is slow
E-commerce Events
subscription_purchased- User purchases subscription
Role-Based Analytics Mapping
🔧 ADMIN Role Analytics
Question: "Which user roles generate the most system activity?"
BigQuery Parameters Available:
user_role(available)event_name(available)event_timestamp(available)session_duration_minutes(available)
SQL Query:
SELECT
(SELECT value.string_value FROM UNNEST(user_properties) WHERE key = 'user_role') as user_role,
COUNT(*) as total_events,
COUNT(DISTINCT user_id) as unique_users,
AVG(CAST((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'session_duration_minutes') AS NUMERIC)) as avg_session_duration
FROM `agmission-analytics.analytics_12345678.events_*`
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
GROUP BY user_role
ORDER BY total_events DESC;
Question: "What's the subscription purchase conversion rate by user role?"
BigQuery Parameters Available:
user_role(available)subscription_type(available)subscription_price(available)trial_conversion(available)service_type(available)
SQL Query:
WITH signup_users AS (
SELECT DISTINCT
user_id,
(SELECT value.string_value FROM UNNEST(user_properties) WHERE key = 'user_role') as user_role,
MIN(TIMESTAMP_MICROS(event_timestamp)) as signup_time
FROM `agmission-analytics.analytics_12345678.events_*`
WHERE event_name = 'signup_completed'
AND _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
),
subscription_purchases AS (
SELECT DISTINCT
user_id,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'subscription_type') as subscription_type,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'service_type') as service_type,
CAST((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'subscription_price') AS NUMERIC) as subscription_price,
(SELECT value.bool_value FROM UNNEST(event_params) WHERE key = 'trial_conversion') as trial_conversion
FROM `agmission-analytics.analytics_12345678.events_*`
WHERE event_name = 'subscription_purchased'
AND _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
)
SELECT
s.user_role,
COUNT(s.user_id) as total_signups,
COUNT(p.user_id) as total_purchases,
ROUND(COUNT(p.user_id) / COUNT(s.user_id) * 100, 2) as conversion_rate_percent,
COUNT(CASE WHEN p.trial_conversion = true THEN 1 END) as trial_conversions,
ROUND(AVG(p.subscription_price), 2) as avg_subscription_price,
COUNT(CASE WHEN p.service_type = 'essential' THEN 1 END) as essential_purchases,
COUNT(CASE WHEN p.service_type = 'enterprise' THEN 1 END) as enterprise_purchases
FROM signup_users s
LEFT JOIN subscription_purchases p ON s.user_id = p.user_id
GROUP BY s.user_role
ORDER BY conversion_rate_percent DESC;
Question: "Which roles have the highest system adoption rates?"
BigQuery Parameters Available:
user_role(available)signup_completedevent (available)job_createdevent (available)file_upload_startedevent (available)
SQL Query:
WITH user_adoption AS (
SELECT
user_id,
(SELECT value.string_value FROM UNNEST(user_properties) WHERE key = 'user_role') as user_role,
MIN(CASE WHEN event_name = 'signup_completed' THEN TIMESTAMP_MICROS(event_timestamp) END) as signup_time,
MIN(CASE WHEN event_name = 'job_created' THEN TIMESTAMP_MICROS(event_timestamp) END) as first_job_time,
MIN(CASE WHEN event_name = 'file_upload_started' THEN TIMESTAMP_MICROS(event_timestamp) END) as first_upload_time
FROM `agmission-analytics.analytics_12345678.events_*`
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
GROUP BY user_id, user_role
)
SELECT
user_role,
COUNT(*) as total_signups,
COUNT(first_job_time) as users_created_jobs,
COUNT(first_upload_time) as users_uploaded_files,
ROUND(COUNT(first_job_time) / COUNT(*) * 100, 2) as job_adoption_rate_percent,
ROUND(COUNT(first_upload_time) / COUNT(*) * 100, 2) as upload_adoption_rate_percent
FROM user_adoption
WHERE signup_time IS NOT NULL
GROUP BY user_role
ORDER BY job_adoption_rate_percent DESC;
E-commerce Analytics
Subscription Purchase Tracking
Question: "What's the distribution of subscription purchases by package type and tier?"
BigQuery Parameters Available:
subscription_type- AgMission package name (e.g., "AgMission Essentials 1", "AgMission Enterprise 3")service_type- Service category (essential, enterprise, addon)subscription_tier- Tier level (string: "1", "2", "3", "4", "5")subscription_price- Subscription pricesubscription_duration- Duration (monthly, quarterly, annual)
SQL Query:
SELECT
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'subscription_type') as subscription_package,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'service_type') as service_type,
(SELECT value.string_value FROM UNNEST(user_properties) WHERE key = 'subscription_tier') as tier,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'subscription_duration') as duration,
COUNT(*) as purchase_count,
COUNT(DISTINCT user_id) as unique_customers,
SUM(CAST((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'subscription_price') AS NUMERIC)) as total_revenue,
ROUND(AVG(CAST((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'subscription_price') AS NUMERIC)), 2) as avg_price
FROM `agmission-analytics.analytics_12345678.events_*`
WHERE event_name = 'subscription_purchased'
AND _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
GROUP BY subscription_package, service_type, tier, duration
ORDER BY total_revenue DESC;
Question: "What's the trial to paid conversion rate by subscription type?"
BigQuery Parameters Available:
trial_conversion- Whether this is a trial conversionsubscription_type- Package nameis_trial- Whether this is a trial subscriptionuser_tenure_days- User tenure in days
SQL Query:
WITH trial_tracking AS (
SELECT
user_id,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'subscription_type') as subscription_type,
(SELECT value.bool_value FROM UNNEST(event_params) WHERE key = 'trial_conversion') as trial_conversion,
(SELECT value.bool_value FROM UNNEST(event_params) WHERE key = 'is_trial') as is_trial,
CAST((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'user_tenure_days') AS NUMERIC) as user_tenure_days,
TIMESTAMP_MICROS(event_timestamp) as purchase_time
FROM `agmission-analytics.analytics_12345678.events_*`
WHERE event_name = 'subscription_purchased'
AND _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 180 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
)
SELECT
subscription_type,
COUNT(CASE WHEN is_trial = true THEN 1 END) as trial_subscriptions,
COUNT(CASE WHEN trial_conversion = true THEN 1 END) as trial_conversions,
COUNT(CASE WHEN is_trial = false AND trial_conversion = false THEN 1 END) as direct_purchases,
ROUND(
CASE
WHEN COUNT(CASE WHEN is_trial = true THEN 1 END) > 0
THEN COUNT(CASE WHEN trial_conversion = true THEN 1 END) / COUNT(CASE WHEN is_trial = true THEN 1 END) * 100
ELSE 0
END, 2
) as trial_conversion_rate_percent,
ROUND(AVG(CASE WHEN trial_conversion = true THEN user_tenure_days END), 1) as avg_trial_duration_days
FROM trial_tracking
GROUP BY subscription_type
ORDER BY trial_conversion_rate_percent DESC;
Question: "What's the upgrade/downgrade pattern analysis?"
BigQuery Parameters Available:
upgrade_from- Previous packageupgrade_to- New packageprevious_subscription_type- Previous subscriptionsubscription_type- Current subscriptionsubscription_price- Price
SQL Query:
SELECT
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'previous_subscription_type') as previous_package,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'subscription_type') as new_package,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'upgrade_from') as upgrade_from,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'upgrade_to') as upgrade_to,
COUNT(*) as change_count,
COUNT(DISTINCT user_id) as unique_users,
AVG(CAST((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'subscription_price') AS NUMERIC)) as avg_new_price,
CASE
WHEN (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'upgrade_from') IS NOT NULL
THEN 'UPGRADE'
WHEN (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'previous_subscription_type') != 'none'
THEN 'CHANGE'
ELSE 'NEW'
END as change_type
FROM `agmission-analytics.analytics_12345678.events_*`
WHERE event_name = 'subscription_purchased'
AND _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
GROUP BY previous_package, new_package, upgrade_from, upgrade_to
ORDER BY change_count DESC;
Question: "What's the revenue impact by payment method and billing frequency?"
BigQuery Parameters Available:
payment_method- Payment method (credit_card, bank_transfer, paypal, invoice)billing_frequency- Billing frequency (monthly, quarterly, annual)subscription_price- Subscription pricediscount_amount- Discount amountpromo_code- Promotional code used
SQL Query:
SELECT
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'payment_method') as payment_method,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'billing_frequency') as billing_frequency,
COUNT(*) as transaction_count,
COUNT(DISTINCT user_id) as unique_customers,
SUM(CAST((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'subscription_price') AS NUMERIC)) as gross_revenue,
SUM(COALESCE(CAST((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'discount_amount') AS NUMERIC), 0)) as total_discounts,
SUM(CAST((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'subscription_price') AS NUMERIC)) -
SUM(COALESCE(CAST((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'discount_amount') AS NUMERIC), 0)) as net_revenue,
COUNT(CASE WHEN (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'promo_code') IS NOT NULL THEN 1 END) as promo_usage_count,
ROUND(AVG(CAST((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'subscription_price') AS NUMERIC)), 2) as avg_transaction_value
FROM `agmission-analytics.analytics_12345678.events_*`
WHERE event_name = 'subscription_purchased'
AND _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
GROUP BY payment_method, billing_frequency
ORDER BY net_revenue DESC;
📊 OFFICER Role Analytics
Question: "What's the optimal job assignment lead time?"
BigQuery Parameters Available:
assignment_lead_time_hours(available)job_type(available)efficiency_score(available)assignee_role(available)
SQL Query:
SELECT
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'job_type') as job_type,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'assignee_role') as assignee_role,
ROUND(AVG(CAST((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'assignment_lead_time_hours') AS NUMERIC)), 2) as avg_lead_time_hours,
ROUND(AVG(CAST((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'efficiency_score') AS NUMERIC)), 2) as avg_efficiency_score,
COUNT(*) as total_assignments
FROM `agmission-analytics.analytics_12345678.events_*`
WHERE event_name = 'job_assigned'
AND _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 60 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
GROUP BY job_type, assignee_role
HAVING COUNT(*) >= 10
ORDER BY avg_efficiency_score DESC, avg_lead_time_hours;
Question: "Which pilots/applicators have the highest efficiency scores?"
BigQuery Parameters Available:
assignee_id(available)assignee_role(available)efficiency_score(available)job_type(available)
SQL Query:
SELECT
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'assignee_id') as assignee_id,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'assignee_role') as assignee_role,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'job_type') as job_type,
COUNT(*) as total_jobs,
ROUND(AVG(CAST((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'efficiency_score') AS NUMERIC)), 2) as avg_efficiency_score,
MIN(CAST((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'efficiency_score') AS NUMERIC)) as min_efficiency,
MAX(CAST((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'efficiency_score') AS NUMERIC)) as max_efficiency
FROM `agmission-analytics.analytics_12345678.events_*`
WHERE event_name = 'job_status_changed'
AND (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'new_status') = 'sprayed'
AND (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'assignee_role') IN ('pilot', 'applicator')
AND _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
GROUP BY assignee_id, assignee_role, job_type
HAVING COUNT(*) >= 5
ORDER BY avg_efficiency_score DESC;
✈️ PILOT Role Analytics
Question: "What's my personal efficiency score compared to team average?"
BigQuery Parameters Available:
user_id(available)efficiency_score(available)job_type(available)user_role(available)
SQL Query:
WITH pilot_performance AS (
SELECT
user_id,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'job_type') as job_type,
AVG(CAST((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'efficiency_score') AS NUMERIC)) as avg_efficiency_score
FROM `agmission-analytics.analytics_12345678.events_*`
WHERE event_name = 'job_status_changed'
AND (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'new_status') = 'sprayed'
AND (SELECT value.string_value FROM UNNEST(user_properties) WHERE key = 'user_role') = 'pilot'
AND _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
GROUP BY user_id, job_type
),
team_averages AS (
SELECT
job_type,
AVG(avg_efficiency_score) as team_avg_efficiency
FROM pilot_performance
GROUP BY job_type
)
SELECT
p.user_id,
p.job_type,
p.avg_efficiency_score as personal_efficiency,
t.team_avg_efficiency,
ROUND(((p.avg_efficiency_score - t.team_avg_efficiency) / t.team_avg_efficiency) * 100, 2) as performance_vs_team_percent
FROM pilot_performance p
JOIN team_averages t ON p.job_type = t.job_type
WHERE p.user_id = 'CURRENT_USER_ID' -- Replace with actual user ID
ORDER BY p.job_type;
Question: "How does weather dependency affect my job completion rates?"
BigQuery Parameters Available:
weather_dependency(available)job_status(available)user_id(available)
SQL Query:
SELECT
(SELECT value.bool_value FROM UNNEST(event_params) WHERE key = 'weather_dependency') as weather_dependent,
COUNT(*) as total_jobs,
COUNT(CASE WHEN (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'new_status') = 'sprayed' THEN 1 END) as completed_jobs,
ROUND(COUNT(CASE WHEN (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'new_status') = 'sprayed' THEN 1 END) / COUNT(*) * 100, 2) as completion_rate_percent
FROM `agmission-analytics.analytics_12345678.events_*`
WHERE event_name = 'job_status_changed'
AND user_id = 'CURRENT_USER_ID' -- Replace with actual user ID
AND _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
GROUP BY weather_dependent
ORDER BY completion_rate_percent DESC;
🚁 APPLICATOR Role Analytics
Question: "Which file types do I upload most frequently?"
BigQuery Parameters Available:
file_type(available)user_id(available)file_size_mb(available)processing_time_seconds(available)
SQL Query:
SELECT
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'file_type') as file_type,
COUNT(*) as upload_count,
ROUND(AVG(CAST((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'file_size_mb') AS NUMERIC)), 2) as avg_file_size_mb,
ROUND(AVG(CAST((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'processing_time_seconds') AS NUMERIC)), 2) as avg_processing_time_seconds,
COUNT(CASE WHEN (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'validation_status') = 'passed' THEN 1 END) as successful_uploads,
ROUND(COUNT(CASE WHEN (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'validation_status') = 'passed' THEN 1 END) / COUNT(*) * 100, 2) as success_rate_percent
FROM `agmission-analytics.analytics_12345678.events_*`
WHERE event_name = 'file_upload_completed'
AND user_id = 'CURRENT_USER_ID' -- Replace with actual user ID
AND _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
GROUP BY file_type
ORDER BY upload_count DESC;
Question: "What's my file upload success rate compared to team average?"
BigQuery Parameters Available:
user_id(available)validation_status(available)file_type(available)user_role(available)
SQL Query:
WITH user_upload_success AS (
SELECT
user_id,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'file_type') as file_type,
COUNT(*) as total_uploads,
COUNT(CASE WHEN (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'validation_status') = 'passed' THEN 1 END) as successful_uploads,
ROUND(COUNT(CASE WHEN (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'validation_status') = 'passed' THEN 1 END) / COUNT(*) * 100, 2) as success_rate
FROM `agmission-analytics.analytics_12345678.events_*`
WHERE event_name = 'file_upload_completed'
AND (SELECT value.string_value FROM UNNEST(user_properties) WHERE key = 'user_role') = 'applicator'
AND _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
GROUP BY user_id, file_type
),
team_averages AS (
SELECT
file_type,
AVG(success_rate) as team_avg_success_rate,
COUNT(DISTINCT user_id) as total_team_members
FROM user_upload_success
GROUP BY file_type
)
SELECT
u.file_type,
u.total_uploads as my_uploads,
u.success_rate as my_success_rate,
t.team_avg_success_rate,
t.total_team_members,
ROUND(u.success_rate - t.team_avg_success_rate, 2) as performance_vs_team
FROM user_upload_success u
JOIN team_averages t ON u.file_type = t.file_type
WHERE u.user_id = 'CURRENT_USER_ID' -- Replace with actual user ID
ORDER BY u.file_type;
🌾 CLIENT Role Analytics
Question: "What's the completion rate for my jobs?"
BigQuery Parameters Available:
client_id(available)job_status(available)job_type(available)
SQL Query:
SELECT
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'job_type') as job_type,
COUNT(*) as total_jobs,
COUNT(CASE WHEN (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'new_status') = 'sprayed' THEN 1 END) as completed_jobs,
COUNT(CASE WHEN (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'new_status') = 'archived' THEN 1 END) as archived_jobs,
ROUND(COUNT(CASE WHEN (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'new_status') = 'sprayed' THEN 1 END) / COUNT(*) * 100, 2) as completion_rate_percent
FROM `agmission-analytics.analytics_12345678.events_*`
WHERE event_name = 'job_status_changed'
AND (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'client_id') = 'CURRENT_CLIENT_ID' -- Replace with actual client ID
AND _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
GROUP BY job_type
ORDER BY completion_rate_percent DESC;
🔍 INSPECTOR Role Analytics
Question: "What's the compliance rate across all jobs?"
BigQuery Parameters Required:
job_type(available)efficiency_score(available)- MISSING:
compliance_score,inspection_result,regulatory_standard
Collection Method for Missing Parameters:
- Add
compliance_scoreto job completion events - Track
inspection_resultwhen inspectors review jobs - Include
regulatory_standardfor compliance tracking
Missing Parameters Analysis
Critical Missing Parameters
1. Weather & Environmental Data
Missing Parameters:
weather_conditions- Current weather conditionstemperature- Temperature at job timewind_speed- Wind speed during operationhumidity- Humidity levelsprecipitation- Precipitation data
Collection Method:
- Integrate with weather API (OpenWeatherMap, WeatherAPI)
- Capture at job creation and completion
- Store in job events as additional parameters
2. Financial & Business Metrics
Missing Parameters:
profit_margin- Profit margin per jobcost_per_acre- Cost per acre calculationrevenue_per_job- Revenue generated per jobcustomer_lifetime_value- CLV calculationaccount_creation_cost- Cost to create accountsupport_cost_per_user- Support cost per userfeature_usage_cost- Feature usage cost
Collection Method:
- Calculate from invoice and cost data
- Add to invoice and job completion events
- Integrate with accounting system
- Track support system costs
- Add to signup and subscription events
3. Performance & Quality Metrics
Missing Parameters:
application_accuracy- Application accuracy percentagecoverage_quality- Coverage quality scorerework_required- Whether rework was neededcustomer_satisfaction- Customer satisfaction scorecompliance_score- Compliance scoreinspection_result- Inspection outcomesregulatory_standard- Regulatory compliance standard
Collection Method:
- GPS tracking integration for accuracy
- Post-job quality assessment
- Customer feedback collection
- Compliance system integration
- Add to job completion events
4. Equipment & Maintenance Data
Missing Parameters:
equipment_id- Specific equipment identifiermaintenance_status- Equipment maintenance statusfuel_consumption- Fuel consumption dataoperating_hours- Equipment operating hours
Collection Method:
- Equipment tracking integration
- Maintenance system integration
- Add to job assignment and completion events
5. Compliance & Safety Data
Missing Parameters:
safety_incidents- Safety incident reportsregulatory_compliance- Compliance statuscertification_status- Certification validity
Collection Method:
- Safety system integration
- Regulatory compliance tracking
- Inspection result recording
- Add to job and user events
6. Enhanced E-commerce Metrics
Missing Parameters:
churn_risk_score- Calculated churn risksubscription_health_score- Subscription health metricfeature_usage_frequency- Feature usage patternssupport_ticket_count- Number of support ticketsuser_engagement_score- Overall engagement metric
Collection Method:
- Calculate from usage patterns
- Track support interactions
- Add to subscription and user events
- Implement engagement scoring system
Implementation Recommendations
Phase 1: Core Parameter Enhancement (Immediate)
-
Add Weather Data Integration
- Implement weather API integration
- Add weather parameters to job events
- Create weather-based analytics
-
Enhance Financial Tracking
- Add profit margin calculations
- Include cost tracking parameters
- Implement revenue analytics
-
Improve Performance Metrics
- Add quality scoring system
- Implement accuracy tracking
- Create performance dashboards
-
Complete E-commerce Implementation
- Ensure all subscription purchase tracking is active
- Validate string-based package names in tracking
- Add missing trial conversion tracking
- Implement addon purchase tracking (currently placeholder)
Phase 2: Advanced Analytics (Next 3 months)
-
Equipment Integration
- Connect with equipment systems
- Add maintenance tracking
- Implement utilization analytics
-
Compliance System
- Add regulatory tracking
- Implement safety monitoring
- Create compliance dashboards
-
Customer Experience
- Add satisfaction tracking
- Implement feedback collection
- Create customer analytics
-
Enhanced E-commerce Analytics
- Implement churn prediction
- Add subscription health scoring
- Create customer lifetime value tracking
Phase 3: Predictive Analytics (Next 6 months)
-
Machine Learning Integration
- Predictive maintenance
- Weather-based scheduling
- Demand forecasting
- Churn prediction models
-
Advanced Reporting
- Custom dashboard creation
- Automated insights
- Real-time monitoring
-
Subscription Optimization
- Package recommendation engine
- Pricing optimization
- Retention improvement analytics
BigQuery Schema Enhancements
Recommended Event Parameter Additions
// Add to existing interfaces
export interface EnhancedJobParams extends JobCreatedParams {
weather_conditions?: string;
temperature?: number;
wind_speed?: number;
humidity?: number;
equipment_id?: string;
maintenance_status?: string;
profit_margin?: number;
cost_per_acre?: number;
}
export interface QualityMetricsParams extends AgMissionBaseContext {
application_accuracy?: number;
coverage_quality?: number;
rework_required?: boolean;
customer_satisfaction?: number;
compliance_score?: number;
}
export interface EnhancedSubscriptionParams extends SubscriptionPurchasedParams {
churn_risk_score?: number;
subscription_health_score?: number;
feature_usage_frequency?: number;
support_ticket_count?: number;
user_engagement_score?: number;
}
Current Implementation Status
✅ Completed Events & Parameters
- Job Management: All events implemented with comprehensive parameters
- File Management: Full upload/download tracking with validation metrics
- Invoice Management: Complete invoice lifecycle tracking
- Authentication: Full signup/login tracking with verification flows
- E-commerce: Subscription purchase tracking with correct package names
- Performance: Page load and API response tracking
- Error Tracking: HTTP error monitoring
🔄 In Progress
- E-commerce Addon Tracking: Currently placeholder implementation
- Trial Conversion Optimization: Basic tracking in place, needs enhancement
- Customer Lifecycle Analytics: Partial implementation
❌ Missing Implementation
- Weather Integration: API integration needed
- Equipment Tracking: System integration required
- Compliance Monitoring: Regulatory system integration
- Quality Scoring: Post-job assessment system
- Customer Satisfaction: Feedback collection system
Data Quality Validation Queries
Verify E-commerce Data Integrity
-- Check subscription purchase data completeness
SELECT
COUNT(*) as total_purchases,
COUNT(CASE WHEN (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'subscription_type') IS NOT NULL THEN 1 END) as with_package_name,
COUNT(CASE WHEN (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'service_type') IS NOT NULL THEN 1 END) as with_service_type,
COUNT(CASE WHEN (SELECT value.string_value FROM UNNEST(user_properties) WHERE key = 'subscription_tier') IS NOT NULL THEN 1 END) as with_tier
FROM `agmission-analytics.analytics_12345678.events_*`
WHERE event_name = 'subscription_purchased'
AND _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE());
Validate Parameter Consistency
-- Check for consistent parameter usage across events
SELECT
event_name,
COUNT(*) as event_count,
COUNT(DISTINCT user_id) as unique_users,
COUNT(CASE WHEN (SELECT value.string_value FROM UNNEST(user_properties) WHERE key = 'user_role') IS NOT NULL THEN 1 END) as with_user_role,
COUNT(CASE WHEN (SELECT value.string_value FROM UNNEST(user_properties) WHERE key = 'subscription_tier') IS NOT NULL THEN 1 END) as with_subscription_tier
FROM `agmission-analytics.analytics_12345678.events_*`
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
GROUP BY event_name
ORDER BY event_count DESC;