{"record":{"id":"42665ea5eed55b0a","repo":"getredash/redash","slug":"can-t-mix-mcf-and-ga-dimensions","errorCode":null,"errorMessage":"Can't mix mcf: and ga: dimensions.","messagePattern":"Can't mix mcf: and ga: dimensions\\.","errorType":"validation","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"redash/query_runner/google_analytics.py","lineNumber":171,"sourceCode":"            service = self._get_analytics_service()\n            service.management().accounts().list().execute()\n        except HttpError as e:\n            # Make sure we return a more readable error to the end user\n            raise Exception(e._get_reason())\n\n    def run_query(self, query, user):\n        logger.debug(\"Analytics is about to execute query: %s\", query)\n        try:\n            params = json_loads(query)\n        except Exception:\n            query_string = parse_qs(urlparse(query).query, keep_blank_values=True)\n            params = {k.replace(\"-\", \"_\"): \",\".join(v) for k, v in query_string.items()}\n\n        if \"mcf:\" in params[\"metrics\"] and \"ga:\" in params[\"metrics\"]:\n            raise Exception(\"Can't mix mcf: and ga: metrics.\")\n\n        if \"mcf:\" in params.get(\"dimensions\", \"\") and \"ga:\" in params.get(\"dimensions\", \"\"):\n            raise Exception(\"Can't mix mcf: and ga: dimensions.\")\n\n        if \"mcf:\" in params[\"metrics\"]:\n            api = self._get_analytics_service().data().mcf()\n        else:\n            api = self._get_analytics_service().data().ga()\n\n        if len(params) > 0:\n            try:\n                response = api.get(**params).execute()\n                data = parse_ga_response(response)\n                error = None\n            except HttpError as e:\n                # Make sure we return a more readable error to the end user\n                error = e._get_reason()\n                data = None\n        else:\n            error = \"Wrong query format.\"\n            data = None","sourceCodeStart":153,"sourceCodeEnd":189,"githubUrl":"https://github.com/getredash/redash/blob/ca79fe988d81cdac9675b412f3dfcab107bc1fbc/redash/query_runner/google_analytics.py#L153-L189","documentation":"Same ga:/mcf: separation rule as error 26 but for dimensions: params['dimensions'] may not contain both 'mcf:' and 'ga:' prefixes because the core and Multi-Channel Funnels endpoints each accept only their own namespace.","triggerScenarios":"A query whose dimensions list mixes namespaces, e.g. {\"dimensions\": \"ga:date,mcf:sourcePath\"}, checked right after the metrics check in run_query.","commonSituations":"Combining core dimensions with MCF path dimensions in one visualization; adapting an MCF report into Redash.","solutions":["Use only ga: dimensions for core queries and only mcf: dimensions for MCF queries — run two separate queries","Drop the mcf: dimension if MCF data isn't needed"],"exampleFix":"// before\n{\"metrics\": \"mcf:totalConversions\", \"dimensions\": \"ga:date,mcf:sourcePath\"}\n// after\n{\"metrics\": \"mcf:totalConversions\", \"dimensions\": \"mcf:date,mcf:sourcePath\"}","handlingStrategy":"validation","validationCode":"def dimensions_are_consistent(dims: str) -> bool:\n    return not (\"mcf:\" in dims and \"ga:\" in dims)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use one namespace per query for dimensions and metrics alike","Split MCF reports into dedicated queries"],"tags":["google-analytics","query-validation","mcf"],"backgroundTag":"invalid-query-parameters","analyzedSha":"ca79fe988d81cdac9675b412f3dfcab107bc1fbc","analyzedAt":"2026-08-28T18:32:34.637Z","schemaVersion":2},"datasetVersion":"2026-08-28T21:17:43.275Z"}