The connector only reads data. It never confirms, cancels or changes orders, never changes stores or menus, and never links or unlinks stores.
Before you start
- You need your own 99Food application. The App ID and App Secret come from an application created in the 99Food developer portal by a company that 99Food approved as a partner (99Food asks for a business agreement, an NDA and a review of the company). If you do not have one, ask your 99Food representative. Nekt does not provide this application.
- Each store can be linked to only one application. Linking a store to a new application unlinks it from the one it uses today (for example, the POS system that receives your orders), and that system stops receiving the store’s orders. Use an application that is already linked to your stores, or one that does not take your stores away from your POS. Check this with your 99Food representative or your POS provider before linking anything.
- The connector never reads or confirms the order queue. 99Food sends new orders to the application’s own system. The connector does not touch that flow: it finds the orders in the financial data and reads each one by its number. That is why only orders your stores accepted appear, and only after they appear in the financial data.
- Reviews are not available. 99Food does not offer customer reviews or ratings to applications.
- Financial data covers only the last three months. 99Food does not return older financial entries or payouts.
Configuring 99Food as a Source
In the Sources tab, click on the “Add source” button located on the top right of your screen. Then, select the 99Food option from the list of connectors. Click Next and you’ll be prompted to add your access.1. Add account access
In the 99Food developer portal, open Application Management and the production application your stores are linked to. Copy its App ID and App Secret. Under Store Management you can see the App Shop ID of each linked store. The following configurations are available:- App ID: The App ID of your 99Food application.
- App Secret: The App Secret of the same application.
- Start Date: Earliest date of the financial data to read. 99Food only keeps the last three months, so an older date is read from three months ago.
- Order Details Backfill (days): How many days of orders the Orders table reads on its first sync (1 to 88, 7 by default). 99Food only lets orders be read one at a time, so every day of backfill makes the first sync longer.
- Max Orders per Sync (advanced): The most orders the Orders table reads in one sync (100 to 20,000; 1,500 by default, about 1.7 hours). Orders left over are read by the next syncs.
- Store IDs (advanced): The App Shop IDs of the stores to read. Leave it empty to read every store linked to the application.
Sizing for large networks
- Orders per day must stay below Max Orders per Sync × syncs per day. For example, 300 stores with 20 orders a day each (6,000 orders) need a Max Orders per Sync of 3,000 with two syncs a day, or 1,500 with four. At about 4 seconds per order, 1,500 orders take about 1.7 hours.
- Each store adds about 7 to 8 minutes per sync when every table is selected (access token, store details and menu), before orders: 10 stores take about 1.3 hours, 50 stores about 6 to 7 hours. With many stores, deselect Store Details and the menu tables here and sync them in a second 99Food source scheduled once a day or less, at a time when the main source is not running (both share the same 99Food limits).
- If the Orders table falls behind, the sync log warns when the orders waiting grow from one sync to the next, or when the oldest is more than 30 days old. Raise Max Orders per Sync or schedule more syncs: 99Food only keeps three months of financial data, so orders that fall further behind than that can no longer be read.
2. Select streams
Choose which data streams you want to sync. For faster extractions, select only the streams that are relevant to your analysis. You can select entire groups of streams or pick specific ones.Tip: The stream can be found more easily by typing its name.Select the streams and click Next.
3. Configure data streams
Customize how you want your data to appear in your catalog. Select the desired layer where the data will be placed, a folder to organize it inside the layer, a name for each table (which will effectively contain the fetched data) and the type of sync.- Layer: choose between the existing layers on your catalog. This is where you will find your new extracted tables as the extraction runs successfully.
- Folder: a folder can be created inside the selected layer to group all tables being created from this new data source.
- Table name: we suggest a name, but feel free to customize it. You have the option to add a prefix to all tables at once and make this process faster!
- Sync Type: you can choose between INCREMENTAL and FULL_TABLE.
- Incremental: every time the extraction happens, we’ll get only the new data, which is good if, for example, you want to keep every record ever fetched.
- Full table: every time the extraction happens, we’ll get the current state of the data, which is good if, for example, you don’t want to have deleted data in your catalog.
4. Configure data source
Describe your data source for easy identification within your organization, not exceeding 140 characters. To define your Trigger, consider how often you want data to be extracted from this source. This decision usually depends on how frequently you need the new table data updated (every day, once a week, or only at specific times). Optionally, you can define some additional settings:- Configure Delta Log Retention and determine for how long we should store old states of this table as it gets updated. Read more about this resource here.
5. Check your new source
You can view your new source on the Sources page. If needed, manually trigger the source extraction by clicking on the arrow button. Once executed, your data will appear in your Catalog.Streams and Fields
Available streams
The table below lists every stream and its slug (the exact identifier to pass when creating the source via API).Things to know
- Amounts are in cents. Every amount is an integer in the smallest currency unit, exactly as 99Food sends it:
1990means R$ 19.90. The commission rate is in hundredths of a percent (3500means 35%). - Identifiers are text. 99Food uses 19-digit numbers for stores and orders; they are stored as text so they keep every digit.
- How orders are found. Orders come from the order numbers in the financial entries of each store. Orders a store did not accept (refused or cancelled before acceptance) do not appear. An order whose status changes later (completed, cancelled or refunded) is read again: an order still in progress is checked on the next syncs, for up to 7 days (after that the sync log counts the orders kept with their last status), and a refund or cancellation creates a new financial entry that makes the order be read again.
- Orders 99Food does not return. If 99Food does not return an order, the sync log says so and the next syncs try again, up to five times. After that the table’s run is marked as failed once; the order’s amounts are still in Financial Entries.
- Late financial updates. Financial entries get their daily payment id and payment date after they are created, and some entries change weeks later (for example, a cancellation), so each sync reads the last 35 days again (records read twice are merged).
- Today’s entries. If 99Food keeps adding entries to a store’s today while the connector reads them, that store’s today is left for the next sync, and the sync log says so. Nothing is lost: the next sync reads that whole day again, both its financial entries and its orders.
- Stores linked later. A store linked to the application after the first sync gets its own history on its next sync: financial data from the Start Date (up to three months) and orders from the Order Details Backfill.
- Stores unlinked or removed from Store IDs. Their orders still waiting to be read again are no longer followed (the sync log counts them) and keep the values already loaded; the other stores are not affected. If the store comes back, its financial data is read again from the Start Date (up to three months) and its orders continue from where they stopped, so the time it was away is covered as long as it is within the three months 99Food keeps (the sync log warns otherwise). After a long absence, its orders are read from the oldest day 99Food still has (up to 88 days), not from the Order Details Backfill; each sync reads at most Max Orders per Sync of them, and the sync log warns if the Orders table falls behind.
- Long pauses. 99Food only keeps three months of financial data. If the source does not sync for longer than that, the period in between can no longer be read, and the sync log names it. Keep the source syncing at least monthly.
- Empty menus. If 99Food answers a store’s menu with no menus, categories, items or modifier groups at all, the menu tables are not updated in that sync (instead of erasing that store’s menu), and the sync log says so.
- Local time.
business_date_timeandcancel_date_timeare in the store’s local time, as 99Food sends them;business_atis the same moment in UTC. - Personal data. The Orders table includes the customer’s name, document and delivery address as sent by 99Food (
receive_address). Handle it according to your data protection policies.
Fields by stream
Below you’ll find all available data streams from 99Food and their corresponding fields:Stores
Stores
Stream
stores. Full table; key shop_id.shop_id- Unique identifier of the store in 99Food (64-bit number, kept as text)app_shop_id- Identifier of the store in the integrator’s system (the Store ID used by this connector)shop_name- Name of the storebound_flag- Whether the store is linked to the application: 1 linked, 0 not linkedshop_phone- Phones of the store (JSON array of objects with type, phone and callingCode)
Store Details
Store Details
Stream
store_details. Full table; key shop_id.shop_id- Unique identifier of the store in 99Food (64-bit number, kept as text)app_shop_id- Identifier of the store in the integrator’s systemname- Name of the store displayed to customerslogo_img- URL of the store’s logo imagehead_img- URL of the main image shown to customers browsing the storeannounce- Top address line of the store locationaddr- Address of the storepoi_name- Address of the store as mapped to a point of interestlat- Latitude of the store’s addresslng- Longitude of the store’s addressbiz_status- Business status of the store: 1 online, 2 closedsub_biz_status- Detailed real-time status: 1 opened, 2 paused, 3 closed, 4 disconnected, 5 closed for the day, 6 blocked, 7 closed by the systemauto_switch- How the store goes online: 1 manually, 2 automaticallypromise_produce_time- Average preparation time configured by the store, in secondsshop_phone- Phones of the store (JSON array)biz_day_time- Days and hours when the store opens (JSON array)main_categories- Main, second and third categories of the store (JSON object)shop_front_photo- URL of the photo of the store frontshop_surrounding_photo- URL of the photo of the store surroundingsbuilding_entrance_photo- URL of the photo of the building entrancebusy_mode_info- Busy-mode configuration: busy state, duration and extra preparation minutes (JSON object)store_availability_status- Whether the store can take orders: 1 available, 2 unavailablestore_unavailable_reason- Reason why the store is unavailablestore_unavailable_end_at- Expected end of the store’s unavailability (UTC)
Financial Entries
Financial Entries
Stream
financial_entries. Incremental by business_at; key app_shop_id, order_id, order_type, business_ts.app_shop_id- Identifier of the store in the integrator’s system (the Store ID the entry was read for)shop_id- Identifier of the store in 99Foodshop_name- Name of the storecontractor_id- Identifier of the legal entity of the storecontractor_name- Name of the legal entity of the storecity_id- Identifier of the city of the storecity_name- Name of the city of the storeorder_id- 99Food order id for order entries (types 1, 2, 3, 4, 8, 9); the expense id for non-order entries (type 5)order_index- Short order number shown to the store (order entries only)order_type- Entry type: 1 order revenue, 2 order refund, 3 partial refund during the sale, 4 after-sale refund, 5 non-order expense (e.g. ads), 8 meal loss deduction, 9 item exchange adjustmentdelivery_type- 0 no delivery, 1 platform delivery, 2 store delivery (order entries only)business_ts- When the entry happened, as Unix secondsbusiness_at- When the entry happened (UTC); used as the incremental replication keybusiness_date_time- When the entry happened, in the store’s local time as sent by 99Food (YYYY-MM-DDTHH:MM:SS, no time zone)meal_original_amount- Original price of the meal before discounts, in centsshop_activity_outcome- Store’s cost of item discounts, in centsshop_activity_subsidy- Platform subsidy to the store for item discounts, in centsshop_delivery_amount- Delivery fee collected by the store in self-delivery, in centsshop_pre_tips- Tip paid by the customer to the store, in centsfree_delivery_outcome- Store’s cost of free-delivery campaigns, in centsfree_delivery_subsidy- Platform subsidy to the store for free-delivery campaigns, in centscommission_base_amount- Base amount of the commission, in centscommission_rate- Commission rate in hundredths of a percent (3500 = 35%)commission_amount- Commission charged by the platform, in centscommission_subsidy_amount- Platform subsidy to the store on the commission, in centsb2p_delivery_amount- Logistics fee charged by the platform to the store, in centspay_commission_amount- Payment processing fee charged to the store, in centsmin_value_difference_amount- Amount paid by the customer to reach the minimum order value, in centsorder_amount- Final order amount of the entry, in centspayment_method- 0 unspecified, 1 online, 2 offline, -1 refundpayment_channel- Payment channel code (e.g. 150 credit card, 153 cash, 212/280 PIX)payment_method_detail- Detailed payment method codecard_brand- Card brand (VISA, MASTERCARD…) when paid by cardcancel_ts- When the order was cancelled, as Unix seconds (0 when not cancelled)cancel_date_time- When the order was cancelled, in the store’s local time as sent by 99Foodcancel_reason- Cancellation reason code (0 none; 1 customer; 101 store; 202 no rider; 301 customer service…)cash_balance- Cash collected by the store for cash orders, in centsmeal_voucher_amount- Amount paid with meal vouchers, in centssettlement_amount- Final amount settled to the store for this entry, in centsexpect_settle_date- Date the amount is scheduled to be paid to the storeday_payment_id- Identifier of the daily settlement that includes this entry (filled in once settled)meal_loss_deduct_amount- Deduction for a cancellation the store is liable for, in cents (type 8)vat_amount- Value-added tax on platform commissions, in centsmerchant_appeal_amount- Compensation after a successful appeal by the store, in cents (type 5)monthly_service_price- Monthly fee charged to grocery stores, in cents (type 5)gmv- GMV of the monthly-fee period of grocery stores, in cents (type 5)monthly_service_base_price- Monthly-fee threshold of grocery stores, in cents (type 5)monthly_service_calculation_cycle- Monthly-fee period of grocery stores (YYYY-MM-DD~YYYY-MM-DD)raw_payload- The entry exactly as sent by 99Food (JSON object)
Weekly Settlements
Weekly Settlements
Stream
weekly_settlements. Incremental by settle_end_date; key app_shop_id, week_payment_id.app_shop_id- Identifier of the store in the integrator’s system (the Store ID the payout was read for)week_payment_id- Unique identifier of the weekly paymentshop_id- Identifier of the store in 99Foodwithdraw_date- Date the payout was actually madewithdraw_amount- Amount of this payout, in centsliability- Entity responsible for the paymentsettle_start_date- First day of the settled periodsettle_end_date- Last day of the settled period; used as the incremental replication keycurrency- Currency code (BRL)day_payment_id_list- Identifiers of the daily settlements included in this payoutday_payment_amount_list- Amounts of the daily settlements included in this payout, in cents (JSON array)payee_cnpj- CNPJ that received the payoutpayer_cnpj- CNPJ of 99Food that made the payoutcnpj_withdraw_amount- Total paid to the receiving CNPJ across all its stores, in centscerc_amount- Amount withheld and paid to a third party after receivables were sold through CERC, in centsraw_payload- The payout exactly as sent by 99Food (JSON object)
Orders
Orders
Stream
orders. Incremental by last_financial_entry_at; key order_id.order_id- Unique 99Food order number (19 digits, kept as text)app_shop_id- Identifier of the store in the integrator’s systemshop_id- Identifier of the store in 99Foodstatus- Current status: 100 created, 200 accepted, 400 picked up, 500 courier arrived, 600 completed, 9xx cancelled (see the 99Food status table)shop_accept_status- Acceptance status of the order by the storebefore_status- Status before the current oneorder_index- Short order number used between the store and the courierremark- Customer’s instructions for the ordercity_id- Identifier of the city in 99Foodcountry- Country of the ordertimezone- Time zone of the orderpay_type- Legacy payment method code (see pay_channel)pay_method- 1 online payment, 2 offline paymentpay_channel- Payment channel code (110 coupon, 150 card, 153 cash, 212/280 PIX…)change_for- Cash the customer will pay with, for change, in centsdelivery_type- 0 customer pickup, 1 delivery by 99Food, 2 delivery by the storefulfillment_mode- 0 delivery, 1 self pickupexpected_cook_eta- Time by which the meal should be ready, as sent by 99Foodexpected_arrived_eta- Estimated delivery time, as sent by 99Foodcreated_at- When the order was placed (UTC)paid_at- When the order was paid (UTC)shop_confirmed_at- When the store confirmed the order (UTC)completed_at- When the order was completed (UTC)cancelled_at- When the order was cancelled (UTC)order_price- Sum of the item prices without promotions or delivery, in centsitems_discount- Promotions on items perceived by the customer, in centsdelivery_price- Delivery fee charged after delivery promotions, in centsdelivery_discount- Delivery promotions perceived by the customer, in centsstore_charged_delivery_price- Original delivery fee before promotions, in centsreal_price- Total the store receives (with delivery) without the promotions subsidised by 99Food, in centsreal_pay_price- Total paid by the customer (with delivery), in centsrefund_price- Total refunded on the order, in centsshop_paid_money- Cash the courier pays the store for cash orders, in centscustomer_need_paying_money- Amount the customer needs to pay, in centsservice_price- Service fee charged to the customer, in centsmeal_top_up_price- Fee charged to reach the store’s minimum order value, in centsin_sale_refund_to_c_fee- Amount under-billed to the store after items were cancelled during the sale, in centscurrency- Currency of the prices, when sentlogistics_cost- Delivery cost charged by 99Food to the store for platform delivery, in centsneed_cutlery- Whether the customer asked for cutleryc_cancel_preference- What the customer wants when an item is out of stockpickup_code- Legacy 4-digit handover codehandover_code- 4-digit code used between the store and the couriertakeaway_code- 4-digit code used between the store and the customer in self pickupprice- Every price field of the order as sent by 99Food, in cents (JSON object)shop- Store information of the order (JSON object)receive_address- Customer and delivery address as sent by 99Food, including personal data (JSON object)promotions- Promotions applied to the order (JSON array)shopper_info- Shopper of grocery orders (JSON object)items_count- Number of item lines in the order (see the order_items table)last_financial_entry_at- Latest financial entry that pointed to this order (UTC); used as the incremental replication key
Order Items
Order Items
Stream
order_items. Incremental by last_financial_entry_at; key order_id, line_number.order_id- 99Food order number the line belongs toline_number- Position of the line in the order, starting at 1app_shop_id- Identifier of the store in the integrator’s systemapp_item_id- Identifier of the item in the integrator’s systemitem_id- Identifier of the item in 99Food, when sentmdu_id- Unique id of the item with its selected quantity and optionsapp_external_id- Free-form field reserved for the restaurant or its POSname- Item name shown in the menusales_type- How the item is sold: Weight or Unitweight- Total weight when sold by weightweight_unit- Weight unit when sold by weight (Gram)amount- Quantity of the itemsubmit_refund_amount- Quantity refunded (amount minus this is the quantity left in the order)sku_price- Unit price of the item, in centstotal_price- Total price of the line without promotions, in centsreal_price- Amount actually paid by the customer for the line, in centspromo_type- Main promotion type applied to the linepromotion_detail- Summary of the promotions of the line (JSON)promo_list- Each promotion applied to the line (JSON array)sub_item_list- Options chosen for the line (modifier items), with their prices in cents (JSON array)remark- Customer’s note for this line (plain text; a JSON array when 99Food sends a list)last_financial_entry_at- Replication key copied from the order (UTC)