{"id":48872,"date":"2026-09-14T11:12:34","date_gmt":"2026-09-14T08:12:34","guid":{"rendered":"https:\/\/outscraper.com\/?p=48872"},"modified":"2026-09-14T11:59:17","modified_gmt":"2026-09-14T08:59:17","slug":"location-based-app-google-maps-data-supabase","status":"publish","type":"post","link":"https:\/\/outscraper.com\/it\/location-based-app-google-maps-data-supabase\/","title":{"rendered":"How to Build a Location-Based App with Google Maps Data and Supabase"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"48872\" class=\"elementor elementor-48872\" data-elementor-post-type=\"post\">\n\t\t\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-db9c9d7 e-flex e-con-boxed e-con e-parent\" data-id=\"db9c9d7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8f0e510 elementor-toc--minimized-on-tablet elementor-widget elementor-widget-table-of-contents\" data-id=\"8f0e510\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;exclude_headings_by_selector&quot;:[],&quot;headings_by_tags&quot;:[&quot;h2&quot;],&quot;no_headings_message&quot;:&quot;No headings were found on this page.&quot;,&quot;marker_view&quot;:&quot;numbers&quot;,&quot;minimize_box&quot;:&quot;yes&quot;,&quot;minimized_on&quot;:&quot;tablet&quot;,&quot;hierarchical_view&quot;:&quot;yes&quot;,&quot;min_height&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;min_height_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;min_height_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"table-of-contents.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-toc__header\">\n\t\t\t\t\t\t<h2 class=\"elementor-toc__header-title\">\n\t\t\t\tTable of Contents\t\t\t<\/h2>\n\t\t\t\t\t\t\t\t\t\t<div class=\"elementor-toc__toggle-button elementor-toc__toggle-button--expand\" role=\"button\" tabindex=\"0\" aria-controls=\"elementor-toc__8f0e510\" aria-expanded=\"true\" aria-label=\"Apri l&#039;indice dei contenuti\"><i aria-hidden=\"true\" class=\"fas fa-chevron-down\"><\/i><\/div>\n\t\t\t\t<div class=\"elementor-toc__toggle-button elementor-toc__toggle-button--collapse\" role=\"button\" tabindex=\"0\" aria-controls=\"elementor-toc__8f0e510\" aria-expanded=\"true\" aria-label=\"Chiudi l&#039;indice dei contenuti\"><i aria-hidden=\"true\" class=\"fas fa-chevron-up\"><\/i><\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<div id=\"elementor-toc__8f0e510\" class=\"elementor-toc__body\">\n\t\t\t<div class=\"elementor-toc__spinner-container\">\n\t\t\t\t<i class=\"elementor-toc__spinner eicon-animation-spin eicon-loading\" aria-hidden=\"true\"><\/i>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-a2df9d5 e-flex e-con-boxed e-con e-parent\" data-id=\"a2df9d5\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ca3d028 elementor-button-success elementor-align-center gm_data_signup elementor-widget elementor-widget-button\" data-id=\"ca3d028\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-md\" href=\"https:\/\/auth.outscraper.com\/signup?redirect=\/googleMaps\" target=\"_blank\" id=\"topSignUp\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<i aria-hidden=\"true\" class=\"fas fa-sign-in-alt\"><\/i>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Join Free Tier<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-3a750624 e-flex e-con-boxed e-con e-parent\" data-id=\"3a750624\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-172e4729 elementor-widget elementor-widget-text-editor\" data-id=\"172e4729\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><strong>To build a location-based app with Google Maps data<\/strong>, collect the business records, normalize them into your own schema, and store them in a database such as Supabase\/PostgreSQL.<\/p><p>For <strong>Google Maps data for app development<\/strong>, collecting the records is only the first step. The application still needs fields it can identify, update, query, map, and connect to its own data.<\/p><p>In this example, a small JSON sample from Outscraper\u2019s <strong>Business Catalog<\/strong>\u00a0is normalized with TypeScript and imported into Supabase\/PostgreSQL for a location-based MVP called Nomad PH.<\/p><p>The sample contains three businesses in General Luna, Siargao. Its purpose is to test the ingestion workflow, not to represent complete business coverage in Siargao or the Philippines.<\/p><p>The main task is turning the Outscraper JSON into application-ready records that can support listings, detail pages, maps, and later spatial features.<\/p><p><strong>Quick Answer: How to Use Google Maps Data in a Location-Based App<\/strong><\/p><ol><li>Collect business records with <strong>Outscraper<\/strong>.<\/li><li>Export the data as <strong>JSON<\/strong>.<\/li><li>Normalize the fields with <strong>TypeScript<\/strong>.<\/li><li>Map the records to your app schema.<\/li><li>Upsert them into <strong>Supabase\/PostgreSQL<\/strong>.<\/li><li>Use them in listings, pages, and maps.<\/li><\/ol><ol><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-375adbb elementor-widget elementor-widget-image\" data-id=\"375adbb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/google-maps-data-to-location-app-workflow.webp\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"google-maps-data-to-location-app-workflow\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6NDkwMDAsInVybCI6Imh0dHBzOlwvXC9vdXRzY3JhcGVyLmNvbVwvd3AtY29udGVudFwvdXBsb2Fkc1wvMjAyNlwvMDlcL2dvb2dsZS1tYXBzLWRhdGEtdG8tbG9jYXRpb24tYXBwLXdvcmtmbG93LndlYnAifQ%3D%3D\">\n\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"750\" height=\"422\" src=\"https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/google-maps-data-to-location-app-workflow-1024x576.webp\" class=\"attachment-large size-large wp-image-49000\" alt=\"Workflow showing how Outscraper JSON becomes records for a location-based app\" srcset=\"https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/google-maps-data-to-location-app-workflow-1024x576.webp 1024w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/google-maps-data-to-location-app-workflow-300x169.webp 300w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/google-maps-data-to-location-app-workflow-768x432.webp 768w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/google-maps-data-to-location-app-workflow-1536x864.webp 1536w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/google-maps-data-to-location-app-workflow-18x10.webp 18w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/google-maps-data-to-location-app-workflow.webp 1672w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">The workflow starts with Outscraper data and ends with structured records the application can use.<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-4d849d44 e-flex e-con-boxed e-con e-parent\" data-id=\"4d849d44\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-24de96c0 e-con-full e-flex e-con e-child\" data-id=\"24de96c0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-2b0a0a79 e-con-full e-flex e-con e-child\" data-id=\"2b0a0a79\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-47713b46 e-con-full e-flex e-con e-child\" data-id=\"47713b46\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-495c6100 elementor-widget__width-initial elementor-widget elementor-widget-heading\" data-id=\"495c6100\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-heading-title elementor-size-default\">Need Business Records for Testing?<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-61ff6944 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"61ff6944\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Use Outscraper\u2019s Business Catalog to start with ready business records before building your ingestion workflow.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-16692ba2 e-con-full e-flex e-con e-child\" data-id=\"16692ba2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6b43df44 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"6b43df44\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/auth.outscraper.com\/businesses?country=US\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Open Business Catalog<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-36b48c50 e-flex e-con-boxed e-con e-parent\" data-id=\"36b48c50\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-72249f46 elementor-widget elementor-widget-heading\" data-id=\"72249f46\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">What Google Maps Data Does a Location-Based App Need?<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-48947945 elementor-widget elementor-widget-text-editor\" data-id=\"48947945\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>A location app does not need every field available in a source record. It needs the fields that help the application identify a place, display useful information, and connect that place to other features.<\/p><p>For the Nomad PH MVP, the Outscraper records provided the base business and location data. The application then stored selected fields in its <span>own <\/span><code dir=\"ltr\"><span>places<\/span><\/code><span> table<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1b817778 elementor-widget elementor-widget-heading\" data-id=\"1b817778\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Core place identity fields\n<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-61b0dc04 elementor-widget elementor-widget-text-editor\" data-id=\"61b0dc04\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>The first group of fields answers a basic question: <strong>which place is this?<\/strong><\/p><p>For this implementation, the main identity and location fields were:<\/p><ul><li><code dir=\"ltr\"><span>name<\/span><\/code><\/li><li><code dir=\"ltr\"><span>place_id<\/span><\/code><\/li><li><code dir=\"ltr\"><span>latitude<\/span><\/code><\/li><li><code dir=\"ltr\"><span>longitude<\/span><\/code><\/li><li><code dir=\"ltr\"><span>address<\/span><\/code><\/li><li><code dir=\"ltr\"><span>business_status<\/span><\/code><\/li><\/ul><p class=\"isSelectedEnd\"><span>The <\/span><code dir=\"ltr\"><span>name<\/span><\/code><span> and <\/span><code dir=\"ltr\"><span>address<\/span><\/code><span> help users identify the business, while latitude and longitude give the application a geographic position.<\/span><\/p><p class=\"isSelectedEnd\"><span>The importer also keeps <\/span><code dir=\"ltr\"><span>place_id<\/span><\/code><span> as the external identifier used for upserts in this MVP. If the same place appears in a later import, the application can update the existing record instead of creating another one.<\/span><\/p><p><span>This does not mean <\/span><code dir=\"ltr\"><span>place_id<\/span><\/code><span> should be treated as a permanent identifier for every possible data workflow. It is simply the source identifier chosen for this implementation.<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f17e1d1 elementor-widget elementor-widget-image\" data-id=\"f17e1d1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/outscraper-json-location-app-fields.webp\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"outscraper-json-location-app-fields\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6NDg5NTksInVybCI6Imh0dHBzOlwvXC9vdXRzY3JhcGVyLmNvbVwvd3AtY29udGVudFwvdXBsb2Fkc1wvMjAyNlwvMDlcL291dHNjcmFwZXItanNvbi1sb2NhdGlvbi1hcHAtZmllbGRzLndlYnAifQ%3D%3D\">\n\t\t\t\t\t\t\t<img decoding=\"async\" width=\"750\" height=\"370\" src=\"https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/outscraper-json-location-app-fields-1024x505.webp\" class=\"attachment-large size-large wp-image-48959\" alt=\"Outscraper JSON business fields used in a location-based app\" srcset=\"https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/outscraper-json-location-app-fields-1024x505.webp 1024w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/outscraper-json-location-app-fields-300x148.webp 300w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/outscraper-json-location-app-fields-768x379.webp 768w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/outscraper-json-location-app-fields-18x9.webp 18w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/outscraper-json-location-app-fields.webp 1270w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">The source JSON contains the place identity, location, rating, and business fields mapped into the application schema.<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-61a6e965 elementor-widget elementor-widget-heading\" data-id=\"61a6e965\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Discovery and listing fields\n<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1b1691df elementor-widget elementor-widget-text-editor\" data-id=\"1b1691df\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>A place page usually needs more than identity and coordinates. Users also need enough information to decide whether they want to view or visit the business.<\/p><p>The MVP stores fields such as:<\/p><ul><li>rating<\/li><li>review count<\/li><li>website<\/li><li>phone<\/li><li>business type<\/li><li>Google Maps URL<\/li><\/ul><p>These fields can support destination listings, place cards, detail pages, and filters inside the application.<\/p><p>Source categories also need some control. Instead of copying every raw subtype directly into the app, Nomad PH maps them into a smaller set of place types:<\/p><ul><li>cafe<\/li><li>coworking<\/li><li>coliving<\/li><li>hotel<\/li><li>hostel<\/li><li>restaurant<\/li><li>other<\/li><\/ul><p>A controlled list keeps the application&#8217;s categories predictable even when the source data contains several business subtypes.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6a295af8 elementor-widget elementor-widget-heading\" data-id=\"6a295af8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Keep source data separate from app-specific data<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-49c6c184 elementor-widget elementor-widget-text-editor\" data-id=\"49c6c184\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>The imported business record is only one layer of the application.<\/p><p>Outscraper supplies the source business and location fields used in this MVP, such as place identity, coordinates, ratings, contact details, and business status.<\/p><p>Nomad PH keeps its own application and community data separate, including:<\/p><ul><li>Wi-Fi speed reports<\/li><li>upload speed<\/li><li>ping<\/li><li>generator observations<\/li><li>power outage observations<\/li><li>user reviews<\/li><li>verification rules<\/li><\/ul><p>That separation matters because the source record and the application&#8217;s own data have different jobs.<\/p><p>The <strong>Outscraper<\/strong> record identifies and describes the place. Nomad PH can then add its own data around that same place without treating community-generated information as part of the original Google Maps business record.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-344ccc7 e-flex e-con-boxed e-con e-parent\" data-id=\"344ccc7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a69b818 elementor-button-success elementor-align-center gm_data_signup elementor-widget elementor-widget-button\" data-id=\"a69b818\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-md\" href=\"https:\/\/auth.outscraper.com\/signup\" target=\"_blank\" id=\"topSignUp\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<i aria-hidden=\"true\" class=\"fas fa-sign-in-alt\"><\/i>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Try Outscraper for Free<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-3905e169 e-flex e-con-boxed e-con e-parent\" data-id=\"3905e169\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-64ef1fdb elementor-widget elementor-widget-heading\" data-id=\"64ef1fdb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Collect the Source Data With Outscraper Business Catalog<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1ef102a9 elementor-widget elementor-widget-text-editor\" data-id=\"1ef102a9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>The first step is to collect the business records your application needs.<\/p><p>For the Nomad PH MVP, I used Outscraper\u2019s <strong>Business Catalog<\/strong> to create a small sample of businesses in General Luna, Siargao. Three records were enough to test the ingestion flow from JSON into the application database.<\/p><p>For a full walkthrough of filtering and exporting records, see the <a href=\"https:\/\/outscraper.com\/outscraper-business-catalog\/\"><strong>Outscraper Business Catalog guide<\/strong><\/a>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-24d07406 elementor-widget elementor-widget-heading\" data-id=\"24d07406\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Define the location and business type\n<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4d6745cb elementor-widget elementor-widget-text-editor\" data-id=\"4d6745cb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Start with the location and category your application needs.<\/p><p>For this MVP:<\/p><ul><li><strong>Location:<\/strong> General Luna, Siargao.\u00a0<\/li><li><strong>Business type:<\/strong> caf\u00e9s<\/li><li><strong>Source:<\/strong> Outscraper Business Catalog<\/li><li><strong>Output:<\/strong> JSON business records<\/li><\/ul><p>Keeping the sample small made it easier to inspect the source fields before building the importer.<\/p><p>For broader Google Maps data collection, Outscraper\u2019s existing <a href=\"https:\/\/outscraper.com\/google-maps-scraping-getting-started-manual-updated\/\"><strong>Google Maps Scraper guides<\/strong><\/a> cover the collection process in more detail.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5965ff1b elementor-widget elementor-widget-heading\" data-id=\"5965ff1b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Export the records as JSON\n<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-67c59e32 elementor-widget elementor-widget-text-editor\" data-id=\"67c59e32\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>For this MVP, I used a small sample from Outscraper\u2019s <strong>Business Catalog<\/strong>\u00a0instead of running a new Google Maps Scraper job. Using ready business records let me test the ingestion workflow immediately without waiting for a new scraping task to finish.<\/p><p>The same workflow can also start with JSON exported from Outscraper\u2019s <a href=\"https:\/\/outscraper.com\/google-maps-scraper\/\"><strong>Google Maps Scraper<\/strong><\/a>. In both cases, the important part is the structured business data that moves into the application.<\/p><p>JSON fit the ingestion workflow well because it was easy to:<\/p><ul><li>inspect in VS Code<\/li><li>parse with TypeScript<\/li><li>preserve nested source fields<\/li><li>pass into a normalization script<\/li><li>store the original record for later reference<\/li><\/ul><p>The JSON file then became the source input for the normalization and Supabase import steps.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-4e41399c e-flex e-con-boxed e-con e-parent\" data-id=\"4e41399c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-4a0fe6d3 e-con-full e-flex e-con e-child\" data-id=\"4a0fe6d3\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-18aa844d e-grid e-con-full e-con e-child\" data-id=\"18aa844d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7fc8ece7 elementor-widget elementor-widget-image\" data-id=\"7fc8ece7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1254\" height=\"1254\" src=\"https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/collect-google-maps-data.webp\" class=\"attachment-full size-full wp-image-49022\" alt=\"Illustration showing structured business and location data collection workflow\" srcset=\"https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/collect-google-maps-data.webp 1254w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/collect-google-maps-data-300x300.webp 300w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/collect-google-maps-data-1024x1024.webp 1024w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/collect-google-maps-data-150x150.webp 150w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/collect-google-maps-data-768x768.webp 768w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/collect-google-maps-data-12x12.webp 12w\" sizes=\"(max-width: 1254px) 100vw, 1254px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-4a627722 e-con-full e-flex e-con e-child\" data-id=\"4a627722\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e7dffe6 elementor-widget elementor-widget-heading\" data-id=\"e7dffe6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-heading-title elementor-size-default\">Start With Structured Business Data<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2a12abb3 elementor-widget elementor-widget-text-editor\" data-id=\"2a12abb3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Use Outscraper\u2019s Business Catalog or Google Maps Scraper to collect the business and location records your application needs, then export them for your ingestion workflow.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-667c4b77 elementor-widget elementor-widget-button\" data-id=\"667c4b77\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/outscraper.com\/google-maps-scraper\/\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Collect Google Maps Data<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-3d85c29f e-flex e-con-boxed e-con e-parent\" data-id=\"3d85c29f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-751d152f elementor-widget elementor-widget-heading\" data-id=\"751d152f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Turn Outscraper JSON Into Application-Ready Records\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6d93d4ae elementor-widget elementor-widget-text-editor\" data-id=\"6d93d4ae\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Raw JSON is useful as a source, but an application usually needs a smaller and more predictable schema.<\/p><p>For the Nomad PH MVP, the importer reads the Outscraper JSON, selects the fields the app needs, converts them <span>into the <\/span><code dir=\"ltr\"><span>places<\/span><\/code><span> table<\/span>, and keeps the original source record for reference.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-346b65c4 elementor-widget elementor-widget-heading\" data-id=\"346b65c4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Normalize the fields the app actually needs\n<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3f83a345 elementor-widget elementor-widget-text-editor\" data-id=\"3f83a345\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>The importer maps source fields into the application model instead of storing every field directly.<\/p><p>For this build, that includes values such as:<\/p><ul><li>business name<\/li><li>place ID<\/li><li>address<\/li><li>latitude<\/li><li>longitude<\/li><li>rating<\/li><li>review count<\/li><li>business status<\/li><li>website<\/li><li>phone<\/li><li>Google Maps URL<\/li><li>place type<\/li><\/ul><p>This makes the records easier to query and use inside the app.<\/p><p>The exact source field names should be checked against the real Outscraper JSON before any code example is published.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-733f9e7 elementor-widget elementor-widget-image\" data-id=\"733f9e7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/typescript-outscraper-json-normalization.webp\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"typescript-outscraper-json-normalization\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6NDg5NjAsInVybCI6Imh0dHBzOlwvXC9vdXRzY3JhcGVyLmNvbVwvd3AtY29udGVudFwvdXBsb2Fkc1wvMjAyNlwvMDlcL3R5cGVzY3JpcHQtb3V0c2NyYXBlci1qc29uLW5vcm1hbGl6YXRpb24ud2VicCJ9\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"750\" height=\"482\" src=\"https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/typescript-outscraper-json-normalization-1024x658.webp\" class=\"attachment-large size-large wp-image-48960\" alt=\"TypeScript normalizing Outscraper JSON for a location-based app\" srcset=\"https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/typescript-outscraper-json-normalization-1024x658.webp 1024w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/typescript-outscraper-json-normalization-300x193.webp 300w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/typescript-outscraper-json-normalization-768x494.webp 768w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/typescript-outscraper-json-normalization-18x12.webp 18w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/typescript-outscraper-json-normalization.webp 1400w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">The importer maps Outscraper source fields into the application's own place schema before storing the records in Supabase.<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6505a11d elementor-widget elementor-widget-heading\" data-id=\"6505a11d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Map source categories into your own app taxonomy\n<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6aa76462 elementor-widget elementor-widget-text-editor\" data-id=\"6aa76462\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Source business categories can be more detailed than the application needs.<\/p><p>Nomad PH uses a smaller internal list:<\/p><ul><li><code dir=\"ltr\"><span>cafe<\/span><\/code><\/li><li><code dir=\"ltr\"><span>coworking<\/span><\/code><\/li><li><code dir=\"ltr\"><span>coliving<\/span><\/code><\/li><li><code dir=\"ltr\"><span>hotel<\/span><\/code><\/li><li><code dir=\"ltr\"><span>hostel<\/span><\/code><\/li><li><code dir=\"ltr\"><span>restaurant<\/span><\/code><\/li><li><code dir=\"ltr\"><span>other<\/span><\/code><\/li><\/ul><ul><\/ul><p>This keeps filtering and page logic predictable.<\/p><p>For example, several source subtypes related to caf\u00e9s can still map to the same <span>internal <\/span><code dir=\"ltr\"><span>cafe<\/span><\/code><span> type. <\/span> The app controls the final category instead of depending on every raw subtype returned by the source.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3cd97b31 elementor-widget elementor-widget-heading\" data-id=\"3cd97b31\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Generate readable slugs\n\n<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3d4c21e2 elementor-widget elementor-widget-text-editor\" data-id=\"3d4c21e2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Each imported place also needs a readable URL slug.<\/p><p class=\"isSelectedEnd\"><span>For example:<\/span><\/p><p class=\"isSelectedEnd\"><code dir=\"ltr\"><span>Gaya Rooftop Space<\/span><\/code><\/p><p class=\"isSelectedEnd\"><span>becomes:<\/span><\/p><p><code dir=\"ltr\"><span>gaya-rooftop-space<\/span><\/code><\/p><p>The slug is generated during normalization so the record is ready for routes such as a place detail page.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-2f469867 e-flex e-con-boxed e-con e-parent\" data-id=\"2f469867\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-71be97e5 elementor-widget elementor-widget-heading\" data-id=\"71be97e5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Preserve the original source payload\n<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-61d4ef12 elementor-widget elementor-widget-text-editor\" data-id=\"61d4ef12\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>The importer keeps two source-related fields:<\/p><ul><li><code dir=\"ltr\"><span>source = \"outscraper\"<\/span><\/code><\/li><li><code dir=\"ltr\"><span>source_payload = original JSON record<\/span><\/code><\/li><\/ul><ul><\/ul><p>Keeping the raw payload is useful because the normalized record does not include every source field.<\/p><p>It gives the application a reference point for:<\/p><ul><li>checking transformations<\/li><li>debugging import issues<\/li><li>remapping fields later<\/li><li>reviewing source values that were not added to the main schema<\/li><\/ul><p>This keeps the application schema clean without throwing away the original record.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-28596720 e-flex e-con-boxed e-con e-parent\" data-id=\"28596720\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-594552df e-con-full e-flex e-con e-child\" data-id=\"594552df\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-51348d75 e-con-full e-flex e-con e-child\" data-id=\"51348d75\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-5447acff e-con-full e-flex e-con e-child\" data-id=\"5447acff\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2652d610 elementor-widget__width-initial elementor-widget elementor-widget-heading\" data-id=\"2652d610\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-heading-title elementor-size-default\">Need Programmatic Access to Google Maps Data?<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6b9ecb27 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"6b9ecb27\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Use Outscraper\u2019s Google Maps API to send business data into your own application or backend workflow without relying on manual exports.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-4bb9ee7a e-con-full e-flex e-con e-child\" data-id=\"4bb9ee7a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-354a2012 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"354a2012\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/outscraper.com\/google-maps-api\/\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Use Google Maps API<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-23e0abaa e-flex e-con-boxed e-con e-parent\" data-id=\"23e0abaa\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-32c91537 elementor-widget elementor-widget-heading\" data-id=\"32c91537\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Import the Google Maps Data Into Supabase<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4a07fce1 elementor-widget elementor-widget-text-editor\" data-id=\"4a07fce1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Once the Outscraper records are normalized, the next step is to store them in the application database.<\/p><p><span>For Nomad PH, the importer sends the normalized records into a Supabase <\/span><code dir=\"ltr\"><span>places<\/span><\/code><span> table backed by PostgreSQL.<\/span><\/p><p><a href=\"https:\/\/supabase.com\/docs\/guides\/database\/overview\"><strong>Supabase provides a Postgres database<\/strong><\/a> that can be managed through its dashboard or accessed programmatically.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-28548736 e-flex e-con-boxed e-con e-parent\" data-id=\"28548736\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-40e10703 elementor-widget elementor-widget-heading\" data-id=\"40e10703\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Map the normalized data into the places table<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-585766c elementor-widget elementor-widget-text-editor\" data-id=\"585766c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>The table keeps the fields the application needs for listings, routes, filtering, and later map features.<\/p><p>Important fields include:<\/p><ul><li><code dir=\"ltr\"><span>id<\/span><\/code><\/li><li><code dir=\"ltr\"><span>destination_id<\/span><\/code><\/li><li><code dir=\"ltr\"><span>neighborhood_id<\/span><\/code><\/li><li><code dir=\"ltr\"><span>name<\/span><\/code><\/li><li><code dir=\"ltr\"><span>slug<\/span><\/code><\/li><li><code dir=\"ltr\"><span>place_type<\/span><\/code><\/li><li><code dir=\"ltr\"><span>address<\/span><\/code><\/li><li><code dir=\"ltr\"><span>latitude<\/span><\/code><\/li><li><code dir=\"ltr\"><span>longitude<\/span><\/code><\/li><li><code dir=\"ltr\"><span>place_id<\/span><\/code><\/li><li><code dir=\"ltr\"><span>google_rating<\/span><\/code><\/li><li><code dir=\"ltr\"><span>google_reviews_count<\/span><\/code><\/li><li><code dir=\"ltr\"><span>business_status<\/span><\/code><\/li><li><code dir=\"ltr\"><span>website<\/span><\/code><\/li><li><code dir=\"ltr\"><span>phone<\/span><\/code><\/li><li><code dir=\"ltr\"><span>google_maps_url<\/span><\/code><\/li><li><code dir=\"ltr\"><span>source<\/span><\/code><\/li><li><code dir=\"ltr\"><span>source_payload<\/span><\/code><\/li><li><code dir=\"ltr\"><span>is_published<\/span><\/code><\/li><\/ul><ul><\/ul><p>The normalized object is mapped into this structure before the database write happens.<\/p><p>That keeps the database model consistent even if the source JSON contains more fields than the app currently uses.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c791c7b elementor-widget elementor-widget-image\" data-id=\"c791c7b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/supabase-places-table-outscraper-import.webp\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"supabase-places-table-outscraper-import\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6NDg5NjUsInVybCI6Imh0dHBzOlwvXC9vdXRzY3JhcGVyLmNvbVwvd3AtY29udGVudFwvdXBsb2Fkc1wvMjAyNlwvMDlcL3N1cGFiYXNlLXBsYWNlcy10YWJsZS1vdXRzY3JhcGVyLWltcG9ydC53ZWJwIn0%3D\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"750\" height=\"238\" src=\"https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/supabase-places-table-outscraper-import-1024x325.webp\" class=\"attachment-large size-large wp-image-48965\" alt=\"Supabase places table storing Outscraper data for a location-based app\" srcset=\"https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/supabase-places-table-outscraper-import-1024x325.webp 1024w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/supabase-places-table-outscraper-import-300x95.webp 300w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/supabase-places-table-outscraper-import-768x244.webp 768w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/supabase-places-table-outscraper-import-1536x488.webp 1536w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/supabase-places-table-outscraper-import-18x6.webp 18w, https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/supabase-places-table-outscraper-import.webp 1862w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">The normalized Outscraper records are stored in the Supabase places table before the application queries them.<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-388f980 e-flex e-con-boxed e-con e-parent\" data-id=\"388f980\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8a3e017 elementor-button-success elementor-align-center gm_data_signup elementor-widget elementor-widget-button\" data-id=\"8a3e017\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-md\" href=\"https:\/\/auth.outscraper.com\/signup?redirect=\/googleMaps\" target=\"_blank\" id=\"topSignUp\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<i aria-hidden=\"true\" class=\"fas fa-sign-in-alt\"><\/i>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Join Free Tier<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-7fe76a83 e-flex e-con-boxed e-con e-parent\" data-id=\"7fe76a83\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-559d065 elementor-widget elementor-widget-heading\" data-id=\"559d065\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Upsert instead of blindly inserting<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4d83fb56 elementor-widget elementor-widget-text-editor\" data-id=\"4d83fb56\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>The importer uses an <strong>upsert<\/strong>, which updates an existing record when the same <code inline=\"\">place_id<\/code> is found or inserts a new record when it is not.<\/p><p>The importer uses <code inline=\"\">place_id<\/code> as the external identifier for this implementation.<\/p><p>The logic is simple:<\/p><ul><li>if the <code inline=\"\">place_id<\/code> already exists, update the existing record<\/li><li>if it does not exist, insert a new record<\/li><\/ul><p>This helps avoid creating duplicate place records when the same business is imported again.<\/p><p>For this MVP, <code inline=\"\">place_id<\/code> was the source identifier chosen for the upsert logic. It should not be treated as a universal rule for every application.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3da60fb0 elementor-widget elementor-widget-heading\" data-id=\"3da60fb0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Import records in batches\n<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4ef3674f elementor-widget elementor-widget-text-editor\" data-id=\"4ef3674f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>The importer processes records in batches of 200.<\/p><p>That batch size was a development choice for this project, not an Outscraper requirement.<\/p><p>The same importer can work with a smaller or larger batch size depending on the application, database limits, and job size.<\/p><p>Imported records are also set as unpublished at first so they can be reviewed before appearing in the app.<\/p><p>That gives the application one more control point between source data and public content.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-459a59c5 elementor-widget elementor-widget-heading\" data-id=\"459a59c5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Use the Imported Records in Your Location-Based App<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e10e787 elementor-widget elementor-widget-text-editor\" data-id=\"e10e787\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Once the records are in Supabase, the application can use them like any other structured database content.<\/p><p>For Nomad PH, the imported places can support destination listings, individual place pages, and map-based browsing without reading directly from the original JSON file.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bc2cd20 elementor-widget elementor-widget-heading\" data-id=\"bc2cd20\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Render place cards and detail pages<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3f68b7e elementor-widget elementor-widget-text-editor\" data-id=\"3f68b7e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>A stored place record can feed different parts of the interface.<\/p><p>For example:<\/p><p class=\"isSelectedEnd\"><code dir=\"ltr\"><span>Supabase place record<\/span><\/code><br \/><span>\u2192 destination listing<\/span><br \/><span>\u2192 place card<\/span><br \/><span>\u2192 place detail page<\/span><\/p><p><strong>Next.js<\/strong> uses <a href=\"https:\/\/nextjs.org\/docs\/app\/getting-started\/layouts-and-pages\"><strong>file-based routing<\/strong><\/a>, which makes it straightforward to create a separate route for each stored place record.<\/p><p><span>Fields such as <\/span><code dir=\"ltr\"><span>name<\/span><\/code><span>, <\/span><code dir=\"ltr\"><span>slug<\/span><\/code><span>, <\/span><code dir=\"ltr\"><span>place_type<\/span><\/code><span>, <\/span><code dir=\"ltr\"><span>address<\/span><\/code><span>, rating, website, and phone can be shown where they are useful.<\/span><\/p><p>Because the data has already been normalized, the frontend does not need to understand the full Outscraper response each time it renders a place.<code dir=\"ltr\"><span><\/span><\/code><code dir=\"ltr\"><span><\/span><\/code><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1807a71 elementor-widget__width-initial elementor-widget elementor-widget-eael-image-scroller\" data-id=\"1807a71\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"eael-image-scroller.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"eael-image-scroller eael-image-scroller-vertical\">\n\t\t\t<img decoding=\"async\" src=\"https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/location-app-place-detail-page-scaled.webp\" alt=\"Location-based app place detail page using an imported Outscraper business record\">\n\t\t<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d41c0e7 elementor-widget elementor-widget-heading\" data-id=\"d41c0e7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Use coordinates for maps and spatial features<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4e6e509 elementor-widget elementor-widget-text-editor\" data-id=\"4e6e509\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p class=\"isSelectedEnd\"><span>The imported records also keep <\/span><code dir=\"ltr\"><span>latitude<\/span><\/code><span> and <\/span><code dir=\"ltr\"><span>longitude<\/span><\/code><span>.<\/span><\/p><p class=\"isSelectedEnd\"><span>Those coordinates can later support:<\/span><\/p><ul data-spread=\"false\"><li><span>map markers<\/span><\/li><li><span>geographic browsing<\/span><\/li><li><span>PostGIS geography points<\/span><\/li><li><span>nearby-place searches<\/span><\/li><\/ul><p class=\"isSelectedEnd\"><span>For this MVP, the coordinates are stored first so the records are ready for later map and spatial work.<\/span><\/p><p><span>The full PostGIS nearby-search logic sits outside the scope of this article.<\/span><\/p><p>For a broader look at how application workflows can get Google Maps data, see <a href=\"https:\/\/outscraper.com\/google-maps-api-vs-web-scraping\/\"><strong data-start=\"2266\" data-end=\"2302\">Google Maps API vs. web scraping<\/strong><\/a>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-abf41b7 elementor-widget elementor-widget-heading\" data-id=\"abf41b7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Add app-specific data on top<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4243957 elementor-widget elementor-widget-text-editor\" data-id=\"4243957\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>The Outscraper record provides the business and location layer.<\/p><p>Nomad PH can then add its own data around the same place, such as:<\/p><ul><li>Wi-Fi speed reports<\/li><li>upload speed<\/li><li>ping<\/li><li>generator observations<\/li><li>power outage observations<\/li><li>user reviews<\/li><li>verification logic<\/li><\/ul><p>This keeps the source data separate from the information created inside the application.<\/p><p class=\"isSelectedEnd\"><span>The result is a simple data model:<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6ab267f elementor-widget elementor-widget-shortcode\" data-id=\"6ab267f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><div style=\"\n  border: 1px solid #e5e7eb;\n  border-radius: 10px;\n  padding: 18px 20px;\n  margin: 20px 0 24px;\n  background: #f8fafc;\n  text-align: center;\n  font-size: 17px;\n  line-height: 1.7;\n\">\n  <strong>Outscraper business data<\/strong>\n  <span style=\"margin: 0 8px;\">+<\/span>\n  <strong>app-specific and community data<\/strong>\n  <span style=\"margin: 0 8px;\">=<\/span>\n  <strong>a richer place record<\/strong>\n<\/div><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7729907 elementor-widget elementor-widget-heading\" data-id=\"7729907\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Final Checklist: Build a Location-Based App With Google Maps Data<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-16b13274 elementor-widget elementor-widget-text-editor\" data-id=\"16b13274\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ol><li>Collect the business records with <a href=\"https:\/\/outscraper.com\/\"><strong>Outscraper<\/strong><\/a>.<\/li><li>Export and normalize the JSON fields your app needs.<\/li><li>Map the records into your own database schema.<\/li><li>Upsert the records into Supabase\/PostgreSQL.<\/li><li>Use the stored data for listings, detail pages, maps, and later spatial features.<\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-2a996877 e-flex e-con-boxed e-con e-parent\" data-id=\"2a996877\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-23416bb6 e-con-full e-flex e-con e-child\" data-id=\"23416bb6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-423865c7 elementor-widget elementor-widget-heading\" data-id=\"423865c7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-heading-title elementor-size-default\">Build Your Location-Based App With Outscraper Data\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4b4088f7 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"4b4088f7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Use Outscraper to collect structured business records, normalize them into your own schema, and store them in Supabase for listings, maps, and other app features.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3ebf47f2 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"3ebf47f2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/auth.outscraper.com\/businesses?country=US\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Get Business Data<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-15e21709 e-flex e-con-boxed e-con e-parent\" data-id=\"15e21709\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-28ec6d4b elementor-widget elementor-widget-template\" data-id=\"28ec6d4b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"template.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-template\">\n\t\t\t\t\t<div data-elementor-type=\"section\" data-elementor-id=\"13580\" class=\"elementor elementor-13580\" data-elementor-post-type=\"elementor_library\">\n\t\t\t\t\t<section data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-section elementor-top-section elementor-element elementor-element-6b414f7 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6b414f7\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-28114d07\" data-id=\"28114d07\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-209f7ca8 elementor-widget elementor-widget-html\" data-id=\"209f7ca8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 align=\"center\">FAQ<\/h2>\n<p align=\"center\" style=\"font-size:20px\">Most frequent questions and answers<p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-43a4e13e elementor-widget elementor-widget-toggle\" data-id=\"43a4e13e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"toggle.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-toggle\">\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<div id=\"elementor-tab-title-1131\" class=\"elementor-tab-title\" data-tab=\"1\" role=\"button\" aria-controls=\"elementor-tab-content-1131\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-right\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Can I use Outscraper JSON directly in an app?<\/a>\n\t\t\t\t\t<\/div>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-1131\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"1\" role=\"region\" aria-labelledby=\"elementor-tab-title-1131\"><p>Yes, but mapping the source fields into your own schema gives you better control over categories, updates, and database structure.<\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<div id=\"elementor-tab-title-1132\" class=\"elementor-tab-title\" data-tab=\"2\" role=\"button\" aria-controls=\"elementor-tab-content-1132\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-right\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Why use Supabase in this example?<\/a>\n\t\t\t\t\t<\/div>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-1132\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"2\" role=\"region\" aria-labelledby=\"elementor-tab-title-1132\"><p>Supabase stores the normalized place records in PostgreSQL and makes them available to the Next.js app.<\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<div id=\"elementor-tab-title-1133\" class=\"elementor-tab-title\" data-tab=\"3\" role=\"button\" aria-controls=\"elementor-tab-content-1133\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-right\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Can the same coordinates support maps and nearby search?<\/a>\n\t\t\t\t\t<\/div>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-1133\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"3\" role=\"region\" aria-labelledby=\"elementor-tab-title-1133\"><p>Yes. Stored latitude and longitude can power map markers and later support PostGIS nearby-place searches.<\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<div id=\"elementor-tab-title-1134\" class=\"elementor-tab-title\" data-tab=\"4\" role=\"button\" aria-controls=\"elementor-tab-content-1134\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-right\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">Should I keep the raw Outscraper response?<\/a>\n\t\t\t\t\t<\/div>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-1134\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"4\" role=\"region\" aria-labelledby=\"elementor-tab-title-1134\"><p><span>Yes. Keeping the original JSON in <\/span><code dir=\"ltr\"><span>source_payload<\/span><\/code><span> helps with debugging, checking transformations, and adding fields later.<\/span><\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-toggle-item\">\n\t\t\t\t\t<div id=\"elementor-tab-title-1135\" class=\"elementor-tab-title\" data-tab=\"5\" role=\"button\" aria-controls=\"elementor-tab-content-1135\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon elementor-toggle-icon-right\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-toggle-icon-opened\"><i class=\"elementor-toggle-icon-opened fas fa-caret-up\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-toggle-title\" tabindex=\"0\">What does upsert mean?<\/a>\n\t\t\t\t\t<\/div>\n\n\t\t\t\t\t<div id=\"elementor-tab-content-1135\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"5\" role=\"region\" aria-labelledby=\"elementor-tab-title-1135\"><p><span>An upsert updates a record if it already exists or inserts a new one if it does not. In this MVP, <\/span><code dir=\"ltr\"><span>place_id<\/span><\/code><span> is used to decide whether a place should be u<\/span><\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t<script type=\"application\/ld+json\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"Can I use Outscraper JSON directly in an app?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p>Yes, but mapping the source fields into your own schema gives you better control over categories, updates, and database structure.<\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"Why use Supabase in this example?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p>Supabase stores the normalized place records in PostgreSQL and makes them available to the Next.js app.<\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"Can the same coordinates support maps and nearby search?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p>Yes. Stored latitude and longitude can power map markers and later support PostGIS nearby-place searches.<\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"Should I keep the raw Outscraper response?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p><span>Yes. Keeping the original JSON in <\\\/span><code dir=\\\"ltr\\\"><span>source_payload<\\\/span><\\\/code><span> helps with debugging, checking transformations, and adding fields later.<\\\/span><\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"What does upsert mean?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p><span>An upsert updates a record if it already exists or inserts a new one if it does not. In this MVP, <\\\/span><code dir=\\\"ltr\\\"><span>place_id<\\\/span><\\\/code><span> is used to decide whether a place should be u<\\\/span><\\\/p>\"}}]}<\/script>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Turn Outscraper Google Maps data into records a location-based app can use. See how JSON business data is normalized with TypeScript, stored in Supabase\/PostgreSQL, and prepared for listings, maps, and spatial features.<\/p>","protected":false},"author":19,"featured_media":48952,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[90],"tags":[1049,373,129,202,1050,152,1047,1046,1048],"class_list":["post-48872","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-app-development","tag-google-maps-data","tag-google-maps","tag-location-intelligence","tag-location-based-app","tag-outscraper","tag-postgresql","tag-supabase","tag-typescript"],"acf":[],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO Pro 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Build a location-based app by turning Google Maps business data into application-ready records with Outscraper JSON, TypeScript, Supabase, and PostgreSQL.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Ed Umbao\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/outscraper.com\/it\/location-based-app-google-maps-data-supabase\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO Pro (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Outscraper \u2013 Business Data &amp; Enrichment Platform\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Build a Location-Based App With Google Maps Data | Outscraper\" \/>\n\t\t<meta property=\"og:description\" content=\"Build a location-based app by turning Google Maps business data into application-ready records with Outscraper JSON, TypeScript, Supabase, and PostgreSQL.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/outscraper.com\/it\/location-based-app-google-maps-data-supabase\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/outscraper.com\/wp-content\/uploads\/2023\/11\/cropped-logo-long-inverted-e1628850885713.webp\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/outscraper.com\/wp-content\/uploads\/2023\/11\/cropped-logo-long-inverted-e1628850885713.webp\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-09-14T08:12:34+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-09-14T08:59:17+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/outscraper\/\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/edumbao\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@outscraper\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Build a Location-Based App With Google Maps Data | Outscraper\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Build a location-based app by turning Google Maps business data into application-ready records with Outscraper JSON, TypeScript, Supabase, and PostgreSQL.\" \/>\n\t\t<meta name=\"twitter:creator\" content=\"@edmundumbao\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/outscraper.com\/wp-content\/uploads\/2020\/01\/logo.png\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/location-based-app-google-maps-data-supabase\\\/#article\",\"name\":\"Build a Location-Based App With Google Maps Data | Outscraper\",\"headline\":\"How to Build a Location-Based App with Google Maps Data and Supabase\",\"author\":{\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/author\\\/ed\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/outscraper.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/location-based-app-google-maps-data-supabase.webp\",\"width\":1270,\"height\":715,\"caption\":\"The Nomad PH MVP displays imported business records on a map using stored latitude and longitude.\"},\"datePublished\":\"2026-09-14T11:12:34+03:00\",\"dateModified\":\"2026-09-14T11:59:17+03:00\",\"inLanguage\":\"it-IT\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/location-based-app-google-maps-data-supabase\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/location-based-app-google-maps-data-supabase\\\/#webpage\"},\"articleSection\":\"Tutorials, App Development, Google Maps data, google-maps, Location Intelligence, Location-Based App, Outscraper, PostgreSQL, Supabase, TypeScript\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/location-based-app-google-maps-data-supabase\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/outscraper.com\\\/it#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/outscraper.com\\\/it\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/category\\\/tutorials\\\/#listItem\",\"name\":\"Tutorials\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/category\\\/tutorials\\\/#listItem\",\"position\":2,\"name\":\"Tutorials\",\"item\":\"https:\\\/\\\/outscraper.com\\\/it\\\/category\\\/tutorials\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/location-based-app-google-maps-data-supabase\\\/#listItem\",\"name\":\"How to Build a Location-Based App with Google Maps Data and Supabase\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/outscraper.com\\\/it#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/location-based-app-google-maps-data-supabase\\\/#listItem\",\"position\":3,\"name\":\"How to Build a Location-Based App with Google Maps Data and Supabase\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/category\\\/tutorials\\\/#listItem\",\"name\":\"Tutorials\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/#organization\",\"name\":\"Outscraper\",\"description\":\"Business Data & Enrichment Platform\",\"url\":\"https:\\\/\\\/outscraper.com\\\/it\\\/\",\"telephone\":\"+12812368208\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/en.gravatar.com\\\/userimage\\\/171842403\\\/0bc12b5208ff9323cafe7e39db3aef4e.png?size=500\",\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/location-based-app-google-maps-data-supabase\\\/#organizationLogo\"},\"image\":{\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/location-based-app-google-maps-data-supabase\\\/#organizationLogo\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/outscraper\\\/\",\"https:\\\/\\\/twitter.com\\\/outscraper\",\"https:\\\/\\\/www.instagram.com\\\/outscraper.services\\\/\",\"https:\\\/\\\/www.tiktok.com\\\/@outscraper\\\/\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCDYOuXSEenLpt5tKNq-0l9Q\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/42886775\\\/admin\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/author\\\/ed\\\/#author\",\"url\":\"https:\\\/\\\/outscraper.com\\\/it\\\/author\\\/ed\\\/\",\"name\":\"Ed Umbao\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/location-based-app-google-maps-data-supabase\\\/#authorImage\",\"url\":\"https:\\\/\\\/outscraper.com\\\/wp-content\\\/litespeed\\\/avatar\\\/2b40d924571ea6350f4a0dfca2202d81.jpg?ver=1789053928\",\"width\":96,\"height\":96,\"caption\":\"Ed Umbao\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/edumbao\",\"https:\\\/\\\/twitter.com\\\/edmundumbao\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/ed-umbao\\\/\"]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/location-based-app-google-maps-data-supabase\\\/#webpage\",\"url\":\"https:\\\/\\\/outscraper.com\\\/it\\\/location-based-app-google-maps-data-supabase\\\/\",\"name\":\"Build a Location-Based App With Google Maps Data | Outscraper\",\"description\":\"Build a location-based app by turning Google Maps business data into application-ready records with Outscraper JSON, TypeScript, Supabase, and PostgreSQL.\",\"inLanguage\":\"it-IT\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/location-based-app-google-maps-data-supabase\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/author\\\/ed\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/author\\\/ed\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/outscraper.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/location-based-app-google-maps-data-supabase.webp\",\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/location-based-app-google-maps-data-supabase\\\/#mainImage\",\"width\":1270,\"height\":715,\"caption\":\"The Nomad PH MVP displays imported business records on a map using stored latitude and longitude.\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/location-based-app-google-maps-data-supabase\\\/#mainImage\"},\"datePublished\":\"2026-09-14T11:12:34+03:00\",\"dateModified\":\"2026-09-14T11:59:17+03:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/#website\",\"url\":\"https:\\\/\\\/outscraper.com\\\/it\\\/\",\"name\":\"Outscraper\",\"description\":\"Business Data & Enrichment Platform\",\"inLanguage\":\"it-IT\",\"publisher\":{\"@id\":\"https:\\\/\\\/outscraper.com\\\/it\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO Pro -->\r\n\t\t<title>Build a Location-Based App With Google Maps Data | Outscraper<\/title>\n\n","aioseo_head_json":{"title":"Build a Location-Based App With Google Maps Data | Outscraper","description":"Build a location-based app by turning Google Maps business data into application-ready records with Outscraper JSON, TypeScript, Supabase, and PostgreSQL.","canonical_url":"https:\/\/outscraper.com\/it\/location-based-app-google-maps-data-supabase\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/outscraper.com\/it\/location-based-app-google-maps-data-supabase\/#article","name":"Build a Location-Based App With Google Maps Data | Outscraper","headline":"How to Build a Location-Based App with Google Maps Data and Supabase","author":{"@id":"https:\/\/outscraper.com\/it\/author\/ed\/#author"},"publisher":{"@id":"https:\/\/outscraper.com\/it\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/location-based-app-google-maps-data-supabase.webp","width":1270,"height":715,"caption":"The Nomad PH MVP displays imported business records on a map using stored latitude and longitude."},"datePublished":"2026-09-14T11:12:34+03:00","dateModified":"2026-09-14T11:59:17+03:00","inLanguage":"it-IT","mainEntityOfPage":{"@id":"https:\/\/outscraper.com\/it\/location-based-app-google-maps-data-supabase\/#webpage"},"isPartOf":{"@id":"https:\/\/outscraper.com\/it\/location-based-app-google-maps-data-supabase\/#webpage"},"articleSection":"Tutorials, App Development, Google Maps data, google-maps, Location Intelligence, Location-Based App, Outscraper, PostgreSQL, Supabase, TypeScript"},{"@type":"BreadcrumbList","@id":"https:\/\/outscraper.com\/it\/location-based-app-google-maps-data-supabase\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/outscraper.com\/it#listItem","position":1,"name":"Home","item":"https:\/\/outscraper.com\/it","nextItem":{"@type":"ListItem","@id":"https:\/\/outscraper.com\/it\/category\/tutorials\/#listItem","name":"Tutorials"}},{"@type":"ListItem","@id":"https:\/\/outscraper.com\/it\/category\/tutorials\/#listItem","position":2,"name":"Tutorials","item":"https:\/\/outscraper.com\/it\/category\/tutorials\/","nextItem":{"@type":"ListItem","@id":"https:\/\/outscraper.com\/it\/location-based-app-google-maps-data-supabase\/#listItem","name":"How to Build a Location-Based App with Google Maps Data and Supabase"},"previousItem":{"@type":"ListItem","@id":"https:\/\/outscraper.com\/it#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/outscraper.com\/it\/location-based-app-google-maps-data-supabase\/#listItem","position":3,"name":"How to Build a Location-Based App with Google Maps Data and Supabase","previousItem":{"@type":"ListItem","@id":"https:\/\/outscraper.com\/it\/category\/tutorials\/#listItem","name":"Tutorials"}}]},{"@type":"Organization","@id":"https:\/\/outscraper.com\/it\/#organization","name":"Outscraper","description":"Business Data & Enrichment Platform","url":"https:\/\/outscraper.com\/it\/","telephone":"+12812368208","logo":{"@type":"ImageObject","url":"https:\/\/en.gravatar.com\/userimage\/171842403\/0bc12b5208ff9323cafe7e39db3aef4e.png?size=500","@id":"https:\/\/outscraper.com\/it\/location-based-app-google-maps-data-supabase\/#organizationLogo"},"image":{"@id":"https:\/\/outscraper.com\/it\/location-based-app-google-maps-data-supabase\/#organizationLogo"},"sameAs":["https:\/\/www.facebook.com\/outscraper\/","https:\/\/twitter.com\/outscraper","https:\/\/www.instagram.com\/outscraper.services\/","https:\/\/www.tiktok.com\/@outscraper\/","https:\/\/www.youtube.com\/channel\/UCDYOuXSEenLpt5tKNq-0l9Q","https:\/\/www.linkedin.com\/company\/42886775\/admin\/"]},{"@type":"Person","@id":"https:\/\/outscraper.com\/it\/author\/ed\/#author","url":"https:\/\/outscraper.com\/it\/author\/ed\/","name":"Ed Umbao","image":{"@type":"ImageObject","@id":"https:\/\/outscraper.com\/it\/location-based-app-google-maps-data-supabase\/#authorImage","url":"https:\/\/outscraper.com\/wp-content\/litespeed\/avatar\/2b40d924571ea6350f4a0dfca2202d81.jpg?ver=1789053928","width":96,"height":96,"caption":"Ed Umbao"},"sameAs":["https:\/\/www.facebook.com\/edumbao","https:\/\/twitter.com\/edmundumbao","https:\/\/www.linkedin.com\/in\/ed-umbao\/"]},{"@type":"WebPage","@id":"https:\/\/outscraper.com\/it\/location-based-app-google-maps-data-supabase\/#webpage","url":"https:\/\/outscraper.com\/it\/location-based-app-google-maps-data-supabase\/","name":"Build a Location-Based App With Google Maps Data | Outscraper","description":"Build a location-based app by turning Google Maps business data into application-ready records with Outscraper JSON, TypeScript, Supabase, and PostgreSQL.","inLanguage":"it-IT","isPartOf":{"@id":"https:\/\/outscraper.com\/it\/#website"},"breadcrumb":{"@id":"https:\/\/outscraper.com\/it\/location-based-app-google-maps-data-supabase\/#breadcrumblist"},"author":{"@id":"https:\/\/outscraper.com\/it\/author\/ed\/#author"},"creator":{"@id":"https:\/\/outscraper.com\/it\/author\/ed\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/outscraper.com\/wp-content\/uploads\/2026\/09\/location-based-app-google-maps-data-supabase.webp","@id":"https:\/\/outscraper.com\/it\/location-based-app-google-maps-data-supabase\/#mainImage","width":1270,"height":715,"caption":"The Nomad PH MVP displays imported business records on a map using stored latitude and longitude."},"primaryImageOfPage":{"@id":"https:\/\/outscraper.com\/it\/location-based-app-google-maps-data-supabase\/#mainImage"},"datePublished":"2026-09-14T11:12:34+03:00","dateModified":"2026-09-14T11:59:17+03:00"},{"@type":"WebSite","@id":"https:\/\/outscraper.com\/it\/#website","url":"https:\/\/outscraper.com\/it\/","name":"Outscraper","description":"Business Data & Enrichment Platform","inLanguage":"it-IT","publisher":{"@id":"https:\/\/outscraper.com\/it\/#organization"}}]},"og:locale":"it_IT","og:site_name":"Outscraper \u2013 Business Data &amp; Enrichment Platform","og:type":"article","og:title":"Build a Location-Based App With Google Maps Data | Outscraper","og:description":"Build a location-based app by turning Google Maps business data into application-ready records with Outscraper JSON, TypeScript, Supabase, and PostgreSQL.","og:url":"https:\/\/outscraper.com\/it\/location-based-app-google-maps-data-supabase\/","og:image":"https:\/\/outscraper.com\/wp-content\/uploads\/2023\/11\/cropped-logo-long-inverted-e1628850885713.webp","og:image:secure_url":"https:\/\/outscraper.com\/wp-content\/uploads\/2023\/11\/cropped-logo-long-inverted-e1628850885713.webp","article:published_time":"2026-09-14T08:12:34+00:00","article:modified_time":"2026-09-14T08:59:17+00:00","article:publisher":"https:\/\/www.facebook.com\/outscraper\/","article:author":"https:\/\/www.facebook.com\/edumbao","twitter:card":"summary","twitter:site":"@outscraper","twitter:title":"Build a Location-Based App With Google Maps Data | Outscraper","twitter:description":"Build a location-based app by turning Google Maps business data into application-ready records with Outscraper JSON, TypeScript, Supabase, and PostgreSQL.","twitter:creator":"@edmundumbao","twitter:image":"https:\/\/outscraper.com\/wp-content\/uploads\/2020\/01\/logo.png"},"aioseo_meta_data":{"post_id":"48872","title":"Build a Location-Based App With Google Maps Data | #site_title","description":"Build a location-based app by turning Google Maps business data into application-ready records with Outscraper JSON, TypeScript, Supabase, and PostgreSQL.","keywords":null,"keyphrases":{"focus":{"keyphrase":"location-based app","score":0,"analysis":[]},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"WebPage","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","location":null,"local_seo":null,"seo_analyzer_scan_date":"2026-09-14 09:00:04","breadcrumb_settings":null,"limit_modified_date":false,"open_ai":null,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2026-09-11 03:27:43","updated":"2026-09-14 09:36:10","focus_keyword":"location-based app","additional_keywords":null,"truseo_locale":null},"_links":{"self":[{"href":"https:\/\/outscraper.com\/it\/wp-json\/wp\/v2\/posts\/48872","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/outscraper.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/outscraper.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/outscraper.com\/it\/wp-json\/wp\/v2\/users\/19"}],"replies":[{"embeddable":true,"href":"https:\/\/outscraper.com\/it\/wp-json\/wp\/v2\/comments?post=48872"}],"version-history":[{"count":80,"href":"https:\/\/outscraper.com\/it\/wp-json\/wp\/v2\/posts\/48872\/revisions"}],"predecessor-version":[{"id":49158,"href":"https:\/\/outscraper.com\/it\/wp-json\/wp\/v2\/posts\/48872\/revisions\/49158"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/outscraper.com\/it\/wp-json\/wp\/v2\/media\/48952"}],"wp:attachment":[{"href":"https:\/\/outscraper.com\/it\/wp-json\/wp\/v2\/media?parent=48872"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/outscraper.com\/it\/wp-json\/wp\/v2\/categories?post=48872"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/outscraper.com\/it\/wp-json\/wp\/v2\/tags?post=48872"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}